Oracle 12c PDB遷移(一)(r10筆記第56天)
最近在整理測試環境的伺服器資源,發現真是混亂,問題比較多。首先是伺服器配置較低(很多都是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');
看看PDB的情況。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 TCYMOB0 MOUNTED
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
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.
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分鐘即可搞定。