Які практики ви дотримуєтесь, щоб уникнути неправильних оновлень даних у великих базах даних?


20

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

Однак це може працювати добре, поки розмір БД не складе кількох ГБ. Коли розмір БД величезний, резервне копіювання триватиме тривалий час. Назвіть кілька найкращих практик, яких слід дотримуватися в таких ситуаціях, щоб уникнути пошкодження логічних даних через логічні проблеми при розгортанні коду?


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

10
Я б перефразував це питання, проблема не в тому, що резервне копіювання займає тривалий час, проблема полягає в тому, що якщо оновлення має катастрофічний збій, може бути необхідним відновлення , яке може блокувати виробництво на тривалий час. Тож, за чим ви дійсно хочете, це стратегія зменшення ризику відмови під час оновлення.
Док Браун

1
Я згоден з @DocBrown тут. Уникнення корупції даних та зайняття резервного копіювання - це справді два окремих питання.
Роббі Ді

1
Коли ви швидко приймаєте, ви не отримуєте стільки вкладу.
папараццо

1
Що ви маєте на увазі "логічні проблеми в розгортанні коду"?
папараццо

Відповіді:


25

Як хтось, хто регулярно займався оновленням виробничої бази для клієнтів для оновлення програмного забезпечення, я кажу вам, що найкращий спосіб мінімізувати помилки - це зробити оновлення максимально простими.

Якщо ви можете внести зміни до всіх записів, а не конкретних записів, бажано.

Іншими словами, якщо вам надано список ідентифікаторів записів, які потребують зміни їх стану, вам слід запитати себе, чому оновлення проводиться в контексті програми. Можливо, з 10 записів, які потрібно оновити, таблиця містить лише 10 елементів. Тому ви повинні запитати себе, чи концептуально все, що ви робите, це оновлення стану всіх записів.

Якщо ви можете вставити, то краще.

Акт додавання запису є самостійним. Маючи на увазі, я маю на увазі лише один побічний ефект додавання запису, і це наявність запису, який раніше не існував. Тому, якщо ви не додаєте запис, якого там не повинно бути, проблем не повинно бути.

Якщо ви можете уникнути видалення, бажано.

Якщо ви виконуєте видалення, ви видаляєте дані, які в іншому випадку були б неможливими без резервного копіювання. Якщо можливо, спробуйте впорядкувати дані таким чином, щоб ви могли відключити записи, змінивши його стан, а не фізично видаливши запис. Надлишок даних може бути поміщений у розділ, або він може бути видалений повністю в більш пізній момент, як тільки ви впевнені, що немає проблем.

Провести послідовну політику оновлення.

Якщо вам потрібно оновити запис, може статися одна з кількох речей:

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

Потрібно мати політику, щоб визначити хід дій, якщо щось не піде за планом. Для простоти ви повинні бути послідовними і застосовувати цю політику в будь-якій ситуації такого типу, а не лише для конкретних таблиць. Це полегшує можливість відновлення даних пізніше. Як правило, моя політика полягає в тому, щоб написати сценарій таким чином, щоб згодом його змогли повторно виконати. Якщо сценарій не вдасться, приємно знати, що ви можете внести правильні корективи та повторно виконати, однак ви можете вибрати власну політику, яка вам найбільше підходить.

Резервні копії

Це жодним чином не виправдає вас зробити резервну копію перед виконанням будь-якого оновлення у виробничому середовищі! Хоча навіть із резервною копією, я вважаю, що не потрібно використовувати резервну копію. Втрата даних не може бути можливою навіть у гіршому випадку .

Висновок

Ви не завжди зможете мати це по-своєму. Таблиця схем, ймовірно, не визначається вами, і як така це означає, що типи оновлень, які ви можете розраховувати виконати, будуть і складними, і ризикованими. Хоча, якщо у вас є якісь відповіді щодо цього питання, це допомагає пам’ятати про ці моменти, оскільки вони роблять будь-які оновлення простими та без істотного ризику.

Удачі!


Я погоджуюся з усім, що ви сказали, але мені було цікаво ваші думки про транзакції, коли є 10 записів, які потребують зміни на 10 к, а вставки / оновлення всіх записів не є життєздатними?
Я тут для Зимових Шапок

Тоді ви просто оновлюєте 10 записів. Я сказав, якщо зможете, зробіть це. Я не сказав робити це, навіть якщо це знищує виробничу базу вашого клієнта. Будь ласка, прийміть мою пораду із зерном солі.
Ніл

12

У цей момент ви повинні використовувати комерційну систему БД комерційної підтримки, яка підтримує знімки (Oracles називає це Flashback ) - це саме та річ, для якої вони потрібні.

Майте на увазі, що в будь-якому випадку вам потрібна концепція резервного копіювання - наявність більшої кількості даних не означає, що ви скачуєте резервні копії, оскільки вони стають складними, навпаки. Вам потрібна якась безперервна резервна копія, наприклад, заснована на реплікації з автоматичним відмовою.


Я не кажу, що хочу створити резервні копії. Заплановані резервні копії завжди є. Питання більше стосується спеціальних резервних копій, що не є проблемою в невеликих системах.
Притам Бархат

Щоб детальніше розібратися, ця думка виходила з БД NoSQL як платформи обслуговування. Насправді читав документацію Firestore, коли вона вискакувала. Якщо вам потрібні логічно послідовні резервні копії, це здається дуже дорогим. Тож мені було цікаво, наскільки успішні команди продуктів працюють з такими системами та як вони забезпечують, щоб не сталося пошкодження логічних даних.
Притам Бархат

@PritamBarhate: вам не потрібно "більше резервного копіювання" через оновлення. У виробничій базі даних, де люди працюють з цими даними, резервне копіювання потрібно робити щонайменше щодня, з оновленнями або без них. Відновлення - це ваша проблема, ви хочете уникнути непотрібних реставрацій за будь-яких обставин.
Док Браун

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

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

3

Це масивна область, тому очікуйте, що це питання буде закрито в досить короткі терміни, але, вгорі голови (як колишня DBA в базах даних yuge):

Март / сховище

Ви можете зменшити певний ризик, якщо у вас є окрема база даних для оновлень та окрема база даних, яку використовують усі. Тоді це лише випадок копіювання даних з однієї БД в іншу після того, як відбулися різні перевірки. Mart / сховище - це, як це іноді описується, але у вас може бути первинний / вторинний, master / slave etc.

Вихідний код

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

Створення / оновлення дати

Щось, що може значно допомогти при відстеженні, де все пішло не так, - це створення та оновлення даних для кожного ряду. Тоді ви можете з першого погляду побачити, які рядки були оновлені.

ETL

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

Резервне копіювання

Повні резервні копії, звичайно, займають багато місця, але звичайний сценарій полягає в тому, що повне резервне копіювання відбувається через регулярні інтервали (скажімо, щотижневі), а часткові - на більш частому (щоденне тощо).

Поточний час відновлення

Залежно від того, яку RDBMS ви використовуєте, деякий момент підтримки відновлення часу. Це дозволяє відкотитись до того часу, коли був відомий добрий стан. Однак для цього потрібна велика кількість пам’яті, що збільшується на те, наскільки далеко ви хочете повернутися.

Аудит

Маючи таблиці аудиту, ви скажете, хто (або що) здійснив оновлення до ряду. Це може дати вам хороший вихідний пункт для розслідування.

Історія

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

Перевірка даних

Переконайтеся, що основні перевірки перевірки даних здійснюються перед їх збереженням - вище і вище основних перевірок типу даних.

Референтна цілісність

Цілісність посилань не є срібною кулею, але вона може допомогти забезпечити чітку структурованість даних.



2

Багато разів, якщо ми робимо оновлення "одним кадром", ми беремо резервне копіювання виробництва та відновлюємо його на тестовому сервері. Потім ми створюємо костюм тестів і виконуємо один кадр. Ми перевіряємо, чи змінилися дані за допомогою тестів, і нам стало зручніше, що оновлення матиме успіх і модифікує дані таким чином, як ми очікуємо їх. Це називається сухим або пробним пробігом. Я рекомендую зробити це.

Це дає всім здорове відчуття, що один постріл вдасться. Ми не можемо гарантувати 100%, оскільки дані будуть оновлюватися з дати пробного запуску, але ми підвищуємо фактори довіри та успіху. Це також дає реальне уявлення про будь-які проблеми, які виникнуть, оскільки ми використовуємо копію виробництва. Тепер, якщо з якихось причин оновлення не вдається, ми завжди можемо перейти до заднього запуску до відновлення, якщо потрібно, але ми повинні були знайти та усунути будь-які проблеми із сухим виконанням.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.