文章目录
- 一、全量迁移
- 1、源端和目标端都需要配置XTTS脚本(源库和目标库都需要进行下列配置)
- 2、源端调用 xttdriver.pl -p做迁移准备
- 3、将源端的数据文件副本和rmanconvert.cmd传到目标端
- 4、在目标端对数据文件拷贝进行字节序的转换
- 二、XTTS 第1~n次增量前滚
- 1、产生增量数据
- 2、源端做增量备份
- 3、将源端的增量数据传到目标端
- 4、目标端进行增量转换和数据写入同步
- 5、源端确定下一个增量备份的FROM_SCN
- 三、XTTS 最后一次增量前滚
- 1、将表空间置为RO状态
- 2、源端做增量备份
- 3、将源端的增量数据传到目标端
- 4、目标端进行增量转换和数据写入同步
- 四、迁移元数据
- 1、在目标库创建业务用户
- 2、导入xtts的元数据
- 3、导入存储过程、触发器、函数、包、视图、序列
- 4、导入公共同义词和dblink等其它对象
- 五、迁移完成后的收尾工作
- 1、查看源端、目标端的数据一致性
- 2、更改用户默认表空间
- 3、目标库的表空间修改为读写模式
- 4、校验数据文件完整性
一、全量迁移
在此步骤中,表空间的数据文件将从源端数据库传输到目标端数据库,本步骤只需要执行一次,数据文件传输过程中不影响源端数据库正常访问。
此处有2种方法:dbms_file_transfer和rman方法。对于数据文件很多的情况下来说,dbms_file_transfer是推荐的方法。
此处使用rman方式。
本次迁移表空间为DS_DATA
资源包:
百度网盘链接:https://pan.baidu.com/s/1paVn-r5d-SzLJ4pX9BL03A?pwd=o0xw
提取码:o0xw
或者自行网上寻找也可以
1、源端和目标端都需要配置XTTS脚本(源库和目标库都需要进行下列配置)
rm -rf /u01/app/xtts/
rm -rf /home/oracle/scripts
mkdir -p /u01/app/xtts/inc_bk
chown oracle:oinstall /u01/app/xtts
chown oracle:oinstall /u01/app/xtts/inc_bk
mkdir -p /u01/app/xtts/df_bk
chown oracle:oinstall /u01/app/xtts/df_bk
mkdir -p /home/oracle/scripts
cd /home/oracle/scripts
# 直接将rman_xttconvert_v3.zip上传到/home/oracle/scripts也可以
cp rman_xttconvert_v3.zip /home/oracle/scripts
# 解压XTTS包
unzip rman_xttconvert_v3.zip
-- 注意修改相应参数(如果源库和目标库版本之类的信息不一样,需要修改参数内容)
cat > /home/oracle/scripts/xtt.properties <<"EOF"
tablespaces=DS_DATA
platformid=13
#srcdir=SOURCEDIR
#dstdir=DESTDIR
#srclink=ttslink
dfcopydir=/u01/app/xtts/df_bk
backupformat=/u01/app/xtts/inc_bk
stageondest=/u01/app/xtts/df_bk
storageondest=/u01/app/oracle/oradata/P19C
backupondest=/u01/app/xtts/inc_bk
#cnvinst_home=/oracle/app/oracle/product/11.2.0/dbhome_1
#cnvinst_sid=targetdb
EOF
2、源端调用 xttdriver.pl -p做迁移准备
首先,确保源库处于OPEN阶段,所有表空间都处于online状态:
select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
select tablespace_name,status from dba_tablespaces;
在源端执行 xttdriver.pl -p做迁移准备:
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -p
- 查看备份的文件
ll /u01/app/xtts/df_bk/*
该操作执行过程包括以下内容:
1、此过程会将相关的表空间文件执行一次镜像拷贝过程,可以认为是全备,可以在rman中执行“list copy;”查看。此处会把数据文件拷贝一份到/u01/app/xtts/df_bk目录。需要注意目录/u01/app/xtts/df_bk的空间。
rman target /
list copy;
2、会在/home/oracle/scripts 目录下产生几个文件,xttplan.txt、rmanconvert.cmd和xttnewdatafiles.txt:
ll -lrt
其中 xttplan.txt 文件中的内容如下:
我这里是只打算迁移DS_DATA表空间,如果上边配置的是多个的话这里会显示多个
该文件中的数值代表数据库的 SCN。如果后面再次运行脚本进行增量操作时,该值会发现改变。
再来看看脚本rmanconvert.cmd的内容:
more rmanconvert.cmd
上述脚本是 perl 脚本产生的 rman convert 脚本,需要将该脚本传递到目标端主机。注意,上述脚本文件格式需要注意,同时并行度是默认的,可以进行调整。
3、将源端的数据文件副本和rmanconvert.cmd传到目标端
将数据文件副本和rmanconvert.cmd文件拷贝到目标端。注意目标端的剩余空间:
scp /u01/app/xtts/df_bk/* 192.168.229.151:/u01/app/xtts/df_bk/
scp /home/oracle/scripts/rmanconvert.cmd 192.168.229.151:/home/oracle/scripts/
在目标端查看到传输成功
4、在目标端对数据文件拷贝进行字节序的转换
注意目标端的空间:
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -c
cat /home/oracle/scripts/xttnewdatafiles.txt
ll -lrt /u01/app/oracle/oradata/P19C
转换后的数据文件拷贝会出现在 xtt.properties 文件中定义的参数 storageondest 下,即最终的数据文件目录。
二、XTTS 第1~n次增量前滚
在此阶段,在源端做增量数据,从源数据库创建增量备份(内部其实是仍然使用rman增量备份),将其传输到目标端,在目标端转换为目标系统Endian格式,然后应用于转换后的目标数据文件副本,将其前滚。此阶段可以多次重复运行。每次连续的增量备份都应该比以前的增量备份花费更少的时间,并且将使目标数据文件副本与源数据库更加一致。这样对于目标库上的数据文件拷贝,通过一次次应用增量数据就可以逐渐追上源库的生产数据。
这个阶段中的步骤可以运行多次,以使目标中的datafiles更接近源文件的时间/ SCN。在此阶段,源数据库完全可访问。
1、产生增量数据
# 产生增量数据
create table testxtts6 tablespace ds_data as select * from Shopping_Carts;
2、源端做增量备份
开始做增量备份:
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i
上面的操作还会在 TMPDIR 目录下产生xttplan.txt.new、tsbkupmap.txt和incrbackups.txt文件:
more xttplan.txt.new
more tsbkupmap.txt
ll /u01/app/xtts/inc_bk/ -h
rman target /
list backupset;
3、将源端的增量数据传到目标端
这里传递增量数据的时候,还需要将源端/home/oracle/scripts/目录下的 xttplan.txt、 tsbkupmap.txt和incrbackups.txt文件都传输到目标端。每当你进行一次增量的备份操作,这 3个文件的内容都会发现变化 。
每一次增量操作之后,都需要将这 3个文件传到目标端数据库的 /home/oracle/scripts/目录中。
# 注意:增量内容应该拷贝到目标端的全量备份路径下
scp /u01/app/xtts/inc_bk/* 192.168.229.151:/u01/app/xtts/df_bk/
scp /home/oracle/scripts/xttplan.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/tsbkupmap.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/incrbackups.txt 192.168.229.151:/home/oracle/scripts/
4、目标端进行增量转换和数据写入同步
export XTTDEBUG=1
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r
如果一套库上有多个实例的话,在执行该步骤之前,需要对环境变量进行确认,如检查当前ORACLE_SID是否是需要执行的SID,否则可能会恢复到其他实例上。(并非是真实的恢复,因为其他实例跟这个备份集没有任何关系,但恢复的过程会在其他实例上进行一遍,如关闭/启动数据库,包括增量恢复的日志都会在另一个数据库上显示。)如果发生了这种事情,不用紧张,调整好环境变量,再执行一次perl xttdriver.pl –r即可。误操作的实例不受影响。
5、源端确定下一个增量备份的FROM_SCN
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -s
该步骤会计算下一个FROM_SCN,将其记录在xttplan.txt文件中,然后在创建下一个增量备份时使用该SCN。
该步骤会将-i时生成的xttplan.txt.new改名为xttplan.txt,并将原来的xttplan.txt备份。
建议在目标端每次做完recover动作后,源端就执行一次该命令,以免遗忘。
三、XTTS 最后一次增量前滚
1、将表空间置为RO状态
假设我们进行了多次增量操作之后,在停机时间的时候,再将源端数据库中需要传输的表空间设置为只读模式 :
# 产生增量数据
create table testxtts66 tablespace ds_data as select * from Shopping_Carts;
select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
from v$tablespace
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
select tablespace_name,status from dba_tablespaces;
2、源端做增量备份
首先对上一次的增量备份目录做迁移:
mv /u01/app/xtts/inc_bk /u01/app/xtts/inc_bk1
mkdir -p /u01/app/xtts/inc_bk
开始做增量备份:
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i
3、将源端的增量数据传到目标端
这里传递增量数据的时候,还需要将源端/home/oracle/scripts/目录下的 xttplan.txt、 tsbkupmap.txt和incrbackups.txt文件都传输到目标端。每当你进行一次增量的备份操作,这 3个文件的内容都会发现变化 。
每一次增量操作之后,都需要将这 3个文件传到目标端数据库的 /home/oracle/scripts/目录中。
# 注意:增量内容应该拷贝到目标端的全量备份路径下
scp /u01/app/xtts/inc_bk/* 192.168.229.151:/u01/app/xtts/df_bk/
scp /home/oracle/scripts/xttplan.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/tsbkupmap.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/incrbackups.txt 192.168.229.151:/home/oracle/scripts/
4、目标端进行增量转换和数据写入同步
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r
四、迁移元数据
注意在导出时,TRANSPORT_TABLESPACES参数需要的表空间要写全,别遗漏。
在目标端进行IMPDP时,transport_datafiles需要将所有的数据文件添加进去。
如果数据文件很多,人为添加容易出错,可以使用perl xttdriver.pl –e获取全部数据文件列表。
1、在目标库创建业务用户
相关脚本在前边的准备阶段已经准备好了:
create user xxt identified by sys;
create user lhr identified by sys;
grant dba to xxt,lhr;
可以使用导出和导入分开来执行,也可以直接通过network_link来做远程导入,而不需要做导出操作:
2、导入xtts的元数据
生成导入脚本:
# 在目标端可以执行如下命令生成impdp,命令在xttplugin.txt文件
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -e
more /home/oracle/scripts/xttplugin.txt
# 显示内容如下:
impdp directory=<DATA_PUMP_DIR> logfile=<tts_imp.log> \
network_link=<ttslink> transport_full_check=no \
transport_tablespaces=DS_DATA \
transport_datafiles='/u01/app/oracle/oradata/P19C/DS_DATA_5.dbf'
在目标端开始导入:
# 目标端创建dblink
create public database link ttslink connect to system identified by sys using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.229.151 )(PORT = 1521)) ) )';
# 利用dblink直接迁移元数据,这里只会迁移表、索引、约束等,因为其它对象存储在系统表空间中
impdp system/lhr directory=DATA_PUMP_DIR logfile=tts_imp_lhr.log \
network_link=ttslink transport_full_check=no \
EXCLUDE=STATISTICS \
transport_tablespaces=DS_DATA \
transport_datafiles='/u01/app/oracle/oradata/P19C/DS_DATA_5.dbf'
3、导入存储过程、触发器、函数、包、视图、序列
-- 导入存储过程、触发器、函数、包、视图、序列
impdp system/lhr directory=DATA_PUMP_DIR \
network_link=ttslink schemas=LHR,XXT content=metadata_only exclude=index,table,constraint parallel=8
4、导入公共同义词和dblink等其它对象
-- 导入公共同义词
set long 9999
select dbms_metadata.get_ddl('SYNONYM',SYNONYM_NAME,OWNER)
FROM dba_synonyms
where owner='PUBLIC' and table_owner in ('LHR','XXT');
-- 导入dblink
set long 9999
select dbms_metadata.get_ddl('DB_LINK',DB_LINK,OWNER)
FROM DBA_DB_LINKS;
五、迁移完成后的收尾工作
1、查看源端、目标端的数据一致性
select count(*) from lhr.testxtts6;
select count(*) from lhr.testxtts66;
select owner, object_type, count(*)
from dba_objects
where object_name not like 'BIN%'
and owner in ('LHR','XXT')
group by owner, object_type
order by 1,2 desc;
select owner, object_type, count(*)
from dba_objects
where status <> 'VALID'
and owner in ('LHR','XXT')
group by owner, object_type
order by 1, 2 desc;
迁移后的对象个数和之前一致。
2、更改用户默认表空间
alter user xxt default tablespace USERS;
3、目标库的表空间修改为读写模式
select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
select tablespace_name,status from dba_tablespaces;
4、校验数据文件完整性
运行RMAN,通过运行VALIDATE TABLESPACE检查物理和逻辑块损坏情况,如下所示:
validate tablespace DS_DATA check logical;
完成迁移