テーブル全体をロックせずにテーブルを変更する 質問する

テーブル全体をロックせずにテーブルを変更する 質問する

しますか

ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL

テーブル全体をロックしますか?

ベストアンサー1

短い答え: MySQL 5.6未満ではロックが必要です。5.6以降では、InnoDBを使用すると、ALTER TABLE列の追加など多くの操作ではロックは必要ありません


MySQL 5.5 以前を使用している場合は、操作全体にわたって読み取りロックがかかり、最後に短時間の書き込みロックがかかります。

MySQLのALTER TABLEのドキュメントより...

ほとんどの場合、ALTER TABLEは元のテーブルの一時的なコピーを作成します...ALTER TABLEの実行中、元のテーブルは他のセッションから読み取り可能です(例外については後ほど説明します)。ALTER TABLE 操作の開始後に開始されるテーブルへの更新と書き込みは、新しいテーブルの準備が整うまで停止されます...

前述の例外は、ALTER TABLE が、テーブル .frm ファイルの新しいバージョンをインストールし、古いファイルを破棄し、テーブルおよびテーブル定義キャッシュから古いテーブル構造をクリアする準備ができた時点で、読み取り (書き込みだけでなく) をブロックすることです。この時点で、排他ロックを取得する必要があります。

つまり、列を追加すると、操作の大部分でテーブルが読み取りロックされ、最後に書き込みロックが取得されます。


MySQL 5.6では、オンラインDDLInnoDBでは、テーブルやインデックスの変更など、多くの処理が高速化され、改善されます。テーブルに列を追加しても、テーブルロックは不要になります。ただし、操作の開始時と終了時に短時間の排他ロックが発生する可能性がある。

それすべき自動的に行われますが、必ず設定しALGORITHM=inplaceてステートメントLOCK=noneに従ってくださいALTER TABLE

例外が1つあります...

MySQL 5.6 より前に作成された InnoDB テーブルは、時間列 (DATE、DATETIME、または TIMESTAMP) を含み、ALTER TABLE ... ALGORITHM=COPY を使用して再構築されていないテーブルに対して ALTER TABLE ... ALGORITHM=INPLACE をサポートしません。

おすすめ記事