スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL Shell ダンプユーティリティーのocimds オプション紹介

はじめに

MySQL Database Service(以下MDS)には、いくつかの制限があります。そのため、オンプレミスのMySQLからMDSへデータを移行しようとすると問題が発生する可能性があります。
MySQL Shellでは、オンプレミスのMySQLからMDSにデータをインポートする際に、互換性チェックに使用できるocimdsオプションがあります。今回このオプションについて紹介していきたいと思います。

今回は以下のバージョンで機能紹介と検証を行います。

  • MySQL 8.0.29
  • MySQL Shell 8.0.29

ocimdsオプションについて

ocimdsオプションを有効にすると、CREATE TABLEDATADIRECTORYINDEX DIRECTORYENCRYPTIONオプションがコメント化されます。
また、互換性のチェックも行われます。例えば、MDSではInnoDBストレージエンジンのみサポートされているため、MyISAMストレージエンジンを使用しているテーブルをダンプしようとすると、ダンプは停止します。

ここでチェックされる問題はcompatibility オプションを使用して出力内容を自動で修正することが可能です。

compatibility: array of strings
ダンプ出力のすべてのテーブルに MySQL Database Service との互換性のために指定された要件を適用し、ダンプファイルを necessary.From MySQL Shell 8.0.23 として変更します。このオプションはすべてのユーティリティで使用でき、そのリリースより前は、インスタンスダンプユーティリティおよびスキーマダンプユーティリティでのみ使用できます。

参照 : 8.5 インスタンスダンプユーティリティ、スキーマダンプユーティリティおよびテーブルダンプユーティリティ

以下のリストを指定することができます。

  • force_innodb
    InnoDB ストレージエンジンを使用していないテーブルをInnoDB ストレージエンジンに変更します。
    これは、MDSではInnoDBストレージエンジンのみサポートされているためです。

  • skip_invalid_accounts
    MDSでサポートされていない外部認証プラグインで作成されたユーザーアカウントを削除します。また、MySQL8.0.26以降ではパスワードが設定されていないユーザーアカウントも削除します。
    ただし、パスワードが設定されていないアカウントがロールとして識別される場合は、CREATE ROLEステートメントを使用してダンプされます。

  • strip_definers
    ビュー、ルーチン、イベント、トリガーからDEFINER句を削除します。
    また、ビューとルーチンの SQL SECURITY 句をDEFINER から INVOKERに変更します。

    これはMDSで特定の権限が制限されていることに関連しています。
    制限されている具体的な権限はドキュメントのデフォルトのMySQL権限を参照してください。

    ビュー、ルーチン、イベント、トリガーを作成する際はDEFINER句でユーザーを指定できます。
    SET_USER_ID権限かSUPER権限を持つユーザーであれば、任意のユーザーを指定することが可能です。
    この権限を持たないユーザーは自身のアカウントのみを指定することができます。

    前述の通り、MDSに作成される管理ユーザのデフォルトのMySQL権限にはSET_USER_IDSUPER権限も含まれていないため、MDSではロードを実行するユーザーがDEFINERとなります。

  • strip_restricted_grants
    MDSによって制限されている特定の権限を削除します。
    これは上で説明した通り、MDSでは一部権限を付与できないことに関係しています。

  • strip_tablespaces
    すべてのテーブルがデフォルトのテーブルスペースに作成されるように、CREATE TABLE ステートメントから TABLESPACE 句を削除します。 MySQL Database Service には、テーブルスペースに対するいくつかの制限があります。

  • ignore_missing_pks
    テーブルに主キーがない場合も無視してダンプを実行します
    MDSでは主キーに関する制限はありません。ただし、高可用性では前提として主キーが必要となります。

  • create_invisible_pks
    主キーがないテーブルに主キーを追加します

検証

実際に、前章で紹介した、MDSと互換性のない機能などをMySQLで使用して、ダンプをとります。
そして、ocimdsオプションを使用した場合と使用していない場合のダンプファイルを比較してみます。

次のように互換性のないオブジェクトを作成していきます。

MyISAMテーブルの作成

テーブルスペースを作成し、TABLESPACE句で指定する

主キーがないテーブルを作成する。

空のパスワードを設定できるようにmy.cnfに以下の設定を追加する

ユーザー(パスワードなし)とロールを作成する

トリガーとルーチンを作成

まずはocimdsオプションなしでダンプします。

次に、ocimdsオプションを使用してダンプします。なお今回は、create_invisible_pksを使用し主キーがないテーブルに主キーを追加するようにします。

ダンプされるファイルの種類に違いはありませんでした。

それでは、それぞれ変更された部分を確認していきます。

まずd1.sqlを確認するとCREATE DATABASEからENCRYPTION句がコメントアウトされていました。
ドキュメントにはCREATE TABLEからENCRYPTION句をコメントアウトすると記載されていましたが、
CREATE DATABASEENCRYPTION句も削除するようです。

これは、CREATE TABLEENCRYPTION 句が指定されていない場合、テーブルはスキーマの設定が継承されるためだと思われます。

d1@t1.sqlを確認するとENGINEがMyISAMからInnoDBに修正されています。

d1@t2.sqlを確認するとTABLESPACE 句が削除されています。

d1@t3.sqlを比較します。
d1.t3には主キーを作成していませんが、DDLには差異はありませんでした。
ドキュメントにも、ダンプメタデータにフラグを追加して、MySQL Shellのダンプロードユーティリティに通知し、主キーを含まないテーブルごとに、非表示の列に主キーを追加する、とあります。

Add a flag in the dump metadata to notify MySQL Shell’s dump loading utility to add primary keys in invisible columns, for each table that does not contain a primary key.

参照 : 11.5 Instance Dump Utility, Schema Dump Utility, and Table Dump Utility

主キーの追加は、他と異なりDDLを書き換えたりはしないようです。

d2.sqlを比較します。
d1.sql同様、ENCRYPTION句がコメントアウトされていました。
また、プロシージャからDEFINER句が削除されています。
そして、procedure_2SQL SECURITY DEFINERとしていましたが、ocimdsオプションを使用しない場合は、SQL SECURITY 句は省略されており、ocimdsオプションをした場合は、SQL SECURITY INVOKERが追加されていました。

d2@t1.triggers.sqlを比較します。こちらもCREATE TRIGGER文からDEFINER句が削除されています。

最後に@.users.sql を比較します。見やすいように出力を半分に分けています。

nopass@localhostはパスワードが空なので、ocimdsオプションの場合は、nopass@localhostのCREATE USER文とGRANT文が削除されています。
また、role_testロールはCREATE USER IF NOT EXISTS 'role_test'@'%'からCREATE ROLE IF NOT EXISTS 'role_test'@'%'に修正されています。

続いて、root@localhostの権限について、もともとはすべての権限を持っていましたが、MDSの制限に基づいて権限が削除されています。

具体的には以下の権限が削除されていました。

まとめ

MDSの制限は複数あり、それらを把握しデータ移行の際にダンプファイルを手動で修正するのは大変です。
今回紹介したocimdsオプションを使用することで、これらを自動で修正してくれるため非常に便利な機能です。また、本記事で具体的にどのような修正が行われるかが確認できたかと思います。
データ移行の際は、ぜひMySQL Shellの活用をご検討ください。

Return Top