傳輸表空間:sql
可傳輸表空間的特性主要用於進行庫對庫的表空間複製,要進行傳輸的表空間必須置於read-only模式。若是生產庫不容許表空間置爲只讀模式,不要緊,方法仍是有的,經過RMAN備份也能夠建立可傳輸表空間集。要使用可傳輸表空間的特性,oracle至少是8i企業版或更高版本。若是是相同操做系統平臺相互導入,則8i及以上版本都可支持,但若是是不一樣操做系統平臺,數據庫版本至少10g。被傳輸的表空間便可以是字典管理,也能夠是本地管理。而且自oracle9i開始,被傳輸表空間的block size能夠與目標數據庫的block size不一樣。數據庫
模擬環境(傳輸表空間):windows
一、首先檢查環境信息:包括平臺,OS版本,數據庫版本,字節序等。oracle
source:app
OS:Red Hat Enterprise Linux Server release 5.4 (Tikangaless
DB:ide
SQL> select * from v$version;工具
BANNERui
--------------------------------------------------------------------------------spa
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
target:
OS:windows 7
DB:
SQL> select * from v$version;
BANNER
------------------------------------------------------------------------------------------------------------------------
----------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
平臺不一樣,數據庫版本一致,原則上oracle支持低版本向高版本導入數據。字節序也是一致都是小字節序。
能夠查詢 v$transportable_platform獲得字節序信息
二、檢查要轉換的對象是否符合TTS規範
conn / as sysdba
exec dbms_tts.transport_set_check('P1,P2',true,true);
SQL> select * from transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
VIOLATIONS
--------------------------------------------------------------------------------
ORA-39908: Index SH.OBJ_IDX in tablespace USERS enforces primary constraints of
table SH.OBJ_RANGE in tablespace P1.
ORA-39911: Index SH.OBJ_INDX in tablespace USERS points to partition R1 of table
SH.OBJ in tablespace P1 outside of transportable set.
10 rows selected
SQL> select index_name,table_name,tablespace_name from user_indexes where table_name='OBJ' or table_name='OBJ_RANGE';
INDEX_NAME TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ_IDX OBJ_RANGE USERS
OBJ_INDX OBJ USERS
可見,TTS規範檢查有問題,如上所示,表空間的索引對象‘SH.OBJ_IND’,'SH.OBJ_INDX' 在users表空間,故而報錯。要麼索引重建要麼把users表空間一併傳輸過來。
重建索引:
SQL> alter index OBJ_IDX rebuild tablespace p1;
Index altered.
SQL> alter index OBJ_INDX rebuild tablespace p1;
Index altered.
SQL> select index_name,table_name,tablespace_name from user_indexes where table_name='OBJ' or table_name='OBJ_RANGE';
INDEX_NAME TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ_IDX OBJ_RANGE P1
OBJ_INDX OBJ P1
從新檢查TTS規範:
SQL> exec dbms_tts.transport_set_check('P1,P2',true,true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
VIOLATIONS
----------------------------------------------------------------------------------------------------
ORA-39911: Index SH.OBJ_INDX in tablespace P1 points to partition R3 of table SH.OBJ in tablespace USERS outside of transportable set.
ORA-39921: Default Partition (Table) Tablespace USERS for OBJ not contained in transportable set.
ORA-39901: Partitioned table SH.OBJ is partially contained in the transportable set.
VIOLATIONS
----------------------------------------------------------------------------------------------------
ORA-39921: Default Partition (Table) Tablespace P1 for OBJ not contained in transportable set.
ORA-39921: Default Partition (Table) Tablespace P2 for OBJ not contained in transportable set.
8 rows selected.
SQL> select table_name,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='OBJ';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ R1 P1
OBJ R2 P2
OBJ R3 USERS
發現分區R3 在user表空間,因此這裏須要修改分區基本信息(在修改以前必定要把原分區數據遷移出來,避免操做失誤數據丟失)。
刪除非法的分區:
SQL> alter table obj drop partition r3;
新增分區:
SQL> alter table obj add partition r3 values less than(maxvalue) tablespace p3;
Table altered.
SQL> select table_name,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='OBJ';
TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
OBJ R1 P1
OBJ R2 P2
OBJ R3 P3
從新驗證TTS規範:
SQL> exec dbms_tts.transport_set_check('P1,P2,P3',true,true);
SQL> select * from transport_set_violations;
VIOLATIONS
----------------------------------------------------------------------------------------------------
ORA-39921: Default Partition (Table) Tablespace USERS for OBJ not contained in transportable set.
OBJ分區表 默認的表空間是user,這裏須要修改掉。
QL> select TABLE_NAME,PARTITION_COUNT,DEF_TABLESPACE_NAME from user_part_tables where table_name='OBJ';
TABLE_NAME PARTITION_COUNT DEF_TABLESPACE_NAME
------------------------------ --------------- ------------------------------
OBJ 3 USERS
待完成:
可傳輸表空間(還有個集)最大的優點是其速度比export/import或unload/load要快的多。由於可傳輸表空間主要是複製數據文件到目標路徑,而後再使用export/import或Data Pump export/import等應用僅導出/導入表空間對象的元數據到新數據庫。
關於可傳輸表空間,還有個集(Transportable Tablespace Sets)的建立,其中都提到了很重要一點,就是被傳輸的表空間在傳輸過程當中必須置爲 read-only。而在實際操做過程當中,對於某些生產數據庫,將表空間置爲 read-only 是件很是複雜的事情甚至徹底不容許,有了 RMAN 的 Transportable Tablespace,這一切都得以免。RMAN 經過備份建立可傳輸表空間集,它並不須要存取活動的數據文件,相應也就不須要將表空間置爲 read-only。所以,數據庫可用性獲得提高,尤爲對於超大的表空間,由於被傳輸的表空間在此期間仍可進行讀寫操做,並且把表空間置爲 read-only 模式可能會花費較長時間,
使用 RMAN 建立可傳輸表空間集,容許你在傳輸過程當中指定目標恢復時間點或 SCN,這樣傳輸的數據能夠更靈活,沒必要徹底複製現有表空間,只要備份中存在,你就能夠選擇性的恢復數據。例如,你的備份策略爲保留一週,你但願建立的可傳輸表空間中數據是截止本月底最後一天的數據,那麼你在下個月第一週內任什麼時候候均可以進行傳輸操做而不須要考慮這期間生產庫是否會有寫入操做。
限制:
1.數據庫版本至少是8或8以上的企業版版本才支持TTS特性
2.源庫和目標庫的字符集必須相同
3.要傳輸的表空間名字不能與目標庫原有的表空間名字重複
4.有關聯對象(物化視圖,外部表)或包函對象(分區表,分區索引)通常狀況下是不能被傳輸的,須要人爲手動處理。
5.自10gR2開始,能夠傳輸XMLType對象,不過此時必須得使用IMP/EXP工具,且參數consttraints和triggers設置爲‘Y’。
6.不能傳輸system表空間或者sys用戶對象
7.浮點類型的數據不支持impdp/expdp工具,須要使用imp/exp
環境模擬:
因爲表空間之間存在索引等其餘約束及關係,光遷移表空間勢必產生影響,因此在遷移表空間以前須要作依賴檢查,檢查apptbs1,apptbs2表空間是否有交叉依賴:
execute dbms_tts.transport_set_check('apptbs1,apptbs2',true);
SQL> select * from transport_set_violations;
未選定行
結論: 此時這個表空間集已經不在違背自包含的條件,能夠肯定爲一個可傳輸表空間集。
對源數據庫執行備份,在執行備份時必定要加上include current controlfile不然執行transport tablespace命令時會出現如下錯誤信息:
Automatic instance removed
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of tranport tablespace command at 03/26/2015 20:24:22
RMAN-03015: error occurred in stored script Memory Script
RMAN-06026: some targets not found - aborting restore
RMAN-06024: no backup or copy of the control file found to restore
RMAN> backup as backupset database format '/u05/oracle/oracle_bk/orclasm/full_%n_%T_%t_%s_%p.bak' include current controlfile plus archivelog delete input;
使用目標數據庫控制文件替代恢復目錄
RMAN-05026: 警告: 假定如下表空間集適用於指定的時間點
表空間列表要求具備 UNDO 段
表空間 SYSTEM
表空間 UNDOTBS1
使用 SID='ORCL' 建立自動實例
供自動實例使用的初始化參數:
db_name=ORCLASM
db_unique_name=ypkw_tspitr_ORCLASM
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=280M
processes=50
db_create_file_dest=/u05/tmp
log_archive_dest_1='location=/u05/tmp'
#No auxiliary parameter file used
啓動自動實例 ORCL
Oracle 實例已啓動
系統全局區域總計 292278272 字節
Fixed Size 2175128 字節
Variable Size 100667240 字節
Database Buffers 184549376 字節
Redo Buffers 4886528 字節
自動實例已建立
對恢復集表空間運行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成
內存腳本的內容:
{
# set requested point in time
set until scn 1897575;
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
sql 'alter system archive log current';
}
正在執行內存腳本
正在執行命令: SET until clause
啓動 restore 於 29-3月 -18
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=81 設備類型=DISK
通道 ORA_AUX_DISK_1: 正在開始還原數據文件備份集
通道 ORA_AUX_DISK_1: 正在還原控制文件
通道 ORA_AUX_DISK_1: 正在讀取備份片斷 D:\FULL_05SV118N_1_1.BAK
通道 ORA_AUX_DISK_1: 段句柄 = D:\FULL_05SV118N_1_1.BAK 標記 = TAG20180329T174606
通道 ORA_AUX_DISK_1: 已還原備份片斷 1
通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:00:01
輸出文件名=E:\APP\ARCH\ORCL\CONTROLFILE\O1_MF_FCSG7PG4_.CTL
完成 restore 於 29-3月 -18
sql 語句: alter database mount clone database
sql 語句: alter system archive log current
內存腳本的內容:
{
# set requested point in time
set until scn 1897575;
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 2 to new;
set newname for clone tempfile 1 to new;
set newname for datafile 7 to
"E:/app/arch\APPLTS1.DBF";
set newname for datafile 8 to
"E:/app/arch\APPLTS2.DBF";
set newname for datafile 9 to
"E:/app/arch\APPLTS3.DBF";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 3, 2, 7, 8, 9;
switch clone datafile all;
}
正在執行內存腳本
正在執行命令: SET until clause
正在執行命令: SET NEWNAME
正在執行命令: SET NEWNAME
正在執行命令: SET NEWNAME
正在執行命令: SET NEWNAME
正在執行命令: SET NEWNAME
正在執行命令: SET NEWNAME
正在執行命令: SET NEWNAME
臨時文件 1 在控制文件中已重命名爲 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_TEMP_%U_.TMP
啓動 restore 於 29-3月 -18
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在開始還原數據文件備份集
通道 ORA_AUX_DISK_1: 正在指定從備份集還原的數據文件
通道 ORA_AUX_DISK_1: 將數據文件 00001 還原到 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_SYS
TEM_%U_.DBF
通道 ORA_AUX_DISK_1: 將數據文件 00003 還原到 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_UND
OTBS1_%U_.DBF
通道 ORA_AUX_DISK_1: 將數據文件 00002 還原到 E:\APP\ARCH\ORCL\DATAFILE\O1_MF_SYS
AUX_%U_.DBF
通道 ORA_AUX_DISK_1: 將數據文件 00007 還原到 E:/app/arch\APPLTS1.DBF
通道 ORA_AUX_DISK_1: 將數據文件 00008 還原到 E:/app/arch\APPLTS2.DBF
通道 ORA_AUX_DISK_1: 將數據文件 00009 還原到 E:/app/arch\APPLTS3.DBF
通道 ORA_AUX_DISK_1: 正在讀取備份片斷 D:\FULL_04SV116V_1_1.BAK
通道 ORA_AUX_DISK_1: 段句柄 = D:\FULL_04SV116V_1_1.BAK 標記 = TAG20180329T174606
通道 ORA_AUX_DISK_1: 已還原備份片斷 1
通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:00:35
完成 restore 於 29-3月 -18
數據文件 1 已轉換成數據文件副本
輸入數據文件副本 RECID=8 STAMP=972064802 文件名=E:\APP\ARCH\ORCL\DATAFILE\O1_MF_
SYSTEM_FCSG7YKR_.DBF
數據文件 3 已轉換成數據文件副本
輸入數據文件副本 RECID=9 STAMP=972064802 文件名=E:\APP\ARCH\ORCL\DATAFILE\O1_MF_
UNDOTBS1_FCSG7YNK_.DBF
數據文件 2 已轉換成數據文件副本
輸入數據文件副本 RECID=10 STAMP=972064803 文件名=E:\APP\ARCH\ORCL\DATAFILE\O1_MF
_SYSAUX_FCSG7YN7_.DBF
數據文件 7 已轉換成數據文件副本
輸入數據文件副本 RECID=11 STAMP=972064803 文件名=E:\APP\ARCH\APPLTS1.DBF
數據文件 8 已轉換成數據文件副本
輸入數據文件副本 RECID=12 STAMP=972064804 文件名=E:\APP\ARCH\APPLTS2.DBF
數據文件 9 已轉換成數據文件副本
輸入數據文件副本 RECID=13 STAMP=972064805 文件名=E:\APP\ARCH\APPLTS3.DBF
內存腳本的內容:
{