2012年12月13日

完整複製和還原 Oracle 的 Instance 資料

要將 Oracle 資料庫要複製到新的機器,或是將正式區的資料複製到測試區,
當然可以用 rman 的備份還原方式,或是用 impdp/expdp、imp/exp …等方式。
好處就是資料會重新整理過,資料就會連續性的匯入,效能會好一點。

不過也有更快速的方式,就是直接將 dbf 檔案複製過去,然後再重建 control file ,
好處就是速度快,也不用再重新設定,而且可以修改 instance 名稱。
但是在異機做還原時,只能限定相同的 Oracle 版本和版次才行。

以下範例就是將 TOPPROD 完整的資料複製到 TOPTEST 。

1. 依照  topprod 的 control file 的參數產生 trace 檔案:
    切換到 topprod: export ORACLE_SID=topprod
    使用 sys 使用登入  sqlplus sys/sys_dsc as sysdba
    執行:SQL> alter database backup controlfile to trace;
     再來就是看檔案產生的位置:
select c.value || '/' || d.instance_name || '_ora_' || to_char(a.spid,'fm99999') || '.trc' from v$process a, v$session b, v$parameter c, v$instance d where a.addr = b.paddr and b.audsid = userenv('sessionid') and c.name = 'user_dump_dest';

出現:/u2/oracle/diag/rdbms/topprod/topprod/trace/topprod_ora_28140.trc

2. 停止 topprod 資料庫,並複製檔案到 toptest
    關閉資料庫:shutdown immediate
    複製檔案:rsync /u2/oracle/oradata/topprod/* /u2/oracle/oradata/toptest
    先刪除 control01.ctl、control02.ctl …檔案,之後會再重建。

3.  建立新的 inittoptest.ora 參數檔案 (檔名必需是 init[資料庫名].ora ,且必須放在 dbs 目錄)
     此作業是要建立一個新的 Instance ,如果已經有建立就可以不用 3、4、5 的步驟。
     進入到 sqlplus 並執行:
     create pfile='/u2/oracle/product/11.2.0/dbhome_1/dbs/inittoptest.ora' from spfile; 

4. 修改 initoptest.ora 檔案,將所有的  topprod 都改為 toptest。

5. 切換到  toptest 資料庫,建立 spfile 資料,並啟動資料庫。
    到 toptest 資料庫:export ORACLE_SID=toptest
    進入 sqlplus 。
    執行:SQL> create spfile from pfile;
    使用 nomount 方式啟動資料庫:startup nomount 
    查看 instance name :select instance_name from v$instance;

6. 複製 trace 檔案並修改為 sql 指令,再執行。
    修改 trc 檔:vi /u2/oracle/diag/rdbms/topprod/topprod/trace/topprod_ora_28140.trc
    修改 SET #1 的部份,並REUSE 改為SET,其餘全部刪除,只剩下如下所示:
 STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "TOPTEST" NORESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u2/oracle/oradata/toptest/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u2/oracle/oradata/toptest/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u2/oracle/oradata/toptest/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u2/oracle/oradata/toptest/system01.dbf',
  '/u2/oracle/oradata/toptest/sysaux01.dbf',
  '/u2/oracle/oradata/toptest/undotbs01.dbf',
  '/u2/oracle/oradata/toptest/users01.dbf',
  '/u2/oracle/oradata/toptest/dbs1-01.dbf',
  '/u2/oracle/oradata/toptest/dbs1-02.dbf',
  '/u2/oracle/oradata/toptest/temptabs.dbf',
  '/u2/oracle/oradata/toptest/rptdbs1-01.dbf'
CHARACTER SET AL32UTF8
   執行 trace 的 SQL 檔就會產生 control file: SQL>@/u2/oracle/trace.sql

7. 開啟資料庫。
    執行:SQL> alter database open resetlogs;  

    如果執行失敗的話,出現ORA-01194: file 1 needs more recovery to be consistent,
    就是日誌的問題,解決方式:
    執行: recover database using backup controlfile until cancel;
    出現 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
    再輸入:/u2/oracle/oradata/toptest/system01.dbf


8. 再把 temporary 的 tablespace 重建,先建一個  TEMP1 然後再移轉再刪除即可。
    先建立:CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE
  '/u2/oracle/oradata/toptest/temp02.dbf' SIZE 20M AUTOEXTEND ON NEXT 640K MAXSIZE   UNLIMITED
   TABLESPACE GROUP ''
   EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

  再切換為預設:alter database default temporary tablespace temp2;
  再刪除:DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

9. 完成,查看 datafile 。
    執行:select file_name,file_id,tablespace_name,status from dba_data_files;


10. 如果是複製到新的機器上或是新的 Instance 名稱,就要建立 toptest 資料庫的密碼檔案。     
      執行:orapwd file=orapwtopptest password=oracle entries=30

11. 新的機器上就要再設定監聽 listener.ora 和連線 tnsnames.ora的檔案,
      然後再重新啟動 Listener: lsnrctl reload listener 。

2 則留言:

  1. 張大哥您好:
    很開心能夠看到您這篇文章,因為我遇到了資料庫整台掛掉,目前是參考您的文章做測試,但是一直不是很順利,由於我要復原的那個dbf已經沒辦法再啟動了,一開始還遇到sid(service name)超過八個字元無法轉換,後來更改了長度還是遇到非常多的問題,不過還是很謝謝您的方法,給我一個方向,再多試試看。真的感謝您

    回覆刪除
    回覆
    1. 你好,如果是相同的 instance name ,只要安裝好 OS 後建立新的 instance 例如是 topprod ,然後再把 dbf 檔案 copy 到原本的路徑,這樣就可以 mount 起來資料庫。但是必須要 oracle 的版本和版次都相同。
      要看掛掉是什麼情況,如果是硬體就找一台主機請鼎新安裝好,再把 dbf 和 tiptop 程式 copy 過去就可以用了,如果是資料庫開不起來,大多都是監聽器的問題,把 log 清掉再啟動試試。

      刪除