Oracle 12c PDB遷移(一)

jeanron100發表於2016-10-18
    最近在整理測試環境的伺服器資源,發現真是混亂,問題比較多。首先是伺服器配置較低(很多都是KVM或者openstack虛機),資源使用率不高,有些資料的版本較低(10gR2),沒有開啟歸檔,沒有備庫(有些都是異機備份的形式)。而且資料庫比較散亂,整合起來難度較大,最大的難點就是資料庫使用者重複,大量重名的同義詞等。之前嘗試整合了一番,遇到了瓶頸,就暫停了整合的過程,現在來看12c還是一個不錯的選擇。當然我的選擇似乎還是晚了些,下午在看很多人的部落格的時候,發現不少人三四年前就在玩12c的很多特性,不與時俱進就太落後了。
    首先我選擇了一個測試資料庫,資料庫使用者繁多,表空間非常多,有50多個,資料量不大(2G以內),訪問不頻繁。
    先在12c的環境中建立一個PDB,為此專門指定了檔案路徑對映。
CREATE PLUGGABLE DATABASE tcymob0 ADMIN USER pdb_mgr IDENTIFIED BY oracle file_name_convert=('/U01/app/oracle/oradata/newtest','/U01/app/oracle/oradata/newtest/tcymob0');
Pluggable database created.
看看PDB的情況。
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TCYMOB0                        MOUNTED
預設建立好是處於mount狀態的,啟動起來。
SQL> alter pluggable database tcymob0 open;
Pluggable database altered.
切換到這個容器
SQL> alter session set container=tcymob0;
Session altered.
檢視資料檔案的情況,可以看到只有system,sysaux,其他的都是共享的。
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/tcymob0/pdbseed/system01.dbf
/U01/app/oracle/oradata/newtest/tcymob0/pdbseed/sysaux01.dbf
我們給PDB的管理使用者賦予DBA許可權吧。如果帶著慣性,還是很容易出錯。
比如$ sqlplus / as sysdba
SQL> grant dba to pdb_mgr;
grant dba to pdb_mgr
             *
ERROR at line 1:
ORA-01917: user or role 'PDB_MGR' does not exist
其實這個和容器設定有關。
檢視當前的容器,是CDB啊。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
切換過去,再次賦許可權就沒有問題了。
SQL> alter session set container=tcymob0;
Session altered.
SQL> grant dba to pdb_mgr;
Grant succeeded.
PDB已經建好了,剩下的事情就是資料遷移了,目前因為資料量不大,所以我採用了邏輯匯出匯入的方式,當然官網的推薦方案非常多。總有一款適合。要旨還是適用的場景決定適用的方案。

DataPump匯入需要目錄。我們也建立一個。
SQL> conn pdb_mgr/oracle@tcymob0
SQL> create directory dp_dir as '/home/oracle/dp_dir';
這裡有個地方需要注意就是這個目錄的容器歸屬是這個所在的PDB.
SQL> select * from all_directories where directory_name='DP_DIR';
OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH                 ORIGIN_CON_ID
------------------------------ ------------------------------ ------------------------------ -------------
SYS                            DP_DIR                         /home/oracle/dp_dir                        3    
為了進一步整合,表空間也可以簡化一些,直接就用users好了。
SQL> create tablespace users datafile  size 2G;
Tablespace created.  
剩下的事情就是impdp匯入了。
因為表空間非常多,但是資料量有不大,所以可以在主庫生成一個parfile來。在源庫中使用如下的語句匯出動態SQL,簡單修改即可。
SQL> select 'remap_tablespace='||tablespace_name||':'||'USERS'from dba_tablespaces;
impdp的匯入如下,也做了一些簡單的優化,把那些預設資料庫使用者都排除,表空間remap_tablespace使用parfile的方式。
impdp pdb_mgr/oracle@tcymob0 directory=dp_dir dumpfile=tcymob0.dmp full=y logfile=impdp.log  EXCLUDE=SCHEMA:\"IN \(\'OUTLN\', \'ANONYMOUS\',\'OLAPSYS\',\'SYSMAN\',\'MDDATA\',\'MGMT_VIEW\',\'SYSTEM\',\'SCOTT\'\)\" parfile=remap_ts.par

匯入的時候丟擲了一個錯誤。
ORA-39005: inconsistent arguments
ORA-31600: invalid input value NULL for parameter VALUE in function DBMS_DATAPUMP.METADATA_REMAP
看起來好像是在remap_tablespace的地方有問題,經過一番排查,發現表空間對映的地方多了個空格。
就類似下面的形式,USERS前多了個空格:
remap_tablespace=ACCCYUC33_INDEX: USERS
除此之外,匯入的過程還是很輕鬆的。耗時不到9分鐘即可搞定。

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

相關文章