跳到主要内容

传输表空间技术(TTS)实现数据快速迁移 [案例分享]

提示

本文为站长原创文章,版权所有,未经允许,禁止转载!

信息

数据库环境信息:
原生产库信息: 硬件:HP C7000刀箱 + BL680G7 刀片服务器 X86-64 架构
操作系统:Windows Enterprise Server 2003 R2 64bit
oracle版本:Oracle Database 10.0.2.4 64bit

新生产库信息: 硬件:HP DL580 G7 4路服务器 X86-64 架构
操作系统:Oracle Enterprise Linux 6.0 update4 64bit
oracle版本:Oracle Database 11.2.0.4 64bit

案例背景简述

本案例为2014年给某市房产局做的一个数据迁移项目,客户原来的生产环境是windows + oracle 10g RAC计划升级到 Linux + Oracle 11g RAC,因客户这套系统为房地产综合管理信息系统是最为核心的业务系统,因此对停机时间要求苛刻,且数据量大,RMAN整库备份约为:1.7T,前期测试了各种迁移方案,最终确定通过跨平台传输表空间技术(TTS)来实施数据迁移。

实施步骤

1、检查表空间约束性
-- 进行严格方式
exec dbms_tts.transport_set_check('XXXWORK','XXXAPP','XXXAPPIX',TRUE,TRUE);
select * from sys.transport_set_violations;

-- 确定表空间与数据文件
select file_name,file_id,tablespace_name,status,online_status
from dba_data_files
where tablespace_name
in (
'XXXWORK','XXXAPP','XXXAPPIX') order by file_name;

-- 统计表空间包含多少文件
SELECT COUNT(*) FROM dba_data_files WHERE TABLESPACE_NAME
IN (
'XXXWORK', 'XXXAPP', 'XXXAPPIX');

-- 确定要copy的数据文件
SELECT file_name FROM dba_data_files WHERE TABLESPACE_NAME
IN (
'XXXWORK','XXXAPP','XXXAPPIX');

-- 查看表空间相关信息
SELECT * FROM DBA_TABLESPACES
where tablespace_name
IN ('XXXWORK', 'XXXAPP', 'XXXAPPIX');

2、在进行expdp导出之前,先把相关表空间设为只读
ALTER TABLESPACE XXXWORK READ ONLY;
ALTER TABLESPACE XXXAPP READ ONLY;
ALTER TABLESPACE XXXAPPIX READ ONLY;

-- 导出表空间元数据
expdp \"/ as sysdba\" DUMPFILE=tts_`date "+%Y-%m-%d"_%H.%M.%S`.log .dmp DIRECTORY=DATA_PUMP_DIR2 LOGFILE=ttslog_`date "+%Y-%m-%d"_%H.%M.%S`.log TRANSPORT_TABLESPACES = XXXWORK,XXXAPP,XXXAPPIX TRANSPORT_FULL_CHECK=Y

--导出数据库中除表及其索引以外的所有metadata数据。
expdp \"/ as sysdba\" directory=tts_dir dumpfile=tts_meta_20140116.dmp content=metadata_only exclude=table full=y

3、拷贝数据文件到N盘中
-- copy的文件脚本
select 'copy '||file_name ||' N:/datafile' from dba_data_files where tablespace_name
IN ('XXXWORK', 'XXXAPP', 'XXXAPPIX') ORDER BY file_name;

4、把文件拷贝从源库拷贝至目的数据库中
-- 把拷贝出来的数据文件导入进去
/home/oracle/script/tts/file_transfer.sh

4.1、创建相关用户及其赋予相应权限
CREATE USER BANKADMIN IDENTIFIED BY VALUES 'xxxx';
CREATE USER XXXADMIN IDENTIFIED BY VALUES 'xxxx' ;

GRANT CONNECT TO BANKADMIN;
GRANT UNLIMITED TABLESPACE,RESOURCE,CONNECT to "lisen";
GRANT UNLIMITED TABLESPACE,RESOURCE,CONNECT to LISEN;

GRANT CONNECT TO WEBUSER;

-- 确认文件导入完成后
-- 如有有大量的文件那么impdp时必须要用参数文件来定义,不然会报错。
5、导入MetaData进入目的数据库中
/home/oracle/script/tts/impdp_tts.sh
impdp \"/ as sysdba\" PARFILE='par.f'

/*
impdp \"/ as sysdba\" PARFILE=par.f
DIRECTORY=TTS_DIR
DUMPFILE=tts_20140117.dmp
LOGFILE=IMPORT_TTS_20140118.log
transport_datafiles='+DBDG/ZXXXCDB/DATAFILE/XXXAPPATTECHIX.DAT'
transport_datafiles='+DBDG/ZXXXCDB/DATAFILE/XXXAPPIX.DAT'
transport_datafiles='+DBDG/ZXXXCDB/DATAFILE/XXXAPPIX01.DAT'
*/

6、 导入Meta信息到schema中:
impdp \"/ as sysdba\" directory=TTS_DIR2 dumpfile=tts_meta_20140116.dmp logfile=impdp_tts_meta_20131126.log schema=XXXADMIN

7、 对用户相关进行更正。
ALTER USER BANKADMIN IDENTIFIED BY VALUES 'xxx' DEFAULT TABLESPACE XXXWORK TEMPORARY TABLESPACE TEMP;
ALTER USER XXXADMIN IDENTIFIED BY VALUES 'xxx' DEFAULT TABLESPACE XXXWORK TEMPORARY TABLESPACE TEMP;

8、 对表空间打开读写
ALTER TABLESPACE XXXWORK READ WRITE;
ALTER TABLESPACE XXXAPP READ WRITE;
ALTER TABLESPACE XXXAPPIX READ WRITE;

9、数据验证
-- 处理DB LINK信息
--创建DBLINK
CREATE DATABASE LINK "ZXXXGDATA.ZXXXC.COM" CONNECT TO "ZXXXGADMIN" IDENTIFIED BY VALUES 'xx' USING 'ZXXXGDATA'

--创建一个Public DBLINK 用于数据比对
create public database link PDG_DBLINK connect to system identified by password using 'WULISTD';

-- 对象完整性检查
SELECT COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN ('WEBUSER', 'lisen', 'LISEN');
SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER IN ('XXXADMIN');

--对比 Source 库与 Target库之间的差异
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES@PDG_DBLINK
WHERE OWNER IN ('XXXADMIN')
MINUS
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES
WHERE OWNER IN ('XXXADMIN');

-- 测试表空间读写性
SELECT * FROM DBA_TABLES WHERE OWNER='XXXADMIN' AND TABLE_NAME LIKE 'TEST_2014%' ORDER BY TABLE_NAME;
CREATE TABLE XXXadmin.test_20140118_01 TABLESPACE XXXWORK AS SELECT * FROM dba_tables;

-- 编译无效对象
@ORACLE_HOME/rdbms/admin/utlrp.sql

10、重新获得统计信息
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(
OWNNAME => 'XXXADMIN',
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE,
CASCADE => TRUE,
METHOD_OPT => 'FOR ALL COLUMNS SIZE REPEAT' );