天天看點

手工 XTTS CPT 遷移-跨平台遷移資料庫

-- xtts 跨平台遷移資料庫

-- 步驟:

1、初始化參數設定;

2、将源端資料檔案傳輸到目标系統;

3、轉換資料檔案為目标系統的位元組序;

4、在源端建立增量備份,并傳輸到目标端;

5、在目标端恢複增量備份;

6、重複多次操作4和5步驟;

7、将源端資料庫表空間設定為 read only 模式;

8、最後一次執行4和5步驟;

9、在源端導出中繼資料,并在目标端導入;

10、将目标端的資料庫表空間設定為 read write;

11、資料驗證。

-- 建議xtts目錄和/rman 備份的路徑目錄都使用nfs共享

alter system set deferred_segment_creation=false sid='*' scope=spfile;

-- ###########################增量臨時檔案在asm######### xtt.properties ##########################

tablespaces=sprod_tbs,idx_tbs

platformid=13

dfcopydir=/xttrman/full -- 本地全量備份資料的路徑

backupformat=/xttrman/incr -- 本地增量備份資料的路徑

stageondest=/xttrman/full -- 目标端所需要恢複資料的路徑,後續生成的增量也要拷貝到這裡

storageondest=+data/prod/datafile -- 目标端資料檔案路徑 -c 的時候放的位置

backupondest=+data/prod/datafile -- 目标端增量檔案的臨時路徑,做完增量後會自動删除,如果放asm需要設定asm_home和asm_sid

asm_home=/oracle/app/grid/product/11.2.0/grid

asm_sid=+asm

parallel=2

rollparallel=2

getfileparallel=2

-- #############################建議使用這種方式,增量臨時檔案在檔案系統###### xtt.properties #######################

dfcopydir=/xttrman/full

backupformat=/xttrman/incr

stageondest=/xttrman/full

storageondest=+data/prod/datafile

backupondest=/xttrman/rec

#asm_home=/oracle/app/grid/product/11.2.0/grid

#asm_sid=+asm

-- ###########################################################################################

-- 源端全量備份腳本

cat full_backup.sh 

export tmpdir=/oracle/soft/xttconvert

perl xttdriver.pl -p

-- 源端執行全量備份

sh full_backup.sh

-- 生成檔案

$ cat xttplan.txt 

sprod_tbs::::967892

6

idx_tbs::::967892

$ cat rmanconvert.cmd

host 'echo ts::sprod_tbs'; 

convert from platform 'linux x86 64-bit' 

datafile 

'/xttrman/full/sprod_tbs_5.tf' 

,'/xttrman/full/sprod_tbs_6.tf' 

format '+data/prod/datafile/%n_%f.dbf' 

parallelism 2; 

host 'echo ts::idx_tbs'; 

'/xttrman/full/idx_tbs_7.tf' 

parallelism 2;

-- 目标端,執行恢複轉換

vi convert.sh

export xttdebug=1

perl xttdriver.pl -c

sh convert.sh

vi do_incr.sh

perl xttdriver.pl -i

-- 源端增量備份

sh do_incr.sh

$ cat xttplan.txt.new 

sprod_tbs::::968168

idx_tbs::::968196

[oracle@localhost xttconvert]$ cat tsbkupmap.txt

idx_tbs::7:::1=07u31cir_1_1

sprod_tbs::5,6:::1=06u31ciq_1_1

-- 注意每次做完增量 需要将增量的資料檔案拷貝到全量備份的目錄下,恢複完删除/xttrman/incr/*

cp /xttrman/incr/-* /xttrman/full/

-- 目标端增量恢複

vi restore_incr.sh

perl xttdriver.pl -r

-- 注意如果增量恢複檔案放在asm可能會出現以下錯誤,可以忽略,這個是xtts無法自動删除asm的臨時檔案

can't locate strict.pm in @inc (@inc contains: /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0 /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl/5.10.0 /oracle/app/grid/product/11.2.0/grid/lib /oracle/app/grid/product/11.2.0/grid/lib/asmcmd /oracle/app/grid/product/11.2.0/grid/rdbms/lib/asmcmd /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0 /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl/5.10.0 /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/5.10.0 /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl/5.10.0/x86_64-linux-thread-multi /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl/5.10.0 /oracle/app/grid/product/11.2.0/grid/perl/lib/site_perl .) at /oracle/app/grid/product/11.2.0/grid/bin/asmcmdcore line 143.

begin failed--compilation aborted at /oracle/app/grid/product/11.2.0/grid/bin/asmcmdcore line 143.

-- 下次增量要記錄目前恢複的scn位置,産生最新 xttplan.txt 檔案,要不然下次增量還會在全量進行備份

perl xttdriver.pl -s

-- 後續增量循環以下三步驟

sh restore_incr.sh

-- 最後一次增量,表空間設定為隻讀模式

sql> alter tablespace sprod_tbs read only;

tablespace altered.

sql> alter tablespace idx_tbs read only;

-- 最後一次恢複

sh do_incr.sh 

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

-- 傳輸表空間

傳輸表空間的步驟可以和最後一次增量備份同時執行,可開并行

方法1:

-- 目标端執行,得到impdp腳本

$oracle_home/perl/bin/perl xttdriver.pl –e

impdp system/oracle directory=ddmp logfile=impdp_xtts_20180527.lognetwork_link=test \

transport_full_check=no \

transport_tablespaces=test,test_ind \

transport_datafiles='/data3/oradata/targetdb/test_5.dbf','/data3/oradata/targetdb/test_ind_6.dbf'

方法2:

-- 手工導出導入表空間

源端

expdp system/oracle directory=sdmp dumpfile=xtts.dmplogfile=expdp_xtts_20180527.log transport_tablespaces=test,test_indtransport_full_check=no;

-- 複制導出的檔案到目标端

目标端

impdp system/oracle directory=ddmp dumpfile=xtts.dmplogfile=impdp_xtts_20180527.logtransport_datafiles='/app/oradata/targetdb/test_5.dbf,/app/oradata/targetdb/test_ind_6.dbf'

-- 驗證,傳輸完成後應該能夠看到所有表空間,并且能夠查詢其中的資料

set pagesize 2000

set linesize 200

col file_name for a40

col object_name for a30

select tablespace_name from dba_tablespaces;

-- 導入中繼資料

-- 源端檢查表空間的自包含性

sql> execute dbms_tts.transport_set_check('test02', true);

sql> select * from transport_set_violations; 

no rows selected

/*

$ expdp system/oracle directory=source_dbdata dumpfile=test02.dmp transport_tablespaces=test02 transport_full_check=y

$ impdp test02/test02 dumpfile=test02.dmp directory=source_dbdata transport_datafiles=/home/oracle/xtts/target_data/test02_7.dbf

*/

-- 方式一

-- 建議不要導入統計資訊,目标庫直接收集

create or replace directory xtts_dir as '/oracle/soft/'

create database link ttslink connect to system identified by "oracle" using 'sprod';

asmcmd> ls -al

warning:option 'a' is deprecated for 'ls'

please use 'absolutepath'

type redund striped time sys name

datafile unprot coarse jun 01 21:00:00 y +data/prod/datafile/idx_tbs_7.dbf => idx_tbs.274.1009834557

datafile unprot coarse jun 01 21:00:00 y +data/prod/datafile/sprod_tbs_5.dbf => sprod_tbs.273.1009834553

datafile unprot coarse jun 01 21:00:00 y +data/prod/datafile/sprod_tbs_6.dbf => sprod_tbs.275.1009834553

datafile unprot coarse jun 01 21:00:00 y none => sysaux.257.1009808403

datafile unprot coarse jun 01 21:00:00 y none => system.256.1009808403

datafile unprot coarse jun 01 21:00:00 y none => undotbs1.258.1009808403

datafile unprot coarse jun 01 21:00:00 y none => users.259.1009808403

n idx_tbs_7.dbf => +data/prod/datafile/idx_tbs.274.1009834557

n sprod_tbs_5.dbf => +data/prod/datafile/sprod_tbs.273.1009834553

n sprod_tbs_6.dbf => +data/prod/datafile/sprod_tbs.275.1009834553

asmcmd>

impdp \’/ as sysdba\‘ directory=xtts_dir logfile=tts_imp.log network_link=ttslink transport_full_check=no transport_tablespaces=sprod_tbs,idx_tbs exclude=statistics transport_datafiles='+data/prod/datafile/idx_tbs.275.1009832163','+data/prod/datafile/sprod_tbs.274.1009832159','+data/prod/datafile/sprod_tbs.273.1009832159'

ls -al|grep -v *.zip|grep -v .sh|awk -f' ' '{print $9}'|xargs rm -rf

-- 方式二

-- 源端導出,如果不對資料字典做任何修改操作,可提前導出

expdp system/oracle directory=xtts_dir logfile=dp_fullexp_meta.log dumpfile=dp_full.dmp full=y content=metadata_only

-- 目标端導入

impdp system/oracle directory=xtts_dir logfile=dp_fullexp_meta.log dumpfile=dp_full.dmp full=y content=metadata_only

-- 自定義 role 處理

select granted_role from dba_role_privs wheregrantee='xtts';

create role r_init_user;

select 'grant '||privilege||' to '||grantee||';' fromdba_sys_privs where grantee='r_init_user';

-- 自定義 profile 處理

set long 1000000

set pagesize 3000

set lines 200

set heading off

set verify off

set feedback off

set echo on

set timing off

set wrap on

set longchunksize 400

spool create_profile.sql

with profile as(

select distinct profile from dba_profiles)

select dbms_metadata.get_ddl('profile',profile) fromprofile;

-- 臨時表處理

select dbms_metadata.get_ddl('table',table_name,owner)

from dba_tables

where temporary='y' and owner in ();

-- 解釋:

tablespaces=    -- 需要遷移的表空間

platformid=   -- 源 os 平台 id

dfcopydir=   -- 源資料庫備份檔案存放目錄

backupformat=    -- 源資料庫增備檔案存放目錄

stageondest=   -- 目标據庫備份檔案存放目錄

storageondest=   -- 目标據庫正式檔案存放目錄

backupondest=   -- 目标據庫增備檔案存放目錄

parallel=   -- 備份,轉化的并行度

rollparallel=   -- 增備的并行度

getfileparallel=  -- 使用 dbms_file_transfer 方式的并行度

-- xtts 跨平台遷移資料庫 2

1、源和目标庫建立資料庫對應的目錄,目标庫建立公共dblink使用 system 使用者

# source db

create or replace directory ora10g_dbf_dir as '+data/ora10g/datafile';

create or replace directory xttsfiles as '/home/oracle/xttsfiles';

grant read,write on directory ... to public;

# target db

create or replace directory ora12c_dbf_dir as '+data/ora12c/datafile';

create database link ora10g_link connect to system identified by system using 'ora10g';

2、解壓 xtts

unzip -d /home/oracle/xtts rman_xttconvert_1.4.zip

3、編輯 xtts.properties 配置檔案

vi xtts.properties

tablespace=ap_data,ap_idx

# source db param

platform=2

srcdir=ora10g_dbf_dir

srclink=ora10g_link

dfcopydir=/home/oracle/xttsfiles

backupformat=/home/oracle/xttsfiles

# target db param

dstdir=ora12c_dbf_dir

stageondest=/home/oracle/xttsfiles

storageondest=+data

backupondest=+fra

asm_home=/u01/app/12.1.0/grid

parallel=4

4、執行腳本

-- 初始提取

generate initial datafile image copies:

$ ./xttdriver.pl -s

copy scripts & files to destination platform:

$ scp ... ...

pull initial datafile image copies to destination:

$ ./xttdriver.pl -g

conversion handled implicitly!

-- 增量同步

generate incremental level 1 backup sets:

$ ./xttdriver.pl -i

capture scn of last synchronization:

use incremental level 1 backup sets to recover datafile image copies to current scn:

$ ./xttdriver.pl -r

-- 當源庫與目标庫期望接近時,dba決定完成遷移,則将所有需要xtts遷移的對象設定為隻讀模式,

alter tablespace ... read only;

-- 直到最後一個1級增量備份被捕獲兵傳輸到目标庫,然後應用于0級備份,在最後一次恢複。

-- 最終同步

use incremental level 1 backup sets to recover datafile image copies to final scn:

import metadata into destination database:

$ ./xttdriver.pl -e

-- cpt(cross-platform transport) 跨平台遷移資料庫

# source 12.1.0.1 

backup read only tablespace as backup sets:

rman target /

backup for transport format '+data' datapump format '/home/oracle/cpt/dp_file.dmp' tablespace tpch_data,tpch_idx;

copy datafile backup sets to target database 12.1.0.2

use dbms_file_transfer or other os tools transport to destination os.

# target 12.1.0.2 non-cdb

restore foreign tablespace tpch_data,tpch_idx format '+data' from backupset '+reco' dump file from backupset '/home/oracle/cpt/dp_file.dmp';