オンラインDDL (Online DDL)
- 定義:DDL操作を実行している間も、ユーザーはデータベースへの読み取りおよび書き込み操作を継続できます。
- 利点:業務への影響が少なく、システム稼働中にDDL操作を実行できるため、高可用性が求められるシナリオで一般的に使用されます。
- 特徴:通常、同時アクセスをサポートし、ロックが少ないため、ダウンタイムを短縮できます。
オフラインDDL (Offline DDL)
- 定義:DDL操作を実行する際、関連するテーブルがロックされ、データのクエリは可能ですが、書き込みはブロックされます。
- 利点:シンプルで実装しやすく、業務への影響が小さい場合に適しています。
- 特徴:DDL操作の実行時には一定のダウンタイムが発生し、通常のクエリやトランザクション処理に影響します。
トランザクションの関連性
- トランザクション:一連の操作のことで、すべて成功するか、すべて失敗するかのどちらかであり、トランザクションの実行中はデータの一貫性が保証されます。
- オンラインDDLとオフラインDDLの操作は通常、個別に行われます。また、DDL操作自体がトランザクションによって制御されない場合もあります(特にオフラインDDLの場合)。
トランザクション待機ポリシー
- オンラインDDL:通常、現在のトランザクションが終了するのを待つ必要はなく、並行して実行できます。
- オフラインDDL:通常、現在のトランザクションが終了するのを待つ必要があります。これは、実行中に関連するテーブルがロックされるためです。
OceanBaseデータベースV4.xバージョンのMySQLモードでサポートされているOnline DDL操作は以下の表のとおりです。
分類 |
操作 |
耗時 |
備考 |
创建物化视图日志(mlog)后 DDL 支持情况 |
|---|---|---|---|---|
| インデックス操作 | インデックスの追加 | データ量に依存し、データの再編成が必要 | 主にグローバル/ローカルインデックス、パーティション付きグローバルインデックス、および空間インデックスが対象です(V4.1.0以降のバージョンでサポート)。 | サポート |
| インデックス操作 | インデックスの削除 | アクティブなトランザクションの有無に依存 | なし | サポート |
| インデックス操作 | インデックス名の変更 | メタデータの変更のみが必要 | なし | サポート |
| インデックス操作 | ハイブリッドインデックス操作 | データ量に依存し、インデックスデータの補完が必要 | 例えば ALTER TABLE t1 ADD INDEX i4(c1), DROP INDEX i2, RENAME INDEX i1 TO i1x のような操作です。 |
サポート |
| 列操作 | Skip Indexタイプの追加/変更/削除 | テーブルスキーマの変更のみ | なし | サポートなし |
| 列操作 | 列の末尾への追加 | メタデータの変更のみ | 例えば LOB(TEXT) 列を追加する場合、ALTER TABLE tbl1 ADD c3 LOB のようにします。 |
サポート
注意OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP1バージョンからマテリアライズドビューのログベーステーブルに列を追加することがサポートされています。 |
| 列操作 | 列の途中への追加 (BEFORE/AFTER/FIRST) |
データ量に依存し、データの再編成が必要(元のデータを書き直す必要があるため) | なし | サポート
注意OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP1バージョンからマテリアライズドビューのログベーステーブルに列を追加することがサポートされています。 |
| 列操作 | VIRTUAL 列の追加 |
メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列を NOT NULL に変更 |
データ量に依存し、データのクエリが必要 | なし | サポートなし |
| 列操作 | 列を NULL に変更 |
メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列のデフォルト値の設定 | メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列のデフォルト値の削除 | メタデータの変更のみ | なし | サポートなし |
| 列操作 | 自動インクリメント列の値の変更 | メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列名の変更 | メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列の型の長さまたは精度の増加 | メタデータの変更のみ | 例えば INT の長さを増やしたり、VARCHAR を可変長に変更したりする場合です。 |
サポートなし |
| 列操作 | 列の複合操作 | 最も時間のかかる操作に依存します | 単一列の操作はOnlineですが、複合列の操作はほとんどがOnlineです。Online DDLかどうかを確認するには、次の章 DDL操作がオンライン操作(Online DDL)かどうかの判断方法 の方法で確認してください。 | サポートなし |
| 外部キー制約操作 | 外部キー、CHECK/NOT NULL 制約の追加 |
データ量に依存し、データのクエリが必要です。 | なし | 外部キー制約の追加はサポートされますが、CHECK/NOT NULL 制約の追加はサポートされません |
| 外部キー制約操作 | 外部キー、CHECK/NOT NULL 制約の削除 |
データ量に依存し、データのクエリが必要です。 | なし | 外部キー制約の削除はサポートされますが、CHECK/NOT NULL 制約の削除はサポートされません |
| テーブル操作 | テーブル名の変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | 行フォーマットの変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | ブロックサイズの変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | 圧縮アルゴリズムの変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | テーブルスペースの最適化 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | 行ストアからカラムストアへの変換
注意
|
テーブルスキーマの変更のみ | なし | サポートなし |
| テーブル操作 | 行ストアから行と列のハイブリッドストアへの変換
注意
|
テーブルスキーマのみの変更 | 現在なし | サポートなし |
| パーティション操作 | パーティションの追加 | メタデータの変更のみが必要 | 現在なし | サポートなし |
| パーティション操作 | 自動パーティション属性のみの変更 | メタデータの変更のみが必要 | 例:
|
サポートなし |
OceanBaseデータベースV4.xバージョンのMySQLモードでサポートされているOffline DDL操作は、次の表のとおりです。
注意
以下の表に記載されている、全文インデックス、複数値インデックス、ベクトルインデックス作成後のDDLサポート状況は、V4.3.5 BP2以降のバージョンに適用されます。
分類 |
操作 |
耗時 |
備考 |
マテリアライズドビューのログ(mlog)作成後のDDLサポート状況 |
全文/複数値/ベクトルインデックス作成後のDDLサポート状況 |
|---|---|---|---|---|---|
| 列操作 | 並べ替え(BEFORE/AFTER/FIRST) |
データ量に依存し、データの再構築が必要 | 暂無 | 不支持 | 支持 |
| 列操作 | 自動インクリメント列の追加 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| 列操作 | 自動インクリメント列への変更 | データ量に依存し、データのクエリが必要 | 暫定なし | 不支持 | 支持 |
| 列操作 | 列型の変更 | データ量に依存し、データの再構築が必要 | 暂無 | 不支持 | 支持 |
| 列操作 | 列を主キーに変更 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| 列操作 | STORED生成列の追加・削除 |
データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| 列操作 | 列の削除 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| 列操作 | VIRTUAL列の削除 |
データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| 列操作 | 混合列操作 | Offline列操作がある場合、Offline DDLに昇格します。 | 暫定なし | 不支持 | 支持 |
| 列操作 | decimal型の精度の変更 |
データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| 主キー操作 | 主キーの追加・削除 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | TRUNCATEテーブル |
アクティブトランザクションの有無に関連 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | 文字セットの変換 | データ量に依存し、データの再構築が必要 | 暂無 | 不支持 | 支持 |
| テーブル操作 | テーブルの削除 | アクティブトランザクションの有無に関連 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | 行ストアからカラムストアへの変換
注意
|
データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | 行ストアから行列混在への変換
注意
|
データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | カラムストアから行ストアへの変換 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | カラムストアから行列混在への変換 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | 行列混在からカラムストアへの変換 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| テーブル操作 | 行列混在から行ストアへの変換 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| パーティション操作 | パーティションルールの変更 | データ量に依存し、データの再構築が必要 | 暫定なし | 不支持 | 支持 |
| パーティション操作 | パーティションの削除 | アクティブトランザクションの有無に関連 | 当該パーティションにパーティションレベルのテーブルロックをかけます。 | 不支持 | 支持 |
| パーティション操作 | TRUNCATEパーティション |
アクティブトランザクションの有無に関連 | 当該パーティションにパーティションレベルのテーブルロックをかけます。 | 不支持 | 支持 |
| パーティション操作 | パーティションの交換 | アクティブトランザクションの有無に関連 | 当該パーティションにパーティションレベルのテーブルロックをかけます。 | 不支持 | 不支持 |
| パーティション操作 | パーティションの手動分割 | データ量に依存し、データの再構築が必要 | 暂無 | 不支持 | 不支持 |
| パーティション操作 | 自動パーティション属性及びパーティションルールの変更 | データ量に依存 | 例:ALTER TABLE t1 PARTITION BY RANGE(xxx) SIZE('xxx') (PARTITION...); |
不支持 | 支持 |
DDL操作がオンライン操作(Online DDL)かどうかの判断方法
OceanBaseデータベースでは、DDL操作のオンラインまたはオフラインの状態は、業務運用にとって非常に重要です。本記事では、DDL操作がOnline DDLかどうかを判断する方法を紹介し、具体的な操作手順と注意点を提供します。列型の変更や混合DDL操作など、実行前にOnline DDLかどうかが不確定な場合は、以下の方法で事前に検証・判断することを推奨します。
DDLがオンライン操作かどうかの判断方法
一部の操作は対象範囲が広く、DDL操作がオンラインかオフラインかを完全に列挙することはできません。混合DDL操作を行う際には、その操作がオンライン操作であるかどうかを明確にすることを推奨します。
オフラインDDLの原理:
OceanBaseのオフラインDDL操作は、「テーブルの再構築」という方式を採用しています。具体的には、オフラインDDLは一時的な隠れたテーブル(ユーザーには不可視)を新規作成し、元のテーブルのデータを新規作成したテーブルに移行します。データ移行完了後、一時テーブルは元のテーブル名にリネームされ、古いテーブルは削除されます。したがって、オフラインDDL操作完了後、table_idは変更されるため、DDL実行中はDDL操作を許可しないよう注意する必要があります。
この原理を利用することで、特定のDDL操作がオンラインDDLかどうかを判断できます。
判断方法:
DDL操作の前後で以下のSQLステートメントを実行し、table_id が変更されたかどうかを確認します。変更がない場合はOnline DDL、変更がある場合はOffline DDLです。
select distinct(table_id) from oceanbase.DBA_OB_TABLE_LOCATIONS where table_name='xxx';
判断手順:
以下の手順に従って、DDL操作がOnline DDLかどうかを判断します。
検証用の空のテーブルを作成します:
CREATE TABLE t10(a INT, b INT);現在の
table_idを確認します:SELECT distinct(table_id) FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE table_name='t10';予想されるDDL操作を実行します:
ALTER TABLE t10 ADD c INT, ADD CONSTRAINT c_idx UNIQUE(c);再度
table_idを確認します:SELECT distinct(table_id) FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE table_name='t10';ステップ2とステップ4で返された結果の
table_idが同じ場合、このDDL操作はオンラインです。table_idが変更されている場合、対応するDDL操作はオフラインです。
説明
この判断方法は、テーブル操作やパーティション操作には適用できません。