XTTS数据迁移 rman_xtt_v(一)

传统的传输表空间方式要求数据第一次由源端到目标端传输时,表空间必须置于read only模式,从而生产不可用。而XTTS方式则只需要在最后一次增量备份时将表空间置于read only模式,显著的减少了停机的时间。

1.        大字节平台到小字节平台的迁移

2.        低版本数据库到高版本数据库的升级+ 迁移

DATABASE
source端:Oracle Database - Enterprise Edition - Version 10.2.0.1 to 12.2
dest端:如果使用dbms_file_transfer(DFT),必须是11.2.0.4以上
         如果是Recovery Manager (RMAN),版本低于11.2.0.4时需要安装11.2.0.4的RDBMS运    行11.2.0.4的实例

OS
source端: any platform provided the prerequisites:cannot be Windows

     dest端: only 64-bit Oracle Linux or RedHat Linux certified

测试

source端:

# oslevel -s

6100-06-05-1115


SQL> select * from v$version;

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

 

dest端:

#uname -a

Linux rac1 2.6.32-504.el6.x86_64 #1 SMP Tue Sep 16 01:56:35 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux


sys@ORCL>select * from v$version;


BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

l   数据文件异常

查询是否有异常状态的数据文件,需要做相应处理或更换逻辑迁移方式。

select file_name from dba_data_files where online_status not in('ONLINE','SYSTEM');

l   源端数据文件类型

如果源端使用裸设备,prepare 阶段的dbms_file_transfer 方式将无法使用,只能用rman 方式。

 

l   comments 数量,根据comments 数量决定是否单独导出comment

SELECT * FROM dba_tab_comments where comments is not null and owner not in ('WMSYS','XS$NULL','ORACLE_OCM','APPQOSSYS','DIP','XDB','SYS','SYSTEM','OUTLN','DBSNMP','ANONYMOUS','SYSMAN','MGMT_VIEW','CTXSYS','APPQOSSYS','XS$NULL' );
SELECT * FROM dba_col_comments where comments is not null and owner not in ('WMSYS','XS$NULL','ORACLE_OCM','APPQOSSYS','DIP','XDB','SYS','SYSTEM','OUTLN','DBSNMP','ANONYMOUS','SYSMAN','MGMT_VIEW','CTXSYS','APPQOSSYS','XS$NULL' );

 

l   source 端和 dest 端的要使用相同的兼容性数据库字符集及国家语言字符集

注意: AL32UTF8 UTF8 不同!!

select * from nls_database_parameters where parameter='NLS_CHARACTERSET' or parameter='NLS_LANGUAGE' or parameter='NLS_NCHAR_CHARACTERSET';

l   source 端和 dest 端的数据块大小相同

l   如果 source 端有非标准块大小的表空间,要在 dest 端设置相应的池大小(比如 db_16k_cache_size

l   dest 端不能存在与 source migration 的表空间名相同的 tablespace ,否则 source 端或者 dest 端的表空间需要 rename

SQL> select tablespace_name from dba_tablespaces;
SQL> alter tablespace users rename to oriusers;

l   source 端不同目录下的数据文件不能重名(忽略大小写),通过下面的 sql 查询是否有重名的数据文件:

select upper(substr(file_name,
                    instr(file_name, '/', -1) + 1,
                    length(file_name) - instr(file_name, '/', -1))),
       count(*)
  from dba_data_files
 group by upper(substr(file_name,
                       instr(file_name, '/', -1) + 1,
                       length(file_name) - instr(file_name, '/', -1)))
having count(*) > 1;

本次测试使用SOE及SOE1表空间进行migration

l   目标端确保 db_files 满足导入表空间之后的文件数

l   如果数据库有 timestamp with local time zone 数据类型, source 端和 dest 端的时区必须相同,否则会在 impdp 时报错

l   传输的表空间必须自包含,诸如物化视图,分区表,索引要特别注意检查

对于SOE1,SOE 进行检查

SQL> exec dbms_tts.transport_set_check('SOE,SOE1',TRUE,True);

PL/SQL procedure successfully completed.

SQL> select * from transport_set_violations;

no rows selected

l   如果 migration 的表空间是加密表空间, source 端和 dest endianness 不同不可以使用此方法

l   查看源端是否有 nested iot with key compression 表,如果有,需要修复 Bug 14835322

SELECT owner,table_name from dba_tables where nested='YES' and iot_type is not null and compression='ENABLED';

l   不可以传输 system 表空间或者 sys 用户对象,如果需要传输 owf_mgr 用户,参照 .

l   source 端不可以是windows P7,source端的compatible.rdbms必须大于10.2.0,且不大于目标端compatible.rdbms

SQL> show parameter compatible

l   source 端必须处于归档模式

SQL> archive log list

Database log mode              Archive Mode

此处开启归档并不是为了使用归档文件,而是因为oracle的rman备份必须开启归档才能使用。

l   dest 端OS必须是64-bit Oracle Linux或者认证的redhat linux

P10:source 端RMAN默认是设备类型必须是DISK,且不能配置压缩,否则会报如下错误:

Entering RollForward

After applySetDataFile

Done: applyDataFileTo

Done: RestoreSetPiece

DECLARE

*

ERROR at line 1:

ORA-19624: operation failed, retry possible

ORA-19870: error while restoring backup piece

/dbfs_direct/FS1/xtts/incrementals/xtts_incr_backup

ORA-19608: /dbfs_direct/FS1/xtts/incrementals/xtts_incr_backup is not a backup

piece

ORA-19837: invalid blocksize 0 in backup piece header

ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 2338

ORA-06512: at line 40

l   数据库操作用户必须属于DBA组

l   目标端目录不能有跟源端同名的数据文件

l   如果用户数据量量比较大或数据变化量比较大,需要在全备之前开启 block change tracking 功能,开启此项功能需要修复 Bug 16850197 ,影响数据库版本: 11.2.0.3

SQL> alter database enable block change tracking using file '/opt/oracle/oradata/blktrace/blk_trace.dbf';
SELECT status, filename,bytes/1024/1024 FROM V$BLOCK_CHANGE_TRACKING;

BCT 文件大小估算:

 = <# of redo threads> * (# of old backups + 2) * (size of db/250000)
# of old backups是指控制文件记录的备份数,最大支持到8.

l   检查是否有非标准块大小表空间:

select tablespace_name,block_size from dba_tablespaces;

如果有返回行,则检查是否有默认表空间与段所在表空间的 block size 不同的表:

select * from(
with a as
(select distinct owner,segment_name,tablespace_name from dba_segments
where owner in('SOE',’SOE1’))
select a.owner,a.segment_name,a.tablespace_name tbs1,(select block_size from dba_tablespaces c where c.tablespace_name=a.tablespace_name)
 blk1,b.def_tablespace_name tbs2,(select block_size from dba_tablespaces c where c.tablespace_name=b.def_tablespace_name) blk2
from a,dba_part_tables b
where a.owner=b.owner and a.segment_name=b.table_name and
(a.tablespace_name<>b.def_tablespace_name or b.def_tablespace_name is null))
where blk1<>blk2 or blk2 is null;

如果有返回行,使用以下命令将表的默认表空间修改为段所在表空间:

比如表 sgpm.A_RCVED_FLOW 查询结果 tbs1 data_a blk1 8k tbs2 data_man blk2 16k ;那么:

alter table sgpm.A_RCVED_FLOW modify default attributes tablespace DATA_A;

l   检查是否有域索引

select count(*) from dba_indexes where table_owner in ('SOE','SOE1') and index_type='DOMAIN';

如果存在域索引,为了加快元数据导出导入时间,考虑删除重建。

 

l   如果需要迁移owf_mgr 用户,需要先在目标库执行脚本创建system type 对象,然后使用数据泵单独导入owf_mgr 用户数据。

impdp system/oracle directory=my_dir network_link=tts_link1 schemas=owf_mgr logfile=owf.log cluster=n

l   如果需要迁移dblink 对象,最好将dblink 涉及的网络在停机之前打通,否则在导入引用了dblink 的包时速度非常慢,因为要等dblink 网络超时,网络超时会重试多次。

 

step 1:source 创建directory:sourcedir,路径使用当前数据文件使用的路径 。如果数据文件有多个路径,需要创建多个 directory

SQL> select file_name from dba_data_files;

FILE_NAME

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

/oracle/app/oracle/oradata/orcl/users01.dbf

/oracle/app/oracle/oradata/orcl/sysaux01.dbf

/oracle/app/oracle/oradata/orcl/undotbs01.dbf

/oracle/app/oracle/oradata/orcl/system01.dbf

/oracle/app/oracle/oradata/orcl/example01.dbf

/oracle/app/oracle/oradata/orcl/soe1.dbf

/oracle/app/oracle/oradata/orcl/soe.dbf


SQL> create directory sourcedir as '/oracle/app/oracle/oradata/orcl';

Directory created.

step 2:dest 创建directory:destdir,路径使用当前数据文件使用的路径 如果目标端有多个路径需要创建多个 directory

sys@ORCL>select file_name from dba_data_files;

FILE_NAME

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

 +DATADG/orcl/datafile/users.932.890771737


sys@ORCL>create directory destdir as '+DATADG/orcl/datafile';

Directory created.

如果源端有多个路径 目标端可以有 1 个路径或者跟源端等同数量的路径。比如:

/opt/a.dbf

/oracle/b.dbf

/u01/c.dbf

以上源端的 3 个数据文件需要迁移到目标端,那么目标端可以定义一个路径,或者定义三个路径,不能定义 2 个路径。

如果定义一个路径,那么上面 3 个文件都会传输到这一个路径下,如果定义 3 个路径,会依次填充到对应的路径下,如果定义两个路径会报错。

step 3 :创建dest端到source端的dblink

step 3.1:以sys用户创建dblink


sys@ORCL>create public database link ttslink connect to system identified by oracle using 'orcl';

Database link created.


step 3.2:验证创建的dblink


sys@ORCL>select * from v$version@ttslink;


BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

其中orcl是在tnsname.ora中配置的service name,参考配置文件:

ORCL =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.20.61)(PORT = 1521))

(CONNECT_DATA =

  (SERVER = DEDICATED)

  (SERVICE_NAME = orcl)

)

)

step 4 :source端和dest端创建目录用于存放 xtts 脚本。 Oracle 用户下操作,文件的属主 / 组需要为 oracle.oinstall

source端:

$ mkdir -p /home/oracle/rman-xtt


在source端解压XTTS使用的脚本

$ pwd

/home/oracle

$ unzip rman-xttconvert_2.0.zip -d rman-xtt

Archive:  rman-xttconvert_2.0.zip

inflating: rman-xtt/xttcnvrtbkupdest.sql

inflating: rman-xtt/xttdbopen.sql

inflating: rman-xtt/xttdriver.pl

inflating: rman-xtt/xttprep.tmpl

inflating: rman-xtt/xtt.properties

inflating: rman-xtt/xttstartupnomount.sql

解压后共计6个脚本,其中最重要的两个脚本:

1)xttdriver.pl:XTTS命令的调用文件


2)xtt.properties:XTTS工具的配置文件

step 5 添加source端和dest端temdir到环境变量里面,路径为step 4创建的存在XTTS工具的文件

$ more .profile

PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:/sbin:.

export PATH

if [ -s "$MAIL" ]           # This is at Shell startup.  In normal

then echo "$MAILMSG"        # operation, the Shell checks

fi                          # periodically.

export ORACLE_BASE=/oracle/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export ORACLE_SID=orcl

export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH

export TMPDIR=/home/oracle/rman-xtt

说明:定义tmpdir是为了存放下面步骤中perl脚本产生的文件,如果不定义,产生的文件会生成到/tmp下或报错

step 6: 编辑xtt.properties文件

 $vi xtt.properties
  tablespaces=SOE,SOE1
  platformid=6
  srcdir=SOURCEDIR
  dstdir=DESTDIR
  srclink=TTSLINK
  dfcopydir=/oracle/app/oracle/backup 使用rman方式时指定的备份集存放位置
  backupformat=/oracle/app/oracle/backup源端增量文件
  stageondest=/home/oracle/source 从源端传输过来的源备份集文件
  storageondest=+ssddg/orcl/datafile 使用rman方法时数据文件转换后的存放位置
  backupondest=+DATADG 增量备份集转换后的小端文件
  parallel=3 使用rman方式做convert时的并行度
  rollparallel 前滚阶段的并行度
参数说明:
 1)SOE,SOE1是source端migration的表空间名,需要大写,末尾不要有空格。
 2)platformid值得是source端平台ID,可以通过以下两种方式查询,推荐使用方式一
  a.方式一
  SQL> select PLATFORM_ID,PLATFORM_NAME from v$database;

PLATFORM_ID PLATFORM_NAME
----------  --------------------------------------------
      6     AIX-Based Systems (64-bit)


  b.方式二
  SQL> col PLATFORM_NAME for a40
  SQL> set pages 200
  SQL> select * from v$transportable_platform ;
  PLATFORM_ID PLATFORM_NAME                            ENDIAN_FORMAT
  ----------- ---------------------------------------- --------------
      1 Solaris[tm] OE (32-bit)                  Big
      2 Solaris[tm] OE (64-bit)                  Big
      7 Microsoft Windows IA (32-bit)            Little
     10 Linux IA (32-bit)                        Little
      6 AIX-Based Systems (64-bit)               Big
      3 HP-UX (64-bit)                           Big
      5 HP Tru64 UNIX                            Little
      4 HP-UX IA (64-bit)                        Big
     11 Linux IA (64-bit)                        Little
     15 HP Open VMS                              Little
      8 Microsoft Windows IA (64-bit)            Little
      9 IBM zSeries Based Linux                  Big
     13 Linux x86 64-bit                         Little
     16 Apple Mac OS                             Big
     12 Microsoft Windows x86 64-bit             Little
     17 Solaris Operating System (x86)           Little
     18 IBM Power Based Linux                    Big
     20 Solaris Operating System (x86-64)        Little
     19 HP IA Open VMS                           Little
 3)srcdir:source端数据库数据库文件存放路径,也即在directory:sourcedir定义的路径,需要大写。dbms_transfer方式专用。
 4)dstdir:dest端数据库数据库文件存放路径,也即在directory:destdir定义的路径,需要大写。dbms_transfer方式专用。
 5)srclink:指定dest端到source端使用的dblink,需要大写。dbms_transfer方式专用。
 6)backupformat:定义source端rman增量备份产生的文件存在位置
 7)stageondest:定义dest端存放source端发送的copies和incremental backups
8)stageondest 从源端传输过来的源增量备份集文件
 9)backupondest 增量备份集转换后的文件
10)如果目标端共享了nfs目录,dfcopydir和stageondest指向该目录

step 7 :将source的XTTS脚本传到dest端:

 $ scp -r /export/home/oracle/rman-xtt 10.10.20.1: '/home/oracle'

该阶段有两种方式,优先选择方案A 。如果源端数据文件放置在裸设备或者不满足1.3 所述条件,选择方案B

方案A: dbms_file_transfer 方式

step 1:source 端开启debug模式 开启 debug 模式后,在调用脚本过程中,会产生详细的输出信息,如果有报错,方便做故障诊断。

$ export XTTDEBUG=1

step 2:source 端prepare

$ perl xttdriver.pl -S

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

 Parsing properties

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

Done parsing properties

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

Checking properties

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

Done checking properties

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

Starting prepare phase

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

Prepare source for Tablespaces:

              'SOE'  /home/oracle/source

xttpreparesrc.sql for 'SOE' started at Wed Sep 23 14:36:54 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:54 2015

Prepare source for Tablespaces:

              'SOE1'  /home/oracle/source

xttpreparesrc.sql for 'SOE1' started at Wed Sep 23 14:36:54 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:54 2015

Prepare source for Tablespaces:

              ''  /home/oracle/source

xttpreparesrc.sql for '' started at Wed Sep 23 14:36:54 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:55 2015

Prepare source for Tablespaces:

              ''  /home/oracle/source

xttpreparesrc.sql for '' started at Wed Sep 23 14:36:55 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:55 2015

Prepare source for Tablespaces:

              ''  /home/oracle/source

xttpreparesrc.sql for '' started at Wed Sep 23 14:36:55 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:55 2015

Prepare source for Tablespaces:

              ''  /home/oracle/source

xttpreparesrc.sql for '' started at Wed Sep 23 14:36:55 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:55 2015

Prepare source for Tablespaces:

              ''  /home/oracle/source

xttpreparesrc.sql for '' started at Wed Sep 23 14:36:55 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:55 2015

Prepare source for Tablespaces:

              ''  /home/oracle/source

xttpreparesrc.sql for '' started at Wed Sep 23 14:36:55 2015

xttpreparesrc.sql for  ended at Wed Sep 23 14:36:55 2015

Done with prepare phase

说明:这一步XTTS主要做以下两件事

1 )验证migration的表空间SOE,SOE1是read write状态,且不存在offline状态的文件

2 )本阶段生成八个文件:其中xttnewdatafiles.txt,getfile.sql需要传送到dest端

$ more xttnewdatafiles.txt

::SOE

14,DESTDIR:/soe.dbf

::SOE1

6,DESTDIR:/soe1.dbf


$ more getfile.sql

0,SOURCEDIR,soe.dbf,DESTDIR,soe.dbf

1,SOURCEDIR,soe1.dbf,DESTDIR,soe1.dbf

同时XTTS会生成xttplan.txt,记录数据库SCN号,其内容如下:

$ more xttplan.txt

SOE::::3871502

14

SOE1::::3871518

6

step 3:source 端将rman-xtt内的 xttnewdatafiles.txt getfile.sql 传输到dest端

$  scp  xttnewdatafiles.txt getfile.sql 10.10.20.1:`pwd`

step 4:dest 端执行脚本从源端获取所有指定文件

oracle@rac1:/home/oracle/rman-xtt>perl xttdriver.pl -G

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

Parsing properties

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


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

Done parsing properties

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


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

Checking properties

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


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

Done checking properties

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


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

Getting datafiles from source

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

sh: line 5: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')

sh: line 6: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')


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

Executing getfile for getfile_sourcedir_soe.dbf_0.sql

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


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

Executing getfile for getfile_sourcedir_soe1.dbf_0.sql

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


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

Completed getting datafiles from source

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

如果需要分批次迁移表空间,每次perl xttdriver.pl –S 之前修改xtt.properties 文件的tablespaces 参数,备份xttnewdatafiles.txt xttplan.txt 文件。


请使用浏览器的分享功能分享到微信等