すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:[非推奨] TokuDB を InnoDB に変換

最終更新日:Mar 29, 2026

2019 年 8 月 1 日より、ApsaraDB RDS for MySQL は TokuDB ストレージエンジンをサポートしなくなります。本トピックでは、テーブルを TokuDB から InnoDB へ移行する手順について説明します。

背景情報

Percona 社が TokuDB のメンテナンスを中止したため、既知のバグが修正されず、極端なケースでは業務損失を引き起こす可能性があります。このため、ApsaraDB RDS for MySQL は 2019 年 8 月 1 日より TokuDB のサポートを終了しました。

  • 適用開始日:2019 年 8 月 1 日

  • 影響範囲:TokuDB ストレージエンジンを使用している RDS インスタンス

インスタンスへの影響の確認

Data Management (DMS) で以下の SQL 文を実行し、TokuDB テーブルを特定します。

-- RDS インスタンスのデフォルトストレージエンジンを表示
SHOW ENGINES;

-- 特定のテーブルのストレージエンジンを表示
SHOW CREATE TABLE <table_name>;

潜在的な影響

警告

移行中にストレージ使用量が約 2 倍になります。移行を開始する前に、現在の TokuDB ストレージ容量の少なくとも 2 倍分の空き容量がインスタンスに確保されていることをご確認ください。

移行を実施する前に、以下の影響を確認してください。

  • CPU および IOPS:移行後、同一データ量の読み取りにおいて CPU 使用率は低下しますが、InnoDB はデータページを圧縮しないため IOPS は増加します。

  • エンドポイントの切り替え:完全移行では接続エンドポイントが切り替わります。移行作業はトラフィックが少ない時間帯に実施してください。

  • データベースエンジンバージョンの変更:移行中にデータベースエンジンバージョンを変更する場合は、事前に互換性を検証してください。

ソリューションの選択

テーブルサイズおよびダウンタイムに対する許容度に応じて、適切なソリューションを選択してください。

ソリューション推奨用途ダウンタイム複雑さ
ソリューション 1:ALTER TABLEテーブルサイズが 100 MB 未満で、短時間のブロッキングが許容される場合テーブル単位での短時間ブロッキング
ソリューション 2:gh-ostテーブルサイズが 5 GB を超える場合、またはテーブル単位での移行が必要な場合ほぼゼロ
ソリューション 3:DTS テーブルレベル同期テーブルサイズが 5 GB を超える場合、または多数のテーブルを一括で移行する場合ほぼゼロ
ソリューション 4:DTS インスタンス移行RDS インスタンス全体の移行またはインスタンスのスペックアップが必要な場合中程度(エンドポイントの切り替えが必要)
いずれかのソリューションを完了した後は、default_storage_engine パラメーターの値を InnoDB に変更してください。この手順を省略すると、明示的に ENGINE 句を指定せずに作成された新規テーブルが依然として TokuDB を使用しようとして、サポート終了によりエラーが発生します。詳細については、「移行後の対応」をご参照ください。

ソリューション 1:ALTER TABLE(直接変換)

このソリューションでは、単一の SQL ステートメントでストレージエンジンを直接変更します。操作中は DML 操作がブロックされるため、短時間のブロッキングが許容される小規模なテーブルにのみ適用可能です。

  1. を使用して、RDS インスタンスにログインします。

  2. 上部ナビゲーションバーで、SQL 操作SQL ウィンドウ を選択します。

  3. 以下のステートメントを実行します。

    ALTER TABLE test.testfs ENGINE = InnoDB;

ソリューション 2:gh-ost(オンライン移行)

このソリューションでは、GitHub 社が開発したオープンソースのオンライン DDL ツール「gh-ost」を使用します。バックグラウンドでデータをゴーストテーブルにコピーし、トラフィックが少ない時間帯に切り替えを行うことで、DML 操作のブロッキングを回避します。

仕組み

gh-ost は元のテーブルと同じスキーマを持つ一時的なゴーストテーブルを作成し、データを増分コピーします。その後、シミュレートされたレプリカ経由でバイナリログを読み取り、進行中の変更を再生します。準備が整ったら、テーブル名を変更して切り替えを完了します。初期のフルコピー時に I/O が一時的に増加しますが、--chunk-size パラメーターでスループットを制限できます。

  • 利点:切り替えタイミングを任意に指定でき、任意の時点で一時停止またはキャンセル可能です。

  • 制限事項:各テーブルに対して個別のコマンドが必要となるため、多数のテーブルを処理する際には煩雑になります。その場合は、代わりにソリューション 3 をご使用ください。

前提条件

  • gh-ost は、お客様のオンプレミスホストまたは Elastic Compute Service (ECS) インスタンスにインストールされています。

  • ホストの IP アドレスが RDS インスタンスの IP アドレスホワイトリストに登録済みであること。

パラメーター

パラメーター説明
--initially-drop-old-table開始前に既存の旧テーブルがあるかを確認し、存在すれば削除します。
--initially-drop-ghost-table開始前に既存のゴーストテーブルがあるかを確認し、存在すれば削除します。
--aliyun-rdsApsaraDB RDS との互換性モードを有効化します。
--assume-rbrRow Based Replication(RBR)形式でバイナリログを読み取ります。
--allow-on-mastergh-ost をプライマリインスタンス上で直接実行します。
--assume-master-hostプライマリインスタンスのエンドポイント
--userデータベースアカウント名
--passwordデータベースアカウントのパスワード
--hostデータベースエンドポイント(プライマリインスタンスのエンドポイントと一致する必要があります)
--databaseデータベース名
--tableテーブル名
--alter適用する DDL 句
--chunk-size1 バッチあたりのコピー行数
--postpone-cut-over-flag-file切り替え延期フラグファイルのパス。このファイルを削除すると切り替えが開始されます。
--panic-flag-file緊急停止フラグファイルのパス。このファイルを作成すると gh-ost が即座に停止します。
--serve-socket-fileインタラクティブな制御コマンド用のソケットファイル
--execute移行を実行します(このフラグを指定しない場合、gh-ost はドライランモードで実行されます)

gh-ost を使用したテーブル移行

  1. ホストまたは ECS インスタンスで、以下のコマンドを実行します。

    gh-ost \
      --user="test01" \
      --password="Test123456" \
      --host="rm-bpxxxxx.mysql.rds.aliyuncs.com" \
      --database="test" \
      --table="testfs" \
      --alter="engine=innodb" \
      --initially-drop-old-table \
      --initially-drop-ghost-table \
      --aliyun-rds \
      --assume-rbr \
      --allow-on-master \
      --assume-master-host="rm-bpxxxxx.mysql.rds.aliyuncs.com" \
      --chunk-size=500 \
      --postpone-cut-over-flag-file="/tmp/ghostpost.postpone" \
      --panic-flag-file="/tmp/stop.flag" \
      --serve-socket-file="/tmp/ghost.sock" \
      --execute

    gh-ost は 2 つの一時テーブル(_gho:ゴーストテーブル、_ghc:変更ログテーブル)を作成します。これらのテーブルは DMS の左側ナビゲーションウィンドウで確認できます。

  2. 切り替えの準備が整ったら、延期フラグファイルを削除します。

    テーブル名変更後に表示されるエラーはすべて無視して構いません — 移行は正常に完了しています。
    rm /tmp/ghostpost.postpone

    gh-ost は直ちにテーブル名を変更し、移行を完了します。

  3. データの整合性を確認した後、gh-ost が残した _del テーブルを削除します。

ソリューション 3:DTS テーブルレベル同期

このソリューションでは、Data Transmission Service(DTS)を使用して、元の TokuDB テーブルから新しい InnoDB テーブルへリアルタイムでデータを同期し、トラフィックが少ない時間帯にテーブル名を変更します。多数のテーブルを同時に処理できるため、バッチ移行に最適です。

DTS のデータ同期インスタンスは別途課金されます。料金の詳細については、「Data Transmission Service の料金」をご参照ください。
  1. を使用して、RDS インスタンスにログインします。

  2. 上部ナビゲーションバーで、SQL 操作SQL ウィンドウ を選択します。

  3. TokuDB テーブルと同じスキーマを持つ一時的な InnoDB テーブルを作成します。例:

    CREATE TABLE `testfs_tmp` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `vc` varchar(8000) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  4. DTS インスタンスの購入を行います。

  5. DTS コンソールの左側ナビゲーションウィンドウで、データ同期 をクリックします。

  6. 購入済みのインスタンスを見つけ、[操作] 列の 同期チャネルの設定 をクリックします。

  7. ソースおよび宛先インスタンスの詳細を設定します。

    SSL 暗号化を有効化すると、CPU 使用率が大幅に上昇します。設定方法については、「RDS インスタンスへの SSL 暗号化の設定」をご参照ください。
    セクションパラメーター
    ソースインスタンスの詳細インスタンスタイプRDS インスタンス
    インスタンス ID移行対象の RDS インスタンスを選択
    暗号化非暗号化 または SSL 暗号化
    宛先インスタンスの詳細インスタンスタイプRDS インスタンス
    インスタンス ID同じ RDS インスタンスを選択
    暗号化非暗号化 または SSL 暗号化

  8. ホワイトリストの設定と次へ をクリックします。

  9. 同期アカウントの作成を待機した後、次へ をクリックします。

  10. testfs テーブルを [選択されたテーブル] セクションに移動し、編集 をクリックします。

  11. 宛先テーブル名を testfs_tmp に設定し、OK をクリックします。

  12. 次へ をクリックします。

  13. 初期フルデータ同期 を選択し、事前チェック をクリックします。

  14. 事前チェックの完了を待機した後、閉じる をクリックします。

  15. 遅延 の値が 0 ミリ秒 になるまで待機します。これは、2 つのテーブルが完全に同期されたことを意味します。

  16. DMS の SQL ウィンドウで、テーブル名を変更して切り替えを完了します。

    テーブル名変更後に DTS が同期エラーを報告することがありますが、これは想定内の動作であり、無視して構いません。
     RENAME TABLE `testfs` TO `testfs_del`, `testfs_tmp` TO `testfs`;
  17. データの整合性を確認します。確認後、DTS インスタンスをリリースして課金を停止し、testfs_del テーブルを削除します。

ソリューション 4:DTS インスタンス移行

このソリューションでは、DTS を使用して RDS インスタンス全体を新しいインスタンスへ移行します。インスタンスのスペックアップが必要な場合や、エンドポイントの切り替えによる中程度のサービス中断が許容される場合に最適です。

  1. ソースインスタンスからすべてのスキーマスクリプトをエクスポートします。各スクリプト内で、ENGINE=TokuDBENGINE=InnoDB に置き換えます。例:

    CREATE TABLE t1 (id INT, name VARCHAR(10)) ENGINE=TokuDB;

    宛先:

    CREATE TABLE t1 (id INT, name VARCHAR(10)) ENGINE=InnoDB;
  2. 新しい RDS インスタンスを作成し、変更済みのスクリプトを使用してデータベースおよびテーブルを作成します。詳細については、「ApsaraDB RDS for MySQL インスタンスの作成」をご参照ください。

  3. DTS を使用して、ソースインスタンスから新しいインスタンスへデータを移行します。詳細については、「ApsaraDB RDS for MySQL インスタンス間の一方向データ同期の設定」をご参照ください。

    DTS タスクの設定時に、初期フルデータ同期 のみを選択してください。

  4. 同期遅延が 0 になったら、アプリケーションの接続文字列を新しいインスタンスのエンドポイントを指すように更新します。

移行後の対応

上記いずれかのソリューションを完了した後は、RDS インスタンスの default_storage_engine パラメーターを InnoDB に更新してください。

重要

この手順を省略すると、明示的に ENGINE 句を指定せずに作成された新規テーブルが依然として TokuDB を使用しようとして、サポート終了によりエラーが発生します。

パラメーターを更新するには、RDS コンソールにアクセスし、パラメーター に移動して、default_storage_engineInnoDB に設定します。