オンラインデータ定義言語 (DDL) は、DDL操作および他のトランザクションの同時実行を可能にする。 オンラインDDLは、データベーステーブルのロック期間を最小限に抑え、データベースの全体的な同時実行性とパフォーマンスを向上させます。
前提条件
計算ノードのバージョンは5.4.16-16717637以降で、論理的に実行されるDDL操作に対して非同期のマルチ書き込みが可能です。 詳細については、「リリースノート」をご参照ください。
このトピックで説明するDDL操作に必要なバージョンと条件については、「Partitionステートメント」、「Instant ADD COLUMN」、「テーブルをロックせずに列の種類を変更する」、「シーケンス」、生成された列、「グローバルセカンダリインデックスの使用方法」、および「テーブルグループステートメント」をご参照ください。
概要
PolarDB-XインスタンスのDDL操作は、次の2つのカテゴリに分類できます。
物理的に実行: DDL操作は実行のためにデータノードにプッシュダウンされます。 これらのDDL動作は、
CREATE LOCAL INDEX
、ALTER/ADD COLUMN
、およびCREATE/DROP TABLE
を含む。 計算ノードは、物理ステートメントのシャードレベルの転送、調整、およびメタデータ管理のみを実行します。 これらのDDL操作の実装原則とオンライン機能は、MySQL DDL操作のものと同様です。
論理的に実行: 計算ノードは完全なDDL操作を実行します。 これらのDDL操作には、
GLOBAL INDEX
、CREATE/DROP PARTITION
、CREATE/DROP PRIMARY KEY
、およびChange the column type without locking tablesが含まれます。 このタイプのDDL操作が実行されると、システムは一時テーブルを作成します。 システムは、元のテーブルの既存のデータを一時テーブルにコピーし、同時に増分データ更新をキャプチャして一時テーブルに同期します。 一時テーブルに履歴データと増分データの両方が十分に追加された後、システムはデータフローを元のテーブルから一時テーブルにシームレスに切り替えます。 計算ノードは、データバックフィル、増分マルチライト、およびメタデータ管理プロセスを処理します。 このタイプのDDL操作はテーブルをロックしません。
次のコンテンツは、他のSQL操作への影響に基づいて、3つの次元からオンラインDDL機能を分析します。
テーブルがロックされているかどうか?
オンラインDDL操作ブロックデータ操作言語 (DML) 操作は、テーブル切り替え中の数秒間のみで、ほとんどの実行期間中にDML操作を実行できます。
オンライン以外のDDL操作では、テーブルに対してDML操作を実行できない実行プロセス全体でテーブルがロックされます。
データはバックフィルされますか?
INSTANT ADD COLUMN
やRENAME TABLE
など、メタデータの変更のみを含むDDL操作は、データをバックフィルすることなく即座に完了できます。DROP TABLE
やDROP INDEX
などのDDL操作は、メタデータを変更し、関連する物理ファイルを削除するだけです。 これらの操作は、データをバックフィルする必要なしに短時間で完了する。INSTANT
操作、テーブル削除操作、およびインデックス削除操作以外のDDL操作では、物理的または論理的な実行中に、元のデータを新しいクラスタ化インデックスまたはセカンダリインデックスにコピーして書き込みます。 実行により、特定の量のクラスターリソースが占有されます。 実行期間は、データ量、同時実行レベル、およびインスタンスの仕様によって異なります。
オンライン更新の同期されたマルチライティングは必要ですか?
論理的に実行されたDDL操作は、データを一時テーブルに埋め戻し、同時にオンラインDMLトラフィックを一時テーブルに同期して複数書き込みます。 オンラインDMLトラフィックは、バックフィルされたデータと競合し得る。 さらに、分散トランザクション手法を使用してマルチ書き込みを処理し、アトミック性を確保し、DML操作を論理操作として実行させます。 これにより、オンライン操作のパフォーマンスが低下します。 この問題に対処するために、PolarDB-Xは、
MOVE/SPLIT PARTITION
、Change the column type without locking tables、REBALANCE
などの論理的に実行されるDDL操作に対して非同期マルチ書き込みを実装します。 マルチライトDMLトラフィックは最初にキャッシュされ、データバックフィルが完了した後に非同期に実行されます。これにより、マルチライトの競合とパフォーマンス低下の期間が最小限に抑えられます。 これらのDDL操作が非同期マルチ書き込みをサポートするかどうかについては、このトピックのオンラインDDL機能のセクションで説明します。既定では、物理的にデータノードで実行され、データをバックフィルし、テーブルをロックしないネイティブオンラインDDL操作は、オンラインログを使用してネイティブ非同期マルチ書き込みを実装します。 これらのDDL操作が非同期マルチ書き込みをサポートするかどうかについては、このトピックのオンラインDDL機能セクションで説明しません。
他のタイプのDDL動作は、複数の書き込みを必要としない。 これらのDDL操作が非同期マルチ書き込みをサポートするかどうかについては、このトピックのオンラインDDL機能セクションで説明しません。
オンラインDDL操作
特にMODIFY column
およびCHANGE COLUMN
ステートメントを使用してDDLステートメントを使用してテーブルおよび列操作を実行する場合、属性の欠落による予期しない列の変更を回避するために、完全な列属性を指定する必要があります。
インデックス操作
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
ローカルセカンダリインデックス (LSI) の作成 | 選択可能 | 選択可能 | 継続しない | 継続する | - |
LSIの削除 | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
LSIの名前変更 | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
グローバルセカンダリインデックス (GSI) の作成 | 必須 | 継続しない | 継続する | 必須 | 選択可能 |
GSIの削除 | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
GSIの名前変更 | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
テーブル操作
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
行形式の変更 (ROW_FORMAT) | 選択可能 | 継続しない | 継続する | 必須 | - |
最適化テーブル | 選択可能 | 継続しない | 継続する | 必須 | - |
テーブル名の変更 | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
デフォルトの文字セットを変更する | 選択可能 | 継続しない | 継続する | 必須 | - |
文字セットの変換 | 継続しない | 継続する | 必須 | 必須 | - |
GSIを持たないテーブルの切り捨て (GSIなしのTruncate table) | 選択可能 | 継続しない | 継続する | 選択可能 | - |
GSIを持つテーブルの切り捨て (Truncate table WITH GSI) | 必須 | 継続しない | 継続する | 選択可能 | - |
パーティション操作
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
パーティションの移行 | 必須 | 選択可能 | はい (関連するパーティションのみが再作成されます) 。 | 必須 | 必須 説明
|
パーティションを分割する | 必須 | 選択可能 | はい (関連するパーティションのみが再作成されます) 。 | 必須 | |
パーティションの結合Merge partitions | 必須 | 選択可能 | はい (関連するパーティションのみが再作成されます) 。 | 必須 | 選択可能 |
パーティションを追加する 説明
| 必須 | 選択可能 | 選択可能 | 選択可能 | - |
パーティションの削除 説明
| 必須 | 選択可能 | 選択可能 | 選択可能 | - |
パーティションの再編成 | 必須 | 選択可能 | はい (関連するパーティションのみが再作成されます) 。 | 必須 | 選択可能 |
パーティションをクリアする | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
パーティションの名前変更 | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
パーティションの変更 | 必須 | 選択可能 | はい (関連するパーティションのみが再作成されます) 。 | 必須 | 選択可能 |
上記の表で説明したパーティション操作のオンラインDDL機能は、テーブルグループとテーブルの両方に適用されます。
シーケンス変更操作
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
シーケンスを作成するCreate a sequence | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
シーケンスの削除 | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
シーケンスの属性の変更 | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
シーケンスタイプの変換 | 必須 | 選択可能 | 選択可能 | 選択可能 | - |
一般的な列操作
列操作は、一般的な列操作 (主キー、パーティションキー、または生成された列に関連しない列操作) 、主キーおよびパーティションキーの変更操作、および生成された列操作に分類されます。 SHOW FULL CREATE TABLE TABLE_NAME
ステートメントを実行して、完全な列属性を表示し、列操作が属するカテゴリを決定できます。
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
列を追加します。 詳細については、「注1」をご参照ください。 | 選択可能 | 継続しない | 継続する | 必須 | - |
列の削除 | 選択可能 | 継続しない | 継続する | 必須 | - |
列の名前変更 | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
列の順序を変更する | 選択可能 | 継続しない | 継続する | 必須 | - |
列のデフォルト値を変更する | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
列のデフォルト値を削除する | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
列のデータ型を変更する | 継続しない | 継続する | 必須 | 必須 | - |
選択可能 | 選択可能 | 選択可能 | 選択可能 | - | |
char列の長さを拡張します。 詳細については、「注3」をご参照ください。 | 継続しない | 継続する | 必須 | 必須 | - |
列の値をNULLに変更する | 選択可能 | 継続しない | 継続する | 必須 | - |
列の値をNOT NULLに変更する 説明
| 選択可能 | 継続しない | 継続する | 必須 | - |
PolarDB-Xでは、データベースのメタデータのみを変更することで、インスタントアルゴリズムを使用して列を追加できます。 特定の列に対する変更操作は、オンラインで論理的に実行できます。 次の表は、
ALGORITHM=INSTANT
またはALGORITHM=OMC
が明示的に指定されている場合の操作のオンライン実行機能を示しています。API 操作
論理的に実行される
ロックテーブル
テーブルの再構築
データの埋め戻し
非同期マルチ書き込みをサポート
選択可能
選択可能
選択可能
選択可能
-
列タイプをオンラインで変更する
必須
継続しない
継続する
必須
必須
デフォルトでは、PolarDB-X 5.7データノードを使用して、
INPLACE
アルゴリズムを使用してVARCHAR
列の長さを拡張できます。 ただし、この機能は8.0のデータノードではサポートされません。 VARCHAR列の長さが255バイト以下の場合、格納に必要なのは1バイトだけです。 長さが256バイト以上の場合、格納のために2バイトを必要とする。 VARCHAR列の長さを255バイト以下から256バイト以上に拡張する場合、メタデータの変更だけでは変更できません。 逆に、VARCHAR列の長さを256バイト以上から255バイト以下に減らしたい場合は、メタデータの変更のみで変更できます。API 操作
論理的に実行される
ロックテーブル
テーブルの再構築
データの埋め戻し
非同期マルチ書き込みをサポート
VARCHAR
列の長さを256バイト以上に拡張します。選択可能
継続しない
継続する
必須
-
デフォルトでは、PolarDB-X 5.7データノードを使用して、
INPLACE
アルゴリズムを使用してCHAR
列の長さを拡張できます。 ただし、この機能は8.0のデータノードではサポートされません。 次の表に、操作のオンライン実行機能を示します。API 操作
論理的に実行される
ロックテーブル
テーブルの再構築
データの埋め戻し
非同期マルチ書き込みをサポート
CHAR
列の長さを拡張する選択可能
継続しない
継続する
必須
-
主キーとシャーディング列の操作
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
主キーの追加 | 必須 | 継続しない | 継続する | 必須 | 選択可能 |
元の主キーを削除し、新しい主キーを追加する | 必須 | 継続しない | 継続する | 必須 | 選択可能 |
シャーディング方法、シャード数、またはシャーディング列の変更 | 必須 | 選択可能 | はい (シャーディングの変更に関連するGSIまたはプライマリテーブルが再作成されます) 。 | 必須 | 選択可能 |
GSIまたはプライマリテーブルのシャーディング列の定義を変更する | 必須 | 選択可能 | はい (シャーディング列を使用するGSIまたはプライマリテーブルが再作成されます) 。 | 必須 | 選択可能 |
生成された列操作
API 操作 | 論理的に実行される | ロックテーブル | テーブルの再構築 | データの埋め戻し | 非同期マルチ書き込みをサポート |
仮想列の追加 (virtual列) | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
仮想列の削除 (virtual列) | 選択可能 | 選択可能 | 選択可能 | 選択可能 | - |
ストレージ列の追加 (STORED列) | 継続しない | 継続する | 必須 | 必須 | - |
ストレージ列の削除 (STORED列) | 選択可能 | 継続しない | 継続する | 必須 | - |
論理列の追加 (logical列) | 必須 | 継続しない | 継続する | 必須 | 選択可能 |
論理列の削除 (logical列) | 必須 | 継続しない | 継続する | 必須 | - |
オンライン実行機能の管理
PolarDB-Xでは、次の方法を使用してオンライン実行機能を管理できます。
列を追加する場合は、ALGORITHM=Instantを指定してインスタントadd column機能を使用できます。
オンラインで列を変更する場合は、ALGORITHM=OMCを指定して論理実行方法を使用できます。
デフォルトでは、論理的に実行されるDDLステートメントはオンラインで実行されます。 特別な仕様は必要ありません。
物理的に実行される一般的な列操作とローカルインデックスDDL操作のオンライン実行の場合、操作に対してALGORITHM=INPLACEを指定できます。 操作がオンライン実行をサポートしていない場合、エラーが発生します。 それ以外の場合、操作は直接実行されます。