предисловие
Будь то разработка, тестирование или администратор базы данных, он неизбежно участвует в работе базы данных, например: создание таблицы, добавление поля, добавление данных, обновление данных, удаление данных, запрос данных и т. д.
В нормальных условиях это нормально, но если при работе с базой данных возникает ошибка, например:
-
Условие where было написано некорректно при удалении данных заказа, что привело к удалению многих пользовательских заказов.
-
При обновлении эффективного времени участников эффективное время всех участников обновляется одновременно.
-
При восстановлении онлайн-данных я допустил ошибку и хочу восстановить ее.
Сценариев очень много, я не буду их все перечислять.
Что делать в случае неправильной работы базы данных онлайн-среды? Есть ли лекарство от сожаления?
Ответ - да, пожалуйста, внимательно посмотрите вниз.
1. Не используйте инструменты чата для отправки операторов SQL.
Обычно после того, как разработчики пишут операторы SQL, они привыкают использовать инструменты чата, такие как: qq, DingTalk или Tencent и т. д., чтобы отправить их на团队老大
илиDBA
Выполнение в онлайн-среде. Однако из-за некоторых инструментов чата некоторые特殊字符
автоматически экранируется, а некоторые сообщения内容太长
, будут автоматически разделены на несколько сообщений.
Это приведет к тому, что босс команды или репликация SQL от администратора базы данных не обязательно будет правильной.
Их нужно сшить вручную完整的sql
, а иногда даже нужно заменить экранированные символы обратно на предыдущие специальные символы, что приведет к потере большого количества дополнительного времени. Даже если SQL в итоге склеен, человек, который на самом деле выполняет SQL, должен быть очень пустым.
Поэтому настоятельно рекомендуется использовать оператор sql для выполнения в режиме онлайн.邮件
В прошлом вы могли избежать некоторых недостатков использования инструментов чата и уменьшить вероятность неправильной работы. И есть архив, в который удобно вернуться, когда возникнет проблема в будущем. Многие инструменты чата сохраняют только последние7天
история, сообщения будут храниться дольше.
Не используйте инструменты чата для отправки инструкций sql!
Не используйте инструменты чата для отправки инструкций sql!
Не используйте инструменты чата для отправки инструкций sql!
Важная вещь сказана трижды, это действительно может уменьшить количество ошибок.
2. Сожмите оператор sql в одну строку
Иногда оператор sql, написанный разработчиком, очень длинный, с использованием различныхjoin
иunion
, и используйте инструмент украшения, чтобы превратить sql в несколько строк. При копировании sql я не могу определить, завершен ли sql. (Чтобы прикинуться вынужденным, я тоже натравливаю, хахаха)
В онлайн-среде иногда необходимо подключиться к базе данных через командную строку, например: mysql, после того, как вы скопируете оператор sql, интерфейс командной строки, поскольку экран прокручивается слишком быстро, затем не может определить, успешно ли выполняется sql.
Для такого рода проблем настоятельно рекомендуется поставить оператор sql压缩成一行
, убери лишнее换行符
и空格
, что может эффективно уменьшить количество ошибок.
sql压缩工具
Рекомендуемое использование:tool.lu/sql/
3. Выберите перед операцией с данными
Следует отметить, что данные операции в этой статье в основном относятся к修改
и删除
данные.
Много раз из-за нашей человеческой ошибки условие where пишется неправильно. Но без тщательной проверки оператор sql был выполнен напрямую. Хорошо, что сфера влияния небольшая, если это касается десятков тысяч, сотен тысяч или даже миллионов строк данных, можно плакать.
Ввиду этой ситуации перед операцией с данными измените sql наselect count(*)
утверждения, такие как:
update order set status=1 where status=0;
Изменить его на:
select count(*) from order where status=0;
Проверьте количество строк записей, затронутых выполнением sql, и убедитесь, что вы его знаете. Также дайте себе возможность проверить правильность SQL и убедиться, что он выполняется.
4. Операционные данные sql plus limit
даже через вышеперечисленноеselect
Оператор подтверждает, что с оператором sql нет проблем, и количество строк записей, затронутых после выполнения, верно.
Также рекомендуется не выполнять его сразу.limit
+ select出的记录行数
. Например:
update order set status=1 where status=0 limit 1000;
Предполагая, что за один раз обновляется слишком много данных, все связанные строки записей будут заблокированы, что приведет к длительному ожиданию блокировки и тайм-ауту запроса пользователя.
Кроме того, Канадаlimit
Это позволяет избежать одновременной обработки слишком большого количества данных, что повлияет на ЦП сервера.
Есть еще одна важная причина:limit
После этого сфера влияния оперативных данных полностью контролируема.
5. Обновите модификацию и время модификации при обновлении
многие люди пишутupdate
Заявление, если вы хотите изменить состояние, обновите только состояние, независимо от других полей. Например:
update order set status=1 where status=0;
Этот sql будетstatus
Все данные, равные 0, обновляются до 1.
Позже выяснилось, что проблема в бизнес-логике, и ее нельзя так обновлять.status
Откат состояния.
В это время вы, естественно, можете подумать об этом sql:
update order set status=0 where status=1;
Но если подумать, что-то не так.
Это не поставит некоторые из предыдущихstatus
Данные 1 обновлены до 0?
На этот раз я действительно буду плакать, у-у-у-у.
На этот раз я дам вам полезную привычку: обновляя данные, обновляйте их одновременно修改人
и修改时间
поле.
update order set status=1,edit_date=now(),edit_user='admin' where status=0;
这样在恢复数据时就能通过修改人和修改时间字段过滤数据了。
понадобится позже修改时间
Его можно легко найти с помощью этого оператора sql:
select edit_user ,edit_date from `order` order by edit_date desc limit 50;
Конечно, если это система с высокой степенью параллелизма, этот метод пакетного обновления не рекомендуется, и таблица может быть заблокирована на определенный период времени, что приведет к истечению времени ожидания запроса.
Некоторые учащиеся могут спросить: зачем обновлять модификатор одновременно и обновлять только время модификации?
Основные причины следующие:
-
Чтобы выявить ненормальные действия пользователя, удобно подсчитать и локализовать проблемы позже.
-
В некоторых случаях в процессе выполнения операторов SQL время модификации данных, сгенерированных обычными пользователями, может быть точно таким же, как у вас, что приводит к дополнительной проверке данных при откате.
6. Больше используйте логические удаления и меньше физические удаления
Удаление данных является важным бизнес-сценарием в развитии бизнеса.
Некоторые разработчики привыкли проектировать таблицы как物理删除
, по первичному ключу только одинdelete
Предложения могут быть легко сделаны.
Причины они называют:节省数据库的存储空间
.
Идея хороша, но реальность жестока.
Что делать, если я по ошибке удалил часть чрезвычайно важных данных и хочу их восстановить?
На данный момент осталось всего восемь слов: нет данных, нет восстановления. (PS: возможно, его можно восстановить с помощью бинарного файла binlog)
Если вы использовали его при разработке таблицы до逻辑删除
, вышеуказанная проблема становится легче справиться. При удалении данных простоupdate
Просто удалите состояние, например:
update order set del_status=1,edit_date=now(),edit_user='admin' where id=123;
При возникновении исключения для восстановления данных восстановите удаленное состояние id, например:
update order set del_status=0,edit_date=now(),edit_user='admin' where id=123;
7. Сделайте резервную копию перед операцией с данными
Если изменяется только небольшой объем данных или выполняется только один или два оператора SQL, с помощью вышеуказанного修改人
и修改时间
Поле может быстро найти правильные данные, когда их нужно откатить.
Однако, если число измененных строк записей велико и выполняется несколько SQL-запросов,修改时间
. На этом этапе вам может быть трудно выяснить, какие данные нужно откатить сразу.
Чтобы решить эту проблему, можно создать резервную копию таблицы.
Вы можете использовать следующую резервную копию sql:
create table order_bak_2021031721 like`order`;insert into order_bak_2021031721 select * from`order`;
Сначала создайте идентичную таблицу, а затем скопируйте данные в новую таблицу.
Его также можно упростить в sql:
create table order_bak_2021031722 select * from`order`;
创建表的同时复制数据到新表中。
Кроме того, рекомендуется добавить к названию таблицы
bak
и时间
, с одной стороны, чтобы быстро определить, какие таблицы являются резервными, по имени таблицы, а с другой стороны, чтобы различать несколько резервных копий. Потому что иногда необходимо выполнить несколько раз sql для восстановления данных.В этом случае рекомендуется сделать резервную копию таблицы несколько раз.Если произойдет исключение, откатите данные до последней резервной копии, что может сэкономить много времени на повторные операции.
При восстановлении данных измените оператор sql наselect
заявление, сначала найдите соответствующие данные в резервной базе данных, каждые данные соответствуют одномуupdate
оператор, восстановить старую таблицу.
8. Промежуточные результаты записываются во временную таблицу
Иногда нам нужно использовать sql-запрос, чтобы найти идентификатор записи, которую нужно обновить, а затем обновить данные через эти идентификаторы.
После пакетного обновления обнаруживается, что что-то не так и нужно откатить данные. Однако, поскольку некоторые данные были обновлены, в настоящее время используется тот же sql и те же условия, но тот же идентификатор не может быть найден в прошлый раз.
В этот момент мы начали паниковать.
В ответ на эту ситуацию мы можем сначала сохранить идентификатор первого запроса в临时表
, то через临时表
Идентификатор используется в качестве условия запроса для обновления данных.
Если вы хотите восстановить данные, просто используйте临时
Идентификатор в таблице можно использовать в качестве условия запроса для обновления данных.
После модификации, через 3 дня, если проблем нет, можно ставить临时表
удален.
9. Перед именем таблицы должно стоять имя библиотеки.
Когда мы пишем sql для удобства, мы обычно не указываем имя базы данных. Например:
update order set status=1,edit_date=now(),edit_user='admin' where status=0;
假如有多个数据库中有相同的表order,表结构一模一样,只是数据不一样。
Из-за небольшой ошибки человека, выполняющего оператор sql, была введена неправильная база данных.
use trade1;
Затем выполните этот оператор SQL, результат трагичен.
Очень эффективным способом предотвращения таких проблем является добавление数据库名
:
update `trade2`.`order` set status=1,edit_date=now(),edit_user='admin' where status=0;
这样即使执行sql语句前进错数据库了,也没什么影响。
10. Ограничения на добавление, удаление и модификацию полей
Много раз нам приходится работать с полями таблицы, например добавлять, изменять и удалять поля, но каждая ситуация отличается.
Новые добавленные поля должны быть пустыми
Новые добавленные поля должны быть разрешены пустыми. Почему он разработан таким образом?
В нормальных условиях, если в программу добавляется новое поле, это поле обычно сначала добавляется в базу данных, а затем отправляется последний код программы.
Почему такой порядок?
Потому что если сначала отправлять программу, то добавлять поля в базу. В течение периода, когда программа только что была успешно развернута, но новые поля в базу данных не были добавлены вовремя, в последней программе все добавления, удаления, изменения и запросы, использующие вновь добавленные поля, будут сообщать об ошибке. исключение, что поле не существует.
Ну просто сначала добавить поля в базу, а потом отправлять в программу по порядку.
Если вновь добавленное поле в базе данных не пусто, последняя программа еще не выпущена, а старый код все еще работает в сети.insert
будет сообщено об исключении, что поле не может быть пустым. Из-за недавно добавленных ненулевых полей старый код не может присваивать значения.
Следовательно, вновь добавленное поле должно быть пустым.
Кроме того, этот дизайн больше подходит для операции отката при сбое выпуска программы. Если только что добавленному полю разрешено быть пустым, то базу откатывать не надо, достаточно откатить код, не очень удобно?
Удалить поля нельзя
Удаление полей не допускается, особенно нельзя удалять обязательные поля.
Почему ты это сказал?
Предполагая, что разработчик изменил программу, чтобы она не использовала поле удаления, как его развернуть дальше?
-
Если программа развернута первой, нет времени на удаление полей таблицы, связанных с базой данных. когда есть
insert
При запросе, поскольку поле в базе данных является обязательным, будет сообщено об исключении, что обязательное поле не может быть пустым. -
Если вы сначала удалите соответствующие поля таблицы в базе данных, программа не успела отправить. В это время все поля, связанные с удаленным полем
增删改查
, будет сообщено об исключении, что поле не существует.
Поэтому обязательные поля в онлайн-среде удалять нельзя.
Измените поля в соответствии с реальной ситуацией
Существует три случая изменения полей:
1. Измените имя поля
Изменение имени поля не допускаются, с почти проблемой удалите необходимое поле.
-
Если программа развернута, нет времени изменять имена полей таблицы в базе данных. В это время все
增删改查
, будет сообщено об исключении, что поле не существует. -
Если вы сначала измените имя поля в базе данных, программа не успела отправить. В это время все
增删改查
, также будет сообщено об исключении, что поле не существует.
Поэтому имя поля онлайн-среды изменять нельзя.
2. Измените тип поля
При изменении типа поля он должен быть совместим с предыдущими данными. Например:
-
Вы можете изменить tinyint на int, но вам нужно тщательно измерить изменение от int до tinyint.
-
Вы можете изменить varchar на текст, но вам нужно тщательно измерять, когда вы меняете текст на varchar.
3. Измените длину поля
Рекомендуется изменить длину поля на больший размер, обычно не рекомендуется изменять его на меньший размер. Если вы должны изменить его на меньший размер, вы должны сначала подтвердить максимальную длину, которой может показаться, что поле избегает.insert
Поле слишком длительное исключение произошло во время работы.
Кроме того, рекомендуется установить разумную длину, чтобы не тратить ресурсы базы данных.
Суммировать
В этой статье рассказывается о 10 способах снижения неправильной работы с базой данных, не все сценарии вам подходят. Особенно в некоторых сценариях с высокой степенью параллелизма или очень большим объемом данных в одной таблице необходимо выбирать в соответствии с реальной ситуацией. Но я уверен, что после прочтения этой статьи у вас обязательно будет какой-то выигрыш, потому что большинство методов применимы к вам, что может избавить вас от многих обходных путей, и настоятельно рекомендуется собирать.
Последнее слово (пожалуйста, обратите внимание, не проституируйте меня по пустякам)
Если эта статья полезна или вдохновляет вас, пожалуйста, помогите обратить внимание, ваша поддержка является самой большой мотивацией для меня, чтобы продолжать писать.
Попросите в один клик три ссылки: лайк, вперед и смотреть.
Следите за официальной учетной записью: [Су Сан сказал о технологии], ответьте в официальной учетной записи: интервью, артефакты кода, руководства по разработке, управление временем имеют большие преимущества для поклонников, и ответьте: присоединяйтесь к группе, вы можете общаться и учиться со многими старшими из BAT. производители .