2016年6月24日金曜日

そのALTER TABLEがオンラインALTER TABLEかどうかを確かめる方法

MySQL 5.6以降の InnoDB オンラインDDL について、「これってオンラインでできたっけ?」とここ最近だけで何度か聞かれたので。
ちなみにここを見てもわかる。
何故か概要ページにできるかできないかの表があることと、 ALTER TABLE のページから概要ページに直接リンクがないので見つけにくいらしい。
で、このページを思い出せなくてもできるかどうか確認する方法。
  • 同じ構造を持った空のテーブルを作ります
mysql57> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `num` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `val` varchar(32) DEFAULT NULL,
  UNIQUE KEY `num` (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql57> CREATE TEMPORARY TABLE tt1 LIKE t1;
Query OK, 0 rows affected (0.00 sec)

  • 試したいALTER TABLEに LOCK=NONE を明示して実行するます
mysql57> ALTER TABLE tt1 ADD KEY (val), LOCK=NONE; -- インデックスの追加はできる
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql57> ALTER TABLE tt1 ADD FULLTEXT KEY (val), LOCK=NONE; -- FTインデックスの追加はできない
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED.

mysql57> ALTER TABLE tt1 MODIFY val varchar(63), LOCK=NONE; -- 255バイトをまたがないvarcharのサイズ変更はできる
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql57> ALTER TABLE tt1 MODIFY val varchar(64), LOCK=NONE; -- 255バイトをまたぐやつはできない
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: Cannot change column type INPLACE. Try LOCK=SHARED.

mysql57> ALTER TABLE tt1 MODIFY val varchar(63) CHARACTER SET latin1, LOCK=NONE; -- 文字コードの変換もできない
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: Cannot change column type INPLACE. Try LOCK=SHARED.
ね、簡単でしょ?

0 件のコメント :

コメントを投稿