このセクションでは、テーブルレベルのリストアの方法について説明します。
テーブルレベルリストアの方法
テーブルレベルリストアにおける物理リストア支援テナント段階では、フルリストアと高速復元の2つの方法があります。
テーブルレベルリストアプロセスは、物理リストア支援テナント、テナント間テーブル導入、および支援テナントのクリーンアップの3つの段階で構成されています。以前のバージョンでは、物理リストア支援テナント段階でフルリストア方式が採用されていました。この方式では、ソーステナントのすべてのデータをバックアップメディアから支援テナントにリストアする必要があり、以下の2つの問題が生じていました:
- 一時的な支援テナントのリストアをサポートするために、クラスタ上に十分なCPU、メモリ、およびディスクリソースを予約しておく必要がありました。
- すべてのデータをバックアップメディアから支援テナントにリストアするプロセスでは、大量の時間とネットワーク帯域幅を消費します。
上記の問題を解決するため、OceanBaseデータベースは高速リストア方式による支援テナントのリストアをサポートしています。この方式で支援テナントをリストアする場合、読み取り専用の支援テナントを1つリストアするだけで済みます。テナント内のユーザーデータはバックアップメディアからリストアする必要がなく、テナント間テーブル導入段階でバックアップメディアからリストア対象テーブルのバックアップマクロブロックデータを直接読み取るだけで済みます。この方式により、テーブルレベルリストアにおける一時的な支援テナントのリソース使用量が削減され、リストアタスクの時間コストが短縮されます。
注意
現在のバージョンでは、復元に使用されるバックアップセットのデータバージョン番号がV4.3.5.0以上の場合、システムは自動的に高速復元方式を使用してテーブルレベル復元プロセス中の支援テナントの復元を実行します。復元に使用されるバックアップセットのデータバージョン番号がV4.3.5.0(含まず)以下の場合は、引き続きフル復元方式を使用して支援テナントの復元を実行します。復元に使用されるバックアップセットのデータバージョン番号は、ビューCDB_OB_BACKUP_SET_FILES(sysテナント)またはDBA_OB_BACKUP_SET_FILES(ユーザーテナント)のTENANT_COMPATIBLE列を照会することで確認できます。
テーブルレベルリストアを実行した後、sysテナントでビューCDB_OB_RESTORE_HISTORYのRESTORE_TYPE列をクエリすることで、支援テナントのリストア方式を確認できます。
使用制限と注意事項
ユーザーテーブルのみのリストアをサポートしており、一時テーブル、ビュー、マテリアライズドビュー、マテリアライズドビューのログ、インデックスなどを単独でリストアすることはサポートしていません。
テーブルリストア時には、全文インデックス、JSON複数値インデックス、またはベクトルインデックスを持つテーブルのリストアをサポートします。
カラムストアおよび行列混合形式のテーブルのリストアをサポートします。
テーブルリストアのソーステナントとターゲットテナントの互換性は一致している必要があります。例えば、どちらもOracle互換テナント、またはどちらもMySQL互換テナントである必要があります。
テーブルリストア時には、指定するテーブル名がシステムで実際に格納しているテーブル名と一致している必要があります。例えば、Oracleモードのテナントでテーブル
testを作成した場合、システム内部で実際に格納されるテーブル名はTESTとなります。そのため、テーブルをリストアする際にはテーブル名としてTESTを指定する必要があります。そうでない場合、システムはエラーを返し、テーブルが存在しないことを示します。テナントレベルリストアでサポートされているバックアップデータのバージョンと同様に、テーブルレベルリストアも現在は、低バージョンのバックアップデータから同じバージョンまたは高いバージョンへのテーブルリストアのみをサポートしており、同じバージョン内のマイナーバージョン間での逆方向リストアもサポートしていません。テナントレベルリストアでサポートされているバックアップデータのバージョンの詳細については、リストア前の準備を参照してください。
テーブルレベルリストアでは、テーブルのリストアに加えて、そのテーブルに関連付けられた多くの情報もリストアされますが、一部の情報はリストアされません。具体的にリストア可能な情報については、テーブルレベルリストアのSchemaリストア説明を参照してください。
前提条件
指定したテーブルのリストアプロセスでは支援テナントを使用する必要があるため、テーブルリストアを行う前に、ターゲットテナントが存在するクラスタ内で支援テナント用の必要なリソースプールを作成する必要があります。支援テナント用の必要なリソースプールを作成する詳細な操作については、テーブルレベルリストア前の準備を参照してください。
操作手順
rootユーザーで、対象テナントが存在するクラスタのsysテナントにログインします。(オプション)指定したテーブルをリストアする際に使用されたバックアップデータに暗号化機能が設定されている場合は、バックアップセットの暗号化情報を設定する必要があります。
データバックアップ時にパスワードが追加された場合にのみ、バックアップのリストアパスワードを設定する必要があります。
SET DECRYPTION IDENTIFIED BY 'password';ここで、
passwordはバックアップ時に追加されたパスワードに置き換える必要があります。フルバックアップと増分バックアップで設定されたパスワードが異なる場合は、複数のパスワードを入力する必要があり、パスワードの間に半角カンマ(,)で区切ります(フルバックアップのパスワードを前に、増分バックアップのパスワードを後に配置します)。フルバックアップと増分バックアップで設定されたパスワードが同じ場合の例:
SET DECRYPTION IDENTIFIED BY '******';フルバックアップと増分バックアップで設定されたパスワードが異なる場合の例:
SET DECRYPTION IDENTIFIED BY '******','******';(オプション)テーブルレベルリストアの並列度を設定します。
単一テーブルの並列リストア
テーブルレベルのリストアを実行する前に、パラメータrecover_table_dopで並列度を設定できます。設定後、システムは以下の2つの段階でこの並列度を使用します:
- メインテーブルデータリストア段階:システムはメインテーブルの各パーティションを複数のサブタスクに分割し、並列して実行します。
- インデックスリストア段階:システムはリストアされたメインテーブルデータに基づき、並列実行(Parallel Execution, PX)を利用してテーブルのインデックスを再構築します。
構文は以下のとおりです:
-- tenant_name は対象テナント ALTER SYSTEM SET recover_table_dop=INT_VALUE tenant=tenant_name;複数テーブルの並列リストア(オプション)
複数テーブルのテーブルレベルリストアを実行する前に、パラメータrecover_table_concurrencyで並列度を設定できます。設定後、複数のテーブルを並列して実行し、リストア性能を向上させることができます。
構文は以下のとおりです:
-- tenant_name は対象テナント ALTER SYSTEM SET recover_table_concurrency=INT_VALUE tenant=tenant_name;テナント内の各observerノード上のメインテーブルデータリストアワーカースレッド数の設定
単一テーブルの並列度
recover_table_dopと複数テーブルの並列度recover_table_concurrencyを設定した後、テナント内の各observerノード上のデータ補完ワーカースレッド数も ddl_thread_score パラメータで設定する必要があります。テーブルレベルリストアのテナント間データ導入段階では、メインテーブルデータのリストアは対象テナント上の特定のDAGスレッドに依存します。構文は以下のとおりです:
-- tenant_name は対象テナント ALTER SYSTEM SET ddl_thread_score=INT_VALUE tenant=tenant_name;注意
- 物理リストア補助テナント実行段階では、ha_high_thread_score パラメータを調整することで、リストアの並列度を動的に変更できます。変更は即時に反映されます。補助テナント名は、テーブルレベルリストアのタスク進捗表 CDB_OB_RECOVER_TABLE_JOBS で確認できます。具体的な調整方法については、物理リストアを参照してください。
- テナント間データ導入段階では、対象テナントの
recover_table_concurrencyまたはrecover_table_dopパラメータを調整することで、複数テーブル/単一テーブルのリストア並列度を動的に変更できます。変更は即時に反映されます。
以下のコマンドを実行して、指定したテーブルをリストアします。
SQLステートメントは以下のとおりです:
ALTER SYSTEM RECOVER TABLE table_name_list TO [TENANT [=]] dest_tenant_name FROM uri [UNTIL {TIME='timestamp'} | {SCN=scn} ] WITH 'restore_option' [WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [REMAP TABLE remap_table_name_list] [REMAP TABLEGROUP remap_tablegroup_list] [REMAP TABLESPACE remap_tablespace_list] [DESCRIPTION [=] description];関連パラメータの説明は以下のとおりです:
table_name_list:リストアするテーブルです。形式はdatabase_name.table_name1,database_name.table_name2,...で、複数のテーブル間は半角カンマ(,)で区切ります。database_nameとtable_nameを指定する場合:table_nameはシステムが実際に格納するテーブル名と一致している必要があります。例えば、Oracleテナントでテーブルtestを作成した場合、システム内部で実際に格納されるテーブル名はTESTとなります。そのため、テーブルをリストアする際にはTESTという名前を指定する必要があります。そうでない場合、システムはエラーを返し、テーブルが存在しないことを示します。database_nameまたはtable_nameに特殊文字が含まれる場合、特殊文字を含むdatabase_nameまたはtable_nameはバッククォート(``)で囲む必要があります。データベース内のすべてのテーブルをリストアする場合は、
database_name.*と表現できます。テナント内のすべてのユーザーテーブルをリストアする場合は、
*.*と表現できます。
dest_tenant_name:テーブルをリストアする対象テナント名です。テーブルのリストアはユーザーテナントへのみサポートされており、sysテナントやMetaテナントへのリストアはサポートされていません。uri:データバックアップとログアーカイブのパスをそれぞれ指定します。これはテナントレベルの物理リストアコマンドのパラメータと同じです。データバックアップがPLUS ARCHIVELOG方式で実行された場合は、パスを1つだけ指定すれば済みます。そうでない場合は、データバックアップとログアーカイブのために少なくとも2つのパスをそれぞれ入力する必要があります。例:'file:///backup/archive, file:///backup/data'。{TIME='timestamp'} \| {SCN=scn}:指定されたリストア終了位置です。この位置までリストアされ、この位置のデータも含みます。TIMEまたはSCNにリストアする場合は、必ず=を使用して指定する値を結合する必要があります。UNTIL句を指定しない場合、デフォルトで最新の位置までリストアされます。restore_option:補助テナントのpool_list、locality、primary_zone、concurrencyを指定します。異なるパラメータ間は&で区切ります。localityとprimary_zoneを指定する際は、可能な限りソーステナントと同構成に保つことを推奨します。concurrencyを指定しない場合、デフォルトでその補助テナントに割り当てられたMAX_CPUに等しくなります。例えば、このドキュメントでは、システムテナントが補助テナントに割り当てるMAX_CPUは16です。各パラメータの詳細については、テーブルレベルリストア関連パラメータ紹介を参照してください。
WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password':テナントのマスターキーバックアップ情報を指定します。ソーステナントで透過的暗号化(TDE)が構成されている場合にのみ、リストア時にマスターキーバックアップ関連情報を指定する必要があります。backup_key_path:マスターキーのバックアップパス。password:マスターキーをバックアップする際に設定した暗号化パスワード。
マスターキーバックアップに関する操作については、バックアップ前の準備の マスターキーのバックアップ を参照してください。
remap_table_name_list:リストア後のテーブル名を変更します。テーブル名のみを変更し、所属するデータベースを変更しない場合、テーブル名を変更せずに他のデータベースに移行する場合、テーブル名を変更し、所属するデータベースも他のデータベースに変更する場合をサポートします。ソースオブジェクトと変更後のオブジェクトの間は、半角コロン(:)で結合します。具体的な形式の例は以下のとおりです:テーブル名を
studentからstudent2に変更し、所属するデータベースを変更しない場合:REMAP TABLE school.student:student2。所属するデータベースを変更しない場合、対象テナントにテーブルを作成する際、システムはデフォルトでテーブルを対象テナントの同名データベースにリストアします。同名のデータベースが存在しない場合、テーブルのリストアは失敗します。
テーブル名を変更せず、所属するデータベースを
schoolからcollegeに変更する場合:REMAP TABLE school.student:college.student。テーブル名を
studentからstudent2に変更し、所属するデータベースをschoolからcollegeに変更する場合:REMAP TABLE school.student:college.student2。schoolデータベースのすべてのテーブルをcollegeデータベースにリストアする場合:REMAP TABLE school.*:college.*
説明
変更する
database_nameまたはtable_nameに特殊文字が含まれる場合、特殊文字を含むdatabase_nameまたはtable_nameをバッククォート(``)で囲む必要があります。remap_tablegroup_list:テーブルが所属するテーブルグループの名前を変更します。ソーステーブルがテーブルグループに紐づけられている場合、対象テナントにテーブルを作成する際、システムはデフォルトでテーブルを対象テナントの同名テーブルグループにリストアします。同名のテーブルグループが存在しない場合、テーブルのリストアは失敗します。対象テナントに他のテーブルグループがある場合、このステートメントを使用してテーブルを他のテーブルグループにリストアできます。ソースオブジェクトと変更後のオブジェクトの間は、半角コロン(:)で結合します。例えば、ソーステーブルグループ
tg1内のテーブルをすべて対象テナントのテーブルグループnewtg1にリストアする場合:REMAP TABLEGROUP tg1:newtg1。remap_tablespace_list:テーブルが所属するテーブルスペースの名前を変更します。テーブルスペースはOceanBaseデータベースにおける論理的単位で、現在は主にデータ暗号化に使用されます。ソーステーブルがテーブルスペースに紐づけられている場合、対象テナントにテーブルを作成する際、システムはデフォルトでテーブルを対象テナントの同名テーブルスペースにリストアします。同名のテーブルスペースが存在しない場合、テーブルのリストアは失敗します。対象テナントに他のテーブルスペースがある場合、このステートメントを使用してテーブルを他のテーブルスペースにリストアできます。ソースオブジェクトと変更後のオブジェクトの間は、半角コロン(:)で結合します。例えば、ソーステーブルスペース
ts1内のテーブルをすべて対象テナントのテーブルスペースnewts1にリストアする場合:REMAP TABLESPACE ts1:newts1。
テーブルリストア関連パラメータの詳細については、テーブルレベルリストア関連パラメータ紹介を参照してください。
infodbライブラリ内のテーブルtbl1、tbl2を対象テナントのinfodbライブラリにリストアし、テーブルtbl1の名前をnewtblに変更します。同時に、テーブルが所属するテーブルグループをnewtg1に、テーブルが所属するテーブルスペースをnewts1にリダイレクトします。例:ALTER SYSTEM RECOVER TABLE infodb.tbl1,infodb.tbl2 TO TENANT oracle001 FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' UNTIL TIME='2023-09-30 00:00:00' WITH 'pool_list=restore_pool' REMAP TABLE infodb.tbl1:newtbl REMAP TABLEGROUP tg1:newtg1 REMAP TABLESPACE ts1:newts1;
注意
- テーブルデータのリストアが成功した時点で、テーブルのリストアは成功したことになります。インデックス、制約、その他の関連するスキーマのリストアが失敗してもかまいません。
- テーブルレベルのリストアが終了した後、
ddl_thread_score、recover_table_concurrency、recover_table_dopの設定を元に戻すことを推奨します。リストアしない場合、今後のテーブルレベルのリストアは設定された並列パラメータに従って実行されます。 - テーブルレベルのリストア中にテーブルに関連付けられたトリガーのリストアは、以下のモードで行われます:
- テーブルレベルのリストア開始コマンドでリストアするテーブル名にリネーム(REMAP TABLEマッピング)が行われていない場合、つまりテーブルが元のテーブル名でリストアされる場合は、テーブルに関連付けられたトリガーもリストアされます。
- テーブルレベルのリストア開始コマンドでリストアするテーブル名にリネーム(REMAP TABLEマッピング)が行われている場合、つまりテーブルが新しいテーブル名でリストアされる場合は、テーブルに関連付けられたトリガーはリストアされません。
次のステップ
指定したテーブルのリストアを開始した後、ビューを使用してテーブルリストアの進捗状況と結果を確認できます。具体的な操作については、テーブルレベルリストアの進捗状況の確認およびテーブルレベルリストア結果の確認を参照してください。
指定したテーブルのリストアが終了した後、補助テナントが存在するクラスタで以下のコマンドを実行し、補助テナント用に作成されたリソースプールを手動で解放する必要があります。
DROP RESOURCE POOL restore_pool;ここで、
restore_poolはリストア前の準備時に補助テナント用に作成されたリソースプール名を表します。リソースプールの削除に関する詳細な操作と説明については、リソースプールの削除を参照してください。
関連ドキュメント
テーブルレベルリストアにおける各スキーマ情報のリストア状況については、テーブルレベルリストアのスキーマリストアの説明を参照してください。