MySQLはALTER TABLE
を実装します テーブルの再作成として、プロセス中のある段階でテーブルの2つのコピーがシステムに存在します。この操作には12GBを超える空き容量が必要です。
スペースを空けてください。または、別の一時ディレクトリを使用するようにサーバーを設定します 、十分なスペースがある場所。
代替案の代替案(WHILE
ストアドプロシージャでラップする必要がある場合があります):
- 新しいテーブルを作成します(
temp_table
)新しい構造で -
original_table
から小さなバッチでデータを転送するtemp_table
に - ドロップ
original_table
temp_table
の名前を変更します
-- useful only if concurrent access is allowed during migration
LOCK TABLES original_table WRITE, temp_table WRITE;
SELECT COUNT(*) INTO @anythingleft FROM original_table;
WHILE @anythingleft DO
-- transfer data
INSERT INTO temp_table
SELECT
original_table.old_stuff,
"new stuff"
FROM original_table
ORDER BY any_sortable_column_with_unique_constraint -- very important!
LIMIT 1000; -- batch size, adjust to your situation
DELETE FROM original_table
ORDER BY any_sortable_column_with_unique_constraint
LIMIT 1000; -- ORDER BY and LIMIT clauses MUST be exactly the same as above
SELECT COUNT(*) INTO @anythingleft FROM original_table;
END WHILE;
-- delete, rename
DROP TABLE original_table;
UNLOCK TABLES;
RENAME TABLE old_table TO original_table;
テーブルでInnoDBを使用している場合は、SELECT ... FOR UPDATE;
を使用してより複雑なソリューションを使用できます。 テーブルロックの代わりに、しかし私はあなたがアイデアを得ると信じています。