1. 程式人生 > >exp/expdp傳輸表空間和rman convert實現大資料量快速遷移

exp/expdp傳輸表空間和rman convert實現大資料量快速遷移

將Oracle資料庫中某個使用者遷移到另外一個庫上,遷移的資料量大小約 120GB 。如果採用 expdp 匯出的話時間會很長,再加上匯出的 DMP 檔案拷貝和 impdp 匯入資料的時間,不能滿足要求。 

這裡採用 RMAN 的CONVERT 功能和 exp/expdp 的transport_tablespace 的功能。前者將使用者所在的表空間的資料檔案從一個數據庫所在的系統平臺中拷貝到另外一個數據庫系統上,後者將表空間對應的 metadata 資料拷貝出來。

測試過程雖然順利,但最後想到一個問題, rman 中的 catalog 記錄的 copy 的檔案已經被資料庫例項佔用的情況下,該記錄如何刪除掉?

後來想到 rman convert 方法,它將檔案系統檔案拷貝到 ASM 磁碟組,不在 catalog 中留記錄。同時,這個方法免去了檔名稱修改的操作,更簡潔高效。

使用 convert 可以實現跨平臺的資料遷移,這點在環境複雜的專案中非常有用。

首先,介紹一下環境。

源庫是 redhat linux as 5 ,單資料庫例項,檔案系統格式儲存資料檔案,資料庫版本為 10.2.0.4 。

目標庫是 redhat linux as 5 ,兩節點的 RAC , ASM 格式儲存資料檔案,資料庫版本為 10.2.0.4 。

可以使用 SELECT * FROMV$TRANSPORTABLE_PLATFORM; 檢查這個版本上的表空間是否支援傳輸。結果當然是支援的。

其次,瞭解遷移的表空間和資料物件。

根據 dba_segments 查詢到使用者使用的哪些表空間,好決定要遷移的表空間。

在表空間確定了以後,如這裡是 xxyy 。需要再根據表空間的 segment 都是哪些使用者,如果不僅僅是要遷移的使用者,還要將新的使用者也找出來。

在目標庫上提前將這些使用者建立好。

這是因為我們採用的是表空間傳輸遷移資料,所以難免會有多的物件被遷移。根據實際情況權衡,決定是清理源頭還是全部遷移。

表空間的 segment 的型別需要先分析一下。對於分割槽表、 IOT 表、 XMLType 物件等等不常見的,要先想想能不能用它遷移,這是第一點。

還有兩點:一,目標庫和源庫的字符集要一致,否則請測試該方案;二、目標庫不能有同名的表空間。

最後,開始正式遷移操作,步驟如下:

第一步,準備工作

校驗表空間是否 self contained (注:不知道如何翻譯,原文輸出)

       SQL> execute sys.dbms_tts.transport_set_check('XXYY', true);

       SQL> select * from sys.transport_set_violations;

如果有記錄,必須處理。

將表空間設定為只讀狀態。這點好理解,開始遷移了,就不能再寫入資料到表空間了。

       SQL> ALTER TABLESPACE XXYY READ ONLY;

第二步,使用 exp 匯出表空間所有物件的 metadata

exp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_exp.log   transport_tablespace=y   tablespaces=XXYY

第三步,使用 rman 的convert 將表空間的資料檔案拷貝到檔案系統上。

確定檔案系統的平臺名稱

SQL> SELECT tp.platform_id,substr(d.PLATFORM_NAME,1,30), ENDIAN_FORMAT

 2       FROM V$TRANSPORTABLE_PLATFORM tp,V$DATABASE d

 3       WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

PLATFORM_IDSUBSTR(D.PLATFORM_NAME,1,30)

-----------------------------------------------------------------------

ENDIAN_FORMAT

--------------

        13 Linux x86 64-bit

Little

根據平臺名稱,拷貝出文件名稱。

converttablespace xxyy             to platform="Linux x86 64-bit" FORMAT'/u01/oradata/servdb/%U';

測試操作過程如下

[[email protected]]$ rman target /

RecoveryManager: Release 10.2.0.4.0 - Production on Wed Apr 18 13:13:04 2012

Copyrigxx(c) 1982, 2007, Oracle.  All rigxxs reserved.

connectedto target database: SERVDB (DBID=3658273059)

RMAN>convert tablespace xxyy            to platform="Linux x86 64-bit" FORMAT '/u01/oradata/servdb/%U';

Startingbackup at 18-APR-12

usingtarget database control file instead of recovery catalog

allocatedchannel: ORA_DISK_1

channelORA_DISK_1: sid=347 devtype=DISK

channelORA_DISK_1: starting datafile conversion

inputdatafile fno=00035 name=/u01/oradata/servdb/datafile/xxyy01.dbf

^[converteddatafile=/u01/oradata/servdb/data_D-SERVDB_I-3658273059_TS-XXYY_FNO-35_e1n8o3nc

channelORA_DISK_1: datafile conversion complete, elapsed time: 00:10:55

Finishedbackup at 18-APR-12

第四步,將檔案拷貝到目標庫所在的系統上

這裡使用 scp ,也可以使用 ftp ,那樣會更快。

第五步,在目標庫上建使用者,匯入資料

imp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.logtransport_tablespace=y datafiles='/dbbackup/servdb_rman/xxyy01.dbf'

第六步,檢查表空間狀態和調整表空間為讀寫

雖然目標庫是 RAC ,檔案又是儲存在 ASM 上,但是也不是不能訪問檔案系統上的檔案。

只是檔案系統檔案無法共享,所以,只能在一個節點上看到。

/dbbackup/[email protected]=>xxzq1$sqlplus/ as sysdba

SQL*Plus:Release 10.2.0.4.0 - Production on Wed Apr 18 16:39:56 2012

Copyrigxx(c) 1982, 2007, Oracle.  All Rigxxs Reserved.

Connectedto:

OracleDatabase 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

Withthe Partitioning, Real Application Clusters, OLAP, Data Mining

andReal Application Testing options

SQL>set linesize 300

SQL>col name format a50

SQL>r

 1* select file#,name,status from v$datafile

    FILE#NAME                                              STATUS

------------------------------------------------------------ -------

        1 +LOGDG/xxzq/system01.dbf                          SYSTEM

        2 +LOGDG/xxzq/undotbs01.dbf                         ONLINE

        3 +LOGDG/xxzq/sysaux01.dbf                          ONLINE

        4 +LOGDG/xxzq/users01.dbf                           ONLINE

        5 +LOGDG/xxzq/undotbs02.dbf                         ONLINE

        6 +LOGDG/xxzq/tbs_yy01.dbf                          ONLINE

        7 /dbbackup/servdb_rman/xxyy01.dbf                  ONLINE

7rows selected.

這個結果表空間的資料在其他例項上也操作了,將導致系統宕機,因為其他例項根本不能讀寫到這個系統上的檔案。

我們正常將是設定為讀寫狀態。這是為了將檔案從檔案系統上遷移到 ASM 上。

SQL>alter tablespace xxyy read write;

如果不將表空間設定為讀寫狀態,則對此表空間檔案的 COPY 將出錯。開始我也沒設定為讀寫,所以報錯了。

RMAN>backup as copy datafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

Startingbackup at 18-APR-12

usingchannel ORA_DISK_1

RMAN-00571:===========================================================

RMAN-00569:=============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571:===========================================================

RMAN-03002:failure of backup command at 04/18/2012 16:45:25

RMAN-20201:datafile not found in the recovery catalog

RMAN-06010:error while looking up datafile: /dbbackup/servdb_rman/xxyy01.dbf

RMAN>exit

設定為讀寫後,正常將資料檔案拷貝一份到了 ASM 上。

backupas copy datafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

第七步,將檔案離線,在重新命名就可以了。

SQL>alter database datafile '/dbbackup/servdb_rman/xxyy01.dbf' offline;

Databasealtered.

SQL>alter database rename file '/dbbackup/servdb_rman/xxyy01.dbf' to '+LOGDG/xxzq/xxyy01.dbf';

Databasealtered.

SQL>select name from v$datafile;

NAME

--------------------------------------------------------------------------------

+LOGDG/xxzq/system01.dbf

+LOGDG/xxzq/undotbs01.dbf

+LOGDG/xxzq/sysaux01.dbf

+LOGDG/xxzq/users01.dbf

+LOGDG/xxzq/undotbs02.dbf

+LOGDG/xxzq/tbs_yy01.dbf

+LOGDG/xxzq/xxyy01.dbf

7rows selected.

SQL>alter database datafile 7 online;

alterdatabase datafile 7 online

*

ERRORat line 1:

ORA-01113:file 7 needs media recovery

ORA-01110:data file 7: '+LOGDG/xxzq/xxyy01.dbf'

SQL>recover datafile 7;

Mediarecovery complete.

SQL>alter database datafile 7 online;

Databasealtered.

SQL>exit

遷移實際上到這步就結束了。

但最後想到一個問題。

我們將檔案使用 copy 拷貝到了 asm 中,然後讓例項使用了。

這時, rman 的catalog 還是認為這個檔案是它的一個拷貝,雖然不能刪除,但始終是個芥蒂。

/dbbackup/[email protected]=>xxzq1$rmantarget /

RecoveryManager: Release 10.2.0.4.0 - Production on Wed Apr 18 16:20:36 2012

Copyrigxx(c) 1982, 2007, Oracle.  All rigxxs reserved.

connectedto target database: XXZQ (DBID=485623294)

RMAN>list copy;

usingtarget database control file instead of recovery catalog

specificationdoes not match any archive log in the recovery catalog

Listof Datafile Copies

Key    File S Completion Time Ckp SCN    CkpTime        Name

----------- - --------------- ---------- --------------- ----

3      7    A 18-APR-12       9853271475418-APR-12       +LOGDG/xxzq/xxyy01.dbf

嘗試使用 RMAN 的switch 作資料檔案重新命名,但 rman 中還是有這個記錄,不能除掉。

RMAN>switch datafile '/dbbackup/servdb_rman/xxyy01.dbf'  to copy;

最後,想到一個方法。使用 convert 代替 copy 將資料檔案複製到 ASM 中。 convert 操作是不在 catalog 中留記錄的。

上面列的操作步驟在第四步之後就進行跳轉。

第四步中將檔案傳輸到檔案系統中後,使用 rman convert 將檔案複製一份到 ASM 磁碟組中。

這個 convert 功能在 rman catalog 中不保留記錄,可以實現 ASM 和檔案系統的檔案相互轉移。

方法如下:

convertdatafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

這個檔案約 5GB ,所用時間為 35 秒。

RMAN>convert datafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

Startingbackup at 19-APR-12

usingtarget database control file instead of recovery catalog

allocatedchannel: ORA_DISK_1

channelORA_DISK_1: sid=105 instance=xxzq1 devtype=DISK

channelORA_DISK_1: starting datafile conversion

inputfilename=/dbbackup/servdb_rman/xxyy01.dbf

converteddatafile=+LOGDG/xxzq/xxyy01.dbf

channelORA_DISK_1: datafile conversion complete, elapsed time: 00:00:35

Finishedbackup at 19-APR-12

第五步,在目標庫上建使用者,匯入資料

imp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.logtransport_tablespace=y datafiles='+LOGDG/xxzq/xxyy01.dbf'

這個步驟和上述用的差別就是檔名稱的差別。

第六步,檢查表空間狀態和調整表空間為讀寫

因為資料檔案本身就在 ASM 磁碟組上, RAC 的兩個節點都能訪問得到該檔案,所以我們先查查檔案狀態。

SQL>set linesize 300

SQL>col name format a50

SQL>r

 1* select file#,name,status from v$datafile

    FILE#NAME                                              STATUS

------------------------------------------------------------ -------

        1 +LOGDG/xxzq/system01.dbf                          SYSTEM

        2 +LOGDG/xxzq/undotbs01.dbf                         ONLINE

        3 +LOGDG/xxzq/sysaux01.dbf                          ONLINE

        4 +LOGDG/xxzq/users01.dbf                           ONLINE

        5 +LOGDG/xxzq/undotbs02.dbf                         ONLINE

        6 +LOGDG/xxzq/tbs_yy01.dbf                          ONLINE

        7 +LOGDG/xxzq/xxyy01.dbf                         ONLINE

7rows selected.

所有檔案都是 ONLINE 的狀態。

我們將其設定為讀寫狀態,這樣使用者就可以讀寫遷移過來的表空間中的所有物件了。

SQL>alter tablespace xxyy read write;

我們回到 RMAN 中,使用 list copy 檢查一下檔案有沒有拷貝記錄。

/u01/oracle/[email protected]=>xxzq1$rmantarget /

RecoveryManager: Release 10.2.0.4.0 - Production on Thu Apr 19 09:46:23 2012

Copyrigxx(c) 1982, 2007, Oracle.  All rigxxs reserved.

connectedto target database: XXZQ (DBID=485623294)

RMAN>list copy;

usingtarget database control file instead of recovery catalog

specificationdoes not match any archive log in the recovery catalog

結果和我們想的一樣,在 rman catalog 中沒有任何記錄。因此該方法應該是首選。

總結

對已大資料量的遷移工作,使用表空間傳輸的方法實現是效率比較高的一種方法。

exp/expdp 遷移 metadata , rman convert 遷移資料檔案。

他們的聯合使用,可以支援跨平臺、跨檔案系統的遷移,這點在環境複雜的專案中非常有用。

相關推薦

exp/expdp傳輸空間rman convert實現料量快速遷移

將Oracle資料庫中某個使用者遷移到另外一個庫上,遷移的資料量大小約 120GB 。如果採用 expdp 匯出的話時間會很長,再加上匯出的 DMP 檔案拷貝和 impdp 匯入資料的時間,不能滿足要求。  這裡採用 RMAN 的CONVERT 功能和 exp/expdp

WEB Service 下實現料量傳輸

)直接返回DataSet物件  特點:通常元件化的處理機制,不加任何修飾及處理;  優點:程式碼精減、易於處理,小資料量處理較快;  缺點:大資料量的傳遞處理慢,消耗網路資源;  建議:當應用系統在內網、專網(區域網)的應用時,或外網(廣域網)且資料量在KB級時的

MySql 料量快速插入語句優化

INSERT語句的速度 插入一個記錄需要的時間由下列因素組成,其中的數字表示大約比例:連線:(3) 傳送查詢給伺服器:(2) 分析查詢:(2) 插入記錄:(1x記錄大小) 插入索引:(1x索引) 關閉:(1) 這不考慮開啟表的初始開銷,每個併發執行的查詢開啟。

用Toad for Oracle創建數據庫空間用戶

創建數據庫 ssi 密碼 ble src base ace 創建用戶 pac 打開Toad, 1,菜單欄Session—>new Connection….打開如下窗口: 2,進入之後,菜單DatebaseàSechema Brower。。。找到Table Spa

Oracle建立空間用戶

creat 增長 pac files tor initial ide efault start Oracle建立表空間和用戶 建立表空間和用戶的步驟: 用戶 建立:create user 用戶名 identified by

創建Oracle空間用戶

ide others maxsize 創建用戶 max add emp alter ant create oracle tablespace and user /*第1步:創建臨時表空間 */ create temporary tablespace test_temp t

ORACLE12C PDB創建默認空間用戶語句

oracle12c data upd 客戶 del mit apc 默認 exec 第一次接觸到12C CDB和PDB數據庫,且客戶提供的是ORACLE一體機,只有訪問權,費勁周折,今記錄12C創建默認路徑表空間語句和用戶 --創建默認表空間: create tablesp

11g創建空間用戶(不區分大小寫)與導入導出命令

RR cmd IT word bho contents ide 刪除 創建用戶 --用戶名不區分大小寫--刪除用戶表空間drop user &用戶名 cascade;drop tablespace &永久表空間名稱 including contents a

MySQL5.7傳輸空間——遷移分區

flush 目標 utf8 存儲 nod db文件 否則 exp 完成 Mysql 傳輸表空間--將InnoDB分區表復制到另一個實例(二)實驗環境:(都是mysql5.7) 源庫:192.168.2.200 mysql5.7.16 zhangdb下的em

Oracle dmp文件導入(還原)到不同的空間不同的用戶下

map 文件的 schema 導出數據 esp ans 進行 taf 修改 Oracle dmp文件導入(還原)到不同的表空間和不同的用戶下一、exp/imp解決方法:1、可以用sed修改dmp文件,正常導入sed -i 's/TEST_TS/USERS/g'

Oracle建立空間

    本人使用的操作資料庫的IDE事datagrip(與強大的IDEA,WEBSTORM同屬捷克的JetBrains公司),用慣了idea和webstorm的同志們會覺得畫面很親切     下面介紹一下建立表空間,建立操作使用者,以及為使用者分配許可權的操作: &

Oracle12c,CDBPDB建立空間使用者,以及Pl/SQL連線PDB

 今天上午剛安裝的12c,用來一下午的時間總結出來的,不保猜測的對錯,但保證SQL能執行成功。 CDB給使用者授權表空間的SQL是從別出整理過來的,因為我是在PDB中建立,沒測試過下面程式碼是否可用。 alter user C##truedata quota unlimited on TRUED

一、orcale建立空間使用者

create tablespace zml20180730 datafile 'E:\orcale\data\zml20180730.dbf' size 300m autoextend on next 100m maxsize unlimited extent Managemen

Mysql下傳輸空間

源庫 test 目標庫  tes 把test庫下的 t3表 ,傳輸到tes庫下面 步驟 1 目標庫上建立與原庫一樣的表t3 2 解除安裝目標庫下的t3的表空間 3 在源庫執行表空間匯出 4 將源庫上的匯出檔案複製到目標庫,並修改許可權 5 源庫上執行解鎖操作 6 目標庫上執行表空間

mysql database:傳輸空間

源庫 [[email protected] ~]# su - mysql [[email protected] ~]$ mysql -utpcc -ptpcc mysql> use 

ORACLE 12C下建立空間新使用者

首先是關於ORACLE 12C的新特性,這部分內容轉載自https://www.cnblogs.com/kerrycode/p/3386917.html,如有轉載限制,請聯絡我  Oracle 12C引入了CDB與PDB的新特性,在ORACLE 12C資料庫引入的多租使用者環境(Multitena

Oracle 空間資料檔案之間的關係

首先,你需要明白的一點是:資料庫的物理結構是由資料庫的作業系統檔案所決定,每一個Oracle資料庫是由三種類型的檔案組成:資料檔案、日誌檔案和控制檔案。資料庫的檔案為資料庫資訊提供真正的物理儲存。  每一個Oracle資料庫有一個或多個物理的資料檔案(data file)。一個數據庫的資料

oracle建立臨時空間資料空間以及刪除

-----建立臨時表空間----- create temporary tablespace zhangmingchaotemp tempfile 'd:\oracle\zhangmingchaotemp.dbf' -----初始化大小----- size 50m

Oracle建立空間使用者及授權並匯入資料學習筆記

第一步:連線資料庫 通過oracle自帶的客戶端工具sqlplus,以管理員角色連線資料庫 第二步:建立表空間 1.臨時表空間 create temporary tablespace 臨時表空間名 tempfile '表空間存放路徑\臨時表空間名.dbf' size

linux檢視所有的空間使用者

查詢所有的使用者 select username from  dba_users   查詢所有的表空間 select tablespqce_name from user_tables   查詢所有的表 select table_name fr