Какие методы вы используете, чтобы избежать неправильных обновлений данных в больших базах данных?


20

Типичным советом перед любым производственным развертыванием является резервное копирование БД. Таким образом, если в новом обновлении есть какая-то проблема, которая может привести к потенциальной потере данных или логическому повреждению данных, у вас все еще есть резервная копия для сравнения и исправления старых записей.

Тем не менее, это может работать хорошо, пока размер БД не будет в нескольких ГБ. Когда размер БД огромен, резервное копирование занимает много времени. Каковы некоторые рекомендации, которые следует соблюдать в таких ситуациях, чтобы избежать логического повреждения данных из-за логических проблем при развертывании кода?


11
Резервные копии предназначены не только для развертываний. Я имею в виду, что ваша потеря данных - всего лишь один сбой диска, и они непредсказуемы и могут произойти сегодня или завтра. (Рейдовые массивы не являются ответом, они также терпят крах.)
Питер Б

10
Я бы перефразировал этот вопрос, проблема не в том, что резервное копирование занимает много времени, проблема в том, что в случае неудачного обновления обновление может потребоваться восстановление , которое может заблокировать производство на долгое время. Итак, что вам действительно нужно, так это стратегия снижения риска сбоя во время обновления.
Док Браун

1
Я согласен с @DocBrown здесь. Предотвращение повреждения данных и слишком долгого резервного копирования - это два отдельных вопроса.
Робби Ди

1
Когда вы принимаете быстро, вы не получаете столько информации.
Папараццо

1
Что вы подразумеваете под «логическими проблемами при развертывании кода»?
Папараццо

Ответы:


25

Как человек, который регулярно занимался обновлением производственной базы данных для клиентов для наших обновлений программного обеспечения, я говорю вам, что лучший способ минимизировать ошибки - это делать обновления как можно более простыми.

Если вы можете внести изменения во все записи, а не в конкретные записи, это предпочтительно.

Другими словами, если вам предоставляется список идентификаторов записей, для которых необходимо изменить их состояние, вы должны спросить себя, почему обновление выполняется в контексте программы. Возможно, из 10 записей, которые необходимо обновить, таблица содержит только 10 элементов. Поэтому вы должны спросить себя, концептуально ли все, что вы делаете, это обновляет состояние всех записей.

Если вы можете вставить, это предпочтительно.

Акт добавления записи является автономным. Под этим я подразумеваю только один побочный эффект от добавления записи - это существование записи, которой раньше не было. Поэтому, если вы не добавляете запись, которой не должно быть, проблем не должно быть.

Если вы можете избежать удаления, это предпочтительно.

Если вы выполняете удаление, вы удаляете данные, которые в противном случае были бы невозможно восстановить без резервного копирования. Если возможно, попытайтесь организовать данные таким образом, чтобы можно было отключить записи, изменив их состояние, а не физически удалив запись. Избыток данных можно поместить в раздел или полностью удалить в более поздний момент, если вы уверены, что проблем нет.

Имейте последовательную политику обновления.

Если вам нужно обновить запись, может произойти одно из нескольких:

  1. Ваша запись не существует.
  2. Ваша запись существует, но она уже была изменена.
  3. Ваша запись существует и требует изменений.

Вы должны иметь политику, чтобы определить курс действий, если что-то идет не так, как планировалось. Для простоты вы должны быть последовательными по всем направлениям и применять эту политику в любой ситуации такого типа, а не только для конкретных таблиц. Это облегчает возможность восстановления данных позже. Как правило, моя политика заключается в том, чтобы написать сценарий таким образом, чтобы иметь возможность выполнить его позже. В случае сбоя скрипта приятно знать, что вы можете внести коррективы и выполнить заново, однако вы можете выбрать собственную политику, которая подходит вам лучше всего.

Резервные копии

Это ни в коем случае не освобождает вас от выполнения резервного копирования перед выполнением любого обновления в производственной среде! Хотя даже с резервной копией, я считаю невозможным использовать резервную копию. Потеря данных не может быть возможной даже в худшем случае .

Вывод

Вы не всегда сможете сделать это по-своему. Схема таблицы вряд ли будет определяться вами, и поэтому она означает, что типы обновлений, которые вы можете ожидать, будут как сложными, так и рискованными. Хотя, если у вас есть какие-либо слова в этом вопросе, это помогает помнить эти моменты, поскольку они делают любые обновления прямо и без существенного риска.

Удачи!


Я согласен со всем, что вы сказали, но мне было любопытно, что вы думаете о транзакциях, когда 10 записей требуют замены из 10 КБ, а вставка / обновление всех записей нежизнеспособны?
Я здесь для зимних шапок

Тогда вы просто обновите 10 записей. Я сказал, если можешь, сделай это. Я не говорил, делай это, даже если это разрушит производственную базу данных твоего клиента. Примите мой совет с крошкой соли, пожалуйста.
Нил

12

На этом этапе вы должны использовать систему БД коммерческого уровня, которая поддерживает моментальные снимки (оракулы называют это Flashback ) - это именно то, для чего они предназначены.

Имейте в виду, что вам все равно нужна концепция резервного копирования - наличие большего количества данных не означает, что вы удаляете резервные копии, потому что они становятся трудными, как раз наоборот. Вам нужно какое-то непрерывное резервное копирование, например, на основе репликации с автоматическим восстановлением после отказа.


Я не говорю, что хочу сбросить резервные копии. Запланированные резервные копии всегда есть. Вопросы больше касаются специальных резервных копий, которые не являются проблемой для небольших систем.
Притам Бархате

Более подробно, эта мысль пришла от NoSQL DB в качестве сервисных платформ. На самом деле читал документацию Firestore, когда она появилась. Если вам нужны логически согласованные резервные копии за пределами сайта, это кажется очень дорогим. Поэтому мне было интересно, как успешные группы разработчиков работают с такими системами и как они гарантируют, что логическое повреждение данных не произойдет.
Притам Бархате

@PritamBarhate: вам не нужно больше резервных копий из-за обновлений. В производственной базе данных, где люди работают с этими данными, резервное копирование должно выполняться как минимум ежедневно, с обновлениями или без них. Восстановление - это ваша проблема, вы хотите избежать ненужных восстановлений при любых обстоятельствах.
Док Браун

3
Репликация с автоматическим переключением при отказе - это избыточность, которая больше не является стратегией резервного копирования для баз данных, чем использование RAID для дисков .
Blrfl

1
Все хорошие плюсы в отношении резервных копий и моментальных снимков, но очистка ошибочной операции базы данных (если было добавлено несколько часов новых данных до ее реализации) может быть очень сложной в зависимости от сценария и других систем, на которые он влияет (планировщики, другие записи базы данных). что полагаться на него, если он охватывает несколько таблиц, кэши, аутентификации и т. д.). Я всегда предполагаю, что мне придется использовать резервную копию, но всегда, по крайней мере, стараюсь никогда этого не делать.
анонимный пингвин

3

Это огромная область - так что ожидайте, что этот вопрос будет закрыт в довольно короткие сроки, но не в моей голове (как бывший администратор баз данных в базах данных yuge):

Mart / Repository

Вы можете уменьшить некоторый риск, если у вас есть отдельная база данных для обновлений и отдельная база данных, которую используют все. Тогда это всего лишь случай копирования данных из одной БД в другую после проведения различных проверок. Март / репозиторий, как это иногда описывается, но у вас может быть основной / дополнительный, главный / подчиненный и т. Д.

Исходный код

Для всего, что может измениться, есть исходный код, который относится к тому, как данные были обновлены. Сколько их у вас варьируется от БД к БД, но у вас может быть один для каждого пользователя, роли, канала данных, модуля кода и т. Д.

Дата создания / обновления

Когда вы отслеживаете, где что-то пошло не так, вам может помочь создание и обновление данных для каждой строки. Затем вы можете сразу увидеть, какие строки были обновлены.

ETL

Если обновление базы данных происходит как часть фабрики данных, вы можете восстановить предыдущий винтаж из плоских файлов.

Резервный

Полные резервные копии, конечно, занимают много места, но в обычном сценарии полное резервное копирование происходит через регулярные промежутки времени (например, еженедельно), а частичные - чаще (ежедневно и т. Д.).

Момент времени восстановления

В зависимости от того, какую СУБД вы используете, некоторые моменты поддержки могут быть восстановлены. Это позволяет вам вернуться к тому времени, когда было известно хорошее состояние. Однако для этого требуется большой объем памяти, который увеличивает то, насколько далеко вы хотите вернуться.

аудит

Наличие таблиц аудита скажет вам, кто (или что) сделал обновление строки. Это может дать вам хорошую отправную точку для расследования.

история

Для некоторых критических таблиц копия соответствующей строки берется во время обновления, поэтому данные могут быть восстановлены в случае необходимости.

Проверка данных

Убедитесь, что базовые проверки проверок данных выполняются до их сохранения - сверх проверок базовых типов данных.

Ссылочная целостность

Ссылочная целостность не является серебряной пулей, но она может помочь обеспечить правильную структуру данных.



2

Много раз, если мы выполняем обновление «одним выстрелом», мы производим резервное копирование и восстанавливаем его на тестовом сервере. Затем мы создаем набор тестов и запускаем один выстрел. Мы проверяем, что данные изменились с помощью тестов, и нам стало удобно, что обновление пройдет успешно, и мы изменим данные так, как мы ожидаем. Это называется пробным или пробным прогоном. Я рекомендую это сделать.

Это дает всем хорошее чувство, что один выстрел будет успешным. Мы не можем гарантировать 100%, потому что данные будут обновлены с даты пробного запуска, но мы повышаем уверенность и факторы успеха. Это также дает реальное представление о любых проблемах, которые могут возникнуть, поскольку мы используем копию производства. Теперь, если по какой-то причине обновление завершается неудачно, мы всегда можем вернуться к повторному запуску до восстановления, если это необходимо, но мы должны были найти и устранить любые проблемы с пробным прогоном.

Если вы не можете взять всю базу данных (если она действительно большая), попробуйте экспортировать образец меньшего размера и запустить обновление (небольшой пробный прогон) для реальных данных. Я бы предпочел весь набор данных, если это возможно, чтобы тест был как можно более полным.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.