语言
<< 返回文章列表

举一反三:跨平台版本迁移之 XTTS 方案操作指南(2)

2018年4月23日
罗贵林
4020

XTTS 初始参数说明


XTTS 是基于一组 rman-xttconvert_2.0 的脚本文件包来实现跨平台的数据迁移,主要包含 Perl script xttdriver 和 xttdriver Perl 脚本。Perl script xttdriver.pl 是备份、转换、应用的执行脚本,xtt.properties 是属性文件,其中包含 XTTS 配置的路径、参数。


rman-xttconvert_2.0 包参数说明如下表:


IMG_6961.png


6XTTS 迁移步骤(使用 RMAN 备份方法)



主要有以下步骤:

1)初始化参数设置;

2)将源端数据文件传输到目标系统;

3)转换数据文件为目标系统的字节序;

4)在源端创建增量备份,并传输到目标端;

5)在目标端恢复增量备份;

6)重复多次操作4和5步骤;

7)将源端数据库表空间设置为 READ ONLY 模式;

8)最后一次执行4和5步骤;

9)在源端导出元数据,并在目标端导入;

10)将目标端的数据库表空间设置为 READ WRITE;

11)数据验证。


6.1 XTTS 迁移准备阶段  


6.1.1 生产库打开块跟踪特性


首先在生产库上打开块跟踪功能。

如果源库是 11g,延时段特性需要先禁用 alter system set deferred_segment_creation=false sid='*' scope=spfile;

不然 xtts 不会将空表导入目标库。


alter database enable block change tracking using file '/home/oracle/xtts/block_change_tracking.log';


6.1.2 传输表空间前自包含检查 


首先对表空间做自包含检查,检查出 Index 存在自包含问题,需要重建或者最后创建:

SQL> execute dbms_tts.transport_set_check(‘DATATBS ’,true);

 

PL/SQL procedure successfully completed.

 

SQL> select * from transport_set_violations;


XXXX 创建在 USERS 表空间,需要提前迁移至 DATATBS 表空间。

Drop index XXXX;

CREATE INDEX XXXX ON "LUOKLE"."BI_LUOKLEINSTRUCTION" ("SENDTIME", "STATUS", "RECLUOKLE", "CREATORORGID", "CREATETIME") TABLESPACE DATATBS parallel 8;

Alter index XXXX noparallel;


由于 XTTS 最后导入元数据时候不支持临时表,所以需要提前查出系统临时表信息。

select dbms_metadata.get_ddl('TABLE',TABLE_NAME,owner) from dba_tables where  TEMPORARY='Y' and owner=XXX;


需要手工创建的临时表有X个,以下脚本导入元数据之后手工执行。

CREATE GLOBAL TEMPORARY TABLE XXX

(    "_ID" NUMBER,

        "STATUS" CHAR(1)

   ) ON COMMIT PRESERVE ROWS ;


在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集。


常见的以下情况是违反自包含原则的:

  • 索引在内部表空间集,而表在外部表空间集(相反地,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则);

  • 分区表一部分区在内部表空间集,一部分在外部表空间集(对于分区表,要么全部包含在内部表空间集中,要么全不包含);

  • 如果在传输表空间时同时传输约束,则对于引用完整性约束,约束指向的表在外部表空间集,则违反自包含约束;如果不传输约束,则与约束指向无关;

  • 表在内部表空间集,而 lob 列在外部表空间集,则违反自包含约束。


通常可以通过系统包 DBMS_TTS 来检查表空间是否自包含,验证可以以两种方式执行:非严格方式和严格方式。


以下是一个简单的验证过程,假定在 eygle 表空间存在一个表 eygle,其上存在索引存储在 USERS 表空间:

SQL> create table eygle as select rownum id ,username from dba_users;

SQL> create index ind_id on eygle(id) tablespace users;


以SYS用户执行非严格自包含检查(full_check=false): 

IMG_6962.png


执行严格自包含检查(full_check=true):

IMG_6963.png


反过来对于 USERS 表空间来说,非严格检查也是无法通过的: 

IMG_6964.png


但是可以对多个表空间同时传输,则一些自包含问题就可以得到解决:

IMG_6965.png

6.1.3 目标端创建数据库并修改部分参数


在目标环境需要提前安装好 GI 和 Oracle 软件,并创建监听、拷贝生产环境的 TNS 和新数据库,并修改部分数据库参数:

create directory xtts_dir as 'home/oracle/xtts/';

grant read,write on directory xtts3 to public;


调整以下参数:

alter system set "_optimizer_adaptive_cursor_sharing"=false sid='*' scope=spfile;

alter system set "_optimizer_extended_cursor_sharing"=none sid='*' scope=spfile;

alter system set "_optimizer_extended_cursor_sharing_rel"=none sid='*' scope=spfile;

alter system set "_optimizer_use_feedback"=false  sid ='*' scope=spfile;

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

alter system set event='28401 trace name context forever,level 1' sid='*' scope=spfile;

alter system set resource_limit=true sid='*' scope=spfile;

alter system set resource_manager_plan='force:' sid='*' scope=spfile;

alter system set "_undo_autotune"=false sid='*' scope=spfile;

alter system set "_optimizer_null_aware_antijoin"=false sid ='*' scope=spfile;

alter system set "_px_use_large_pool"=true  sid ='*' scope=spfile;

alter system set audit_trail=none  sid ='*' scope=spfile;

alter system set "_partition_large_extents"=false  sid='*' scope=spfile;

alter system set "_index_partition_large_extents"= false sid='*' scope=spfile;

alter system set "_use_adaptive_log_file_sync"=false  sid ='*' scope=spfile;

alter system set disk_asynch_io=true  sid ='*' scope=spfile;

alter system set db_files=2000 scope=spfile;

 

alter profile "DEFAULT" limit PASSWORD_GRACE_TIME UNLIMITED;

alter profile "DEFAULT" limit PASSWORD_LIFE_TIME UNLIMITED;

alter profile "DEFAULT" limit PASSWORD_LOCK_TIME UNLIMITED;

alter profile "DEFAULT" limit FAILED_LOGIN_ATTEMPTS UNLIMITED;

 

exec dbms_scheduler.disable( 'ORACLE_OCM.MGMT_CONFIG_JOB' );

exec dbms_scheduler.disable( 'ORACLE_OCM.MGMT_STATS_CONFIG_JOB' );

 

BEGIN

DBMS_AUTO_TASK_ADMIN.DISABLE(

client_name => 'auto space advisor',

operation => NULL,

window_name => NULL);

END;

/

 

BEGIN

DBMS_AUTO_TASK_ADMIN.DISABLE(

client_name => 'sql tuning advisor',

operation => NULL,

window_name => NULL);

END;


6.1.4 源端保留用户信息和权限


源端保留用户信息和权限:

spool create_user_LUOKLE.sql

select 'create user '||username||' identified by values '||''''||password||''''||';' from dba_users where default_tablespace in('TEST');

spool off


角色权限的语句:

spool grant_role_priv_LUOKLE.sql

select 'grant '||GRANTED_ROLE||' to '||grantee||';' from dba_role_privs where grantee in(select username from dba_users where default_tablespace in('TEST'));

spool off


sys 权限的赋权语句:

spool grant_sys_priv_LUOKLE.sql

select 'grant '||privilege||' to '||grantee||';' from dba_sys_privs where grantee in(select username from dba_users where default_tablespace in('TEST'));

spool off


对表空间的配额权限语句:

spool unlimited_tablespace_LUOKLE.sql

select 'alter user '||username||' quota unlimited on DATATBS ||';' from dba_users where default_tablespace in('TEST');

spool off


附:若后期存在用户与其他非本用户的对象权限问题,如 Schema A 对 Schema B 上表的访问和操作等权限,可以使用以下语句在源库检索出权限,并在目标端数据库进行赋权即可:

set line 200

set pages 0

spool grant_tab_priv.sql

select 'grant ' || privilege || ' on ' || owner || '.' || table_name || ' to ' || grantee || ';'

from dba_tab_privs

where owner in (select username from dba_users where default_tablespace in('TEST'))

or grantee in (select username from dba_users where default_tablespace in('TEST''))

and privilege in('SELECT','DELETE','UPDATE','INSERT') and grantable='NO'

union

select 'grant ' || privilege || ' on ' || owner || '.' || table_name || ' to ' || grantee || ' with grant option;'

from dba_tab_privs

where owner in (select username from dba_users where default_tablespace in('TEST'))

or grantee in (select username from dba_users where default_tablespace in('TEST'))

and privilege in('SELECT','DELETE','UPDATE','INSERT') and grantable='YES';

spool off


6.2 XTTS 迁移初始化阶段


6.2.1 源端更改配置文件 xtt.properties


更改以下参数:

tablespaces=TEST,TEST_INDEX                 

platformid=13                             

dfcopydir=/home/oracle/xtts/bak

backupformat=/home/oracle/xtts/bakincr

stageondest=/home/oracle/xtts/bak

storageondest=+DATA/oracle11gasm/datafile

backupondest=+DATA/oracle11gasm/datafile

asm_home=/u01/app/grid/product/11.2.0/grid

asm_sid=+ASM

parallel=2

rollparallel=2

getfileparallel=2

 

更改配置之后,将整个 rman-xttconvert 目录传输至目标端。


6.2.2 源端进行迁移初始化


在源端进行初始化,即 backup as copy 的形式备份数据文件到 /aix_xtts/bak 下。

more full_backup.sh

export TMPDIR=/aix_xtts

perl xttdriver.pl -p 


执行脚本进行全备:

nohup sh ./full_back.sh >full_back.log &


初始化之后产生 xttplan.txt  rmanconvert.cmd;

xttplan.txt 记录了当前 SCN,也就是下次需要增量的开始 SCN;

rmanconvert.cmd 记录了文件转换的名字。


[oracle@oracle11gasm xtts]$ cat rmanconvert.cmd

host 'echo ts::TEST';

  convert from platform 'Linux x86 64-bit'

  datafile

   '/home/oracle/xtts/bak/TEST_5.tf'

  format '+DATA/oracle11gasm/datafile/%N_%f.xtf'

 parallelism 2;

host 'echo ts::TEST_INDEX';

  convert from platform 'Linux x86 64-bit'

  datafile

   '/home/oracle/xtts/bak/TEST_INDEX_6.tf'

  format '+DATA/oracle11gasm/datafile/%N_%f.xtf'

 parallelism 2;


6.2.3 转换初始化文件至 ASM 中


由于使用了 NFS 不需要再次传输 /aix_xtts/bak,修改 xtt.properties 文件:

修改备库 xtt.properties 文件:


增加:

asm_home=/oracle/app/grid/11.2.0.4

asm_sid=+ASM


该步骤中,我们需要在 Linux 目标端主机上完成,进行全库的数据文件转换,通过脚本直接将数据文件转换到 ASM DISKGROUP 中。


注意:该转换步骤中,我们只需要转换我们需要传输的业务表空间即可,也就是 DATATBS 。


如下是全库的转换脚本:

more convert.sh

export XTTDEBUG=1

export TMPDIR=/aix_xtts

perl xttdriver.pl -c


执行脚本进行转换:

nohup sh ./convert.sh >convert.log &


并且在目标的 storageondest 目录下会生成经转换后的数据文件拷贝。


日志如下:

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

Parsing properties

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

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

Done parsing properties

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

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

Checking properties

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

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

Done checking properties

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

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

Performing convert

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

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

Converted datafiles listed in: /xtts/xttnewdatafiles.txt

 

转换成功之后会生成 xttnewdatafiles.txt,该文件为数据文件在 ASM MAP 关系表,即 file_id 和数据文件名对应表,增量恢复需要。


如果没有产生需要手工创建,命令格式如下:

[oracle@oracle11gasm xtts]$ cat xttnewdatafiles.txt

::TEST

5,+DATA/oracle11gasm/datafile/test_5.xtf

::TEST_INDEX

6,+DATA/oracle11gasm/datafile/test_index_6.xtf


6.3 XTTS 迁移增量备份恢复


6.3.1 生产库进行第一次增量备份


由于生产库每天的归档极大,因此需要进行多次增量备份,并将增量备份传输到目标端 Linux 的新环境,并应用增量备份,其中初始化产生的 xttplan.txt 文件记录了增量 SCN 起始位置,这里我们只需要对需要传输的表空间进行增量备份即可:

more do_incr.sh

export TMPDIR=/aix_xtts

perl xttdriver.pl –i

 

执行脚本进行增量备份:

nohup sh ./do_incr.sh >do_incr_1.log &


backup incremental from scn 13827379581   第一次增量备份开始的 SCN,由 -p 初始化产生;

增量8天的数据时间花费100分钟,产生增量文件40G。


[root@ecmsdb01plk xtts]# cat xttplan.txt.new  --增量备份生成新的 xttplan.txt.new 文件

DATATBS ::::14000344337                   --下一次增量备份开始的 SCN

[oracle@oracle11g bakincr]$ pwd

/home/oracle/xtts/bakincr

[oracle@oracle11g bakincr]$ ls -lrt

-rw-r----- 1 oracle oinstall 49152 Apr  1 08:00 0gsv7s0v_1_1

-rw-r----- 1 oracle oinstall 49152 Apr  1 08:00 0hsv7s10_1_1


第一次增量备份之后产生的2个配置文件为 tsbkupmap.txt 和 incrbackups.txt,这两个为增量与数据文件对应关系配置,在做增量恢复时候需要用到。


[oracle@oracle11gasm xtts]$ cat tsbkupmap.txt

TEST_INDEX::6:::1=0hsv7s10_1_1

TEST::5:::1=0gsv7s0v_1_1

[oracle@oracle11gasm xtts]$ cat incrbackups.txt

/home/oracle/xtts/bakincr/0hsv7s10_1_1

/home/oracle/xtts/bakincr/0gsv7s0v_1_1


通过 FTP 传输增量文件至目标 LINUX 环境。


ftp> put a0rj69fq_1_1

200 PORT command successful.

150 Opening data connection for a0rj69fq_1_1.

226 Transfer complete.

23119626240 bytes sent in 1395 seconds (1.618e+04 Kbytes/s)

local: a0rj69fq_1_1 remote: a0rj69fq_1_1

ftp>

ftp>

 

ftp>put  9vrj66jc_1_1

200 PORT command successful.

150 Opening data connection for 9vrj66jc_1_1.

226 Transfer complete.

22823591936 bytes sent in 1381 seconds (1.614e+04 Kbytes/s)

local: 9vrj66jc_1_1 remote: 9vrj66jc_1_1


两个窗口并行传输,花费时间25分钟,由于第一次增量数据较大整体消耗2个小时。


6.3.2 目标端进行第一次增量恢复


增量恢复前需要检查 xttnewdatafiles.txt(数据文件在 ASM 中 MAP 关系表)、tsbkupmap.txt 和 incrbackups.txt(增量与数据文件对应关系配置)、xttplan.txt(下次需要增量的开始 SCN)这些配置文件是否存在,如不存在会出现报错。


将增量备份集放置 /home/oracle/xtts/bak下,做增量恢复:


more restore_incr.sh

export TMPDIR=/home/oracle/xtts

perl xttdriver.pl -r


执行脚本进行增量恢复:

nohup sh ./restore_incr.sh >restore_incr.log &

 

第一次增量转换加恢复40G数据耗时30分钟。

IMG_6966.jpg


IMG_6967.jpg

如果在-r应用报 ORA-19638 错误,则需要把 xttplan.txt 使用前一次或前二次的。(因为多次的-i和-s会对 xttplan.txt 进行修改)


6.3.3 生成下次增量所需 SCN 配置文件


$ perl xttdriver.pl -s

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

Parsing properties

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

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

Done parsing properties

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

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

Checking properties

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

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

Done checking properties

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

Prepare newscn for Tablespaces: 'DATATBS '

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

Prepare newscn for Tablespaces: ''

New /oraexport/xtts/xttplan.txt with FROM SCN's generated

 

[root@ecmsdb01plk xtts]# cat xttplan.txt

DATATBS ::::14000344337


生产环境执行如上命令,产生最新 xttplan.txt 文件,下次增量备份开始 SCN 为 14000344337。


6.3.4 生产库进行第二次增量备份


生产环境进行第二次增量备份,此次增量备份一天数据:

more do_incr.sh

export TMPDIR=/home/oracle/xtts

perl xttdriver.pl –i


执行脚本进行增量备份:

nohup sh ./do_incr.sh >do_incr_1.log &

backup incremental from scn 14000344337 第二次增量备份开始的 SCN。

 

第二次增量备份一天数据耗时5分钟。产生文件12G,通过 FTP 并行传输花费10分钟,总体二次增量备份一天数据耗时20分钟。


6.3.5 目标端进行第二次增量恢复


xttplan.txt 使用前一次的。

二次增量恢复一天数据,耗时15分钟:

[oracle@ecmsdb01plk scripts_linux]$ perl xttdriver.pl -r -d

 

6.4 XTTS 正式迁移


IMG_6968.png


切割准备工作示意图


6.4.1 停止业务


业务部门停止应用程序。数据库检查当前会话,需要杀掉已经存在的会话。

set lines 132 pages 1111 trim on trims on

spo machine_before_upgrade.txt

select inst_id, machine, count(*) from gv$session where username!='SYS' group by inst_id, machine;

spo off


Kill 掉任然连接到数据库的会话:

SELECT 'kill -9 '||SPID FROM V$PROCESS

 WHERE ADDR IN (SELECT PADDR FROM V$SESSION WHERE USERNAME != 'SYS');

或 

select 'alter system kill session '''||sid||','||serial#||''' immediate;'

from v$session where USERNAME != 'SYS';


6.4.2 生成最后一次增量备份 SCN 配置文件


$ perl xttdriver.pl -s

 

使用 xttdriver.pl –s生成最后一个 SCN 增量配置文件(即最后一次增量备份开始的SCN),也可以手工修改 xttplan.txt。


6.4.3 生产库将表空间设置为只读


将业务表空间设置为只读模式,并开始最后一次的增量备份。


sqlplus / as sysdba

alter tablespace DATAtBS read only;


6.4.4 最后一次增量备份


在源端中间环境进行最后一次增量备份:

more do_incr.sh

export TMPDIR=/home/oracle/xtts

perl xttdriver.pl –i

 执行脚本进行备份:

nohup sh ./do_incr.sh >do_incr_1.log &


按照之前每天增量备份加传输大概耗时30分钟,在增量备份同时可以进行元数据的导出。


6.4.5 导出元数据(XTTS 元数据以及其他对象元数据)


在这个步骤中,我们可以并行同时导出 XTTS 的元数据以及其他的元数据,例如数据库存储过程,函数。触发器等等。


导出传输表空间元数据命令如下:

create or replace directory xtts3 as '/oraexport/xtts/  '

exp  \'/ as sysdba \' transport_tablespace=y tablespaces='DATATBS ' file=/oraexport/xtts/exp_DATATBS_xtts.dmp log=/oraexport/xtts/exp_DATATBS_xtts.log  STATISTICS=none parallel=8 

expdp \'/ as sysdba\' dumpfile=tts.dmp directory=xtts_dir logfile=expdp_xtts.log transport_tablespaces=TEST,TEST_INDEX exclude=STATISTICS;


导出元数据耗时2分钟。


导出其他对象数据如下:

expdp \'/ as sysdba\'  directory=xtts_dir dumpfile=expdp_LUOKLE_meta.dmp logfile=expdp_LUOKLE_meta.log CONTENT=metadata_only SCHEMAS=LUOKLE parallel=2;


导出其他数据耗时15分钟。


导出完成之后,将 dmp 文件传输到 Linux。


6.4.6 最后一次应用增量备份


将备份集放置 /oradata2 下,做增量恢复:

more restore_incr.sh

export TMPDIR=/home/oracle/xtts

perl xttdriver.pl -r -d

执行脚本进行增量恢复:

nohup sh ./restore_incr.sh >restore_incr.log &

根据之前增量恢复一天数据大概耗时15分钟。


6.4.7 导入 XTTS 元数据


通过如下命令将 xtts 表空间元数据导入到目标新库中:

create or replace directory xtts_dir as '/home/oracle/xtts/';

impdp \'/ as sysdba\' dumpfile=expdp_tts.dmp directory=xtts_dir transport_tablespace=y datafiles='+DATA/ORACLE11GASM/DATAFILE/test_5.xtf,+DATA/ORACLE11GASM/DATAFILE/test_index_6.xtf';

根据之前测试结果导入时间为10分钟左右。


6.4.8 目标端新库将表空间设置为读写模式


将业务表空间设置为可读写模式:

sqlplus / as sysdba

alter tablespace DATATBS read write;


6.4.9 目标端新库导入其他对象元数据


impdp \'/ as sysdba\' dumpfile=expdp_LUOKLE_meta.dmp directory=xtts_dir


STATISTICS 如果不使用之前统计信息可用排除,最后收集。


根据之前测试耗时15分钟左右,XTTS 已完成表空间迁移。