オンラインDDL (Online DDL)
- 定義:DDL操作を実行している間も、ユーザーはデータベースへの読み取りおよび書き込み操作を含むアクセスを継続できます。
- 利点:業務への影響が少なく、システム稼働中にDDL操作を実行できます。高可用性が求められるシナリオで一般的に使用されます。
- 特徴:通常、同時アクセスをサポートし、ロックが少ないため、ダウンタイムを短縮できます。
オフラインDDL (Offline DDL)
- 定義:DDL操作を実行する際、関連するテーブルがロックされ、データのクエリは可能ですが、書き込みはブロックされます。
- 利点:シンプルで実装しやすく、業務への影響が大きくない場合に適しています。
- 特徴:DDL操作の実行時には一定のダウンタイムが発生し、通常のクエリやトランザクション処理に影響します。
トランザクションの関連性
- トランザクション:一連の操作のことで、すべて成功するか、すべて失敗するかのどちらかであり、トランザクションの実行時にはデータの一貫性が保証されます。
- オンラインDDLとオフラインDDLの操作は通常、個別に行われます。また、DDL操作自体がトランザクションによって制御されることを、一部のデータベース管理システムではサポートしていない場合があります(特にオフラインDDLの場合)。
トランザクションの待機ポリシー
- オンラインDDL:通常、現在のトランザクションが終了するのを待つ必要はなく、並行して実行できます。
- オフラインDDL:通常、現在のトランザクションが終了するのを待つ必要があります。実行中は関連するテーブルがロックされるためです。
OceanBaseデータベースV4.xバージョンのOracleモードでサポートされているOnline DDL操作は以下の表のとおりです。
分類 |
操作 |
耗時 |
備考 |
マテリアライズドビューのログ(mlog)作成後のDDLサポート状況 |
|---|---|---|---|---|
| インデックス操作 | インデックスの追加 | データ量に依存し、データの再編成が必要 | 主にグローバル/ローカルインデックス、パーティションを含むグローバルインデックス、および空間インデックス(V4.1.0以降のバージョンでサポート)に関連します。 | サポート |
| インデックス操作 | インデックスの削除 | アクティブトランザクションの有無に関連 | なし | サポート |
| インデックス操作 | インデックス名の変更 | メタデータの変更のみが必要 | なし | サポート |
| インデックス操作 | ハイブリッドインデックス操作 | 最も時間のかかる操作に関連 | 例えば ALTER TABLE t1 ADD INDEX i4(c1), DROP INDEX i2, RENAME INDEX i1 TO i1x の構文は、Oracleモードではサポートされません。 |
サポートなし |
| 列操作 | Skip Indexタイプの追加/変更/削除 | テーブルスキーマの変更のみ | なし | サポートなし |
| 列操作 | 列の末尾への追加 | メタデータの変更のみ | 例えば LOB (TEXT) 列の追加、ALTER TABLE tbl1 ADD c3 LOB。 |
サポート
注意OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP1バージョンからマテリアライズドビューのログベーステーブルへの列追加がサポートされています。 |
| 列操作 | VIRTUAL 列の追加 |
メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列の削除
説明OceanBaseデータベースV4.3.5バージョンでは、 |
メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列を NOT NULL に変更 |
データ量に依存し、データのクエリが必要 | なし | サポートなし |
| 列操作 | 列を NULL に変更 |
メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列のデフォルト値の設定 | メタデータの変更のみ | なし | サポートなし |
| 列操作 | 列のデフォルト値の削除 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 自動インクリメント列の値の変更 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列名の変更 | メタデータの変更のみが必要 | なし | サポートなし |
| 列操作 | 列の型の長さまたは精度の増加 | メタデータの変更のみが必要 | 例えば INT の長さの増加、VARCHAR の可変長、NUMBER 型の変換。 |
サポートなし |
| 列操作 | ハイブリッド列操作 | 最も時間のかかる操作に関連 | 単一列操作はOnlineですが、ハイブリッド列操作はほとんどがOnlineです。Online DDLかどうかを確認するには、以下の章 DDL操作がOnline操作(Online DDL)かどうかの判断方法 の方法で確認してください。 | サポートなし |
| 外部キー制約操作 | 外部キー、CHECK/NOT NULL 制約の追加 |
データ量に依存し、データのクエリが必要です。 | なし | 外部キーと CHECK 制約の追加はサポートされますが、NOT NULL 制約の追加はサポートされません |
| 外部キー制約操作 | 外部キー、CHECK/NOT NULL 制約の削除 |
データ量に依存し、データのクエリが必要です。 | なし | 外部キー制約の削除はサポートされますが、CHECK/NOT NULL 制約の削除はサポートされません |
| テーブル操作 | テーブル名の変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | 行フォーマットの変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | ブロックサイズの変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | 圧縮アルゴリズムの変更 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | テーブル領域の最適化 | メタデータの変更のみ | なし | サポートなし |
| テーブル操作 | 行ストアからカラムストアへの変換
注意
|
テーブルスキーマのみ変更 | 現在なし | 不可 |
| テーブル操作 | 行ストアから行列混合ストアへの変換
注意
|
テーブルスキーマのみ変更 | 現在なし | 不可 |
| パーティション操作 | パーティションの追加 | メタデータの変更のみが必要 | 現在なし | 不可 |
| パーティション操作 | 自動パーティション属性の変更のみ | メタデータの変更のみが必要 | 例:
|
不可 |
OceanBaseデータベースV4.xバージョンのOracleモードでサポートされているOffline DDL操作は以下の表のとおりです。
分類 |
操作 |
耗時 |
備考 |
マテリアライズドビューのログ(mlog)作成後のDDLサポート状況 |
|---|---|---|---|---|
| 列操作 | 自動インクリメント列の追加 | データ量に依存し、データの再構築が必要です(元のデータを書き直す必要があります) | なし | 不可 |
| 列操作 | 列を主キーに変更 | データ量に依存し、データの再構築が必要です | なし | 不可 |
| 列操作 | STORED 生成列の追加/削除 |
データ量に依存し、データの再構築が必要です | なし | 不可 |
| 列操作 | 列の削除 | データ量に依存し、データの再構築が必要です | なし | 不可 |
| 列操作 | VIRTUAL 列の削除 |
データ量に依存し、データの再構築が必要です | なし | 不可 |
| 列操作 | 不要な列のクリア | データ量に依存し、データの再構築が必要です | なし | 不可 |
| 列操作 | 列の混合操作 | オフライン列操作がある場合、オフラインDDLに昇格します。 | なし | 不可 |
| 主キー操作 | 主キーの追加/削除 | データ量に依存し、データの再構築が必要です | なし | 不可 |
| テーブル操作 | 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実行中はDML操作が許可されない点に注意が必要です。
この原理を利用することで、特定のDDL操作がOnline DDLかどうかを判断できます。
判断方法:
DDL操作の前後で以下のSQLステートメントを実行し、table_idが変化したかどうかを確認します。変化がなければOnline DDL、変化があればOffline DDLです。
select distinct(table_id) from 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 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 DBA_OB_TABLE_LOCATIONS WHERE table_name='t10';ステップ2とステップ4で返される
table_idが同じ場合、このDDL操作はオンラインです。table_idが変化している場合、対応するDDL操作はオフラインです。
説明
この判断方法は、テーブル操作およびパーティション操作には適用されません。