オンライン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) |
データ量に依存し、データの再構築(既存データの書き直しが必要)が必要 | Oracleモードではサポートされていません | サポート
注意OceanBaseデータベースV4.3.5では、V4.3.5 BP1からマテリアライズドビューのログを使用したベーステーブルへの列追加がサポートされています。 |
| 列操作 | VIRTUAL列の追加 |
メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列をNOT NULLに変更 |
データ量に依存し、データのクエリが必要 | なし | サポートなし |
| 列操作 | 列をNULLに変更 |
メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列のデフォルト値の設定 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列のデフォルト値の削除 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 自動インクリメント列値の変更 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列名の変更 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列の型の長さまたは精度の増加 | メタデータの変更のみが必要 | 例:INTの長さの増加、VARCHARの可変長、NUMBER型の変換。 |
サポートなし |
| 列操作 | ハイブリッド列操作 | 最も時間のかかる操作に依存 | 単一列操作はオンラインですが、ハイブリッド列操作はほとんどがオンラインです。オンライン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以降のバージョンに適用されます。
- 共有ストレージモードでは、全文/複数値/ベクトルインデックスはOffline DDLをサポートしません。
分類 |
操作 |
耗時 |
備考 |
マテリアライズドビューのログ(mlog)作成後のDDLサポート状況 |
フルテキスト・複数値・ベクトルインデックス作成後のDDLサポート状況 |
|---|---|---|---|---|---|
| 列操作 | 並べ替え(BEFORE/AFTER/FIRST) |
データ量に依存し、データ再編成が必要 | Oracleモードではサポートされていません | 不支持 | 支持 |
| 列操作 | 自動インクリメント列の追加 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| 列操作 | 自動インクリメント列への変更 | データ量に依存し、データのクエリが必要 | 現在なし | 不支持 | 支持 |
| 列操作 | 列型の変更 | データ量に依存し、データ再編成が必要 | Oracleモードではサポートされていません | 不支持 | 支持 |
| 列操作 | 列を主キーに変更 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| 列操作 | STORED生成列の追加・削除 |
データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| 列操作 | 列の削除 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| 列操作 | VIRTUAL列の削除 |
データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| 列操作 | 混合列操作 | オフライン列操作がある場合、オフラインDDLに昇格します。 | 現在なし | 不支持 | 支持 |
| 主キー操作 | 主キーの追加・削除 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| テーブル操作 | TRUNCATEテーブル |
アクティブトランザクションの有無に関連 | 現在なし | 不支持 | 支持 |
| テーブル操作 | 文字セットの変換 | データ量に依存し、データ再編成が必要 | Oracleモードではサポートされていません | 不支持 | 支持 |
| テーブル操作 | テーブルの削除 | アクティブトランザクションの有無に関連 | 現在なし | 不支持 | 支持 |
| テーブル操作 | 行ストアからカラムストアへの変換
注意
|
データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| テーブル操作 | 行ストアから行列混合ストアへの変換
注意
|
データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| テーブル操作 | カラムストアから行ストアへの変換 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| テーブル操作 | カラムストアから行列混合ストアへの変換 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| テーブル操作 | 行列混合ストアからカラムストアへの変換 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| テーブル操作 | 行列混合ストアから行ストアへの変換 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| パーティション操作 | パーティションルールの変更 | データ量に依存し、データ再編成が必要 | 現在なし | 不支持 | 支持 |
| パーティション操作 | パーティションの削除 | アクティブトランザクションの有無に関連 | 当該パーティションにパーティションレベルのテーブルロックをかけます。 | 不支持 | 支持 |
| パーティション操作 | パーティションの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実行中はDML操作が許可されない点に注意が必要です。
この原理を利用することで、特定のDDL操作がOnline 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操作はオフラインです。
説明
この判断方法は、テーブル操作およびパーティション操作には適用されません。