背景情報
通常、テーブルのスキーマを変更する場合、テーブルをロックする必要があります。この場合、ビジネスリクエストがブロックされます。この問題を解決するために、ODC V4.2.0 以降では、ロックフリーのスキーマ変更機能が提供されています。このトピックでは、ロックフリーのスキーマ変更タスクを実行するためのチケットを送信する方法について説明します。
技術メカニズム
一時テーブルを作成します。
一時テーブルのスキーマを変更します。
すべてのデータをコピーします。
増分データを同期します。
データ整合性を検証します。
セッションを強制終了します。
新しいテーブルに切り替えます。
実行プロセス

ロックフリーのスキーマ変更チケットを開始します。
入力された SQL 文に対して事前チェックを実行します。
タスクプロセスを承認します。
ロックフリーのスキーマ変更タスクを実行します。
ロックフリーのスキーマ変更でサポートされる操作
カテゴリ | 操作 | サポート対象? | 備考 |
列操作 | 列タイプの変更 | ✔️ | - |
列の再配置 (別の列の前または後、または最初の位置に列を移動する) | ✔️ | - | |
文字セットの変更 | ✔️ | - | |
列名の変更 | ❌ | - | |
列の追加 | ✔️ | - | |
列の削除 | ❌ | - | |
プライマリキー列の追加 | ❌ | - | |
プライマリキー | プライマリキーの追加 | ✔️ | ターゲットテーブルには、NULL 以外のユニークキーが必要です。 |
プライマリキーの変更 | ✔️ | ターゲットテーブルには、NULL 以外のユニークキーが必要です。 | |
プライマリキーの削除 | ✔️ | ターゲットテーブルには、NULL 以外のユニークキーが必要です。 | |
パーティション | パーティションの削除 | ✔️ | - |
パーティションの切り捨て | ✔️ | - | |
テーブルの再パーティション化 | ✔️ | - | |
パーティション化されていないテーブルをパーティションテーブルに変更する | ✔️ | - |
考慮事項
データベースに十分なディスク容量があることを確認してください。
テーブルにはプライマリキーまたは NULL 以外のユニークキーが含まれており、外部キーは含まれていません。
ロックフリーのスキーマ変更タスクが実行されているテーブルに対して他の DDL 操作を実行すると、タスクは失敗します。
OceanBase Database の MySQL モードでは、テーブル名は 54 文字を超えることはできません。
ODC が OceanBase Database Community Edition のインスタンスに接続する場合、データソース構成情報には、クラスタ名と sys テナントアカウントが含まれている必要があります。
V4.3.0 より前のバージョンの OceanBase Database の MySQL モードでは、ODC はテーブル名の切り替え中にデータの書き込みを防ぐために、ユーザーをロックし、セッションを閉じます。
ロックフリーのスキーマ変更タスクが実行されているテーブルに対して他の DDL 操作を実行すると、タスクは失敗します。
手順
ロックフリーのスキーマ変更タスクを作成する
このトピックでは、OMS の OceanBase Community Edition と Enterprise Edition を例として使用し、テーブル birth の student テーブルの列の型を date に変更するシナリオを示します。この例で使用されるプロジェクト名は odc_4.2.0、データベース名は odc_test、テーブル名は student です。
SQL ウィンドウで、
studentという名前のテーブルをodc_testデータベースに作成する SQL 文を記述します。
CREATE TABLE `odc_test`.`student` ( `name` varchar(120) NULL, `id` int NOT NULL, `birthday` date NULL, `create_time` date NULL, CONSTRAINT `key_id` PRIMARY KEY (`id`) ) DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci PARTITION BY RANGE(`id`) ( PARTITION `p1` VALUES LESS THAN (10000), PARTITION `p2` VALUES LESS THAN (20000) );ロックフリーのスキーマ変更タスクを作成します。
a. [チケット] タブで、[ロックフリースキーマ変更] > [新規作成] を選択します。

b. [オンラインスキーマ変更の作成 パネルで、次のパラメーターを構成します。

パラメータ
説明
データベース
データベース変更タスクが属するデータベースを選択します。
ユーザーのロック
ユーザーをロックするように指定すると、ODC はテーブル名の切り替え前に、指定されたデータベースアカウントをロックし、このアカウントのすべてのセッションを閉じます。これは、テーブル名の切り替え中にデータ整合性を確保しながら、ビジネスへの影響を軽減するためです。
アカウントが指定されていない場合、ODC はアカウントをロックしたり、セッションを閉じたりしません。この場合、テーブル名の切り替え中にデータ整合性を手動で確保する必要があります。
説明テーブルとその関連テーブルのロックフリーのスキーマ変更タスクを同時に実行することはできません。
変更定義
CREATE TABLE: OceanBase Database で他の構文がサポートされていない場合は、CREATE 文を使用する必要があります。
ALTER TABLE: OceanBase Database V4.0.0 以降では、ALTER TABLE OFFLINE モードで ALTER 文を使用できます。
SQL コンテンツ
編集セクションに SQL スクリプトを入力します。
テーブルの切り替え設定
データ整合性が検証された後、ターゲットテーブルに切り替えます。
テーブルロックのタイムアウト期間: テーブルの切り替え中はテーブルがロックされます。タイムアウト期間内にテーブルの切り替えが完了しない場合、切り替えは失敗します。
再試行回数: 指定された期間内にテーブルの切り替えが完了しない場合は、再試行を自動的に開始できます。
完了時のソーステーブルのクリーンアップ戦略: を選択できます名前変更タスクは処理されませんソーステーブルを削除せずに名前を変更するか、今すぐ削除ロックフリースキーマ変更タスクが完了した後に、ソーステーブルを削除します。
タスク設定
[今すぐ実行] または [スケジュール実行] を選択します。
ロックフリーのスキーマ変更ツールは、2 つのエラー処理方法を提供します。
タスクを中止: これはデフォルトのオプションです。このオプションを選択すると、スクリプトの実行時にエラーが発生した場合、タスクは中止されます。
エラーを無視して続行: このオプションを選択すると、エラーが発生した誤ったステートメントをスキップし、スクリプト内の他のステートメントの実行を続けます。
選択自動切り替えまたは 手動切り替え。
備考
オプション。タスクに関する追加情報。長さは 200 文字を超えることはできません。
c. [作成]をクリックします。
d. ロックフリーのスキーマ変更タスクが生成された後、 > を選択し、タスクリストでタスク情報を表示します。チケット> ロックフリーのスキーマ変更タスクリストでタスク情報を確認します。
ロックフリーのスキーマ変更タスクを表示する
タスク情報を表示するタスク情報
ロックフリー スキーマ変更タスク リストのチケットタブをクリックし、表示内のアクション対象タスクの列。
次の タスクの詳細パネルで、[クリック] タスク情報タブに移動して、タスクのデータベース、種類、リスクレベル、SQL コンテンツ、およびロールバック文を表示します。
[クリック] 再開始ロックフリー スキーマ変更タスクを再度開始するためです。
タスクプロセスを表示するタスクプロセス
次の タスクの詳細パネルで、[クリック] をクリックします。タスクプロセスタブで、タスクの開始ステータス、承認ステータス、実行ステータス、実行結果などの情報を表示します。
実行レコードを表示する実行レコード
[タスクの詳細パネルで、[クリック] 実行レコードタブに切り替えて、新規テーブルとソーステーブルの DDL 文を表示します。
タスクログを表示するタスクログ
次の タスクの詳細パネルで、[クリック] [タスク ログ]タブに切り替えて、タスクのすべてのログとアラートログを表示します。
タブ | 説明 |
すべてのログ | 、、 ログを含む、すべてのタスクログの完全な情報を表示します。、、または をクリックして、すべてのログを検索、ダウンロード、またはコピーできます。情報、エラー、および 警告logs。 [クリック] できます検索、ダウンロード、または コピーすべてのログを検索、ダウンロード、またはコピーするため。 |
アラートログ | 次を表示します: エラーおよび 警告 クリック検索、ダウンロード、または コピーアラートログを検索、ダウンロード、またはコピーするため。 |