一、迁移环境
源库:@H_301_7@AIX-Based Systems (64-bit),@H_301_7@11.1.0.7.0 rac
目标库:@H_301_7@Linux x86 64-bit ,@H_301_7@12.1.0.2 rac
@H_301_7@
二、导入元数据报错
userid='/assysdba' DIRECTORY=TTSIMP DUMPFILE=exp_xttplugin_201803_%u.dmp LOGFILE=imp_xttplugin_201803.log transport_datafiles=’xxx’,’xxx’,’xxx’....’xxx’#共326个数据文件,篇幅问题就不cat出来了
@H_301_7@1、执行元数据导入:@H_301_7@
nohup impdp parfile=imp_xttplugin_201803.par > imp_xttplugin_201803.par.out &
Mastertable"SYS"."SYS_IMPORT_TRANSPORTABLE_01"successfullyloaded/unloaded Starting"SYS"."SYS_IMPORT_TRANSPORTABLE_01":/********ASSYSDBAparfile=imp_xttplugin_201803.par ProcessingobjecttypeTRANSPORTABLE_EXPORT/PLUGTS_BLK ORA-39123:DataPumptransportabletablespacejobaborted ORA-00059:maximumnumberofDB_FILESexceeded Job"SYS"."SYS_IMPORT_TRANSPORTABLE_01"stoppedduetofatalerroratFriApr2700:24:152018elapsed000:05:06
@H_301_7@
这里是由于目前现在导入的库是个中间库,用户转换而已,后续是转换成@H_301_7@pdb,所以只是很简单的建库,并没有修改一下初始化参数,所以导致了报错(属于低级错误,自我反省中)。
@H_301_7@
2、修改@H_301_7@db_files之后,再次执行导入:@H_301_7@@H_301_7@
nohup impdp parfile=imp_xttplugin_201803.par > imp_xttplugin_201803.par.out &
Mastertable"SYS"."SYS_IMPORT_TRANSPORTABLE_01"successfullyloaded/unloaded Starting"SYS"."SYS_IMPORT_TRANSPORTABLE_01":/********ASSYSDBAparfile=imp_xttplugin_201803.par ProcessingobjecttypeTRANSPORTABLE_EXPORT/PLUGTS_BLK ORA-39123:DataPumptransportabletablespacejobaborted ORA-29349:tablespace'XXX_DATA'alreadyexists Job"SYS"."SYS_IMPORT_TRANSPORTABLE_01"stoppedduetofatalerroratFriApr2700:35:292018elapsed000:04:37
@H_301_7@
@H_301_7@
--发现已经导入56个数据文件 selectcount(1)fromdba_data_fileswheretablespace_namenotin('SYSTEM','USERS','SYSAUX','UNDOTBS1'); count(1) --------- 56 --发现已经导入了12个表空间,总共16个表空间 selectcount(1)fromdba_tablespaceswheretablespace_namenotin('SYSTEM','UNDOTBS1'); count(1) --------- 12 --也就是说在第一次因为db_files报错的时候,在导入TRANSPORTABLE_EXPORT/PLUGTS_BLK步骤,已经有部分元数据导入了,再次发起导入已经存在的就会存在冲突。
@H_301_7@
三、寻找解决办法
@H_301_7@
oerrora29349 29349,00000,"tablespace'%s'alreadyexists" //*Cause:Triedtoplug-inatablespacewhichalreadyexists. //*Action:Droptheoffendingtablespaceifpossible.Otherwiseuseadifferentmethod(e.g.,import/export)tomovedata.
我们日常常用的删除表空间的语句有如下@H_301_7@3种:
--删除表空间,保留表空间包含内容和物理数据文件: droptablespacexxx; --删除表空间及包含的内容,保留物理数据文件: droptablespacexxxincludingcontents; --删除表空间及包含的内容及物理数据文件: droptablespacexxxincludingcontentsanddatafiles;
@H_301_7@
这里根据@H_301_7@ORA-29349的报错,解决办法是删除已有的表空间,再进行导入,因为需要@H_301_7@XTTS元数据还没导入,保留数据文件,而且如果把数据文件清理掉了,数据就丢失了,迁移就会变的没有意义。所以这里选用@H_301_7@drop tablespace xxx including contents;的方式进行删除。为了确保能保留数据文件,我进行了测试,也就是这个测试造成了下面的山路十八湾(不想被我带坑里的可以跳过,直接到第四节)
@H_301_7@
createtablespacetest_drpdatafile'+DATA’size10mautoextendoff; selecttablespace_name,file_namefromdba_data_fileswheretablespace_name='TEST_DRP' TABLESPACE_NAMEFILE_NAME --------------------------------------------------------------------------- TEST_DRP+DATA/RACDB/DATAFILE/test_drp.456.974282309 droptablespaceTEST_DRPincludingcontents; selecttablespace_name,file_namefromdba_data_fileswheretablespace_name='TEST_DRP'; norowsselected
@H_301_7@
发现数据文件也是被一起删除掉了,这里很困惑,是不是存放在@H_301_7@ASM里面的问题?尝试@H_301_7@drop tablespace TEST_DRP;也是一样,会将数据文件一同删除。这里或许有大神一下就知道什么原因了,@H_301_7@ASM问题?其它问题?这里先卖个关子,毕竟我是要带着大家走弯路的,弯路走多了就成了直路嘛(知道原因的请跳过)
@H_301_7@
@H_301_7@3、@H_301_7@sqlfile生成的@H_301_7@ddl
既然不能删除已有的表空间,那么就采用排除已经存在的对象进行导入,貌似也没有什么大不了的事嘛,是的,在我们日常@H_301_7@expdp/impdp中加exclude参数确实很容易。但这里有transport_datafiles参数是不能加@H_301_7@exclude的。
再换一种思路,排除@H_301_7@transport_datafiles中已经导入的@H_301_7@data_files,然后加上@H_301_7@sqlfile生成@H_301_7@ddl语句,通过直接执行@H_301_7@ddl来进行导入元数据。
@H_301_7@cat imp_xttplugin_201803.par
userid='/assysdba' DIRECTORY=TTSIMP DUMPFILE=exp_xttplugin_201803_%u.dmp LOGFILE=imp_xttplugin_201803.log sqlFILE=imp_xttplugin_201803.sql transport_datafiles=’xxx’,’xxx’....’xxx’
@H_301_7@
@H_301_7@
生成之后的imp_xttplugin_201803.sql部分内容:
@H_301_7@
execSYS.DBMS_PLUGTS.NEWDATAFILE('+DATA/RACDB/test_drp.dbf'); BEGINsys.dbms_plugts.beginImpTablespace('TEST_DRP',6,'SYS',1,8192,127403426271554,22147483645,8,128,1361893745,4129,802505,NULL,2966,1469671696,NULL); COMMIT; END; / BEGIN sys.dbms_plugts.checkDatafile(NULL,13618937425,10,3931648,802652,122486743949798,421943042,NULL); COMMIT; END; / BEGIN sys.dbms_plugts.commitPluggable; COMMIT; END; /
看着能生成对应的@H_301_7@ddl语句,还有点小激动,在尝试手工执行的时候,我错了,依旧会报@H_301_7@ORA-29349错误,看来要好好研读一下@H_301_7@sys.dbms_plugts这个表的内容了,嗯,效果还不错,摸索了一些规律,将剩下的表空间元数据手工导入了。也就是“@H_301_7@Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK“这一步通过手工导入了(过程就不描述了,毕竟是行不通的办法),接下来应该”@H_301_7@Processing object type TRANSPORTABLE_EXPORT/TABLE“ 根据生成的@H_301_7@ddl语句已经没法往下继续了。原因有@H_301_7@2个,一是语法不支持,二是在导入表空间元数据的时候,表空间的@H_301_7@tablespace_id和@H_301_7@datafile_id都是有关联映射的。@H_301_7@CREATE TABLE XXX.XXX (XXX XXX) STORAGE(SEG_FILE 36 SEG_BLOCK 194 OBJNO_REUSE 13743);这个是无法直接执行的。
@H_301_7@
到这里,该想的办法都想了,还想过重建控制文件,表空间重命名等,是不是真的没有办法了?这里本来打算放弃治疗了,准备清理环境之后再一步步进行@H_301_7@XTTS迁移(模拟测试)。但这里还有个问题,就是@H_301_7@drop tablespace在@H_301_7@asm里数据文件会被清理掉的原因还没找出来。
@H_301_7@
那原因是什么呢?(赶紧恶补@H_301_7@drop tablespace的知识)
详见:@H_301_7@https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9004.htm
@H_301_7@
四、测试验证
@H_301_7@
--创建非OMF管理的表空间 createtablespacetest_drpdatafile'+DATA/RACDB/test_drp01.dbf'size10mautoextendoff; --创建测试数据 createtablescott.test_drp(idnumber)tablespaceTEST_DRP; insertintoscott.test_drpvalues(1); createindexscott.test_drp_idxonscott.test_drp(id)tablespaceTEST_DRP; --表空间置为readonly altertablespaceTEST_DRPreadonly; --导出元数据 cat>exp_xttplugin_test_20180502.par userid='/assysdba' DUMPFILE=exp_xttplugin_test_20180502_%u.dmp LOGFILE=exp_xttplugin_test_20180502.log DIRECTORY=TTSEXP_TMP exclude=TABLE_STATISTICS,INDEX_STATISTICS,INDEX/STATISTICS transport_full_check=no transport_tablespaces=(TEST_DRP) --导入元数据 cat>imp_xttplugin_test_20180502.par userid='/assysdba' DIRECTORY=TTSEXP_TMP DUMPFILE=exp_xttplugin_test_20180502_%u.dmp LOGFILE=imp_xttplugin_test_20180502.log transport_datafiles='+DATA/RACDB/test_drp01.dbf' --模拟ORA-29349报错 impdpparfile=imp_xttplugin_test_20180502.par Connectedto:OracleDatabase12cEnterpriseEditionRelease12.1.0.2.0-64bitProduction WiththePartitioning,RealApplicationClusters,AutomaticStorageManagement,OLAP,AdvancedAnalyticsandRealApplicationTestingoptions Mastertable"SYS"."SYS_IMPORT_TRANSPORTABLE_01"successfullyloaded/unloaded Starting"SYS"."SYS_IMPORT_TRANSPORTABLE_01":/********ASSYSDBAparfile=imp_xttplugin_test_20180502.par ProcessingobjecttypeTRANSPORTABLE_EXPORT/PLUGTS_BLK ORA-39123:DataPumptransportabletablespacejobaborted ORA-29349:tablespace'TEST_DRP'alreadyexists --删除TEST_DRP表空间及包含的内容,保留数据文件 droptablespaceTEST_DRPincludingcontents; --再次执行导入 impdpparfile=imp_xttplugin_test_20180502.par Import:Release12.1.0.2.0-ProductiononWedMay216:29:282018 Copyright(c)1982,2014,Oracleand/oritsaffiliates.Allrightsreserved. Connectedto:OracleDatabase12cEnterpriseEditionRelease12.1.0.2.0-64bitProduction WiththePartitioning,AdvancedAnalyticsandRealApplicationTestingoptions Mastertable"SYS"."SYS_IMPORT_TRANSPORTABLE_01"successfullyloaded/unloaded Starting"SYS"."SYS_IMPORT_TRANSPORTABLE_01":/********ASSYSDBAparfile=imp_xttplugin_test_20180502.par ProcessingobjecttypeTRANSPORTABLE_EXPORT/PLUGTS_BLK ProcessingobjecttypeTRANSPORTABLE_EXPORT/TABLE ProcessingobjecttypeTRANSPORTABLE_EXPORT/INDEX/INDEX ProcessingobjecttypeTRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK Job"SYS"."SYS_IMPORT_TRANSPORTABLE_01"successfullycompletedatWedMay216:29:322018elapsed000:00:03
@H_301_7@
@H_301_7@五、案例总结
@H_301_7@1、@H_301_7@XTTS迁移过程有很多需要注意的点,一定不能马虎大意,关键操作最好设置还原点(@H_301_7@restore point)。
@H_301_7@2、@H_301_7@OMF管理的表空间在@H_301_7@drop tablespace的时候是会自动清理物理数据文件的。