ほとんどの "人気のある"(MySQL、Postgres ...)データベースシステムは、ライブプロダクションデータベースのテーブルの変更(列のタイプの追加、削除、変更など)をどのように処理しますか?
私は正しい方法がスケジュールされたすべてのダウンタイムをバックアップしてから変更を行うことを知っています.
しかし...現在のデータベースシステムは、これらを「オンライン」で何も停止せずに実行することをサポートしていますか? (変更/削除されている列を参照するクエリを遅らせるだけかもしれません)
そして、私がALTER TABLE...
稼働中のデータベースで?これが起こるとすべてが停止しますか?データが破損することはありますか?等.
繰り返しますが、私はPostgresまたはMySQLを主に言及しています。
(そして、はい、「正しい方法」を行う前にこれを行う必要があったときはいつでも、バックアップ、ダウンタインのスケジューリングなど...しかし、この種のことや「クイックダーティ」、または「クイック、ライブ、ダーティ」スキーマ変更を実際にサポートするDBシステムがある場合)
誰かが提案した FacebookスクリプトからのMySQLのオンラインスキーマの変更 (チュートリアル here およびソース here を使用)... 「ハッキー」な一連の方法を自動化します...制作に似た何かで誰かがこれを使用したことがありますか?
PostgreSQLでALTER TABLE
を発行すると SELECT
を含むすべてをブロックするACCESS EXCLUSIVE
ロックがかかります 。ただし、テーブルが再書き込みを必要とせず、新しいUNIQUE
、CHECK
、またはFOREIGN KEY
制約が検証のために高価な全テーブルスキャンを必要としない場合など、このロックは非常に簡単です。
疑わしい場合は、一般的にそれを試すことができます! PostgreSQLのすべてのDDLはトランザクション対応であるため、時間がかかりすぎて他のクエリを保留し始めた場合は、ALTER TABLE
をキャンセルしても問題ありません。さまざまなコマンドに必要なロックレベルは ロックページに記載 です。
通常は遅い操作の一部は、ダウンタイムなしで安全に実行できるように高速化できます。たとえば、テーブルt
があり、列customercode integer NOT NULL
をtext
に変更する場合、顧客はすべての顧客コードをX
で始める必要があると判断したため、次のように記述できます。
ALTER TABLE t ALTER COLUMN customercode TYPE text USING ( 'X'||customercode::text );
...しかし、それは再書き込みのためにテーブル全体をロックします。同様に、DEFAULT
を使用して列を追加します。これは、長いロックを回避するためにいくつかのステップで実行できますが、アプリケーションは一時的な複製に対処できなければなりません。
ALTER TABLE t ADD COLUMN customercode_new text;
BEGIN;
LOCK TABLE t IN EXCLUSIVE MODE;
UPDATE t SET customercode_new = 'X'||customercode::text;
ALTER TABLE t DROP COLUMN customercode;
ALTER TABLE t RENAME COLUMN customercode_new TO customercode;
COMMIT;
これは、プロセス中にwritesがt
に変換されるのを防ぐだけです。ロック名EXCLUSIVE
は、すべてを除外するという点で多少誤解を招きますSELECT
を除く; ACCESS EXCLUSIVE
モードは、すべてを完全に排除する唯一のモードです。 ロックモード を参照してください。 ALTER TABLE
が必要とするロックのアップグレードが原因で、この操作がデッドロックロールバックする可能性がありますが、最悪の場合、もう一度実行する必要があります。
t
またはINSERT
が着信するたびに、UPDATE
からcustomercode_new
に自動的に入力されるcustomercode
でトリガー関数を作成することにより、そのロックを回避してすべてをライブで行うこともできます。
CREATE INDEX CONCURRENTLY
や ALTER TABLE ... ADD table_constraint_using_index
のような組み込みツールもあり、DBAがよりゆっくりと作業を行うことで排他ロック期間を短縮できるように設計されています並行性に配慮した方法で。
Perconaは、オンラインスキーマ変更を実行するための独自のツールを開発しました
ツールは pt-online-schema-change と呼ばれます
これにはトリガーが含まれるため、ドキュメントをよくお読みください。
ドキュメントによると、行われる主な操作は
システムをシャットダウンしてすべての変更を一度に行うことは非常に危険な場合があります。何かがうまくいかず、頻繁にそれが起こった場合、簡単に戻る方法はありません。
アジャイル開発者として、テーブルが変更されて読み取られるため、ダウンタイムなしでテーブルをリファクタリングする必要がある場合があります。
次のアプローチは、ロールバックが非常に簡単ないくつかの低リスクのステップで変更が行われるため、低リスクです。
このアプローチを何度も使用して、ダウンタイムなしで大きなライブプロダクションテーブルを変更しました。まったく問題はありません。
はい、多くの最新のデータベースでは、列を追加したり、null許容値の追加や削除など、列の特性を変更したりできます。
列を削除すると、データは失われますが、破損の恐れはあまりありません。
Perconaツールは、トリガーを使用して変更を支援します。テーブルに既存のトリガーがすでにある場合は、うまく機能しません。データベースにとって非常に重要であるため、既存のトリガーを実際に処理するものを作成する必要がありました https://github.com/StirlingMarketingGroup/smg-live-alter