オンライン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 DDL)かどうかの判断方法の方法で確認してください。 | サポートなし |
| 外部キー制約操作 | 外部キー、CHECK/NOT NULL制約の追加 |
データ量に依存し、データのクエリが必要です。 | なし | 外部キーとCHECK制約の追加はサポートされていますが、NOT NULL制約の追加はサポートされていません |
| 外部キー制約操作 | 外部キー、CHECK/NOT NULL制約の削除 |
データ量に依存し、データのクエリが必要です。 | なし | 外部キー制約の削除はサポートされていますが、CHECK/NOT NULL制約の削除はサポートされていません |
| テーブル操作 | テーブル名の変更 | メタデータの変更のみが必要です | なし | サポートなし |
| テーブル操作 | 行フォーマットの変更 | メタデータの変更のみが必要です | なし | サポートなし |
| テーブル操作 | ブロックサイズの変更 | メタデータの変更のみが必要です | なし | サポートなし |
| テーブル操作 | 圧縮アルゴリズムの変更 | メタデータの変更のみが必要です | なし | サポートなし |
| テーブル操作 | テーブル領域の最適化 | メタデータの変更のみが必要です | なし | サポートなし |
| テーブル操作 | 行ストアからカラムストアへの変換
注意
|
テーブルスキーマのみ変更 | なし | サポートなし |
| テーブル操作 | 行ストアからカラムストアへの変換
注意
|
テーブルスキーマのみの変更 | なし | 不可 |
| パーティション操作 | パーティションの追加 | メタデータの変更のみが必要 | なし | 不可 |
| パーティション操作 | 自動パーティション属性のみの変更 | メタデータの変更のみが必要 | 例:
|
不可 |
OceanBaseデータベースV4.xバージョンのOracleモードでサポートされているOffline DDL操作は以下の表のとおりです。
分類 |
操作 |
耗時 |
備考 |
クリエイテッドマテリアライズドビューのログ(mlog)作成後のDDLサポート状況 |
|
|---|---|---|---|---|---|
| 列操作 | 自動インクリメント列の追加 | データ量に依存し、データの再編成が必要です(元のデータを書き直す必要があります) | なし | 不可 | |
| 列操作 | 列を主キーに変更する | データ量に依存し、データの再編成が必要です | なし | 不可 | |
| 列操作 | 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実行中は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操作はオフラインです。
説明
この判断方法は、テーブル操作とパーティション操作には適用されません。