使用RMAN Duplicate方法搭建異名資料庫實驗

realkid4發表於2014-03-05

 

Oracle RMAN工具工作環境一共有三個資料庫源物件:targetcatalogauxiliary

target就是進行備份操作的源資料庫,我們進行備份還原的物件都是在這個庫上進行。預設情況下,備份集合資訊是儲存在controlfilecatalog是一個可選資料庫,備份後設資料可以單獨放在catalog資料庫中儲存。auxiliary是作為輔助操作進行的,一些與備份還原相關的操作,都可以利用auxiliary上完成。

本篇從10g資料庫入手,實驗在相同host上構建不同名clone資料庫注意:在其他主機上進行clone操作完全相同。

 

1、環境介紹

 

我們選擇Oracle 10gR2進行測試,Linux環境主機。

 

SQL> select * from v$version;

BANNER

---------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for Linux: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 – Production

 

2Target資料庫備份

 

當前資料庫沒有選擇catalog,採用controlfile進行備份檔案。資料庫例項名稱為oratest,作為資料來源。此時備份資訊如下:

 

RMAN> list backup;

 

List of Backup Sets

===================

BS Key  Type LV Size       Device Type Elapsed Time Completion Time

------- ---- -- ---------- ----------- ------------ ---------------

13      Full    595.90M    DISK        00:00:30     05-MAR-14     

        BP Key: 13   Status: AVAILABLE  Compressed: NO  Tag: TAG20140305T111526

        Piece Name: /u01/app/oracle/flash_recovery_area/ORATEST/backupset/2014_03_05/o1_mf_nnndf_TAG20140305T111526_9kf5pgf2_.bkp

 

(篇幅原因,有省略……

BS Key  Size       Device Type Elapsed Time Completion Time

------- ---------- ----------- ------------ ---------------

15      15.07M     DISK        00:00:02     05-MAR-14     

        BP Key: 15   Status: AVAILABLE  Compressed: NO  Tag: TAG20140305T112405

        Piece Name: /u01/app/oracle/flash_recovery_area/ORATEST/backupset/2014_03_05/o1_mf_annnn_TAG20140305T112405_9kf66ppv_.bkp

 

  List of Archived Logs in backup set 15

  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time

  ---- ------- ---------- --------- ---------- ---------

  1    2       576174     04-MAR-14 578638     05-MAR-14

  1    3       578638     05-MAR-14 578643     05-MAR-14

  1    4       578643     05-MAR-14 578677     05-MAR-14

 

BS Key  Type LV Size       Device Type Elapsed Time Completion Time

------- ---- -- ---------- ----------- ------------ ---------------

16      Full    6.80M      DISK        00:00:01     05-MAR-14     

        BP Key: 16   Status: AVAILABLE  Compressed: NO  Tag: TAG20140305T112407

        Piece Name: /u01/app/oracle/flash_recovery_area/ORATEST/autobackup/2014_03_05/o1_mf_s_841404247_9kf66qvs_.bkp

  Control File Included: Ckp SCN: 578684       Ckp time: 05-MAR-14

  SPFILE Included: Modification time: 05-MAR-14

 

注意:在備份過程中,一定要有一個單獨的backup archivelog all的過程,將歸檔日誌作為單獨備份集合儲存。如果不進行這個操作,在進行duplicate過程中會出現錯誤。

 

RMAN> backup archivelog all;

 

Starting backup at 05-MAR-14

(篇幅原因,有省略……)

Starting Control File and SPFILE Autobackup at 05-MAR-14

piece handle=/u01/app/oracle/flash_recovery_area/ORATEST/autobackup/2014_03_05/o1_mf_s_841404247_9kf66qvs_.bkp comment=NONE

Finished Control File and SPFILE Autobackup at 05-MAR-14

 

在進行duplicate操作過程中,target資料庫最好維持mount狀態!

 

3、網路配置

 

無論是在本機還是異地進行duplicate構建,保證targetauxiliary互聯是重要的。所以在TNS連線方面,要進行配置過程。

Oracle Net配置三個檔案,listener.oratnsnames.orasqlnet.ora。起碼要保證tnsnames.ora的互聯配置。

 

[oracle@SimpleLinuxUp admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

ORATEST = --target

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = oratest)

    )

  )

 

ORAAUX = --目標auxiliary

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = oraaux)

    )

  )

 

一些文獻(包括官方MOS文章)都推薦額外進行listener.ora的配置,將兩個服務作為靜態註冊註冊進監聽程式listener這樣做的基礎是這樣的:在進行duplicate過程中,如果我們是從target端進行操作,就需要透過auxiliary端的監聽器訪問auxiliary。而此時auxiliary只有一個例項物件,雖然可以動態註冊,但是註冊狀態是blocked

 

Service "oraaux" has 1 instance(s).

  Instance "oraaux", status BLOCKED, has 1 handler(s) for this service...

 

9i11gBlocked狀態是不允許進行遠端連入的。當我們試圖透過監聽器連入的時候,是會報錯。

 

MAN> connect auxiliary sys/oracle@oraaux

 

RMAN-00571: =============================

RMAN-00569: ========= ERROR MESSAGE STACK FOLLOWS =====

RMAN-00571: ============================

RMAN-04006: error from auxiliary database: ORA-12528: TNS:listener: all appropriate instances are blocking new connections

 

解決方法有兩個:一個就是放棄使用動態註冊方法,就需要手工修改listener.ora檔案。也就是為什麼很多網路同仁文章中推薦這個步驟。另一種方法就是從auxiliary端進行duplicate操作,這樣使用/匿名登入是沒有問題的。第二種方法的缺點是一些時候需要將備份集合傳遞到auxiliary所在伺服器目錄中。

筆者本次就選取第二種方法進行實驗。

 

4、引數檔案設定和路徑建立

 

引數檔案是保證資料庫啟動到nomount狀態和例項建立重要物件。我們進行auxiliary過程,要“模擬”出資料庫例項。這個時候,可以選擇使用target的引數檔案模板進行修改。

 

SQL> create pfile from spfile; --oratest上進行

File created.

 

$ORACLE_HOME/dbs中,定位到initoratest.ora文字引數檔案,修改其中內容,儲存為initoraaux.ora。注意下面標紅部分:

 

db_name = ORAAUX

oraaux.__db_cache_size=159383552

oraaux.__java_pool_size=4194304

oraaux.__large_pool_size=4194304

oraaux.__shared_pool_size=75497472

oraaux.__streams_pool_size=0

oraaux.db_file_name_convert = ('ORATEST','ORAAUX')

oraaux.log_file_name_convert = ('ORATEST','ORAAUX')

*.audit_file_dest='/u01/app/oracle/admin/oraaux/adump'

*.background_dump_dest='/u01/app/oracle/admin/oraaux/bdump'

*.compatible='10.2.0.1.0'

*.core_dump_dest='/u01/app/oracle/admin/oraaux/cdump'

*.db_block_size=8192

*.db_create_file_dest='/u01/app/oracle/oradata'

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=10485760000

*.dispatchers='(PROTOCOL=TCP) (SERVICE=oraauxXDB)'

*.job_queue_processes=10

*.open_cursors=300

*.pga_aggregate_target=81788928

*.processes=400

*.remote_login_passwordfile='EXCLUSIVE'

*.sessions=445

*.sga_target=247463936

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='/u01/app/oracle/admin/oraaux/udump'

 

注意三個問題:一個是目錄,筆者依然是遵照OFA的建立原則。所以將原來的oratest的目錄物件修改為oraaux。二是對於db_file_convertlog_file_convert的設定。在Oracle中,資料庫對於檔名稱的理解是包括目錄結構的,所以在這個過程中需要設定對映規則。最後是control_files引數從引數檔案中刪去,主要是考慮希望使用OMF自定義名稱的方式(這樣的策略在後面也引起一些問題)。

建立目錄,使用root賬號將需要的各種路徑建立好。

 

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/admin/oraaux/adump

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/admin/oraaux/bdump

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/oradata/ORAAUX/controlfile

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/admin/oraaux/cdump

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/flash_recovery_area/ORAAUX/controlfile

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/admin/oraaux/cdump

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/admin/oraaux/udump

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/oradata/ORAAUX/onlinelog

[root@SimpleLinuxUp /]# mkdir -p /u01/app/oracle/flash_recovery_area/ORATEST/onlinelog

[root@SimpleLinuxUp /]# chown -R oracle:oinstall /u01

 

5、密碼檔案建立

 

密碼檔案是用於在不適用作業系統層面驗證的時候,或者資料庫不存在(只有例項啟動nomount)狀態下,進行系統登入驗證的工具。

我們需要手工建立oratestoraaux兩個例項的密碼檔案。

 

[oracle@SimpleLinuxUp dbs]$ orapwd file=orapworatest password=oracle force=y

[oracle@SimpleLinuxUp dbs]$ orapwd file=orapworaaux password=oracle force=y

 

[oracle@SimpleLinuxUp admin]$ cd $ORACLE_HOME/dbs

[oracle@SimpleLinuxUp dbs]$ ls -l | grep orapw

-rw-r----- 1 oracle oinstall    1536 Mar  5 10:23 orapworaaux

-rw-r----- 1 oracle oinstall    1536 Mar  5 10:13 orapworatest

 

注意:對於密碼檔案的建立和定位,Oracle是有自己的規則的。這個和引數檔案選擇順序很像。查詢目錄都是在$ORACLE_HOME/dbs目錄,如果是linux環境,檔案格式是orapw,注意是小寫orapw,而且這個SID是和系統定義環境變數$ORACLE_SID要求完全相同!如果是Windows環境下,命名為ORAPW。確認密碼檔案是否成功設定的最好方法就是手工grant sysdba to sys,如果報錯就證明建立過程有問題。

 

6、啟動auxiliary例項

 

使用引數檔案initoraaux.oraORACLE_SID,可以將auxiliary資料庫啟動到nomount狀態。

 

[oracle@SimpleLinuxUp dbs]$ export ORACLE_SID=oraaux

[oracle@SimpleLinuxUp dbs]$ sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 5 09:04:10 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup nomount pfile=initoraaux.ora

ORACLE instance started.

 

Total System Global Area  247463936 bytes

Fixed Size                  1218772 bytes

Variable Size              83887916 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

 

[oracle@SimpleLinuxUp dbs]$ ps -ef | grep pmon

oracle    2591     1  0 08:59 ?        00:00:00 ora_pmon_oratest

oracle    2642     1  0 09:04 ?        00:00:00 ora_pmon_oraaux

oracle    2670  2549  0 09:05 pts/0    00:00:00 grep pmon

 

此時,動態註冊監聽器狀態如下。

 

[oracle@SimpleLinuxUp dbs]$ lsnrctl status

 

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 05-MAR-2014 09:58:29

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date                05-MAR-2014 09:07:36

Uptime                    0 days 0 hr. 50 min. 53 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Log File         /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SimpleLinuxUp)(PORT=1521)))

Services Summary...

Service "ORAAUX_XPT" has 1 instance(s).

  Instance "oraaux", status BLOCKED, has 1 handler(s) for this service...

Service "oraaux" has 1 instance(s).

  Instance "oraaux", status BLOCKED, has 1 handler(s) for this service...

Service "oratest" has 1 instance(s).

  Instance "oratest", status READY, has 1 handler(s) for this service...

Service "oratest_XPT" has 1 instance(s).

  Instance "oratest", status READY, has 1 handler(s) for this service...

The command completed successfully

 

兩個例項都可以被監聽程式識別。

 

7RMAN duplicate過程

 

下面進行最關鍵的duplicate過程,注意,我們是從auxiliary入手處理。

 

[oracle@SimpleLinuxUp dbs]$ export ORACLE_SID=oraaux

[oracle@SimpleLinuxUp dbs]$ rman nocatalog

 

Recovery Manager: Release 10.2.0.1.0 - Production on Wed Mar 5 10:27:49 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

RMAN> connect target sys/oracle@oratest

connected to target database: ORATEST (DBID=3370560176)

using target database control file instead of recovery catalog

 

連線auxiliary資料庫。

 

RMAN> connect auxiliary /        

connected to auxiliary database: ORAAUX (not mounted)

 

啟動duplicate過程。

 

RMAN> duplicate target database to oraaux;

 

Starting Duplicate Db at 05-MAR-14

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: sid=431 devtype=DISK

 

contents of Memory Script:

{

   set until scn  578677;

   set newname for datafile  1 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_system_9k8m458j_.dbf";

   set newname for datafile  2 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_undotbs1_9k8m45bw_.dbf";

   set newname for datafile  3 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_sysaux_9k8m458q_.dbf";

   set newname for datafile  4 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_users_9k8m45c1_.dbf";

   set newname for datafile  5 to  "/u01/app/oracle/oradata/ORAAUX/datafile/o1_mf_example_9k8m458x_.dbf";

   restore

   check readonly

   clone database

   ;

}

executing Memory Script

(篇幅原因,有省略……

contents of Memory Script:

{

   Alter clone database open resetlogs;

}

executing Memory Script

 

database opened

Finished Duplicate Db at 05-MAR-14

 

如果可以順利完成指令碼過程,就可以實現啟動資料庫oraaux

 

[oracle@SimpleLinuxUp ~]$ sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 5 11:55:44 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected.

SQL> select status from v$instance;

 

STATUS

------------

OPEN

 

注意,此時例項還是使用pfile啟動,沒有spfile

 

SQL> show parameter spfile;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string

SQL> create spfile from pfile;

File created.

 

重新啟動,如果沒有問題的話,就可以保證完成過程。

 

SQL> startup force;

ORACLE instance started.

 

Total System Global Area  247463936 bytes

Fixed Size                  1218772 bytes

Variable Size              83887916 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

ORA-00205: error in identifying control file, check alert log for more info

 

SQL> select status from v$instance;

 

STATUS

------------

STARTED

 

故障出現!

 

8、丟失的控制檔案

 

從過程看,是啟動在nomount之後資料庫報錯。在行為上,10g11g有一些差異。如果是10g版本,Oracle會停止在錯誤發生之前的狀態。在這個案例中,我們發現資料庫停留在nomount狀態。而11g環境中,系統多半會直接中斷。

位置提示上,是控制檔案出了問題。先看alert_log資訊。

 

Wed Mar  5 11:59:41 2014

ALTER DATABASE   MOUNT

Wed Mar  5 11:59:41 2014

ORA-00202: control file: '/u01/app/oracle/product/10.2.0/db_1/dbs/cntrloraaux.dbf'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Wed Mar  5 11:59:44 2014

ORA-205 signalled during: ALTER DATABASE   MOUNT...

 

找不到檔案!我們看系統給出的引數檔案是什麼內容。

 

SQL> show parameter control;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time        integer     7

control_files                        string      /u01/app/oracle/product/10.2.0                                                 /db_1/dbs/cntrloraaux.dbf

 

這個目錄顯然是給定的非OFA策略路徑。到目錄中,我們也找不到檔案。

 

[oracle@SimpleLinuxUp dbs]$ ls -l | grep cntrl

[oracle@SimpleLinuxUp dbs]$

 

比較麻煩的情況,資料庫都在,控制檔案啟動前執行良好。但是資訊沒有寫入到引數檔案control_files中。如何解決?

冷靜想來,我們在initoraaux.ora中,是沒有定義control_files引數的。在建立auxiliary資料庫的過程中,我們是看得到create control file指令碼的,說明在這個過程中是有控制檔案生成。如果沒有定義control_files引數,Oracle應該是使用OMF策略,在資料庫目錄和Recovery Area中建立兩個物件。

在關閉資料庫前,我們使用了create spfile from pfile的方法,這個過程中,Oracle可能依據的是一箇舊的原則(OFA之前),設定了$ORACLE_HOME/dbs目錄中的一個不存在的控制檔案。再次啟動,失敗報錯。

當務之急是想辦法解決,這個思路下,兩個OFA目錄中應該是有控制檔案物件。經過查詢,也確定正確。

 

--oradata目錄

[oracle@SimpleLinuxUp dbs]$ cd /u01/app/oracle/oradata/ORAAUX/controlfile/

[oracle@SimpleLinuxUp controlfile]$ ls -l

-rw-r----- 1 oracle oinstall 7389184 Mar  5 11:59 o1_mf_9kf80kq1_.ctl

-rw-r--r-- 1 oracle oinstall     742 Mar  5 10:54 sqlnet.log

 

--flashback Recovery目錄

[oracle@SimpleLinuxUp controlfile]$ cd /u01/app/oracle/flash_recovery_area/

[oracle@SimpleLinuxUp flash_recovery_area]$ ls

ORAAUX  ORATEST

[oracle@SimpleLinuxUp flash_recovery_area]$ cd ORAAUX/

[oracle@SimpleLinuxUp ORAAUX]$ ls -l

total 12

drwxr-x--- 3 oracle oinstall 4096 Mar  5 11:54 archivelog

drwxr-xr-x 2 oracle oinstall 4096 Mar  5 11:54 controlfile

drwxr-x--- 2 oracle oinstall 4096 Mar  5 11:55 onlinelog

[oracle@SimpleLinuxUp ORAAUX]$ cd controlfile/

[oracle@SimpleLinuxUp controlfile]$ ls -l

-rw-r----- 1 oracle oinstall 7389184 Mar  5 11:59 o1_mf_9kf80kwj_.ctl

 

目錄中的確存在控制檔案物件,而且更可貴的是,時間戳相同,都是11:59。可以相信是相同的映象。而且在OFA格式下,是不會存在混淆的。

下面需要做的,就是將spfile中的control_files引數修改掉。

 

SQL> alter system set control_files='/u01/app/oracle/oradata/ORAAUX/controlfile/o1_mf_9kf80kq1_.ctl','/u01/app/oracle/flash_recovery_area/ORAAUX/controlfile/o1_mf_9kf80kwj_.ctl' scope=spfile;

System altered.

 

重新啟動資料庫。

 

SQL> shutdown immediate;

ORA-01507: database not mounted

 

ORACLE instance shut down.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  247463936 bytes

Fixed Size                  1218772 bytes

Variable Size              83887916 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

 

SQL> show parameter control_files

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_files                        string      /u01/app/oracle/oradata/ORAAUX                                              /controlfile/o1_mf_9kf80kq1_.c                                                 tl, /u01/app/oracle/flash_reco                                                 very_area/ORAAUX/controlfile/o                                                 1_mf_9kf80kwj_.ctl

 

修改成功!至此duplicate資料庫建立成功,與oratest完全相同。

這個問題,可能還有不同的處理策略。首先,我們可以在控制檔案建立上放棄OMF,就在initoraaux.ora中制定一個簡單名稱的控制檔案。這樣就可以避免OMFduplicate過程中報錯。第二種方法是在我們成功啟動open資料庫中,不使用create spfile from pfile,而是從memory中建立spfile。在11g中,支援從執行的資料庫memory中將引數轉化為spfile。如果有這個策略,也許就不會出現控制檔案引數問題了。

 

--10g

SQL> create spfile from memory;

create spfile from memory

                   *

ERROR at line 1:

ORA-00922: missing or invalid option

 

--11g

SQL> create spfile='/tmp/res.ora' from memory;

File created.

 

最後,這個問題的根源也許和Oracle有一定關係。duplicate結束之後,是否需要將正確的OMF檔案路徑設定在control_files引數,而不是一個過去值。很大可能也是一個Bug

 

9、結論

 

複製資料庫進行測試,是我們經常需要面對的需求。實現的方法有很多,簡單的有exp/impexpdp/impdp),複雜的有DG standby等。使用duplicate方法,是一種比較簡單的方法,值得我們學習掌握。


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

相關文章