举一反三:跨平台版本迁移之 XTTS 方案操作指南(2)
XTTS 初始参数说明
XTTS 是基于一组 rman-xttconvert_2.0 的脚本文件包来实现跨平台的数据迁移,主要包含 Perl script xttdriver 和 xttdriver Perl 脚本。Perl script xttdriver.pl 是备份、转换、应用的执行脚本,xtt.properties 是属性文件,其中包含 XTTS 配置的路径、参数。
rman-xttconvert_2.0 包参数说明如下表:
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):
执行严格自包含检查(full_check=true):
反过来对于 USERS 表空间来说,非严格检查也是无法通过的:
但是可以对多个表空间同时传输,则一些自包含问题就可以得到解决:
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分钟。
如果在-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 正式迁移
切割准备工作示意图
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 已完成表空间迁移。