データベースのテーブル構造を変更する際のテーブルロック問題を解決するため、ロックフリースキーマ変更機能を提供しています。この機能により、テーブルロックによる業務のブロッキングを効果的に回避できます。本記事では、ロックフリースキーマ変更チケットを提出することでデータベースのロックフリースキーマ変更を実現する方法について説明します。
注意
ロックフリースキーマ変更タスクは、OceanBaseデータベースのMySQLモードでのみサポートされており、Enterprise版またはCommunity版のOMSを使用する必要があります。
背景
原理
ロックフリースキーマ変更の実行プロセスは、以下の図に示されています:
説明
タスクが複数のテーブルにまたがる場合、各テーブルを順番に変更します。つまり、あるテーブルのすべてのステップが完了してから次のテーブルの処理に移ります。
単一テーブルの処理手順は以下のとおりです:
シャドウテーブルの作成:ユーザーが入力した変更内容に基づいて、シャドウテーブルを生成します。シャドウテーブルの構造は、ユーザーが最終的に期待するテーブル構造となります。
データ同期:元のテーブルのデータを、全量同期および増分同期の形式でシャドウテーブルに同期します。
データ整合性検証:増分同期の過程で、定期的にデータ整合性検証を実施します。
業務の一時停止:元のテーブルとシャドウテーブルのデータの差が小さくなったら、業務を一時停止します。OceanBaseデータベースのバージョンに応じて、ユーザーロックとテーブルロックの2種類の業務一時停止方法が提供されます。lock userとlock tableの時間はデータベースカーネルが決定し、プログラムでは制限しません。そのうち、ユーザーロックが成功すると、そのユーザーのセッションを同期的に終了します。2秒以内にセッションを終了できなかった場合は、ロックに失敗したとみなされます。
データ同期の完了:業務が一時停止された後も、増分同期とデータ検証は継続的に実行されます。25秒以内にデータ同期が完了しない場合、タスクは失敗して終了します。
古いテーブル名と新しいテーブル名の切り替え:データ同期が完了した後、元のテーブルとシャドウテーブルの名前を変更します。シャドウテーブルが新しい業務テーブルとなり、本番業務に使用されます。
ロックフリースキーマ変更チケットの実行プロセス
ユーザーがロックフリースキーマ変更チケットを提出します。
ユーザーが入力したSQL文に対して事前チェックを行います。
タスクの承認フローを進めます。
ロックフリースキーマ変更タスクを実行します。
サポートされる変更範囲
分類 |
操作 |
サポート |
備考 |
|---|---|---|---|
| 列操作 | 列型の変更 | はい | |
| 列の並べ替え (before/after/first) | はい | ||
| 文字セットの変換 | はい | ||
| 列の名前変更 | いいえ | ||
| 列の追加 | はい | ||
| 列の削除 | はい | ||
| 主キー列の追加 | いいえ | ||
| 主キー | 主キーの追加 | はい | テーブルにNOT NULL制約のある一意キーが存在する必要があります |
| 主キーの変更 | はい | テーブルにNOT NULL制約のある一意キーが存在する必要があります | |
| 主キーの削除 | はい | テーブルにNOT NULL制約のある一意キーが存在する必要があります | |
| パーティション | パーティションの削除 | はい | |
| パーティションのTRUNCATE | いいえ | ||
| パーティションの再編成 | はい | ||
| 非パーティションテーブルからパーティションテーブルへの変更 | はい | ||
注意事項
データベースのディスク容量が十分であることを確認してください。
テーブルには 主キーまたはNOT NULL制約のある一意キー が 存在し、外部キーは存在しない 必要があります。
現在のテーブルでロックフリースキーマ変更を実行している場合、他のDDL操作を実行するとタスクが失敗します。
OceanBaseのMySQLモードでは、テーブル名は54文字以下です。
ODCがOceanBase Community版データベースに接続する場合、データソース設定情報にクラスタ名とSYSテナントアカウントが含まれている必要があります。
テーブル名切り替えの書き込み禁止ポリシーについて、デフォルトではユーザーロック方式のみが提供されます。一部のOBバージョンでは、テーブルロック方式も追加で提供されます。
ユーザーロック(lock user)方式を採用する場合、以下の制限に注意してください:
変更を実行するデータベースアカウントには、ユーザーをロックする権限が付与されていなければなりません。通常は
CREATE USER権限ですが、具体的に必要な権限はOceanBaseデータベースのバージョンによって異なります。変更を実行するデータベースアカウントは、ロック対象ユーザーのリストに含まれていてはなりません。含まれている場合、そのアカウント自身のセッションも一緒に閉じられ、テーブル構造を切り替える際のkill sessionが失敗します。
単一のロックフリースキーマ変更中は、列の追加と削除を同時に行うことはできません。必要に応じて、数回に分けて変更を行ってください。
ロックフリースキーマ変更タスクの新規作成
本記事では、OceanBase Community版とEnterprise版 OMSを例に説明します。シナリオは、studentテーブルのbirthday列の型をdateに変更することです。この例で使用されるプロジェクト名はodc_4.2.0、データベース名はodc_test、テーブル名はstudentです。
(オプション)OceanBase Community版クラスタをインストールします。クラスタの設定が既に完了している場合は、この手順をスキップできます。
説明
Enterprise版 OMSでOceanBaseデータソースを作成する際には、クラスタ名を含める必要があります。単一マシンではデータソースを作成できません。具体的なクラスタのデプロイ方法については、プラン2:OceanBaseクラスタ環境のデプロイを参照してください。
ConfigServerのインストール。ConfigServerは、OceanBaseとOBProxyがOceanBase rs_listにアクセスするためのインターフェースです。OceanBase ConfigServerのアドレス設定後、OceanBaseは自動的にrs_listをConfigServerに登録します。
説明
OCPでクラスタをデプロイする場合は、この手順を省略できます。OCPが作成したクラスタは、OCPのアドレスをOceanBase ConfigServerとして自動設定します。
Enterprise版 OMSのインストール。本記事ではEnterprise版 OMSを使用します。Enterprise版 OMSはDocker経由で入手できます。必要に応じてCommunity版 OMSを選択し、設定することもできます。
ODCのメタデータ情報を設定し、ロックフリースキーマ変更を有効にします。
a. ODCでEnterprise版 OMSの情報を設定します。
ODCのMetaDBに接続し、Enterprise版 OMSのURLとログイン認証情報を設定します。oms_urlの構成は
http://${oms_host}: ${oms_port}、oms_authornazitionの構成はusername:passwordのBase64エンコードです。設定完了後、ODCを再起動して設定したEnterprise版 OMS情報を有効にします。構文:
#oms_urlの設定 update config_system_configuration set `value` = '${oms_url}' where `key` = 'odc.osc.oms.url'; #oms_authornazitionの設定 update config_system_configuration set `value` = '${oms_authornazition}' where `key` = 'odc.osc.oms.authorization'; #oms_regionの設定、例:cn-anhui update config_system_configuration set value = '${oms_region}' where `key` = 'odc.osc.oms.region'例:
#oms_urlの設定、omsのアクセスアドレスを入力:http://localhost:8089 update config_system_configuration set `value` = 'http://localhost:8089' where `key` = 'odc.osc.oms.url'; #oms_authornazitionの設定、例えばアカウントがtest、パスワードが123456の場合、`test:123456` をBase64エンコードすると:dGVzdDoxMjM0NTY= update config_system_configuration set `value` = 'dGVzdDoxMjM0NTY=' where `key` = 'odc.osc.oms.authorization'; # oms_regionの設定。OMSインストール時に入力したregionがcn-anhuiの場合は、詳細はOMSインストールプロセスを参照してください。 update config_system_configuration set value = 'cn-anhui' where `key` = 'odc.osc.oms.region'
b. ロックフリースキーマ変更を有効にします。現在、Alibaba CloudデータベースOceanBaseはロックフリースキーマ変更をサポートしています。OceanBase Community版では、ODCはデフォルトでロックフリースキーマ変更を有効にしていません。ODCのMetaDBを設定し、SQLステートメントを実行してこの設定を有効にする必要があります。
```shell update config_system_configuration set value = 'true' where `key` = 'odc.features.task.osc.enabled'; ```-
注意
OceanBase Community版では、ODCを使用してデータソースを作成する際には、sysテナントを設定する必要があります。

SQLウィンドウで、SQLステートメントを編集して、データベースodc_testにstudentテーブルを作成します。
CREATE TABLE `odc_test`.`student` ( `id` int(11) COMMENT 'student id' NOT NULL, `name` varchar(120) COMMENT 'student name' NULL, `birthday` datetime(0) COMMENT 'student birthday' NOT NULL, `province` varchar(120) COMMENT 'student province' NULL, `city` varchar(120) COMMENT 'student city' NULL, `mobile_phone` int COMMENT 'student mobile_phone' NULL, `email` varchar(120) COMMENT 'student email' NULL, `create_time` datetime(0) COMMENT 'update time' NULL, CONSTRAINT `cons_id` PRIMARY KEY (`id`) ) DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ;アカウント/テーブルのロック。
OceanBaseデータベースがMySQL V4.2.5より古いバージョンの場合、データベーステーブル構造を変更する際にはテーブルロックがサポートされていません。ロック対象のアカウントを指定する必要があります。新旧テーブルを切り替える際(
Rename)、ODCはロックされたアカウントに対してalter table user lock accountコマンドを実行し、セッションを終了することで、ロックされたアカウント下のすべてのプロセスを終了させます。OceanBaseデータベースがMySQL V4.2.5以上V4.3.0未満のバージョンの場合、データベーステーブル構造を変更する際には、アカウントロックによるテーブルロックは行われなくなりました。OBProxyのバージョンがV4.3.1以上であることを確認し、ロックフリースキーマ変更タスクの前に以下の操作を実行してテーブルをロックする必要があります。そうでない場合、テーブルロックは失敗します。
OBProxyパラメータを変更します。
alter proxyconfig set proxy_id=1; alter proxyconfig set client_session_id_version=2; alter proxyconfig set enable_single_leader_node_routing = false;テナントレベルのパラメータを変更します。
alter system set enable_lock_priority=true;テーブルロック機能をサポートするOceanBase MySQLバージョン範囲を変更します。
テーブルロック機能がデフォルトでサポートするOceanBase MySQLバージョン範囲はV4.2.5からV4.2.9です。テーブルロック機能がサポートするバージョン範囲を変更する場合は、ODCのMetaDBに接続し、以下のSQLステートメントを実行できます。
insert into config_system_configuration( key, application, profile, label, description, value) values('odc.osc.support-lock-table-ob-version-json', 'odc', 'default', 'master', 'control odc enable lock table version, default is ["4\\.2\\.[5-9].* "]', '$望ましいバージョン範囲');ここで、
'$望ましいバージョン範囲'はJSON配列であり、配列要素はJavaのワイルドカード規則に従います。例えば、OceanBase MySQLのバージョン範囲をV4.2.5からV4.2.9およびV4.3.5に変更する場合、対応するvalue値は["4\\\\.2\\\\.[5-9].*", "4.3.5.*"]となります。テーブルロックが成功したかどうかを検証します。ODCで
lock tableコマンドを実行して一時テーブルをロックした後、新しい接続を使用してその一時テーブルにデータ挿入を試みます。データ挿入がブロックされた場合、テーブルロックタスクが有効であることを意味します。create table test_table(id int not null primary key); session 1: session 2 lock table test_table; insert into test_table values(1); ブロック中... unlock table test_table; 挿入成功
ロックフリースキーマ変更タスクを新規作成します。
プロジェクト > すべてのプロジェクト ページで、対象のプロジェクト名をクリックします。
チケット タブで、ロックフリースキーマ変更 > ロックフリースキーマ変更の新規作成 をクリックします。
ロックフリースキーマ変更を新規作成 ページで、以下の情報を入力し、作成する をクリックします。
情報項目説明データベース 変更対象のデータベースを選択します。 ロック対象ユーザー - ロック対象ユーザーを指定した場合、ODCはテーブル名切り替え前に指定されたデータベースアカウントをロックし、そのアカウントに対応するすべてのセッションを終了します。これにより、テーブル名切り替え中のデータ整合性を保証しつつ、業務への影響を可能な限り軽減します。
- いずれのアカウントも指定しない場合、ODCはアカウントのロックやセッションの終了は行いません。切り替え中のデータ整合性はご自身で確保してください。
注意
- ロックフリースキーマ変更タスクの実行中、そのタスクを実行しているユーザーは、ロックフリースキーマ変更に関連するテーブルの変更操作を実行できません。
- このタスクを実行するデータベースアカウントには、ユーザーをロックする権限が必要です。通常は
CREATE USER権限ですが、具体的に必要な権限はOceanBaseデータベースのバージョンによって異なります。 - このタスクを実行するデータベースアカウントをロック対象ユーザーとして指定しないでください。そうすると、そのアカウント自身のセッションも一緒に閉じられ、テーブル構造を切り替える際のkill sessionが失敗します。
変更定義 - CREATE TABLE:OceanBaseでサポートされていない構文はCREATEステートメントを使用する必要があります。
- ALTER TABLE:OceanBase V4.0.0以降のバージョンでは、ALTER TABLE OFFLINEモードでALTERステートメントを使用できます。
SQL内容 編集エリアにSQLスクリプトを入力します。 テーブル切り替え設定 データ整合性が確認された後、元のテーブルをターゲットテーブルに切り替えます。 - テーブルロックタイムアウト時間:テーブル切り替えプロセスではテーブルがロックされます。タイムアウトまでに切り替えが完了しないと、実行が失敗する可能性があります。
- 失敗時のリトライ回数:テーブルロック時間を超えても切り替えが完了しない場合、自動でリトライできます。
- 完了後のソーステーブルクリーンアップ戦略:名前を変更して処理しない を選択すると、ソーステーブルは名前を変更されますが削除されません。今すぐ削除 を選択すると、ロックフリースキーマ変更完了後にソーステーブルが削除されます。
タスク設定 - 実行方法:手動実行、今すぐ実行、スケジュール実行 のいずれかを選択します。
- タスクエラー処理:
- タスクの停止:タスクの停止がデフォルトの方法です。スクリプトの実行中にエラーが発生した場合、実行を停止します。
- エラーを無視してタスクを続行:エラーを無視してタスクを続行する方法を選択すると、スクリプトの実行中にエラーが発生した場合、エラーステートメントをスキップして実行を続けます。
- テーブル名切り替え方法:自動切り替え、手動切り替え のいずれかを選択してテーブル名を切り替えます。
説明 説明 テキストボックスに200文字以内の説明情報を入力できます。この項目はオプションです。 タスクが生成された後、チケット > ロックフリースキーマ変更 リストでタスク情報を確認できます。
ロックフリースキーマ変更タスクの表示
チケット > ロックフリースキーマ変更 にアクセスし、ロックフリースキーマ変更タスクリストで、対象タスクの名前をクリックしてタスクの詳細を表示します。操作列の ··· をクリックすると、対象タスクに対してさらなる操作を実行できます。
- 実行:タスクの実行方法が手動実行の場合、このチケットを手動で実行します。
- 終了:タスクの実行方法が周期実行または定期的実行の場合、終了操作でこのチケットを終了できます。対象のチケットを選択すると、上部の一括操作ボタンを使用して一括終了できます。
- 無効/有効:タスクの実行方法が周期実行または定期的実行の場合、無効にすることでそのタスクの実行を一時的に停止できます。再有効化すると再度適用されます。
- 編集:タスクの状態が無効の場合、編集を通じてそのタスクの内容を更新できます。
- 削除:タスクの状態が完了または終了の場合、削除を通じてそのタスクを削除できます。
- 表示:タスクの内容詳細を表示します。
- クローン:このタスクの実行内容をコピーし、同じ設定の新規タスク作成画面を迅速に生成します。
- 共有:このタスクのアクセスアドレスを迅速にコピーします。
ポップアップ表示されたタスク詳細パネルでは、デフォルトでそのジョブの 基本情報 タブが表示され、タスクタイプ、データベース、変数設定、実行方法などの情報を確認できます。
タスク詳細パネルで、タスクプロセス タブをクリックし、タスク開始状態、承認状態、実行状態、実行結果などの情報を確認します。
タスク詳細パネルで、実行結果 タブをクリックし、タスクの実行履歴を確認します。
タスク詳細パネルで、タスクログ タブをクリックし、タスクの全ログとアラートログを確認します。
情報項目説明全ログ 全ログは、タスクの INFO、ERROR、WARN ログなどの全量情報を表示します。検索、ダウンロード、コピー ボタンをクリックすると、情報の検索、全ログのダウンロード、またはコピーが可能です。 アラートログ アラートログは、タスクの ERROR と WARN ログを個別に表示します。タスクが失敗した場合、アラートログからエラー情報を確認できます。検索、ダウンロード、コピー ボタンをクリックすると、情報の検索、アラートログのダウンロード、またはコピーが可能です。