Oracle 12c PDB遷移(一)
最近在整理測試環境的伺服器資源,發現真是混亂,問題比較多。首先是伺服器配置較低(很多都是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分鐘即可搞定。
首先我選擇了一個測試資料庫,資料庫使用者繁多,表空間非常多,有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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 19c pdb遷移Oracle
- Oracle 12c PDB遷移及ORA-00600錯誤分析和解決Oracle
- 12c跨平臺完成PDB的備份遷移
- PDB克隆遷移轉換
- Oracle 12c Relocate PDBOracle
- oracle 12c 使用RMAN的傳輸表空間功能在PDB之間遷移資料Oracle
- 多租戶:在Oracle12.2中 從Non-CDB遷移到PDB,從PDB遷移另一個CDB中Oracle
- Oracle 12c PDB淺析Oracle
- Oracle 12C -- 使用seed PDB建立新的pdbOracle
- 【BUILD_ORACLE】使用Oracle資料泵線上不停機克隆/遷移PDBUIOracle
- Oracle 12c系列(六)|Relocate a PDBOracle
- Oracle 12c系列(五)|PDB RefreshOracle
- oracle 12c rman備份pdbOracle
- Oracle 12c PDB淺析(二)Oracle
- Oracle 12C RMAN transport tablespace from PDB of RAC CDB to remote PDBOracleREM
- Oracle 12c 遷移MGMTDB 到其他的磁碟組Oracle
- ORACLE 12C pdb受限解決思路Oracle
- Oracle 12c系列(二)|PDB的建立Oracle
- ORACLE 12C新特性——CDB與PDBOracle
- oracle 12c使用dblink克隆pdbOracle
- oracle 表遷移方法 (一)Oracle
- 遷移案例一: oracle 8i 檔案遷移Oracle
- oracle 12c PDB隨CDB啟動和連結PDB的方式Oracle
- Oracle 12c 多租戶 手工建立 pdb 與 手工刪除 pdbOracle
- Oracle 12C RMAN Duplicating Tablespaces Within a PDBOracle
- Oracle 12C RMAN Duplicating the PDB to remote CDBOracleREM
- Oracle 12c CDB&PDB 基本維護Oracle
- ZT 遷移案例一: oracle 8i 檔案遷移Oracle
- 【Oracle 12c Flex Cluster專題 】— Leaf Node的故障遷移OracleFlex
- Oracle 12C 新特性之資料檔案線上遷移Oracle
- Oracle 12c 多租戶在 CDB 中 Plug A PDB,Unplugging A PDBOracle
- 【ASK_ORACLE】Oracle 12c之CDB與PDB的備份與恢復(一)什麼是CDB與PDB?Oracle
- Oracle 12c RMAN Cross-Platform Transport of a Closed PDBOracleROSPlatform
- ORACLE 12C PDB 維護基礎介紹Oracle
- Oracle 12c 使用Non-CDB來建立PDBOracle
- Oracle 12C 建立使用者連線pdbOracle
- Oracle 12c PDB中碰到的DG問題Oracle
- Oracle 12c 手工建立 和 刪除 PDB 示例Oracle