當然可以用 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 。
張大哥您好:
回覆刪除很開心能夠看到您這篇文章,因為我遇到了資料庫整台掛掉,目前是參考您的文章做測試,但是一直不是很順利,由於我要復原的那個dbf已經沒辦法再啟動了,一開始還遇到sid(service name)超過八個字元無法轉換,後來更改了長度還是遇到非常多的問題,不過還是很謝謝您的方法,給我一個方向,再多試試看。真的感謝您
你好,如果是相同的 instance name ,只要安裝好 OS 後建立新的 instance 例如是 topprod ,然後再把 dbf 檔案 copy 到原本的路徑,這樣就可以 mount 起來資料庫。但是必須要 oracle 的版本和版次都相同。
刪除要看掛掉是什麼情況,如果是硬體就找一台主機請鼎新安裝好,再把 dbf 和 tiptop 程式 copy 過去就可以用了,如果是資料庫開不起來,大多都是監聽器的問題,把 log 清掉再啟動試試。