遷移式升級的測試(三)

jeanron100發表於2016-09-28
還是繼續昨天的任務,今天會把剩下的工作都做完,給個交代。
昨天完成了Data Guard切換,然後Failover備庫,匯出了後設資料資訊作為TTS的準備,亮點就在於匯入的部分。無需挪動資料檔案,這是補充資料字典資訊即可。
這個工作的一個重點內容就是如何保證資料字典資訊的完整性。
在目標環境11g中需要建立相應的使用者,這一點還是很有技巧的。如果採用impdp的形式直接匯入使用者,這樣不妥,因為我們有設定profile,有臨時表空間,預設表空間的資訊。
比如下面的使用者建立語句:
   CREATE USER "TEST" IDENTIFIED BY VALUES '5F712A8369686639'
      DEFAULT TABLESPACE "TEST_DATA"
      TEMPORARY TABLESPACE "TEMP"
      PROFILE "PF_TEST" ;
如果直接匯入肯定會失敗,因為預設表空間不存在,profile還沒有建立。
建議的方式就是手工來完成,這樣做的好處就是一次稽核透過,正式環境直接執行即可。
如果手工建立,這就牽扯到另外一個問題,那就是對比兩個庫中的使用者資訊,源庫中有100多個使用者,目標庫11g的環境有預設的資料庫使用者,需要排除。
可以使用如下的指令碼來過濾。
10g環境執行得到一個列表
spool 10g_user.lst
set feedback off
set pages 0
select username from dba_users;
spool off

11g環境執行得到一個列表
spool 11g_user.lst
set feedback off
set pages 0
select username from dba_users;
spool off
然後對比即可。
 sort 10g_user.lst |awk '{print $1}'> 10g_users.lst
 sort 11g_user.lst |awk '{print $1}'> 11g_users.lst
 sdiff 10g_users.lst  11g_users.lst |less

不過還是實踐中的對比和感悟,發現其實還有一個小竅門,那就是直接抽段,使用如下的語句即可快速得到一個列表。
select owner from dba_segments group by owner;
100多個使用者的資料庫環境,上面的語句會查得不到20個使用者,逐一排除都綽綽有餘。
這樣使用者列表的任務就搞定了。可以使用如下的語句得到使用者的DDL語句,然後在這個基礎上改動臨時表空間,預設表空間資訊。
select dbms_metadata.get_ddl('USER',u.username) ||';'from dba_users u WHERE USERNAME in ('OEM_MON','APP_TE_SDE','GHOSTOL','TE_GAMEUSER','JYCX','OG_SWORD','TEST','OG_GAMEUSER','PERFSTAT');
得到的語句類似下面的形式,我們簡稱為create_user.sql
   CREATE USER "TE_GAMEUSER" IDENTIFIED BY VALUES 'E62AFD5FC9ED1DD2'
      TEMPORARY TABLESPACE "TEMP"
      PROFILE "PF_TE_GAMEUSER"
這個時候還有幾個小問題,profile的資訊怎麼解決,也是生成DDL,其實也可以換個方法,那就是impdp
先在11g的庫中建立一個目錄。
CREATE DIRECTORY EXT_DIR AS '/export/home/oracle/HF';
然後匯入profile資訊即可。
$ impdp \'sys/oracle as sysdba\' dumpfile=full_exclude_tab.dmp logfile=full_ddl.log directory=EXT_DIR include=PROFILE CONTENT=METADATA_ONLY
然後執行create_user.sql語句即可。
這樣倒入資料字典的使用者資訊就準備好了。
我們停止10g的主庫,把資料檔案都釋放出來。
建立一個parfile,類似下面的形式:
tablespaces=USERS,GHOSTOL_DATA,GHOSTOL_INDEX,TEST_DATA,TEST_INDEX,PERFSTAT,STAT_POINT,TEST_MV_DATA,TEST_MV_INDEX,TEST_AUDIT_DATA,JYCX_DATA,OEM_DATA,TEST_INDEX2,TEST_INDEX3,SWDONLINE_DATA,SWDONLINE_INDX,STORELOG_DATA,STORELOG_INDX,OEM_MON_TEST,USERCENTER_DATA
datafiles=/U01/app/oracle/oradata/TEST/stat_point_01.dbf
,/U01/app/oracle/oradata/TEST/TEST_mv_data_01.dbf
,/U01/app/oracle/oradata/TEST/users01.dbf
,/U01/app/oracle/oradata/TEST/ghostol_data01.dbf
,/U01/app/oracle/oradata/TEST/ghostol_index01.dbf
。。。
然後使用如下的方式匯入即可。
imp \'sys/oracle as sysdba\' file=exp_tts_TEST.dmp transport_tablespace= y  log=imp_tts_TEST.log parfile=datafiles.par
當然也不是一帆風順,有一個小問題需要注意。那就是預設表空間USERS已存在,我們需要刪除已有的USERS表空間,重置預設表空間,比如我們建立一個表空間中轉一下。
> create tablespace def_ts datafile '/U03/app/oracle/oradata/TEST/default_ts.dbf' size 10M;
> alter database default tablespace def_ts;
> drop tablespace users including contents and datafiles cascade constraint;
因為涉及的資料檔案很多,如果有遺漏,不匹配,需要格外注意。
IMP-00017: following statement failed with ORACLE error 29347:
 "BEGIN   sys.dbms_plugts.beginImpTablespace('TS_AUDIT',10,'SYS',1,0,8192,1,2"
 "28967869732,1,2147483645,8,128,8,0,1,0,8,1434590011,1,33,68705469137,NULL,0"
 ",0,NULL,NULL); END;"
IMP-00003: ORACLE error 29347 encountered
ORA-29347: Tablespace name validation failed - failed to match tablespace 'TS_AUDIT'
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_PLUGTS", line 1876
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully
這個問題就是資料檔案資訊存在,但是匯入的tablespaces引數卻不完整,就會出現這類問題。
匯入的過程很快,可以從日誌進度看出。用不了幾分鐘。
完成之後,一個大工程總算完成了,還有補充的任務就是匯入其它的DDL資訊,這個可以impdp的形式全庫匯入即可。也就3分鐘就完事了。
impdp \'sys/oracle as sysdba\' dumpfile=full_exclude_tab.dmp logfile=full_ddl_impdp.log directory=EXT_DIR full=Y  CONTENT=METADATA_ONLY
Job "SYS"."SYS_IMPORT_FULL_01" completed with 270 error(s) at Wed Sep 28 16:33:35 2016 elapsed 0 00:03:09
看起來整個過程還是非常平滑的,後續的就是問題跟蹤和統計資訊收集了,這些都可以按照計劃來補充,可以線上完成。

然後驚訝的是11g的庫遷移完之後,停掉11g的庫,重新開啟10g的庫,竟然還可以開啟,這是不是一種更加平滑的資料庫升級,降級。
實踐總結總是會讓人有不一樣的感觸和所得,不要相信自己的記憶力,為了方便自己,受益更多的人,還是好記星不如爛筆頭。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2125723/,如需轉載,請註明出處,否則將追究法律責任。

相關文章