PolarDB-X 1.0 の DDL 実行エンジンは、DDL 操作のタスク管理を導入しています。これにより、DDL 文の動作が以前のバージョンと比較して変更されています。このトピックでは、DDL タスクの実行時に想定される動作と、遵守する必要があるハードリミットについて説明します。
注意事項
完了した DDL タスクは、タスクキューから自動的に削除されます。DDL 文の実行が完了すると、タスクはなくなるため、タスクステータスは無視してください。
DDL タスクが完了したら、すぐに
CHECK TABLEを実行して、対応する論理テーブルに一貫性があることを確認してください。タスク管理文を使用して DDL タスクを再開、ロールバック、または削除した後は、
CHECK TABLEを実行して論理テーブルの一貫性を確認してください。DDL 文が失敗すると、エラーコードとエラーメッセージが返されます。
SHOW DDLを実行して、保留中のタスクのREMARKフィールドで失敗の原因を確認してください。重要失敗した DDL タスクを再開、ロールバック、または削除する前に、根本原因を特定し、正しい回復操作を確認してください。失敗の原因を理解せずにタスク管理文を実行すると、その文自体が失敗する可能性があります。
DDL タスクが失敗して保留状態になると、セキュリティ上の理由から、影響を受けるテーブルはアクセス不可になります。
SHOW TABLESなどの文は結果を返さず、DML ステートメントはthe table is unknownやdoes not existのようなエラーを返すことがあります。保留中の DDL タスクが再開またはロールバックされ、一貫性のある状態に復元された後にのみ、テーブルは再びアクセス可能になります。CREATE TABLE文でIF NOT EXISTSを使用したり、DROP TABLE文でIF EXISTSを使用したりすると、実行中の特定のエラーは文の失敗を引き起こさず、代わりに警告として記録されます。このような文を実行した後は、出力に警告数 (例:1 warning) が含まれているかどうかを確認してください。SHOW WARNINGSを実行して詳細を確認し、重要な情報を見逃さないようにしてください。Data Management (DMS) などのクライアントでは、
PURE_ASYNC_DDL_MODEを設定して DDL 文を非同期で実行します。これにより、クライアント側のタイムアウトによって長時間実行される DDL 操作が中断されるのを防ぎます。DDL 文の実行時間が見積もれず、クライアントに PolarDB-X 1.0 の接続タイムアウトが設定されている場合に使用します。文が送信された後、SHOW DDLを実行してタスクのステータスを確認してください。
制限事項
CREATE TABLEとRENAME TABLE操作のみロールバックできます。RECOVER DDLとROLLBACK DDLは、同じ保留中の DDL タスクに対して組み合わせたり、繰り返したりすることはできません。たとえば、ROLLBACK DDLでタスクをロールバックした後、ロールバックが失敗した後にRECOVER DDLを試みると、論理テーブルの不整合が発生する可能性があります。シナリオ上、これらの操作を組み合わせる必要がある場合は、テクニカルサポートにご連絡ください。REMOVE DDLは、データベースのセキュリティが確保されている場合にのみ実行してください。REMOVE DDLを不確かな状態のデータベースで実行すると、DDL タスクの中間状態が公開され、論理テーブルに不整合が生じる可能性があります。REMOVE DDLの誤用によりデータ整合性の問題が発生した場合は、テクニカルサポートにご連絡ください。デフォルトでは、各物理データベースは最大 128 個のテーブルシャードをサポートします。この制限を超えると、次のエラーが返されます:
mysql> CREATE TABLE test_mdb_mtb (c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(10), c3 DATE) -> DBPARTITION BY HASH(c1) TBPARTITION BY HASH(c1) TBPARTITIONS 129; ERROR 4647 (HY000): [f5bd90594800000][30.25.86.55:8527][JICHEN_LOCAL_APP]ERR-CODE: [TDDL-4647][ERR_TABLE_PARTITIONS_EXCEED_LIMIT] The number of table partitions '129' exceeds the upper limit '128'. Please specify less table partitions or adjust the value of the parameter MAX_TABLE_PARTITIONS_PER_DB.この制限を引き上げるには、
MAX_TABLE_PARTITIONS_PER_DBをヒントとして渡します:mysql> /*+TDDL:cmd_extra(MAX_TABLE_PARTITIONS_PER_DB=400)*/CREATE TABLE test_mdb_mtb (c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(10), c3 DATE) -> DBPARTITION BY HASH(c1) TBPARTITION BY HASH(c1) TBPARTITIONS 129; Query OK, 0 rows affected (2.64 sec)DDL 実行エンジンのタスクキューには、最大 65,535 個の保留中の DDL タスクを保持できます。この制限に達すると、新しい DDL 文は実行できません。スペースを解放するには、まず保留中のタスクをリストして削除するタスクを特定し、次にそれらを削除します:
SHOW DDL;REMOVE DDL <task_id>;この制限は、パラメーターを変更しても変更できません。