xtts 迁移数据库
采用最新版本的 rman_xttconvert_VER4.3.zip 做迁移
1. 先把xtts的脚本放到源库
2. 然后给 xtt.properties 指定源库/目标库的备份放置的路径,以及datafile在目标端的路径
3. 把 xtts 脚本目录拷贝到目标端
4. 把源库/目标库的 TMPDIR 环境变量设置到脚本的所在目录
5. 源库上备份 xttdriver.pl --backup
6. 拷贝源库的 res.txt 和备份到目标库
7. 在目标库恢复 xttdriver.pl --restore
8. 然后不断做 incremental backup
a). 源库做 incremental backup: xttdriver.pl --backup
b). 源库拷贝incrbackups.txt中刚做的incremental backup到目标库
c). 拷贝 res.txt到目标库
d). 目标库应用 incremental backup (会重启目标库): xttdriver.pl --restore
如是重复
9. Final Incremental Backup 最后一次增量备份
a). 需要把源库的 tablespace 置为只读
b). 最后一次备份: xttdriver.pl --backup
c). 源库拷贝最后的incremental backup到目标库
d). 拷贝 res.txt到目标库
e). 目标库最后一次追平备份: xttdriver.pl --restore
10. Transport Phase: 把metadata从源库导出再导入到目标库
测试的准备阶段:
a). 先在原库创建测试用户和数据
创建两个tablespace 一个放数据一个放索引
create tablespace test datafile '+data' size 100m;
create tablespace test_ind datafile '+data' size 100m;
grant dba to test identified by test;
alter user test default tablespace test;
conn test/test
create table test1 as select * from dba_source;
create index test1_ind on test1(line) tablespace test_ind;
create or replace procedure copy_table_status(src_owner varchar2,
src_tabname varchar2,
trg_owner varchar2,
trg_tabname varchar2) Authid Current_User is
n_numrows all_tables.num_rows%TYPE;
n_numblks all_tables.blocks%TYPE;
n_avgrlen all_tables.avg_row_len%TYPE;
n_invalidate boolean default false;
begin
dbms_stats.get_table_stats(ownname => upper(src_owner),
tabname => upper(src_tabname),
numrows => n_numrows,
numblks => n_numblks,
avgrlen => n_avgrlen);
dbms_stats.set_table_stats(ownname => upper(trg_owner),
tabname => upper(trg_tabname),
numrows => n_numrows,
numblks => n_numblks,
avgrlen => n_avgrlen,
no_invalidate => n_invalidate);
end;
/
b). 在原库检查一些限制
比如
-- 原库需要启用 archive log mode
-- 原库的 COMPATIBLE 参数不能大于目标库
-- 原库的 rman 设置:
DEVICE TYPE DISK 不能设置为 COMPRESSED
BACKUP TYPE 不能设置为 COPY (需要设置为 BACKUP TYPE TO BACKUPSET)
channel 不能设置为 SBT
channel 不能有限制,比如 MAXSETSIZE,MAXPIECESIZE等
-- 要传输的 tablespace 不能有 offline 的 datafile, tablespace状态应当是 READ WRITE
-- 如果目标端不是 Linux,则 DB 版本应大于 12.1.0.1
-- 原库的 DB 版本不应大于目标端 DB 版本
-- 原库/目标库 DB 版本应当大于 11.2.0.4
-- 临时的备份不应当放到 ASM 中 (ASM是能用来放置最后的 datafile)
- enable archived log
SQL> alter system set db_recovery_file_dest_size=10g scope=both sid='*';
SQL> alter system set db_recovery_file_dest='+data' scope=both sid='*';
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;
SQL>
- check RMAN setting
RMAN> show all;
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
- check COMPATIBLE parameter
SQL> show parameter COMPATIBLE
c). 另外,详细阅读 Note 2471245.1 的 Known Issues 中提到的注意事项
比如:原库和目标库都不应有自定义的 glogin.sql
开始实施XTTS
Step 1.1: 在目标端安装软件,创建数据库以及创建相关的用户
– 在目标端创建用户 test
sqlplus / as sysdba
SYS@R11204 > grant dba to test identified by test;
Grant succeeded.
Step 1.2: 确定要做 xtts 的表空间,并确定满足基本的 transportable tablespace 的条件
通读下面的文档来更详细的了解Transportable tablespace, 确保两边满足 Transportable tablespace 的条件
Master Note for Transportable Tablespaces (TTS) -- Common Questions and Issues (Doc ID 1166564.1)
Transportable Tablespace (TTS) Restrictions and Limitations: Details, Reference, and Version Where Applicable (Doc ID 1454872.1)
比如
-- 在原库执行DBMS_TTS.TRANSPORT_SET_CHECK检查是否要 transport 的 tablespace 是自包含的
CONN / AS SYSDBA
SQL> EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK(ts_list => 'TEST,TEST_IND', incl_constraints => TRUE);
PL/SQL procedure successfully completed.
SQL> SELECT * FROM transport_set_violations;
no rows selected <== 确保执行 DBMS_TTS.TRANSPORT_SET_CHECK 之后,transport_set_violations没有返回任何行
Step 1.3 从 note 2471245.1下载 rman_xttconvert_VER4.zip到原库,解压
[oracle@frac1 xtts]$ pwd
/home/oracle/xtts
[oracle@frac1 xtts]$ ls
rman_xttconvert_VER4.3.zip xttcnvrtbkupdest.sql xttdbopen.sql xttdriver.pl xtt.newproperties xttprep.tmpl xtt.properties xttstartupnomount.sql
Step 1.4 在原库和目标库创建必须的目录
原库:创建一个目录存放备份 (对应的是 xtt.properties 中的 src_scratch_location 参数)
$ mkdir /home/oracle/xtts_backup
目标库:创建一个目录存放备份 (对应的是 xtt.properties 中的 dest_scratch_location 参数 )
$ mkdir /home/oracle/xtts_backup_dest
目标库:另外,还要确认目标库里datafile 最后要放置的路径 (对应的是 xtt.properties 中的 dest_datafile_location 参数 )
SQL > select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/u01/data/R11204/users01.dbf
<== 所以在我们这次测试中,稍后目标库的 xtt.properties 中的 dest_datafile_location 参数应定义为 /u01/data/R11204
Step 1.5 在原库配置 xtt.properties 文件
以下是强制需要设置的参数
tablespaces
platformid
src_scratch_location
dest_scratch_location
dest_datafile_location
(if using 12c or higher) -- usermantransport=1
tablespaces在我们这个例子里是以逗号分隔的 TEST,TEST_IND; platformid是指定原库的 platformid,可以通过查询原库的 V$DATABASE.PLATFORM_ID 获知:
比如:
SQL> select platform_id from v$database;
PLATFORM_ID
-----------
13 <===== AIX 的 platform_id 并不是 13
注意:因为脚本会自动获取目标库的 platformid,所以这里的platformid是指定原库的 platformid
src_scratch_location 在我们这个例子里是 /home/oracle/xtts_backup
dest_scratch_location 在我们这个例子里是 /home/oracle/xtts_backup_dest
dest_datafile_location 在我们这个例子里是 /u01/data/R11204
这个例子中的这几个参数最后是
$ cat xtt.properties |grep -v ^# |grep -v ^$
tablespaces=TEST,TEST_IND
platformid=13
src_scratch_location=/home/oracle/xtts_backup
dest_datafile_location=/u01/data/R11204
dest_scratch_location=/home/oracle/xtts_backup_dest
Step 1.6 把原库的 xttconvert 脚本以及修改过的 xtt.properties 拷贝到目标库
注释:下面的 192.168.56.160 是我的测试案例中目标库所在的主机的 IP 地址
$ scp -r /home/oracle/xtts oracle@192.168.56.160:/home/oracle/xtts
oracle@192.168.56.160's password:
xttdriver.pl 100% 176KB 176.2KB/s 00:00
xtt.newproperties 100% 5169 5.1KB/s 00:00
xttprep.tmpl 100% 11KB 11.4KB/s 00:00
xttstartupnomount.sql 100% 52 0.1KB/s 00:00
xttcnvrtbkupdest.sql 100% 1390 1.4KB/s 00:00
xtt.properties 100% 5203 5.1KB/s 00:00
xttdbopen.sql 100% 71 0.1KB/s 00:00
Step 1.7 在原库以及目标库要执行操作的 shell 里设置 TMPDIR 环境变量到 rman_xttconvert_VER4 脚本所在的目录
export TMPDIR=/home/oracle/xtts
Step 2.1 在原库设置正确的 ORACLE_HOME 和 ORACLE_SID 参数并执行备份
$ . oraenv
ORACLE_SID = [R112041] ?
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@frac1 ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/11.2.0/dbhome_1
[oracle@frac1 ~]$ echo $ORACLE_SID
R112041
并执行备份
$ cd /home/oracle/xtts
$ $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup
Step 2.2 把原库生成的备份以及 res.txt 文件拷贝到目标库
– 拷贝备份从原库的 src_scratch_location 到目标库的 dest_scratch_location
--在原库执行
$ scp -r /home/oracle/xtts_backup/* oracle@192.168.56.160:/home/oracle/xtts_backup_dest
oracle@192.168.56.160's password:
TEST_IND_7.tf 100% 100MB 100.0MB/s 00:01
TEST_6.tf 100% 100MB 100.0MB/s 00:01
– 把 /home/oracle/xtts 目录下的res.txt 文件拷贝到目标库的/home/oracle/xtts 目录下
--在原库执行
$ scp res.txt oracle@192.168.56.160:/home/oracle/xtts/
oracle@192.168.56.160's password:
res.txt 100% 118 0.1KB/s 00:00
Step 2.3 在目标库应用备份
-- 设置 ORACLE_HOME 和 ORACLE_SID 环境变量
[oracle@oslab ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/11.2.0.4a
[oracle@oslab ~]$ echo $ORACLE_SID
R11204
-- 在目标库应用备份
[oracle@oslab ~]$ cd /home/oracle/xtts/
[oracle@oslab xtts]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore
Step 3.1 接下来是做增量备份并应用到目标端 (注意!!! 下面的步骤里会重启目标端的数据库)
– 在原库做增量备份
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup
Step 3.2 把增量备份以及 res.txt 拷贝到目标库
拷贝备份从原库的 src_scratch_location 到目标库的 dest_scratch_location
--在原库执行
cd /home/oracle/xtts/
$ scp `cat incrbackups.txt` oracle@192.168.56.160:/home/oracle/xtts_backup_dest
oracle@192.168.56.160's password:
04vqapf3_1_1 100% 40KB 40.0KB/s 00:00
03vqapf2_1_1 100% 40KB 40.0KB/s 00:00
$ scp res.txt oracle@192.168.56.160:/home/oracle/xtts/
oracle@192.168.56.160's password:
res.txt 100% 260 0.3KB/s 00:00
Step 3.3 在目标库应用增量备份 (这个步骤会重启目标端数据库)
-- 在目标库执行
cd /home/oracle/xtts/
$ORACLE_HOME/perl/bin/perl xttdriver.pl --restore
注意!!! Step 3.1 到 Step 3.3 可以反复操作来实现目标库追平原库的目的,直到最终做 transportable tablespace 的最后步骤
Step 4.1 这个步骤是原库的 tablespace 置为只读 (稍后会做最后一次增量备份并在目标端最后一次应用增量备份)
-- 在原库把 test, test_ind tablespace置为只读 (此时应用就不能修改数据了)
SQL> alter tablespace TEST read only;
Tablespace altered.
SQL> alter tablespace TEST_IND read only;
Tablespace altered.
Step 4.2 在原库做最后一次增量备份
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup
这次会有下面的 warning, 但可以忽略
####################################################################
Warning:
------
Warnings found in executing /home/oracle/xtts/backup_Mar21_Sun_20_32_11_889//xttpreparenextiter.sql
####################################################################
Prepare newscn for Tablespaces: 'TEST_IND'
DECLARE*
ERROR at line 1:
ORA-20001: TABLESPACE(S) IS READONLY OR,
OFFLINE JUST CONVERT, COPY
ORA-06512: at line 284
####################################################################
Warning:
------
Warnings found in executing /home/oracle/xtts/backup_Mar21_Sun_20_32_11_889//xttpreparenextiter.sql
####################################################################
Step 4.3 把增量备份以及 res.txt 传输至目标端
--在原库执行
$ cd /home/oracle/xtts/
$ scp `cat incrbackups.txt` oracle@192.168.56.160:/home/oracle/xtts_backup_dest
$ scp res.txt oracle@192.168.56.160:/home/oracle/xtts/
Step 4.4 在目标端应用最后一次增量备份
--在目标库执行
$ORACLE_HOME/perl/bin/perl xttdriver.pl --restore
Step 5.1 从原库导出对应 tablespace 的 metadata
--在原库执行下面的操作,注意替换 directory, transport_tablespaces 以及用户名密码信息
$ expdp system/oracle dumpfile=xttdump.dmp directory=DATA_PUMP_DIR statistics=NONE transport_tablespaces=TEST,TEST_IND transport_full_check=y logfile=tts_export.log
在我的案例中生成的 dump 文件如下
/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/log/xttdump.dmp
Step 5.2 拷贝 dmp 文件到目标库
$ scp /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/log/xttdump.dmp oracle@192.168.56.160:/home/oracle/xtts/
Step 5.3 导入到目标库
--导入目标库:需要修改 directory以及transport_datafiles指定的目录以及文件名字(datafile名可能会发生改变)
$ ls /u01/data/R11204/TEST*
/u01/data/R11204/TEST_6.dbf /u01/data/R11204/TEST_IND_7.dbf
$ impdp system/oracle dumpfile=xttdump.dmp directory=xtts transport_datafiles='/u01/data/R11204/TEST_6.dbf','/u01/data/R11204/TEST_IND_7.dbf'
Step 6.1 在收尾的部分,我们会先验证迁移过来的 datafile 的一致性
--目标库
$ rman target /
RMAN> validate tablespace 'TEST','TEST_IND' check logical;
Step 6.2 最后把两个 tablespace 置为 READ WRITE模式
--目标库
sqlplus / as sysdba
alter tablespace TEST read write;
alter tablespace TEST_IND read write;
参考mos 提供方案写的。