迁移或备份数据库可以采用传输表空间技术TTS,优点是操作较简便,只需要将元数据进行导出导入,数据文件可以使用FTP方式从源库拷贝至目标库;缺点是数据文件传输至目标库之前,需要将源库表空间置为只读,相当于停业务,所以需要根据业务要求来判断是否可以采用这种方式,下面就针对TTS做一个简单的实验,感性地体会下其操作过程。增强版的XTTS未来有机会再做实验。
实验环境:
为了处理简单,源库和目标库均采用了11.2.0.4的版本,且字节序相同(其实TTS强大的一点就是可以借助RMAN做不同字节序、平台的转换,这点可以参考eygle大师的《深入浅出Oracle》一书,专门有一章介绍了这部分内容)。
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
PLATFORM_NAME ENDIAN_FORMAT
Linux x86 64-bit Little
1.源库验证待传输表空间(dcsopen_tbs)是否自包含,是否符合使用传输表空间的前提条件
SQL EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK(‘DCSOPEN_TBS’,TRUE);
PL/SQL procedure successfully completed.
如果待传输的表空间有对象引用了其他非要传输的表空间的对象,例如索引,则需要事先解决这个问题,也就是要传输的表空间对象必须是自包含的。执行上述包,若存在违反约束的情况,则下面这条SQL会返回错误信息:
SQL SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected
2.将待传输表空间置为只读
SQL alter tablespace dcsopen_tbs read only;
Tablespace altered.
3.导出元数据
[oracle@emrep11 ~]$ expdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_tablespaces=dcsopen_tbs logfile=tts_export.log
Export: Release 11.2.0.4.0 - Production on Fri Jul 8 09:01:42 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting “SYSTEM”.”SYS_EXPORT_TRANSPORTABLE_01”: system/******** dumpfile=dcsopen_tbs.dmp directory=tts transport_tablespaces=dcsopen_tbs logfile=tts_export.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX/INDEX
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/COMMENT
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table “SYSTEM”.”SYS_EXPORT_TRANSPORTABLE_01” successfully loaded/unloaded
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/home/oracle/tts/dcsopen_tbs.dmp
Datafiles required for transportable tablespace DCSOPEN_TBS:
/u01/app/oracle/11.2.0.4/oradata/DCSOPEN/dcsopen_tbs01.dbf
Job “SYSTEM”.”SYS_EXPORT_TRANSPORTABLE_01” successfully completed at Fri Jul 8 09:01:59 2016 elapsed 0 00:00:14
4.目标库导入元数据
这其中可能有一些容易犯错的地方:
错误1:若dcsopen_tbs01.dbf还未拷贝FTP至目标库,此时执行了:
SQL alter tablespace dcsopen_tbs read write;
Tablespace altered.
则执行导入会报错:
[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=/home/oracle/tts/dcsopen_tbs01.dbf logfile=tts_import.log
…
ORA-39123: Data Pump transportable tablespace job aborted
ORA-19722: datafile /home/oracle/tts/dcsopen_tbs01.dbf is an incorrect version
因为表空间置为只读,是为了保证数据的一致性,所以需要在拷贝完成后才能将其置为可读写状态。
[oracle@emrep11 ~]$ oerr ora 19722
19722, 00000, “datafile %s is an incorrect version”
// *Cause: The datafile is an incorrect version. It contains either less or
// more changes then the desired version.
// *Action: Make sure the right datafiles are transported. Make sure the
// datafile is copied while its tablespace is read only.
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1424004061629
错误2:若目标库没有和源库相同的用户,则报错:
[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=dcsopen_tbs01.dbf logfile=tts_import.log
…
ORA-39123: Data Pump transportable tablespace job aborted
ORA-29342: user DCSOPEN does not exist in the database
当然,既然使用数据泵,应该可以使用remap_schema参数做映射替换,感兴趣的朋友可以尝试。
另外,如果不知道目标库使用了什么用户导出的,可以使用sqlfile参数:
[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=dcsopen_tbs01.dbf sqlfile=ddl.sql
他会生成一个ddl.sql文件,显示了这份dmp文件的内容,其中有一部分就会检查用户,这样你就可以知道是什么用户了:
BEGIN
sys.dbms_plugts.checkUser(‘DCSOPEN’);
COMMIT;
END;
/
错误3:如果第二次导入,未删除第一次旧的dump文件,则会报错:
[oracle@emrep11 tts]$ expdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_tablespaces=dcsopen_tbs logfile=tts_export.log
…
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-31641: unable to create dump file “/home/oracle/tts/dcsopen_t
bs.dmp”
ORA-27038: created file already exists
Additional information: 1
这点你不能说不好,还未探究是否有参数可以跳过了。
5.导入完成后,此时查看目标表的表空间
SYS@EMREP select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
DCSOPEN_TBS READ ONLY
状态是只读,需要手工打开,
SYS@EMREP alter tablespace dcsopen_tbs read write;
Tablespace altered.
SYS@EMREP select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
DCSOPEN_TBS ONLINE
这样就完成了表空间的迁移过程,当然这实验省略了很多内容,例如字节序、跨平台等等,实际情况可能会更复杂。