空のスタンバイテナントを作成する場合は、プライマリテナントが新規作成された場合、またはプライマリテナントが作成後から現在までの完全なログを保持していることを確認できる場合に適しています。
ステップ1:アクセスビュー専用ユーザーの作成
スタンバイテナントがプライマリテナントに接続する際には、プライマリテナントの一部のシステムビューにアクセスする必要があるため、これらのシステムビューに対するクエリ権限を持つ専用ユーザーが必要です。既存のプライマリテナントユーザーに権限を付与することも、プライマリテナント上でスタンバイテナント専用の新規ユーザーを作成して権限を付与することも可能です。
スタンバイテナントがアクセスする必要があるシステムビューは以下の通りです:
GV$OB_LOG_STAT:プライマリテナントのマシンリスト、レプリカサービスのログストリームLSN範囲、ロール(リーダーかどうか)などの情報を取得します。GV$OB_LOG_STATビューの詳細については、GV$OB_LOG_STATを参照してください。GV$OB_UNITS:プライマリテナントのすべてのUnit情報を照会し、レプリカの状態、ゾーン、リージョンなどの情報を取得します。これはフィルタリング、テナントマシン接続の取得およびメンテナンスに使用されます。GV$OB_UNITSビューの詳細については、GV$OB_UNITSを参照してください。GV$OB_PARAMETERS: プライマリテナントのcluster_id、tenant_idなどのサービスに必須のメタ情報を照会します。GV$OB_PARAMETERSビューの詳細については、GV$OB_PARAMETERSを参照してください。DBA_OB_ACCESS_POINT: アクセスポイント情報を取得するために使用されます。プライマリテナントのレプリケーション移行や災害復旧などのシナリオにおいて、アクセスポイントが変更された場合、スタンバイテナントは自動的にそれを検出でき、ユーザーが手動で変更する必要はありません。DBA_OB_ACCESS_POINTビューの詳細については、DBA_OB_ACCESS_POINTを参照してください。DBA_OB_TENANTS:プライマリテナントの互換モードを取得します。DBA_OB_TENANTSビューの詳細については、DBA_OB_TENANTSを参照してください。DBA_OB_LS: プライマリテナントのログストリームリストとログストリームの状態を取得します。DBA_OB_LSビューの詳細については、DBA_OB_LSを参照してください。
アクセスビュー専用ユーザーの作成と権限付与の具体的な手順は以下の通りです。
注意
OceanBaseデータベースのユーザー名と権限情報は、プライマリテナントとスタンバイテナント間で同期されます。スタンバイテナント自身ではユーザーの作成や権限の付与が許可されていません。したがって、現在のスタンバイテナントのソースが別のスタンバイテナントの場合、対応するプライマリテナント上でアクセスビュー専用ユーザーを作成し、権限を付与する必要があります。
MySQLモード
管理者ユーザーでプライマリテナントにログインします。
以下のコマンドを実行して、新しいユーザーを作成します。
obclient [oceanbase]> CREATE USER rep_user IDENTIFIED BY '******';ユーザーに権限を付与します。
以下の例は、
oceanbaseデータベース内のすべてのテーブルに対するSELECT権限をそのユーザーに付与するものです。また、oceanbaseデータベース内のGV$OB_LOG_STAT、GV$OB_UNITS、GV$OB_PARAMETERS、DBA_OB_ACCESS_POINT、DBA_OB_TENANTS、DBA_OB_LSなどのビューに対するSELECT権限のみを付与することもできます。obclient [oceanbase]> GRANT SELECT ON oceanbase.* TO rep_user;
Oracleモード
管理者ユーザーでプライマリテナントにログインします。
新しいユーザーを作成します。
obclient [SYS]> CREATE USER rep_user IDENTIFIED BY ******;ロール
STANDBY_REPLICATIONを新しいユーザーrep_userに付与します。STANDBY_REPLICATIONはシステムのデフォルトロールであり、このロールにはデフォルトでCREATE SESSIONシステム権限と以下のビューに対するクエリ権限が含まれています:- GV$OB_LOG_STAT
- GV$OB_UNITS
- GV$OB_PARAMETERS
- DBA_OB_ACCESS_POINT
- DBA_OB_TENANTS
- DBA_OB_LS
- DBA_OB_LS_HISTORY
ステートメントは次のとおりです:
obclient [SYS]> GRANT STANDBY_REPLICATION TO rep_user;
ステップ2:スタンバイテナントの作成
rootユーザーで、作成するスタンバイテナントが属するクラスタのsysテナントにログインします。以下のコマンドを実行して、スタンバイテナント作成に必要なUnit仕様を作成します。
例えば、CPUが1コアでメモリが5GBのUnit仕様
unit1を作成します。obclient [oceanbase]> CREATE RESOURCE UNIT unit1 MAX_CPU 1, MEMORY_SIZE = '5G';Unit仕様の詳細な作成手順については、テナントの作成を参照してください。
スタンバイテナント作成に必要なリソースプールを作成します。
例えば、リソースプール
pool_for_standbyを作成します。obclient [oceanbase]> CREATE RESOURCE POOL pool_for_standby UNIT = 'unit1', UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3');リソースプールの詳細な作成手順については、テナントの作成を参照してください。
以下のコマンドを実行して、空のスタンバイテナントを作成します。
SQL文は以下のとおりです:
CREATE STANDBY TENANT [IF NOT EXISTS] tenant_name LOG_RESTORE_SOURCE [=] string_value [tenant_characteristic_list]; tenant_characteristic_list: tenant_characteristic [, tenant_characteristic...] tenant_characteristic: COMMENT 'string' | PRIMARY_ZONE [=] zone_name | RESOURCE_POOL_LIST [=](pool_name [, pool_name...]) | LOCALITY [=] 'locality description'主要なパラメータの説明は以下のとおりです:
tenant_name:作成するスタンバイテナント名。必須。テナント名はOceanBaseデータベースのキーワードにすることはできません。IF NOT EXISTS:作成するテナント名が既に存在し、IF NOT EXISTSが指定されていない場合、システムはエラーを報告します。オプションです。LOG_RESTORE_SOURCE:ログ復元ソースの設定。必須。具体的な形式は:'SERVICE=$ip_list USER=$user_name@$tenant_name PASSWORD=$password';であり、このパラメータに入力する情報はALTER SYSTEM SET LOG_RESTORE_SOURCEコマンドと一致しています。その中で:
$ip_list:プライマリテナントが存在するレプリカのOBServerノードのIPアドレスとSQLポート番号(デフォルトは2881)。プライマリテナント上でDBA_OB_ACCESS_POINTビューを照会することで取得できます。複数のOBServerノード情報がある場合、すべてのOBServerノードの情報を入力する必要はありません。$user_name:先ほど作成したアクセスビュー専用ユーザー。$tenant_name:接続するプライマリテナント名。$password:アクセスビュー専用ユーザーに対応するユーザーのパスワード。
COMMENT:コメント。オプションです。RESOURCE_POOL_LIST:スタンバイテナントが使用するリソースプールのリストを指定します。必須です。PRIMARY_ZONE:スタンバイテナントが属するPrimary Zoneを指定します。オプションです。LOCALITY:スタンバイテナントのレプリカのZone間の分散状況を指定します。オプションです。
例:
obclient [oceanbase]> CREATE STANDBY TENANT IF NOT EXISTS standby_tenant LOG_RESTORE_SOURCE = "SERVICE=xx.xx.xx.1:2881;xx.xx.xx.2:2881;xx.xx.xx.3:2881 USER=rep _user@mysql PASSWORD=******" RESOURCE_POOL_LIST=('pool_for_standby');以下のコマンドを実行して、テナントの状態を確認します。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';クエリ結果は次のとおりです:
+----------------+-------------+----------------------------+--------+-------------+----------------------------+ | TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ | standby_tenant | USER | 2023-04-14 21:06:48.787550 | NORMAL | STANDBY | 2023-04-14 21:12:59.183293 | +----------------+-------------+----------------------------+--------+-------------+----------------------------+ 1 row in setクエリ結果によると、
TENANT_ROLEの値がSTANDBYであり、かつSTATUSの値がNORMALであれば、スタンバイテナントの状態は正常であり、スタンバイテナントの作成に成功しています。この方法で作成されたスタンバイテナントは、作成後自動的に継続同期モードに入ります。