mysql 高速化 代替テーブル追加列には時間がかかります




oak-online-alter-table (3)

私は、これについての適切な答えは、 pt-online-schema-changegh-ostような機能を使用していると思います。

これで40億行以上の移行を完了しましたが、停止時間が1分未満で最大10日かかることがあります。

Perconaは上記と非常によく似た方法で動作します

  • テンポラリテーブルを作成する
  • 一時テーブルにレプリケートされるように、最初のテーブル(挿入、更新、削除)のトリガを作成します。
  • 小規模なバッチでは、データを移行する
  • 完了したら、テーブルの名前を新しいテーブルに変更し、もう一方のテーブルを削除します

私は、データベース内のテーブル(main_table)に "location"という列を追加しようとしていました。 私が実行したコマンドは

ALTER TABLE main_table ADD COLUMN location varchar (256);

main_tableには、2,000,000を超える行が含まれています。 それは2時間以上継続しており、まだ完了していません。

mytopを使用してこのデータベースのアクティビティを監視して、クエリが他のクエリプロセスによってロックされていないことを確認しようとしましたが、そうではないようです。 それは長い時間がかかりますか? 実際には、このコマンドを実行する前にマシンを再起動したばかりです。 このコマンドはまだ実行中です。 私は何をすべきか分かりません。


あなたのケースのような大きなデータでAlter Tableには長い時間がかかりますので、このような状況では使用しないでください。このようなコードを使用してください:

select main_table.*, 
  cast(null as varchar(256)) as null_location, -- any column you want accepts null
  cast('' as varchar(256)) as not_null_location, --any column doesn't accept null
  cast(0 as int) as not_null_int, -- int column doesn't accept null
into new_table 
from main_table;

drop table main_table;
rename table new_table TO main_table;

ALTER TABLE文は、mysqlが新しいカラムを含むテーブルのすべての単一の行を書き直さなければならないことを意味します。 2百万行以上の行があるため、かなりの時間がかかることが予想されますが、その間にサーバーが大部分のIOバウンドになる可能性があります。 あなたは通常、次のことを行う方がより効果的であることがわかります:

CREATE TABLE main_table_new LIKE main_table;
ALTER TABLE main_table_new ADD COLUMN location varchar(256);
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table;
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table;
DROP TABLE main_table_old;

このようにして、空のテーブルに列を追加し、基本的には、新しいテーブルにデータを書き込んで、他の誰も見ていないことを確かめます。







alter