oracle 19c pdb遷移

賀子_DBA時代發表於2021-03-14
一:該方法失敗了!使用rman 備份某個pdb,來實現遷移某個pdb的目的:
針對19c制定備份任務,可以選擇只備份特定的pdb,這樣有個好處是,如果需要恢復,不用恢復重置檔案和引數檔案,直接恢復某個pdb即可,具體得做個試驗記錄下,這只是我的猜測!恢復某個或者多個pdb的時候,不需要停止其他的pdb; 然後再做一個試驗,是不是可以從新起名來恢復某個pdb,例如liu_pdb恢復成he_pdb;
首先在81.94上備份liu_pdb的pdb資料庫,
backup pluggable database liu_pdb;
嘗試在81.93上恢復,前提是81.93上沒有liu_pdb這個pdb,如下告訴rman的備份檔案路徑,發現報錯
RMAN> catalog start  with  '/data/u01/backup';
searching for all files that match the pattern /data/u01/backup
List of Files Unknown to the Database
=====================================
File Name: /data/u01/backup/liu_PDB_20210313_2_1
Do you really want to catalog the above files (enter YES or NO)? yes
cataloging files...
no files cataloged
List of Files Which Were Not Cataloged
=======================================
File Name: /data/u01/backup/liu_PDB_20210313_2_1
RMAN-07518: Reason: Foreign database file DBID: 457766100  Database Name: LIUDB
然後嘗試先建立上liu_pdb看看是不是能解決,估計不可以!因為他報錯的是db_name 是liudb,但是81.93這裡是db_name 為liuhe!
DBID是DataBase IDentifier的縮寫,意思就是資料庫的唯一識別符號。這個DBID在資料檔案頭和控制檔案都是存在的,可以用於標示資料檔案的歸屬,異地恢復的時候db_name不可以變化!
如果db_name一樣,是不是可以這樣來遷移某個pdb?試了下也不行,依舊報錯!雖然db_name一樣,但是dbid不一樣也不行!
RMAN-07518: Reason: Foreign database file DBID: 457766100  Database Name: LIUDB
然後嘗試先恢復引數檔案再恢復控制檔案,最後恢復pdb,這個操作是在空環境下進行的(也就是隻有資料庫軟體)試試可以嗎?
具體過程:首先備份pdb02,開啟自動備份了引數和控制檔案
RMAN> backup pluggable database  PDB02  format '/data/u01/PDB02_%T_%s_%p';
然後先恢復引數檔案,再恢復控制檔案
RMAN>restore   spfile to '$ORACLE_HOME/dbs/initliuhe.ora'  from  '/data/u01/backup/c-457766100-20210313-07';
RMAN> restore  controlfile  from  '/data/u01/backup/c-457766100-20210313-07';
RMAN> catalog start  with  '/data/u01/backup';
RMAN> restore  pluggable  database  PDB02;  ---成功
但是當你recover的時候失敗:其實就算成功了,也不行,因為你就沒有cdb,怎麼啟動pdb呢?
RMAN> recover  pluggable  database  PDB02;
Starting recover at 13-MAR-21
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=9 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/13/2021 23:09:13
RMAN-06067: RECOVER DATABASE required with a backup or created control file

最後嘗試下修改dbid為源端資料庫的dbid

但是nid也只能修改成從新生成的dbid,也不能自定義改成源端一樣的dbid

[oracle@tvy-dbtest-04 dbs]$  nid target=/
失敗了,不能透過backup 某個pdb,然後恢復到另一個例項!

二:採用拔出某個pdb,然後scp  對應檔案和xml檔案到目的端,最後再插入pdb來實現遷移資料庫!這樣來遷移資料和使用者都會遷移過去!
如下這樣來實現遷移某個pdb的效能  ,expdp  ,rman 三者的效能對比?
備份:注意需要先close 源pdb。
SQL>alter pluggable database pdb01 close immediate;
然後拔出PDB01,注意必須起名字為.xml字尾!
SQL>alter pluggable database pdb01 unplug into '/home/oracle/pdb01.xml';
SQL> alter pluggable  database  LIU_PDB unplug into '/home/oracle/LIU_PDB0313';
alter pluggable  database  LIU_PDB unplug into '/home/oracle/LIU_PDB0313                                       *
ERROR at line 1:
ORA-65125: valid XML or PDB archive file name is required
注意執行完unplug之後,該pdb就無法開啟了,
SQL> select pdb_id,pdb_name,dbid,STATUS  from dba_pdbs where   pdb_name='LIU_PDB';
  pdb_id   pdb_name          dbid            STATUS
  3               pdb01       527541637     UNPLUGGED
恢復分兩種情況:
一)在本地恢復
1)本地沒有刪除原來的 pdb01,需要加as clone 關鍵字來避開conflicts with the GUID的錯誤!
具體操作如下:
SQL> create  pluggable  database  pdb02  using  '/home/oracle/pdb01.xml';
報錯如下,
SQL> create  pluggable  database  pdb02  using  '/home/oracle/pdb01.xml';
create  pluggable  database  pdb01  using  '/home/oracle/pdb01.xml'                                                             *
ERROR at line 1:
ORA-65018: FILE_NAME_CONVERT or NOCOPY must be specified
可以透過設定引數db_create_file_dest來指定新建立的pdb的檔案的路徑,也可以設定FILE_NAME_CONVERT來實現轉換(前提得知道原來的 unplug的pdb的檔案路徑注意如果FILE_NAME_CONVERT指定的目錄不存在會自動建立上!
方法1:如果沒有設定db_create_file_dest,則需要指定FILE_NAME_CONVERT來實現轉換目錄:
create  pluggable  database  pdb02  using  '/home/oracle/pdb01.xml' file_name_convert=('/data/u01/app/oracle/oradata/LIUDB/liu_pdb','/data/u01/app/oracle/oradata/LIUDB/pdb01');
因為我是在同一個cbd中,先把liu_pdb匯出來,然後建立成另一個名字的pdb,就會如下報錯,其實就是pdb的id衝突!加上 as clone關鍵字 就可以從新生成一個!
SQL>  create  pluggable  database  pdb02  using  '/home/oracle/pdb01.xml'  file_name_convert=('/data/u01/app/oracle/oradata/LIUDB/liu_pdb','/data/u01/app/oracle/oradata/LIUDB/pdb01');
create  pluggable  database  pdb01  using  '/home/oracle/pdb01.xml'  file_name_convert=('/data/u01/app/oracle/oradata/LIUDB/liu_pdb','/data/u01/app/oracle/oradata/LIUDB/pdb01')
*
ERROR at line 1:
ORA-65122: Pluggable database GUID conflicts with the GUID of an existing
container.
解決加個as  clone即可:
SQL>  create  pluggable  database  pdb01   as clone  using  '/home/oracle/pdb01.xml'  file_name_convert=('/data/u01/app/oracle/oradata/LIUDB/liu_pdb','/data/u01/app/oracle/oradata/LIUDB/pdb01');
Pluggable database created.
建立完pdb01會建立如下的檔案:
/data/u01/app/oracle/oradata/LIUDB/pdb01/system01.dbf
/data/u01/app/oracle/oradata/LIUDB/pdb01/sysaux01.dbf
/data/u01/app/oracle/oradata/LIUDB/pdb01/undotbs01.dbf
/data/u01/app/oracle/oradata/LIUDB/pdb01/users01.dbf
方法2:設定db_create_file_dest,這樣建立的pdb就預設在設定db_create_file_dest的目錄下了,
SQL> alter  system  set db_create_file_dest='/data/u01/app/oracle/oradata/LIUDB/';
System altered.
然後可以直接執行建立
SQL> create  pluggable  database  pdb02  as  clone  using  '/home/oracle/pdb01.xml';
然後會自動建立如下所示的檔案:自動生產的名字,建議首選第一種,是在不知道原來的pdb的檔案目錄的時候迫不得已再選擇設定 db_create_file_dest
/data/u01/app/oracle/oradata/LIUDB/LIUDB/BD686D8A980BC360E0535E51010AD293/datafi
le/o1_mf_system_j4s1vvw4_.dbf
/data/u01/app/oracle/oradata/LIUDB/LIUDB/BD686D8A980BC360E0535E51010AD293/datafi
le/o1_mf_sysaux_j4s1vvw5_.dbf
/data/u01/app/oracle/oradata/LIUDB/LIUDB/BD686D8A980BC360E0535E51010AD293/datafi
le/o1_mf_undotbs1_j4s1vvw6_.dbf
/data/u01/app/oracle/oradata/LIUDB/LIUDB/BD686D8A980BC360E0535E51010AD293/datafi
le/o1_mf_users_j4s1vvw7_.dbf
註釋
如下語句
create  pluggable  database  pdb03  as  clone  using  '/home/oracle/pdb01.xml' nocopy tempfile reuse;
其中as  clone表示是克隆,那麼pdb03的pdb_id和GUID會從新生成;
其中nocopy表示不復制資料檔案,仍用原來的位置的檔案作為新的pdb的資料檔案,但是pdb_id也會從新生成一個新的!
其中 tempfile reuse表示複用臨時檔案
二):異地恢復,也就說在另一臺機器上恢復
alter pluggable database liu_pdb unplug into '/home/oracle/pdb01.xml';這裡生產的xml檔案只是記錄了pdb1的一些資訊,例如相關資料檔案的路徑,pdb_id ,GUID等等資訊,如果需要異地恢復,需要把對應的pdb01的資料檔案也一併複製到目的端的相應目錄下
[oracle@tvy-dbtest-04 liu_pdb]$ scp  pdb01.xml oracle@10.1.81.93:/data/u01/
[oracle@tvy-dbtest-04 liu_pdb]$ pwd
/data/u01/app/oracle/oradata/LIUDB/liu_pdb
[oracle@tvy-dbtest-04 liu_pdb]$ scp  * oracle@10.1.81.93:/data/u01/app/oracle/oradata/LIUDB/liu_pdb/
oracle@10.1.81.93's password:
sysaux01.dbf                                                                                        100%  380MB 118.1MB/s   00:03
system01.dbf                                                                                        100%  280MB 149.8MB/s   00:01
undotbs01.dbf                                                                                       100%  100MB  96.1MB/s   00:01
users01.dbf                                                                                         100% 5128KB 101.2MB/s   00:00
然後再在異地81.93上指定create pluggable database 的命令!具體同本地恢復的內容!
SQL> create  pluggable  database  pdb01  as  clone   using  '/data/u01/pdb01.xml'  file_name_convert=('/data/u01/app/oracle/oradata/LIUDB/liu_pdb','/data/u01/app/oracle/oradata/LIUDB/pdb02');
三:本地實現複製某個pdb的方法:從 pdb01 克隆 pdb01_bak
關閉pdb01:
SQL> alter pluggable database pdb01 close immediate;
Pluggable database altered.
啟動pdb01到只讀模式:
SQL> alter pluggable database pdb01 open read only;
Pluggable databasealtered.
複製pdb01,起名字為pdb01_bak,
SQL> CREATE PLUGGABLE DATABASE pdb01_bak  from pdb01  FILE_NAME_CONVERT =('/data/u01/app/oracle/oradata/LIUDB/pdb01','/data/u01/app/oracle/oradata/LIUDB/pdb01_bak');
Pluggable databasecreated.
SQL>alter pluggable database pdb01 close immediate;
Pluggable databasealtered.
SQL>alter pluggable database pdb01 open;
Pluggable databasealtered.
SQL>alter pluggable database pdb01_bak open;
Pluggable databasealtered.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2762774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章