XTTS数据迁移 rman_xtt_v(一)

来源:这里教程网 时间:2026-03-03 18:49:55 作者:

传统的传输表空间方式要求数据第一次由源端到目标端传输时,表空间必须置于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 文件大小估算:

<size of change tracking file> = <# 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 文件。

相关推荐