概要
レコード数が少ない間は問題にならなかったけど、レコード数が多くなると
select insertでコピーするのは厳しくなってきたので、
EXCHANGE PARTITIONでパーティションデータを別テーブルに移動させてみました。
(古くなったデータをアーカイブするときに便利)
準備
テーブル作成
中間テーブルとアーカイブ用テーブルを作成します。
中間テーブルは元テーブルとパーティション以外は同じ定義にしないとダメで、
アーカイブ用テーブルは移動元テーブルと同じ定義にします。
show create table で確認して移動元と同じ定義でテーブルを作ったけど、エラーが、、
Non matching attribute 'ROW_FORMAT' between partition and table
show table status likeでROW_FORMATを確認してみると異なってました。
create table or alter tableで移動元と同じROW_FORMATを指定してください。
処理
パーティションpをpartitioned_dataからpartitioned_data_archiveに移動させます。
中間テーブルを空にする
TRUNCATE TABLE no_partitioned_data_tmp;
パーティションpをpartitioned_dataから中間テーブルに移動
ALTER TABLE partitioned_data
EXCHANGE PARTITION p
WITH TABLE no_partitioned_data_tmp
WITHOUT VALIDATION;
中間テーブルのデータをpartitioned_data_archiveのパーティションpに移動
ALTER TABLE partitioned_data_archive
EXCHANGE PARTITION p
WITH TABLE no_partitioned_data_tmp
WITHOUT VALIDATION;
partitioned_dataのパーティションpを削除
ALTER TABLE partitioned_data DROP PARTITION p;
結果
30分程度掛かるパーティションデータの退避処理が5秒程度に改善されました。
MySQL5.7から EXCHANGE PARTITION のオプションで移動元テーブルの
データ検証を行わない WITHOUT VALIDATION が追加されてますので
範囲外のデータがないことが保証されてる場合はこちらを指定すると低コストで移動できます。