Oracle 11G R2利用RMAN搭建DataGuard環境

環境:

角色
機器名
操作系統
IP
備註
主庫
db1
CentOS 5.11 x86_64192.168.2.241
安裝Oracle,創建數據庫
備庫
db2
CentOS 5.11 x86_64
192.168.2.242
只安裝Oracle

準備工作:

在db1的/etc/hosts裏增加

127.0.0.1       db1

192.168.2.242    db2

在db2的/etc/hosts裏增加

127.0.0.1       db2

192.168.2.241    db1



目錄

  1. 主庫打開歸檔及強制歸檔

  2. 創建3組standby redolog

  3. 修改參數文件

  4. 修改監聽文件

  5. RMAN備份主庫

  6. 複製文件至備庫

  7. 恢復參數文件(db2)

  8. 修改備庫參數文件(db2)

  9. 準備RMAN恢復工作(db2)

  10. 生成備庫參數文件(db2)

  11. 恢復數據庫(db2)

  12. 啓動備庫(db2)



1.主庫打開歸檔及強制歸檔(db1)


檢查Oracle是否開啓歸檔

SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     6
Current log sequence           8

#可以看到Automatic archival             Disabled說明未打開歸檔

打開歸檔(打開歸檔需要先關閉Oracle,然後將數據庫啓動至mount狀態才能修改)

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database archivelog;         #打開歸檔

SQL> alter database force logging;    #打開強制歸檔也可以在數據庫open狀態下打開。此操作用於在使用nologging選項不記錄redo的請求,用於所有的操作都會記錄日誌

SQL> alter database open;                  #打開數據庫

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     6
Next log sequence to archive   8
Current log sequence           8


SQL>  alter system set archive_lag_target=1800;   //通過30分鐘時間限制,強制進行Oracle進行日誌切換並歸檔。默認爲0,不啓動。不建議該值大於2400或者小於600.(時間過長容易導致數據丟失,時間太短容易引起數據庫性能問題)



2.創建多組standby redo log,最少需要多一組,standby redo log是使用Real Time Apply的必要條件

SQL> select group#,member from v$logfile;
    GROUP#        MEMBER
--------------------------------------------------------------------------------
         3                /opt/oracle/oradata/tpy100/redo03.log
         2                /opt/oracle/oradata/tpy100/redo02.log
         1                /opt/oracle/oradata/tpy100/redo01.log

SQL> alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby04.log') size 50m;
SQL> alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby05.log') size 50m;
SQL> alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby06.log') size 50m;
SQL> alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby07.log') size 50m;

SQL> select group#,member from v$logfile;
    GROUP#        MEMBER
--------------------------------------------------------------------------------
         3                /opt/oracle/oradata/tpy100/redo03.log
         2                /opt/oracle/oradata/tpy100/redo02.log
         1                /opt/oracle/oradata/tpy100/redo01.log

         4                /opt/oracle/oradata/tpy100/standby04.log
         5                /opt/oracle/oradata/tpy100/standby05.log
         6                /opt/oracle/oradata/tpy100/standby06.log

         7                /opt/oracle/oradata/tpy100/standby07.log


3.修改參數文件

修改參數文件前,我們先進行備份

SQL> create pfile='/tmp/tpy100.pfile' from spfile;

在修改前我們需要查看下備份的參數文件,根據具體環境更改下面語句

SQL> alter system set db_unique_name=db1 scope=spfile;
SQL> alter system set log_archive_config='dg_config=(db1,db2)' scope=both;
SQL> alter system set log_archive_dest_1= 'location=/opt/oracle/flash_recovery_area/ valid_for=(all_logfiles,all_roles)  db_unique_name=db1' scope=both;
報錯:
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16053: DB_UNIQUE_NAME db1 is not in the Data Guard Configuration

可能會遇上如下報錯信息,這個時候需要重啓下數據庫

SQL> shutdown immediate;
SQL> startup

SQL> alter system set log_archive_dest_1= 'location=/opt/oracle/flash_recovery_area/ valid_for=(all_logfiles,all_roles)  db_unique_name=db1' scope=both;
SQL> alter system set log_archive_dest_2= 'service=db2 async  valid_for=(online_logfiles,primary_role)  db_unique_name=db2' scope=both;
SQL> alter system set log_archive_dest_state_1=enable scope=both;
SQL> alter system set log_archive_dest_state_2=enable scope=both;
SQL> alter system set standby_file_management=auto scope=both;
SQL> alter system set fal_server=db2 scope=both;
SQL> alter system set fal_client=db1 scope=both;
SQL> alter system set db_file_name_convert='/opt/oracle/flash_recovery_area','/opt/oracle/flash_recovery_area' scope=spfile;
SQL> alter system set log_file_name_convert='/opt/oracle/flash_recovery_area','/opt/oracle/flash_recovery_area' scope=spfile;


4.修改監聽文件

[oracle@db1 ~]$ vim /opt/oracle/product/11.2.0/network/admin/tnsnames.ora
在後面增加

db1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db1)
    )
  )

db2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db2)
    )
  )


5.RMAN備份主庫

創建備份存放目錄

[oracle@db1 ~]$ mkdir -p /opt/oracle/dbackup

執行備份

rman>run{
allocate channel c1 type disk;
backup format '/opt/oracle/dbackup/tpy100_%T_%s_%p' database;
sql 'alter system archive log current';
backup format '/opt/oracle/dbackup/archive_log_%T_%s_%p' archivelog all;
backup spfile format '/opt/oracle/dbackup/spfile_%u_%T.bak';
release channel c1;
}
rman>copy current controlfile for standby to '/opt/oracle/dbackup/standby.ctl';


6.複製文件至備庫

[oracle@db1 ~]$ scp -r /opt/oracle/dbackup/ db2:/opt/oracle

[oracle@db1 ~]$ cd $ORACLE_HOME/dbs

[oracle@db1 dbs]$ scp -r orapwtpy100 db2:$ORACLE_HOME/dbs

[oracle@db1 dbs]$ cd $ORACLE_HOME/network/admin

[oracle@db1 admin]$ scp -r listener.ora tnsnames.ora db2:$ORACLE_HOME/network/admin


7.恢復參數文件(db2)

RMAN> set dbid 2926260986

RMAN> startup nomount;

#這裏會報錯不用理會即可

RMAN> restore spfile to pfile '/tmp/tpy100.pfile' from '/opt/oracle/dbackup/spfile_04quaekm_20160219.bak';

#我們將參數文件恢復至/tmp/tpy100.pfile,因爲這個是主庫的參數文件,備庫略有不同

8.修改備庫參數文件(db2)

[oracle@db2 ~]$ vim /tmp/tpy100.pfile

#將裏面的DB1 db1變成相應的DB2 db2,將DB1變成db1
tpy100.__db_cache_size=322961408
tpy100.__java_pool_size=4194304
tpy100.__large_pool_size=4194304
tpy100.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
tpy100.__pga_aggregate_target=339738624
tpy100.__sga_target=503316480
tpy100.__shared_io_pool_size=0
tpy100.__shared_pool_size=159383552
tpy100.__streams_pool_size=0
*.audit_file_dest='/opt/oracle/admin/tpy100/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/opt/oracle/oradata/tpy100/control01.ctl','/opt/oracle/flash_recovery_area/tpy100/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_file_name_convert='/opt/oracle/flash_recovery_area','/opt/oracle/flash_recovery_area'
*.db_name='tpy100'
*.db_recovery_file_dest='/opt/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4070572032
*.db_unique_name='DB2'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=tpy100XDB)'
*.fal_client='DB2'
*.fal_server='DB1'

*.log_archive_config='dg_config=(db2,db1)'
*.log_archive_dest_1='location=/opt/oracle/flash_recovery_area/ valid_for=(all_logfiles,all_roles)  db_unique_name=db2'
*.log_archive_dest_2='service=db1 async  valid_for=(online_logfiles,primary_role)  db_unique_name=db1'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_file_name_convert='/opt/oracle/flash_recovery_area','/opt/oracle/flash_recovery_area'
*.memory_target=843055104
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'


9.準備RMAN恢復工作(db2)

創建相應的目錄,複製備庫控制文件到相應的位置

[oracle@db2 ~]$ mkdir -p /opt/oracle/admin/tpy100/adump
[oracle@db2 ~]$ mkdir -p /opt/oracle/oradata/tpy100
[oracle@db2 ~]$ mkdir -p /opt/oracle/flash_recovery_area/tpy100

[oracle@db2 ~]$ cp /opt/oracle/dbackup/standby.ctl /opt/oracle/oradata/tpy100/control01.ctl
[oracle@db2 ~]$ cp /opt/oracle/dbackup/standby.ctl /opt/oracle/flash_recovery_area/tpy100/control02.ctl

[oracle@db2 ~]$ lsnrctl start

#啓動監聽


10.生成備庫參數文件(db2)

SQL> shutdown immediate;

SQL> startup nomount pfile='/tmp/tpy100.pfile'

SQL> create spfile from pfile='/tmp/tpy100.pfile';

SQL> alter database mount;


11.恢復數據庫(db2)

RMAN> restore database;


12.啓動備庫(db2)

SQL > alter database open read only;

#在這裏啓動的時候如果出現

ERROR at line 1:
ORA-10458: standby database requires recovery
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/opt/oracle/oradata/tpy100/system01.dbf'

先使用shutdown immediate關閉後再重新啓動

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database recover managed standby database using current logfile disconnect from session;

如果出現

SQL>  alter database recover managed standby database using current logfile disconnect from session;

 alter database recover managed standby database using current logfile disconnect from session

*

ERROR at line 1:

ORA-38500: USING CURRENT LOGFILE option not available without stand

則可能是在備機沒有新建standby log

SQL> select member from v$logfile;

MEMBER

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

/opt/oracle/oradata/tpy100/redo03.log

/opt/oracle/oradata/tpy100/redo02.log

/opt/oracle/oradata/tpy100/redo01.log


增加standby log:

 alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby04.log') size 50m;

 alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby05.log') size 50m;

 alter database add standby logfile ('/opt/oracle/oradata/tpy100/standby06.log') size 50m;



如果需要重啓備庫,則需要按如下命令進行重啓

SQL> startup;

SQL> alter database recover managed standby database using current logfile disconnect from session;

注意:剛重啓完你會發現主庫的數據還沒過來,但是過段時間就過來了,在生產環境中我們需要快速處理這個問題,以便減少宕機時間。

關閉完備庫後,在主庫查看
SQL> select dest_name,status,error from v$archive_dest;
DEST_NAME                     STATUS                        ERROR
------------------------------ --------
LOG_ARCHIVE_DEST_1           VALID
LOG_ARCHIVE_DEST_2      ERROR          ORA-03113: end-of-file on   communication channel

可以看到LOG_ARCHIVE_DEST_2是錯誤的,這個是因爲沒有連接到備庫的歸檔路徑,默認情況下Dataguard會每300秒自動連接,這邊爲了快讀處理

解決辦法:在主庫執行
SQL> alter system set log_archive_dest_state_2= enable;

再查詢,如果依然是如此則需要檢查備庫的網絡及監聽




測試有如下語句:
SQL> select sequence#,applied from v$archived_log;
SQL> select process,status from v$managed_standby;
SQL> select sequence# from v$log_history;

查看當前DataGuard角色以及模式

SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

DATABASE_ROLE	 PROTECTION_MODE      PROTECTION_LEVEL
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE


DataGuard啓動關閉順序:

啓動順序:

1.啓動從庫的監聽

[oracle@db2 ~]$ lsnrctl start

2.啓動主庫的監聽

[oracle@db1 ~]$ lsnrctl start

3.啓動備庫

SQL(db2)>  startup mount;
SQL(db2)>  alter database recover managed standby database cancel;
SQL(db2)>  alter database open read only;
如果要切換回recover manage模式(啓動日誌應用或者啓動日誌實時應用,二選一)
SQL(db2)>  alter database recover managed standby database disconnect from session; 啓動日誌應用
SQL(db2)>  alter database recover managed standby database using current logfile disconnect from session; 啓動日誌實時應用

4.啓動主庫,只有在啓動備庫之後才能啓動

SQL(db1)>  startup


關閉順序:

1.關閉主庫:

SQL(db1)>  shutdown immediate;

2.關閉從庫

SQL(db2)>  alter database recover managed standby database cancel;      //停止同步
SQL(db2)>  shutdown immediate;

3.關閉主庫監聽:

[oracle@db1 ~]$ lsnrctl stop

4.關閉從庫監聽

[oracle@db2 ~]$ lsnrctl stop


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章