# MySQL のSQL - スキーママイグレーション - ALTER TABLE に代表されるような - データマイグレーション - DDL: Data Definition Language - データ定義言語 - `ALTER`, `CREATE`, `DROP`, `TRUNCATE` など - DML: Data Manipulation Language - データ操作言語 - `DELETE`, `INSERT`, `SELECT`, `UPDATE` など - DCL: Data Control Language - データ制御言語 - `GRANT`, `REVOKE` など ## MySQL の Online DDL MySQL には Online DDL がある。 これはDMLによる操作をブロックせずに実行できるため、ユーザ影響なしで使うことができます。 - 長時間のロックを回避:ALTER操作に伴うテーブルのロック時間を短縮しすることができます。 - 安全な変更:ロールバック可能 - リードレプリカでも利用可能:リードレプリカでも利用可能です。 DDLの発行時にALGORITHMを指定することができます。 Online DDL の恩恵を受けるには `INPLACE`, `INSTANT` を指定します。 `INSTANT` は内部のメタデータのみを書き換えるため非常に高速で動作します。 ### 使用条件 全てのDDLでOnline DDLが利用できるわけでなく、以下の条件を満たす必要があります。 - ストレージエンジンがInnoDBであること - インデックスを変更しないALTER操作であること - ALTER操作に使用する列に対して、デフォルト値が定義されていること - MySQLの設定ファイルで、`innodb_online_alter_log_max_size`パラメータを適切に設定していること ### おまじない 使用条件等がよくわからない場合は、ALTER時に `ALGORITHM=INPLACE, LOCK=NONE` を指定することで確認できます。 Online DDL が利用できない場合はエラーが起きて実行しなくなります。 ```sql= ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; ``` Railsのデータベースマイグレーションでおまじないの付与は以下の様にするしかなさそうです。 ```ruby= class ChangeUsersTableComment < ActiveRecord::Migration def up execute "ALTER TABLE `users` COMMENT 'hello', ALGORITHM=INPLACE, LOCK=NONE" end def down execute "ALTER TABLE `users` COMMENT '', ALGORITHM=INPLACE, LOCK=NONE" end end ``` #### LOCK - [The LOCK clause] | Value | Description | | ----------- | -------------------------------------------------------------------------------------------------------- | | `NONE` | クエリやDMLの同時実行を許可する | | `SHARED` | 同時進行のクエリーは許可するが、DMLはブロック | | `DEFAULT` | 可能な限りの並行性(並行クエリ、DML、またはその両方)を許可します。`LOCK` を省略した時の挙動になります。 | | `EXCLUSIVE` | 並行するクエリやDMLをブロックします | #### Workshop - https://www.db-fiddle.com/f/jtKTNjvwVU7yd536tAVuhV/0 ## Also see - [InnoDB and Online DDL] - [MySQL 8.0 の INSTANT DDL について – スマートスタイル技術ブログ] - [MySQLのInstant ADD COLUMNをちゃんと調べてみる - y-asaba@hatenablog] ###### tags: `DB` `MySQL` [InnoDB and Online DDL]: https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html [MySQL 8.0 の INSTANT DDL について – スマートスタイル技術ブログ]:https://blog.s-style.co.jp/2018/09/2525/ [MySQLのInstant ADD COLUMNをちゃんと調べてみる - y-asaba@hatenablog]:https://y-asaba.hatenablog.com/entry/2018/12/21/002811 [The LOCK clause]:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-performance.html