久し振りの投稿。

MariaDBを10.3から10.4にupgradeして、色々検証中。

まずは、INSTANTの拡張について記載します。

検証したバージョンは、10.4.8-communityです。


10.3で導入されたINSTANT機能ですが、10.4になって以下のように拡張されています。

  • ALTER TABLE … ADD COLUMN(末尾への追加、10.3で導入)
  • ALTER TABLE … DROP COLUMN(カラム削除、ただしINDEXなし)
  • ALTER TABLE … MODIFY COLUMN(カラム変更)
    • Reordering Columns(順序変更、つまりafterが使える)
    • Changing the Data Type of a Column(varcharは最大まで、varbinaryは255まで、text型はダメ)
    • Changing a Column to NULL(NULL許可へ変更)
    • Adding a New ENUM Option(ENUM値の追加)
    • Adding a New SET Option(SET値の追加)
    • Removing System Versioning from a Column(system versionedの外し)
  • ALTER TABLE … ALTER COLUMN(カラム修正)
    • Setting a Column’s Default Value(デフォルト値の設定)
    • Removing a Column’s Default Value(デフォルト値の削除)
    • ALTER TABLE … CHANGE COLUMN(カラム名変更)
  • ALTER TABLE … DROP INDEX and DROP INDEX(Secodary INDEX削除)
  • ALTER TABLE … DROP FOREIGN KEY(外部キー削除)
  • ALTER TABLE … AUTO_INCREMENT=…(AUTOインクリメント値再設定)
  • ALTER TABLE … PAGE_COMPRESSED=1 and ALTER TABLE … PAGE_COMPRESSION_LEVEL=…(1のみ)
  • ALTER TABLE … DROP CONSTRAINT(制約の削除)
  • ALTER TABLE … RENAME TO and RENAME TABLE …(テーブル名変更)

(参考)

https://mariadb.com/kb/en/library/innodb-online-ddl-operations-with-the-instant-alter-algorithm/

※varcharの拡張は、utf8mb4環境で、最大まで一瞬でした。

※varbinaryについては公式に記載ありませんが、255までなら一瞬でした。256からはCOPYとなるようです。

いやー数が多いですね。

ここには記載がありませんが、virtualの生成列も一瞬で生成可能なので、これもINSTANTとしていいのかなと。

で、INSTANTを発動させるためには、DDLを発行する前に、

SET SESSION alter_algorithm='INSTANT';

をやると、INSTANT以外のものはエラーとなるのですが、

MariaDB [test]> select @@alter_algorithm;
+-------------------+
| @@alter_algorithm |
+-------------------+
| DEFAULT           |
+-------------------+

の状態であれば、INSTANT可能なDDLであれば、INSTANTが選択されるようです。

ただ、これ明示的な記載がないのが気になるところですが。。

(参考)

https://mariadb.com/kb/en/library/server-system-variables/#alter_algorithm


いくつか実験してみました。

以下のようなテーブルに大量にデータ入れてみます。

MariaDB [test]> create table user (
id integer not null auto_increment,
name varchar(64),
money_free integer,
money_paid integer,
primary key (id)
);
MariaDB [test]>  select count() from user;
+----------+
| count() |
+----------+
| 16777214 |
+----------+

これまでは、INSTANTが機能されると、

SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column';

の結果がインクリメントされるのですが、

MariaDB [test]> alter table user modify column name varchar(8192);
Query OK, 0 rows affected (0.017 sec)

などのvarchar拡張やら、enum追加などは、innodb_instant_alter_columnの値が増えませんでした。

これは、どうやら内部的には10.2でサポートされた拡張については、innodb_instant_alter_columnをインクリメントしないという意図的な動きのようです。

https://jira.mariadb.org/browse/MDEV-20801

ここまで広い範囲をカバーしてもらえると、DDL変更の運用負荷がとても下がりますね。

残っている箇所が、INDEX関係なので、相当難しいと思いますが、今後も期待ですね。

以上

コメントがあればどうぞ


CAPTCHA Image
Reload Image