空のスタンバイテナントを作成する方法は、プライマリテナントが新規作成された場合、またはそのプライマリテナントが作成後から現在までの完全なログを保持していることが確認できる場合に適用されます。
ステップ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であれば、スタンバイテナントの状態は正常で、スタンバイテナントは正常に作成されたことを意味します。この方法で作成されたスタンバイテナントは、作成後自動的に継続同期モードに入ります。