Oracle 同機資料庫複寫或複製經常用於提供測試或開發環境。對於產生的複製資料庫有多種方式,如使用冷備方式進行資料庫複製(需要使用nid修改db_name),熱備方式複製資料庫,rman方式複製資料庫等等。由於是同機複製,因此目標資料庫與原資料庫必須位於不同的目錄,其次,使用不用的資料庫名稱(db_name)。本文主要列出使用基於使用者管理的熱備方式來進行資料庫複製的步驟並給出示範。
1、熱備複製步驟
a、建立目標資料庫目錄
b、建立目標資料庫密碼檔案(orapwd)
c、建立目標資料庫參數檔案(pfile/spfile)
d、備份原資料庫並複本備份檔案到目標資料庫
e、啟動目標資料庫到nomount狀態並建立控制檔案
f、恢複目標資料庫(recover)
g、開啟目標資料庫(open with resetlogs)
h、校正資料庫及添加臨時資料檔案
2、示範熱備複製資料庫
-->示範環境SQL> ho cat /etc/issueEnterprise Linux Enterprise Linux Server release 5.5 (Carthage)Kernel \r on an \mSQL> select * from v$version where rownum<2;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionSQL> select name,log_mode,open_mode from v$database;NAME LOG_MODE OPEN_MODE--------------------------- ------------ --------------------SYBO3 ARCHIVELOG READ WRITE--原資料庫名 : sybo3--目標資料庫名: sybo4--原資料庫目錄:/u01/database/sybo3--目標資料庫目錄:/u01/database/sybo4--a、建立目標資料庫目錄[oracle@linux3 database]$ more sybo4.sh#!/bin/shmkdir -p /u01/databasemkdir -p /u01/database/sybo4/adumpmkdir -p /u01/database/sybo4/controlfmkdir -p /u01/database/sybo4/flash_recovery_areamkdir -p /u01/database/sybo4/oradatamkdir -p /u01/database/sybo4/redomkdir -p /u01/database/sybo4/dpdumpmkdir -p /u01/database/sybo4/pfilemkdir -p /u01/database/sybo4/db_broker[oracle@linux3 database]$ ./sybo4.sh --b、建立目標資料庫密碼檔案$ orapwd file=$ORACLE_HOME/dbs/orapwsybo4 password=oracle entries=10--c、建立目標資料庫參數檔案--從原資料庫產生目標資料庫的初始化參數檔案SQL> create pfile='/u01/oracle/db_1/dbs/initsybo4.ora' from spfile;--修改目標資料庫參數檔案$ sed -i 's/sybo3/sybo4/g' $ORACLE_HOME/dbs/initsybo4.ora$ grep sybo3 $ORACLE_HOME/dbs/initsybo4.ora -->校正是否還存在sybo3相關字元--最終的目標資料庫參數檔案$ more $ORACLE_HOME/dbs/initsybo4.orasybo4.__db_cache_size=117440512sybo4.__java_pool_size=4194304sybo4.__large_pool_size=4194304sybo4.__oracle_base='/u01/oracle'#ORACLE_BASE set from environmentsybo4.__pga_aggregate_target=150994944sybo4.__sga_target=226492416sybo4.__shared_io_pool_size=0sybo4.__shared_pool_size=92274688sybo4.__streams_pool_size=0*.audit_file_dest='/u01/database/sybo4/adump/'*.audit_trail='db'*.compatible='11.2.0.0.0'*.control_files='/u01/database/sybo4/controlf/control01.ctl','/u01/database/sybo4/controlf/control02.ctl'*.db_block_size=8192*.db_domain='orasrv.com'*.db_name='sybo4'*.db_recovery_file_dest='/u01/database/sybo4/flash_recovery_area/'*.db_recovery_file_dest_size=4039114752*.dg_broker_config_file1='/u01/database/sybo4/db_broker/dr1sybo4.dat'*.dg_broker_config_file2='/u01/database/sybo4/db_broker/dr2sybo4.dat'*.dg_broker_start=FALSE*.diagnostic_dest='/u01/database/sybo4'*.log_archive_dest_1=''*.memory_target=374341632*.open_cursors=300*.processes=150*.remote_login_passwordfile='EXCLUSIVE'*.undo_tablespace='UNDOTBS1'--d、備份原資料庫並複本備份檔案到目標資料庫--建立一個暫存資料表t使用者驗證複製是否成功SQL> create table t(name varchar2(10),action varchar2(20));SQL> insert into t select 'Robinson','Transfer DB' from dual;SQL> commit;SQL> alter system archive log current;--準備目標資料庫建立控制檔案指令碼,此trace file位於參數user_dump_dest目錄下SQL> alter database backup controlfile to trace resetlogs;--備份原資料庫,如果資料庫檔案較多,使用熱備指令碼來完成SQL> alter database begin backup;--複製資料庫檔案到目標資料庫目錄SQL> host cp /u01/database/sybo3/oradata/* /u01/database/sybo4/oradataSQL> alter database end backup;--e、啟動目標資料庫到nomount狀態並建立控制檔案$ export ORACLE_SID=sybo4$ sqlplus / as sysdbaSQL> startup nomount pfile=/u01/oracle/db_1/dbs/initsybo4.ora;ORACLE instance started.SQL> get sybo4ctl.sql 1 CREATE CONTROLFILE SET DATABASE "sybo4" RESETLOGS ARCHIVELOG 2 MAXLOGFILES 16 3 MAXLOGMEMBERS 3 4 MAXDATAFILES 100 5 MAXINSTANCES 8 6 MAXLOGHISTORY 292 7 LOGFILE 8 GROUP 1 '/u01/database/sybo4/redo/redo01.log' SIZE 50M BLOCKSIZE 512, 9 GROUP 2 '/u01/database/sybo4/redo/redo02.log' SIZE 50M BLOCKSIZE 512, 10 GROUP 3 '/u01/database/sybo4/redo/redo03.log' SIZE 50M BLOCKSIZE 512 11 DATAFILE 12 '/u01/database/sybo4/oradata/system01.dbf', 13 '/u01/database/sybo4/oradata/sysaux01.dbf', 14 '/u01/database/sybo4/oradata/undotbs01.dbf', 15 '/u01/database/sybo4/oradata/users01.dbf', 16 '/u01/database/sybo4/oradata/example01.dbf' 17 CHARACTER SET AL32UTF8 18* ;SQL> @sybo4ctl.sqlControl file created.SQL> alter database mount; -->注意建立控制檔案之後,資料庫已經被mount,如下我們收到了錯誤提示alter database mount*ERROR at line 1:ORA-01100: database already mounted--上面我們修改了控制檔案指令碼,使用了set database以及resetlogs方式來建立資料庫--f、恢複目標資料庫SQL> set logsource '/u01/database/sybo3/flash_recovery_area/SYBO3/archivelog/2013_07_24';SQL> recover database using backup controlfile until cancel;ORA-00279: change 847086 generated at 07/24/2013 14:42:06 needed for thread 1ORA-00289: suggestion :/u01/database/sybo3/flash_recovery_area/SYBO3/archivelog/2013_07_24/o1_mf_1_7_821617241.dbfORA-00280: change 847086 for thread 1 is in sequence #7Specify log: {<RET>=suggested | filename | AUTO | CANCEL}/u01/database/sybo3/redo/redo01.logLog applied.Media recovery complete.--g、開啟目標資料庫SQL> alter database open resetlogs;Database altered.--h、校正資料庫及添加臨時資料檔案SQL> select * from t;NAME ACTION---------- --------------------Robinson Transfer DBSQL> select name from v$datafile;NAME------------------------------------------------------------/u01/database/sybo4/oradata/system01.dbf/u01/database/sybo4/oradata/sysaux01.dbf/u01/database/sybo4/oradata/undotbs01.dbf/u01/database/sybo4/oradata/users01.dbf/u01/database/sybo4/oradata/example01.dbfSQL> col member format a60SQL> select member from v$logfile;MEMBER------------------------------------------------------------/u01/database/sybo4/redo/redo03.log/u01/database/sybo4/redo/redo02.log/u01/database/sybo4/redo/redo01.logSQL> select name from v$controlfile;NAME------------------------------------------------------------/u01/database/sybo4/controlf/control01.ctl/u01/database/sybo4/controlf/control02.ctl--Author : Robinson--Blog : http://blog.csdn.net/robinson_0612SQL> select * from v$tempfile;no rows selectedSQL> select property_name,property_value from database_properties where property_name like '%DEFAULT%';PROPERTY_NAME PROPERTY_VALUE------------------------------ ------------------------------------------------------------DEFAULT_TEMP_TABLESPACE TEMPDEFAULT_PERMANENT_TABLESPACE USERSDEFAULT_EDITION ORA$BASEDEFAULT_TBS_TYPE SMALLFILESQL> select tablespace_name from dba_tablespaces where tablespace_name='TEMP';TABLESPACE_NAME------------------------------TEMPSQL> alter tablespace temp add tempfile '/u01/database/sybo4/oradata/tempfile.dbf' size 50m autoextend on;--建立伺服器參數檔案,之後建議一致性關閉資料庫,備份資料庫,添加資料庫到/etc/oratab,配置監聽器等SQL> create spfile from pfile;
3、小結
a、對於基於使用者管理熱備資料庫的複製有點類似於建立一個新的資料庫,因為我們需要準備建立整個資料庫所需的全部過程
b、注意理解Oracle資料庫啟動步驟(nomount,mount,open)及每一步驟所需要的相關檔案與在不同階段所完成的動作,見Oracle資料庫執行個體啟動關閉過程
c、注意理解幾類不同檔案的作用,即:Oracle 參數檔案,Oracle 密碼檔案,Oracle 控制檔案以及最終開啟的資料庫檔案
d、對於資料庫熱備複製到目標資料庫目錄後等同於還原作業,也就是相當於 rman 的 restore 操作
e、資料庫恢複操作使用了using backup controlfile方式,因為控制檔案與資料檔案不一致。可參考,理解 using backup controlfile
f、由于歸檔日誌位於原資料庫歸檔位置,因此在恢複期間使用了set logsource子句用於指定歸檔日誌所在的位置
g、建立控制檔案時,由於是一個新的db,因此必須使用resetlog方式,否則收到ORA-01223: RESETLOGS must be specified to set a new database name
相關參考
Oracle 冷備份
Oracle 熱備份
Oracle 備份恢複概念
Oracle 執行個體恢複
Oracle 基於使用者管理恢複的處理
SYSTEM 資料表空間管理及備份恢複
SYSAUX資料表空間管理及恢複
Oracle 基於備份控制檔案的恢複(unsing backup controlfile)
RMAN 概述及其體繫結構
RMAN 配置、監控與管理
RMAN 備份詳解
RMAN 還原與恢複
RMAN catalog 的建立和使用
基於catalog 建立RMAN儲存指令碼
基於catalog 的RMAN 備份與恢複
RMAN 備份路徑困惑
自訂 RMAN 顯示的日期時間格式
唯讀資料表空間的備份與恢複
Oracle 基於使用者管理的不完全恢複
理解 using backup controlfile
使用RMAN實現異機備份恢複(WIN平台)
使用RMAN遷移檔案系統資料庫到ASM
基於Linux下 Oracle 備份策略(RMAN)
Linux 下RMAN備份shell指令碼
使用RMAN遷移資料庫到異機
RMAN 提示符下執行SQL語句
Oracle 基於 RMAN 的不完全恢複(incomplete recovery by RMAN)