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 提供方案写的。
原文地址:https://www.cnblogs.com/dqliuq1215/p/14610947.html