しばらくビジネスを実行した後、元の主キーの設定が妥当ではないことがわかり、この時点で主キーを変更したいと思いました。この種の需要は、実際の生産においても依然として非常に大きいです。
それでは、pt-online-schema-change がこの種の問題をどのように解決するかを見てみましょう。
まず、テストテーブルを作成します
create table t2(c1 int Primary Key, c2 int);
テストデータを構築します
delimiter // create procedure p1() begin declare v1 int default 1; set autocommit=0; while v1 <=100000 do insert into test.t2(c1,c2) values(v1,v1+100); set v1=v1+1; if v1%1000 =0 then commit; end if; end while; end // delimiter ; call p1;
次に、pt-online-schema-change を使用して t2 を変更しますtable 主キーを変更します
1. 列 c1 に一意のキーを追加します
# pt-online-schema-change --execute --alter "modify c1 int unique key" --print D=test,t=t2
このとき、テーブルt2のテーブル構造は以下の通りです。
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) DEFAULT NULL, PRIMARY KEY (`c1`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.03 sec)
2. カラムc1の主キーを削除します
# pt-online-schema-change --execute --alter "drop Primary key" -- no-check-alter - -print D=test,t=t2
注: 主キーを削除するには、--no-check-alter オプションを追加する必要があります
このとき、t2 のテーブル構造は次のようになります次のように:
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) DEFAULT NULL, UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.05 sec)
3. 列 c2 に主キーを追加します
# pt-online-schema-change --execute --alter "modify c2 int Primary key" --print D=test,t=t2
このとき、t2のテーブル構造は以下の通りです:
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL, PRIMARY KEY (`c2`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.02 sec)
4.
# pt-online-schema-change --execute --alter "drop key c1" --print D=のカラムc1の一意キーを削除します。 test,t=t2
この時点で、t2の主キーの変更は完了です
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL, PRIMARY KEY (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.02 sec)