空のスタンバイテナントを作成する方法は、プライマリテナントが新規作成された場合、またはそのプライマリテナントが作成後に全てのログを保持していることを確認できる場合に適用されます。
手順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を参照してください。DBA_OB_LOG_RESTORE_SOURCE:スタンバイからプライマリへの切り替え時に、元のプライマリテナントの上流情報を照会し、Switchover実行時に保護モードを変更しなくて済むかどうかを判断するために使用されます。DBA_OB_LOG_RESTORE_SOURCEビューの詳細については、DBA_OB_LOG_RESTORE_SOURCEを参照してください。
ビューにアクセスする専用ユーザーの作成と権限付与の具体的な操作は以下の通りです。
注意
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、DBA_OB_LOG_RESTORE_SOURCEなどのビューに対するSELECT権限のみを付与することもできます。obclient [oceanbase]> GRANT SELECT ON oceanbase.* TO rep_user;
Oracleモード
管理者ユーザーでプライマリテナントにログインします。
新しいユーザーを作成します。
obclient [SYS]> CREATE USER rep_user IDENTIFIED BY ******;新規ユーザー
rep_userにロールSTANDBY_REPLICATIONを付与します。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
- DBA_OB_LOG_RESTORE_SOURCE
ステートメントは以下のとおりです:
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:スタンバイテナントが存在するプライマリゾーンを指定します。オプションです。LOCALITY:スタンバイテナントのレプリカのゾーン間分散状況を指定します。オプションです。
例:
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であれば、スタンバイテナントの状態は正常で、スタンバイテナントは正常に作成されたことを意味します。この方法で作成されたスタンバイテナントは、作成後自動的に継続同期モードに入ります。