Как наиболее «популярная» (MySQL, Postgres ...) система баз данных обрабатывает изменение таблиц в действующих производственных базах данных (например, добавление, удаление или изменение типа столбцов)?
Я знаю, что правильным способом является резервное копирование всего времени простоя по расписанию и внесение изменений.
Но ... поддерживает ли какая-либо текущая система баз данных выполнение этих операций в режиме онлайн без каких-либо остановок? (возможно, просто задерживает запросы, которые ссылаются на столбец, который только что был изменен / удален)
И что это происходит, когда я просто делаю ALTER TABLE...
на работающей базе данных? Все ли останавливается, когда это происходит? Могут ли данные быть повреждены? и т.п.
Опять же, я в основном имею в виду Postgres или MySQL, поскольку с этим я сталкиваюсь.
(И да, в любое время мне приходилось делать это, прежде чем я сделал это «правильным образом», резервное копирование, планирование понижения и т. Д. ... но я просто хочу знать, возможно ли сделать это и так быстро и быстро » «грязный» или если есть какая-либо система БД, которая на самом деле поддерживает «быстрые, живые и грязные» изменения схемы)
Кто-то только что предложил Online Schema Change для MySQL из скрипта Facebook (с учебником здесь и источником здесь ) ... кажется хорошим способом автоматизировать набор "хакерских" способов сделать это ... кто-нибудь когда-либо использовал его в чем-то похожим на производство?
источник
pg_reorg
может помочь с более сложными сценариями.Ответы:
Когда вы запускаете
ALTER TABLE
в PostgreSQL, он беретACCESS EXCLUSIVE
блокировку, которая блокирует все, включаяSELECT
. Тем не менее, эта блокировка может быть весьма кратко , если таблица не требует переписывания, никаких новыхUNIQUE
,CHECK
илиFOREIGN KEY
ограничения не нужны дорогие полного сканирования таблицы для проверки и т.д.Если вы сомневаетесь, вы можете просто попробовать это! Весь DDL в PostgreSQL является транзакционным, поэтому вполне нормально отменить,
ALTER TABLE
если он занимает слишком много времени и начинает задерживать другие запросы. Уровни блокировки, требуемые различными командами, описаны на странице блокировки .Некоторые обычно медленные операции могут быть ускорены, чтобы их можно было безопасно выполнять без простоев. Например, если у вас есть таблица
t
и вы хотите изменить столбецcustomercode integer NOT NULL
на,text
потому что клиент решил, что все коды клиентов теперь должны начинаться сX
, вы можете написать:... но это заблокировало бы всю таблицу для перезаписи. Как и добавление столбца с
DEFAULT
. Это можно сделать за пару шагов, чтобы избежать длительной блокировки, но приложения должны быть в состоянии справиться с временным дублированием:Это будет только предотвратить операции записи в
t
ходе процесса; имя замкаEXCLUSIVE
несколько обманчиво в том смысле, что оно исключает все, кромеSELECT
;ACCESS EXCLUSIVE
режим является только один , который не включает абсолютно Everyting. Смотрите режимы блокировки . Существует риск того, что эта операция может привести к взаимному откату блокировки из-за необходимости обновления блокировкиALTER TABLE
, но в худшем случае вам просто придется сделать это снова.Вы даже можете избежать этого замок и делать все это вживую, создав функцию триггера на
t
том , что всякий раз , когдаINSERT
илиUPDATE
приходит, заполнятся автоматическиcustomercode_new
сcustomercode
.Существуют также встроенные инструменты, такие как
CREATE INDEX CONCURRENTLY
иALTER TABLE ... ADD table_constraint_using_index
предназначенные для того, чтобы администраторы баз данных могли сократить длительность исключительной блокировки, выполняя работу медленнее и в условиях параллелизма.pg_reorg
Инструмент или его преемникpg_repack
может быть использован для некоторых операций по реструктуризации таблиц , а также.источник
ALTER TABLE t ADD COLUMN i INT
- это быстрая операция (обычно <1 мс) после получения блокировки. Однако получение блокировки может поставить в очередь соединения, так что это не «бесплатно» ... хотя в мире это лучше, чем то, что вы должны делать в MySQL. ДобавлениеNOT NULL
ограничения является более трудным и не для притворства сердца.pg_repack
является улучшенным преемникомpg_reorg
.Percona предлагает собственный инструмент для изменения схем в сети
Инструмент называется pt-online-schema-change
Это включает триггеры, поэтому, пожалуйста, внимательно прочитайте документацию.
Согласно Документации, основные операции выполнены
источник
Выключение системы и одновременное выполнение всех изменений может быть очень рискованным. Если что-то идет не так, как это часто случается, обратного пути нет.
Как разработчику Agile, мне иногда нужно реорганизовывать таблицы без каких-либо простоев, так как эти таблицы изменяются и читаются.
Следующий подход имеет низкий уровень риска, поскольку изменение выполняется в несколько этапов с низким уровнем риска, которые очень легко откатить:
Мы много раз использовали этот подход для изменения больших рабочих таблиц без простоев, без каких-либо проблем.
источник
rollback
если что-то пойдет не так.Да, многие современные базы данных позволят вам просто добавить столбец или изменить характеристики столбца, например добавить или удалить nullable.
Если вы уроните столбец, данные будут потеряны, но не будет большого страха коррупции.
источник
Инструмент Percona использует триггеры, чтобы помочь в его изменении, и он не очень хорошо играет, если на вашем столе уже есть триггеры. В итоге мне пришлось написать тот, который действительно хорошо обрабатывает существующие триггеры, поскольку они очень важны для нашей базы данных https://github.com/StirlingMarketingGroup/smg-live-alter
источник
Чтобы ответить на вопрос о том, что происходит с
ALTER TABLE
заявлением, это зависит от степени ваших изменений. В определенных случаях, если вы добавляете новый столбец, по крайней мере, в MS SQL Server, механизм создает временную копию таблицы, создает новое определение таблицы и затем вставляет туда данные. Таким образом, во время изменения таблица будет недоступна для пользователей.Пример конкретных операций для сервера MSSQL приведен здесь: http://support.microsoft.com/kb/956176/en-us
Я бы предположил, что другие RMDB имеют аналогичные методы, хотя точную реализацию вы должны будете проверить с помощью документации поставщика.
источник