参考MOS:11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 1389592.1)
一 使用平台
Oracle数据库云数据库云服务器服务-版本N / A和更高版本
Oracle数据库云服务-版本N / A和更高版本
Oracle数据库-企业版-版本10.2.0.3和更高版本
Oracle数据库云架构服务-版本N / A和更高版本
Oracle数据库数据库云服务器Express Cloud Service-版本N / A和更高版本的Linux x86-64
二 跨平台迁移
当使用跨平台可移动表空间(XTTS)在具有不同字节序格式的系统之间迁移数据时,所需的停机时间可能非常长,因为它与要移动的数据集的大小成正比。但是,将XTTS与跨平台增量备份相结合可以显着减少在平台之间移动数据所需的停机时间。
使用跨平台增量备份功能的高级步骤如下:
1. 准备阶段(源数据保持在线)
将数据文件传输到目标系统如有必要,将数据文件转换为目标系统字节序格式
2. 前滚阶段(源数据保持联机状态-重复此阶段多次以捕获目标数据文件副本直至源数据库)
在源系统上创建增量备份
将增量备份转移到目标系统
将增量备份转换为目标系统字节序格式,并将备份应用于目标数据文件副本
注:在版本3中,如果将数据文件添加到表空间或将新表空间名称添加到xtt.properties文件,则将需要警告和其他说明。
3. 传输阶段(源数据为只读)
使源数据库中的表空间只读
最后一次重复前滚阶段
此步骤使目标数据文件副本与源数据库一致。
处理大数据时,此步骤所需的时间明显少于传统XTTS方法,因为增量备份大小较小。
使用数据泵从源数据库导出表空间中对象的元数据
使用数据泵将表空间中对象的元数据导入到目标数据库中
使目标数据库中的表空间读写
本文档的目的是提供一个示例,说明如何使用此增强的RMAN跨平台增量备份功能来减少跨平台传输表空间时的停机时间。
三 先决条件
当前版本不支持Windows。
源数据库必须正在运行10.2.0.3或更高版本。
源数据库的COMPATIBLE参数必须设置为10.2.0或更高。
源数据库的COMPATIBLE参数不得大于目标数据库的COMPATIBLE参数。
源数据库必须处于ARCHIVELOG模式。
目标数据库必须正在运行11.2.0.4或更高版本。
尽管首选的目标系统是Linux(64位Oracle Linux或RedHat Linux的认证版本),但是此过程可以与其他基于unix的操作系统一起使用。
源的Oracle版本必须低于或等于目标。因此,此过程可以用作升级方法。对可移动表空间的限制将适用。
RMAN的默认设备类型应配置为DISK
源系统上的RMAN 不得将COMPRESSED配置为DEVICE TYPE DISK。如果是这样,则过程可能返回:ORA-19994:跨平台备份的压缩备份具有不同的优先级。
要移动的表空间集必须全部在线,并且不包含任何离线数据文件。表空间必须是READ WRITE。只读的表空间可以使用普通的XTTS方法移动。无需合并跨平台增量式备份即可移动始终只读的表空间。
四 迁移流程耗时
五 迁移操作
5.1 源端获取USER和权限,根据具体情况改查询条件
--CREATE_USER_DDL
select to_char(dbms_metadata.get_ddl('USER',USERNAME)) CREATE_USER_DDL from dba_users where ACCOUNT_STATUS='OPEN' and USERNAME not in ('SYS','SYSTEM');
--GRANT_ROLE_DDL
select to_char(dbms_metadata.get_granted_ddl('ROLE_GRANT',GRANTEE)) GRANT_ROLE_DDL from dba_role_privs where GRANTEE in (select USERNAME from dba_users where ACCOUNT_STATUS='OPEN' and USERNAME not in ('SYS','SYSTEM'));
--default_tablespace
select 'alter user '||username||' default tablespace '||default_tablespace||';' from dba_users where ACCOUNT_STATUS='OPEN' and USERNAME not in ('SYS','SYSTEM');
5.3 建议源端清理并关闭回收站
select OWNER,TYPE,count(1) from dba_recyclebin group by OWNER,TYPE order by OWNER;
show parameter recyclebin
alter systemn set recyclebin='off' scope=both;
purge recyclebin;
5.4 源端自包含检查
execute sys.dbms_tts.transport_set_check('TBS,TEST,TEST2,GG_TBS,JJ_TBS,USERS', true);
select * from sys.transport_set_violations;
5.5 源端创建测试数据,可用于验证同步情况
create user xttst identified by xttst default tablespace USERS;
grant connect,resource to xttst;
create table xttst.xtts (aa date);
insert into xttst.xtts values (sysdate);
commit;
alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
select * from xttst.xtts;
5.6 源端解压XTTS
[/bin/bash]$mkdir xtts
[/bin/bash]$unzip rman_xttconvert_v3.zip -d xtts/
5.7 源端开启块跟踪,共享位置
alter database enable block change tracking using file/oracle/oradata/orcldb/block_change_tracking.log';
5.8 目标端创建PDB
SQL> alter pluggable database orcldb close instances=all;
SQL> drop pluggable database orcldb including datafiles;
SQL> create pluggable database orcldb admin user admin identified by admin;
SQL> alter pluggable database orcldb open instances=all;
5.9 目标端配置tnsnames.ora
vi /u02/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
orcldb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.10)(PORT = 1523))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldb)
)
)
orclpdb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.8.110)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldb)
)
)
tnsping orcldb
5.10 目标端创建目录和DBLINK
$ sqlplus system/oracle@orcldb
SQL> ALTER SESSION SET CONTAINER=orcldb;
create public database link to_orcldb connect to system identified by oracle using 'orcldb';
select name from v$database@to_orcldb;
create directory PUMP_DIR as '/data/expdp';
Grant read,write on directory PUMP_DIR to system;
5.11 源端配置xtt.properties
SYS@orcl1> select PLATFORM_ID from V$DATABASE;
PLATFORM_ID
---------------
6
[/bin/bash]$cat xtt.properties
tablespaces=TBS,TEST,TEST2,GG_TBS,JJ_TBS,USERS
platformid=6
dfcopydir=/xtts/rmanbak
backupformat=/xtts/rmanbak
stageondest=/xtts/rmanbak
storageondest=+DATA/ORCL/A58613850A629F/DATAFILE
backupondest=/xtts/rmanbak
parallel=8
rollparallel=8
getfileparallel=8
5.12目标端解压XTTS,源端将xtt.properties复制到目标端
源端创建数据文件副本
more full_backup.sh
export ORACLE_SID=orcl1
export TMPDIR=/home/oracle/xtts
export XTTDEBUG=1
$ORACLE_HOME/perl/bin/perl xttdriver.pl -p
nohup sh full_backup.sh > full_backup.log
5.13传输源端数据文件副本到目标端,使用NFS可忽略此步
传输源端 rmanconvert.cmd 到目标端
$scp /home/oracle/xtts/rmanconvert.cmd [email protected]:/home/oracle/xtts
5.14 目标端创建辅助实例
创建辅助实例的原因:目标端执行增量恢复时会重启实例,对于PDB架构,会影响其他PDB正常使用。
[oracle@rac1:/home/oracle/xtts]$ vi /u02/app/oracle/product/19.0.0/db_1/dbs/initxtts.ora
*.db_name=xtts
*.compatible=19.0.0
[oracle@rac1:/home/oracle/xtts]$ export ORACLE_SID=xtts
[oracle@rac1:/home/oracle/xtts]$ sqlplus / as sysdba
SQL> startup nomount force;
5.15 目标端转换数据文件副本
more dfile_convert.sh
export ORACLE_SID=xtts
export TMPDIR=/home/oracle/xtts
export XTTDEBUG=1
$ORACLE_HOME/perl/bin/perl xttdriver.pl -c
nohup sh dfile_convert.sh > dfile_convert.log &
5.16 源端插入测试数据
insert into xttst.xtts values (sysdate);
commit;
alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
select * from xttst.xtts;
5.17 源端执行增量备份
more incr_backup.sh
export ORACLE_SID=orcl1
export TMPDIR=/home/oracle/xtts
export XTTDEBUG=1
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i
nohup sh incr_backup.sh > incr_backup.log &
5.18 传输源端增量备份文件到目标端,使用NFS可忽略此步
传输源端 xttplan.txt tsbkupmap.txt 到目标端
$scp xttplan.txt tsbkupmap.txt [email protected]:/home/oracle/xtts
5.19 目标端增量恢复
more recover_incr.sh
export ORACLE_SID=xtts
export TMPDIR=/home/oracle/xtts
export XTTDEBUG=1
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r
nohup sh recover_incr.sh > recover_incr.log &
5.20 源端确定下一次增量备份的FROM_SCN
export ORACLE_SID=orcl1
export TMPDIR=/home/oracle/xtts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -s
六 数据库切割
insert test data
insert into xttst.xtts values (sysdate);
commit;
6.1 源端将表空间设置为只读
alter tablespace TBS read only;
alter tablespace TEST read only;
alter tablespace TEST2 read only;
alter tablespace GG_TBS read only;
alter tablespace JJ_TBS read only;
alter tablespace USERS read only;
6.2执行最后一次增量备份和恢复
目标端创建角色
CREATE ROLE "SELECT_ROLE";
GRANT SELECT ANY DICTIONARY to SELECT_ROLE;
GRANT SELECT ANY TABLE to SELECT_ROLE;
GRANT SELECT ANY SEQUENCE to SELECT_ROLE;
GRANT SELECT ANY TRANSACTION to SELECT_ROLE;
6.3 目标端创建用户
CREATE USER "USER1" IDENTIFIED BY VALUES 'S:C31AE3752D23E329F997612E6D5CAB5438727;770F43' DEFAULT TABLESPACE "SYSTEM" TEMPORARY TABLESPACE "TEMP";
CREATE USER "USER2" IDENTIFIED BY VALUES 'S:312D3507AD174D18717F9F6331E2CB5932F60;D07664' DEFAULT TABLESPACE "SYSTEM" TEMPORARY TABLESPACE "TEMP";
CREATE USER "USER3" IDENTIFIED BY VALUES 'S:33E9BB7738DC61157114F9AE395175632289D;C47786' DEFAULT TABLESPACE "SYSTEM" TEMPORARY TABLESPACE "TEMP";
6.4目标端创建DBLINK
SELECT to_char(dbms_metadata.get_ddl('DB_LINK',DB_LINK,OWNER)) DB_LINK_DDL FROM dba_db_links;
6.5目标端导入表空间元数据
export TMPDIR=/home/oracle/xtts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -e
cat /home/oracle/xtts/xttplugin.txt
[oracle@rac1:/home/oracle/xtts]$ cat xtts_impdp.par
network_link=to_orcldb
transport_full_check=no
directory=PUMP_DIR
logfile=impdp_orcldb_log_20200514.log
parallel=8
cluster=N
transport_tablespaces=TBS,TEST,TEST2,GG_TBS,JJ_TBS,USERS
transport_datafiles='+DATA/ORCL/A58613850A629F/DATAFILE/TBS.dbf','+DATA/ORCL/A58613850A629F/DATAFILE/TEST.dbf','+DATA/ORCL/A58613850A629F/DATAFILE/TEST2.dbf','+DATA/ORCL/A58613850A629F/DATAFILE/GG_TBS.dbf','+DATA/ORCL/A58613850A629F/DATAFILE/JJ_TBS.dbf','+DATA/ORCL/A58613850A629F/DATAFILE/USERS.dbf'
[oracle@rac1:/home/oracle/xtts]$ impdp system/oracle@orclpdb parfile=xtts_impdp.par
6.7 目标端将表空间设置为读写模式
select TABLESPACE_NAME,STATUS from dba_tablespaces;
alter tablespace TBS read write;
alter tablespace TEST read write;
alter tablespace TEST2 read write;
alter tablespace GG_TBS read write;
alter tablespace JJ_TBS read write;
alter tablespace USERS read write;
6.8 目标端验证测试数据
SQL> ALTER SESSION SET CONTAINER=orcldb;
SQL> select * from xttst.xtts;
6.9目标端更改用户默认表空间
select 'alter user '||username||' default tablespace '||default_tablespace||';' from dba_users where ACCOUNT_STATUS='OPEN' and USERNAME not in ('SYS','SYSTEM');
6.10目标端导入其他对象元数据
[oracle@rac1:/home/oracle/xtts]$ cat metadata_only_impdp.par
network_link=to_orcldb
directory=PUMP_DIR
schemas='USER1','USER2','USER3'
content=metadata_only
EXCLUDE=table,index
parallel=4
logfile=impdp_orcldb_20200507.log
cluster=N
[oracle@rac1:/home/oracle/xtts]$ impdp system/oracle@orclpdb parfile=metadata_only_impdp.par
6.11 PUBLIC SYNONYM
set pagesize 6000
select 'CREATE or replace PUBLIC SYNONYM '||synonym_name||' FOR '||table_owner||'.'||table_name||';' FROM dba_synonyms where table_owner in ('NRMDB','NMOSDB','KPIDB') and owner='PUBLIC';
6.12 同步tnsnames.ora
6.13 统计信息
exec dbms_stats.gather_database_stats(estimate_percent => 10, degree => 32, granularity => 'ALL', cascade => TRUE);
6.14无效对象
6.15 对象数量对比
select owner,object_type,count(*) from dba_objects where owner in ('USER1','USER2','USER3') group by owner,object_type order by owner,object_type;
6.16 检查文件头
select FILE#,STATUS,TABLESPACE_NAME,ERROR from v$datafile_
```header;
七 应用校验
八 回退
因本次迁移不涉及对源库的数据影响,若迁移后应用校验失败可以讲应用使用源库继续生产。