2016-03-24 8 views
2

テーブルを新しいスキーマに移行するときに、コピーと名前の変更手順を使用してアトミックスイッチを新しいテーブルに確実に作成したいと考えています。したがって、私はこのようなロックされたテーブルの名前を変更しようとしています:ロックされたテーブルの名前を変更する

CREATE TABLE foo_new (...) 

-- copy data to new table, might take very long 
INSERT INTO foo_new (id,created_at,modified_at) 
    SELECT * FROM foo WHERE id <= 3; 

LOCK TABLES foo WRITE, foo_new WRITE; 

-- quickly copy the tiny rest over 
INSERT INTO foo_new (id,created_at,modified_at) 
    SELECT * FROM foo WHERE id > 3; 

-- now switch to the new table 
RENAME TABLE foo TO foo_old, foo_new TO foo; 

UNLOCK TABLES; 

残念ながらそれはERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transactionになります。

これはどうやって別の方法で行うべきですか?

これはmariadb:10.1です。

答えて

7

ペルコナツール(12参照)を使用するのは一般的にはリックですが、質問に対する回答は実際にALTER TABLEです。私はRENAMEがちょうどエイリアスだと思ったが、it seems like that's not the caseだと思った。

テストは、これはOK働くことを示しているように見える:

CREATE TABLE foo_new (...) 

-- copy data to new table, might take very long 
INSERT INTO foo_new (id,created_at,modified_at) 
    SELECT * FROM foo WHERE id <= 3; 

LOCK TABLES foo WRITE, foo_new WRITE; 

-- quickly copy the tiny rest over 
INSERT INTO foo_new (id,created_at,modified_at) 
    SELECT * FROM foo WHERE id > 3; 

-- now switch to the new table 
ALTER TABLE foo RENAME TO foo_old; 
ALTER TABLE foo_new RENAME TO foo; 

UNLOCK TABLES; 
1

あなたはこのようにそれを行うことができます。エラーメッセージの状態として

CREATE TABLE foo_old (...) 
LOCK TABLES foo WRITE; 
INSERT INTO foo_old (id,created_at,modified_at) 
    SELECT * FROM foo; 
DELETE FROM foo WHERE id <= 3; 
UNLOCK TABLES; 

、ロックされた同じテーブルを持ちながら、あなたがRENAME TABLEを使用することはできません。

+0

現在の方法で間違っていたとあなたの答えでdfferenceは何でしょうか? – Martin

+0

違いは、テーブルがロックされているときには不可能な 'RENAME TABLE'を使う必要がないということです(質問のエラーメッセージを見てください)。 – fancyPants

+0

もう一つのテーブルが別のスキーマを持っているので、私は 'rename table'を使う必要があります。なぜ 'delete'なのかも分かりません。 – tcurdt

0

車輪を再発明しないでください。Perconaのpt-online-schema-changeを使用してください。それは細部の世話をします。

関連する問題