オンライン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タイプの追加/変更/削除 | Table Schemaの変更のみ | なし | サポートなし |
| 列操作 | 列の追加 | メタデータの変更のみ | 例えば、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の型を変換する。 |
サポートなし |
| 列操作 | ハイブリッド列操作 | 最も時間のかかる操作に関連 | 単一列の操作はオンラインですが、ハイブリッド列操作のほとんどはオンラインです。DDLがオンライン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 列の削除 |
データ量に関連し、データの再構築が必要です | なし | サポートされていません |
| 列操作 | 無効な列のクリア | データ量に関連し、データの再構築が必要です | なし | サポートされていません |
| 列操作 | 混合列操作 | オフライン列操作がある場合、オフライン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操作がオンライン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操作はオフラインです。
説明
この判断方法は、テーブル操作およびパーティション操作には適用されません。