程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle Physical Standby

Oracle Physical Standby

編輯:Oracle數據庫基礎

我們公司的Oracle DB從7345到9205都有,在很早以前,我就把它的standby給搞定了,不過用的是自己寫的代碼。Standby架構弄好以後,主要是用它恢復正式庫,每個月都用這個standby機制作2次正式數據庫的恢復演練,感覺運行了2年多了,也是瞞順的,缺點用定時執行apply的程序去apply archive,時機有時掌握不夠好,並且8i的版本的好像不能read only,用戶需要恢復數據都是open resetlogs,然後再把standby更新一次。最近,看了一下網上的文章,從815往後都可以使用oracle原版的standby,Main產生的archive都能夠及時地apply到standby上面去。9ir2後的版本還有邏輯standby,關鍵有一點,聽說9i的standby還可做到Main DB掛了,他的current-redo-log裡面東東也不會丟失,這難道是傳說中的 NON_DATA_LOSE ,看起來的確很誘人。今天先來做做Oracle的物理standby,記錄如下:

Environment:
Oracle:9.0.1.1
OS:Solaris 5.10
Main: 192.1.1.44 Standby 192.1.1.45
Prepared by:Compard

I. Action in Main:
1.create user group dba and member oracle, create a home folder for Oracle.
2.copy a .profile template and update it to match the environment.
3.update /etc/system and reboot.
4.use Oracle account to login to 192.1.1.44 with X tools and create the main database.
5.After step 4 ,check the DB if it''s in archivelog mode.
6.create a new control file named standbycontrolfile to for standbyDB,SQL as the following:



alter database create standby controlfile as ''$Oracle_HOME/dbs/standbycontrol.ctl''

7.Shutdown DB,stop listener.

II. Action in Standby:
1.create user and group same as main db.
2.copy all of the file from Main db, include home folder for oracle and data files/standbycontrol file /Redo Files in Main DB except control files.Copy ''$Oracle_HOME/dbs/standbycontrol.ctl'' in Main DB to standby

db, renames it to match the parameter control_files in spfile/pfile.

III. Action in Main:
1.Open database and listener.
2.edit file $Oracle_HOME/network/admin/tnsnames.ora, add a node names standby_db,link to standby DB.
3.check the archive log location, it must exist at lest 1 valid location,if standby at lest 2 valid location, one tolocally, the other to standby, so please check the following parameters, for example:



log_archive_format=''arc%t_%s.arc''
log_archive_start=true
#locally
log_archive_dest_1=''location=/disk2/aaa/arch'' # You''d better choose a different location from the datafile.
log_archive_dest_state_1=enable
#standby
#"madatory" specifIEs that filled online log files must be successfully archived to the destination before they can be reused.
#"reopen"  specifIEs the minimum number of seconds before redo transport services should try to reopen a failed destination.
log_archive_dest_2=''service=standby_db mandatory reopen=30 '' # standby_db is a nodename define in tnsnames.ora.
log_archive_dest_state_2=enable
#Choose the following parameter to control the minimum number of destinations that must succeed in order for the online logfile to be available for reuse.
log_archive_min_succeed_dest=1

4.please restart db after setting in step 3.
IV. Action in Standby:
1.edit file $Oracle_HOME/network/admin/listener.ora, update default listener to standby listener.



standby =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1.1.45)(PORT = 1521))
      )
    )
; )

SID_LIST_standby=
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /export/home/Oracle)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = aaa)
      (ORACLE_HOME = /export/home/Oracle)
      (SID_NAME = ASRS)
    )
  )

2.create the archive log destination folder to match the parameter log_archive_dest in spfile/pfile.
3.start listener
4.user the following SQL to open standby DB to standby mode.



startup nomount
alter database mount standby database; 
 alter database recover managed standby database disconnect from session;

V.TEST standby struct

Main DB:



SQL> conn scott/tiger
Connected.
SQL> create table aaa as select * from dual;
Table created.
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------------------------------------
AAA
BONUS
DEPT
EMP
SALGRADE
SQL> drop table aaa;
Table dropped.
SQL> conn / as sysdba
Connected.
SQL>  alter system switch logfile;
System altered.
SQL>
alter system switch logfile;

  Standby DB:
1.you can find the archive log files have been transfered to archive file''s folders in standby DB.
2.use sqlplus tools to check if the table aaa is exist or not:



SQL> shutdown immediate
Database closed.
Database dismounted.
Oracle instance shut down.
SQL> startup nomount
Oracle instance started.

Total System Global Area  286187904 bytes
Fixed Size                   434560 bytes
Variable Size             218103808 bytes
Database Buffers           67108864 bytes
Redo Buffers                 540672 bytes
SQL> alter database mount standby database; 
Database altered.
SQL>alter database recover managed standby database disconnect from session;
Database altered.
SQL> !who
root       pts/2        Dec 19 19:34    (172.16.87.98)
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database open read only;
Database altered.
SQL> conn scott/tiger
Connected.
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------------------------------------
BONUS
DEPT
EMP
SALGRADE
SQL> conn / as sysdba
Connected.
SQL> alter database recover managed standby database disconnect from session;
alter database recover managed standby database disconnect from session;
*
ERROR at line 1:
ORA-01093: ALTER DATABASE CLOSE only permitted with 

;no sessions connected
SQL> select ''kill -9 -''||b.spid from v$session a,v$process b
  2  where a.paddr=b.addr
  3  and a.type<>''BACKGROUND'';
SQL>!kill -9 1029
SQL> alter database recover managed standby database disconnect from session;
Database altered.

VI. FAQ:
Q1:ORA-16024: parameter LOG_ARCHIVE_DEST_1 cannot be parsed
A1:在Main上重新啟動DB的時候,報這個錯誤,最後發現修改了log_archive_dest_1,把/disk2/aaa/arch'' 改成''location=/disk2/aaa/arch'' 後成功。
Q2:在standby DB的alter文件發現如下錯誤:



Wed Dec 19 15:48:39 2007
Fetching gap sequence for thread 1, gap sequence 1-1
Trying FAL server:
Error fetching gap sequence, no FAL server specifIEd
Wed Dec 19 15:48:54 2007
Failed to request gap sequence. Thread #: 1, gap sequence: 1-1
All FAL server has been attempted.
Wed Dec 19 18:03:48 2007
Shutting down instance: further logons disabled
Wed Dec 19 18:03:53 2007
MRP0: Background Media Recovery terminating as requested
MRP0: The following warnings/errors are found:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficIEntly old backup
ORA-01110: data file 1: ''/export/home/Oracle/oradata/aaa/system01.dbf''
ORA-16037: user requested cancel of managed recovery Operation
MRP0: Background Media Recovery process is now terminated

A2:檢查了一下,發現standby DB control文件產生的時候,MainDB還是noarchivelog模式,最後重新備份了一下,確認standby的DB也是archivelog狀態後可以自動apply了。不知道是不是這個原因。
Q3:今天手工運行了一下alter system switch logfile; hang機了。
A3:發現是standby_db這個node指向DB不對,解決後正常了,這樣同樣有個問題,如果網絡傳輸慢或者standby機器出問題不能及時解決,那豈不是有很嚴重的性能問題?
Q4:如果正式的掛了,某個數據文件壞能否用standby上面的數據文件,如果整個數據庫掛了,如何把standby數據庫激活成主的:
A4:下面是模擬Main數據庫關閉後,把standby激活成Main DB的過程:



$ sqlplus /nolog
SQL*Plus: Release 9.0.1.0.0 - Production on Thu Dec 20 09:23:56 2007
(c) Copyright 2001 Oracle Corporation.  All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-16003: standby database is restricted to read-only Access
SQL>  alter database mount standby database;
 alter database mount standby database
*
ERROR at line 1:
ORA-01100: database already mounted
SQL> alter database activate standby database;
alter database activate standby database
*
ERROR at line 1:
ORA-01679: database must be mounted EXCLUSIVE and not open to activate
SQL> show parameter passWord
NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
remote_login_passWordfile            string
EXCLUSIVE
SQL> alter database activate standby database;
alter database activate standby database
*
ERROR at line 1:
ORA-01679: database must be mounted EXCLUSIVE and not open to activate
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
Oracle instance shut down.
SQL> !ps -ef |grep ora_
  Oracle  9861  9855   0 09:27:50 pts/2       0:00 /bin/sh -c ps -ef |grep ora_
  Oracle  9862  9861   0 09:27:50 pts/2       0:00 grep ora_
SQL> startup nomount;
Oracle instance started.
Total System Global Area  286187904 bytes
Fixed Size                   434560 bytes
Variable Size          &nbsp;  218103808 bytes
Database Buffers           67108864 bytes
Redo Buffers                 540672 bytes
SQL>  alter database mount standby database;
Database altered.
SQL>  alter database activate standby database;
Database altered.
SQL> archive log list;
ORA-01507: database not mounted
SQL> shutdown immediate
ORA-01507: database not mounted
Oracle instance shut down.
SQL> SQL> startup
Oracle instance started.
Total System Global Area  286187904 bytes
Fixed Size                   434560 bytes
Variable Size             218103808 bytes
Database Buffers           67108864 bytes
Redo Buffers                 540672 bytes
Database mounted.
Database opened.
SQL>
----這時候standby DB就是主的了,如果關閉再執行下面SQL就會報錯:
SQL> alter database mount standby database;
alter database mount standby database
*
ERROR at line 1:
ORA-01665: controlfile is not a standby controlfile

下面是模擬Main DB上刪除了一個數據文件,利用standby恢復的過程: 



SQL> shutdown immediate
Database closed.
Database dismounted.
Oracle instance shut down.
SQL> !mv /export/home/oracle/oradata/aaa/tools01.dbf /export/home/Oracle/oradat
/aaa/tools01.bak
SQL> startup
Oracle instance started.
Total System Global Area  286187904 bytes
Fixed Size                   434560 bytes
Variable Size             218103808 bytes
Database Buffers           67108864 bytes
Redo Buffers                 540672 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01110: data file 7: ''/export/home/Oracle/oradata/aaa/tools01.dbf''
SQL> alter database datafile ''/export/home/Oracle/oradata/aaa/tools01.dbf'' offline;
Database altered.
SQL> alter database open;
Database altered.
--------FTP the tools01.dbf from standby DB---------
SQL> recover  datafile ''/export/home/Oracle/oradata/aaa/tools01.dbf'';
Media recovery complete.
SQL> alter database datafile ''/export/home/Oracle/oradata/aaa/tools01.dbf'' online;
Database altered.

Q5:control文件有變化的時候該如何做。
A5:下面模擬的是添加一個數據文件後的處理過程:

-----------------Main DB-------------------------



SQL> alter system set log_archive_min_succeed_dest=1 scope=spfile;
System altered.
SQL> alter system switch logfile;
System altered.
 SQL>create tablespace compard datafile ''/export/home/Oracle/compard01.dbf'' size 20M;
Tablespace created.
SQL> create user compard default tablespace compard identifIEd by cctv temporary
 tablespace temp;
User created.
SQL> grant connect to compard  ;
Grant succeeded.
SQL> alter system switch logfile;
System altered.
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /export/home/Oracle/dbs/arch/
Oldest online log sequence     18
Next log sequence to archive   20
Current log sequence           20
SQL> alter system switch logfile;--execute 5 times
--------------standby DB --------------------------

SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG;
 SEQUENCE# APPLIE
---------- ------
        18 YES    
        19 NO
        20 NO
        21 NO
        22 NO
        23 NO
        24 NO

error in alter file:
Errors in file /export/home/Oracle/admin/aaa/bdump/asrs_mrp0_9281.trc:
ORA-01670: new datafile 9 needed for standby database recovery
ORA-01157: cannot identify/lock data file 9 - see DBWR trace file
ORA-01110: data file 9: ''/export/home/Oracle/compard01.dbf''
MRP0: Background Media Recovery process is now terminated
Thu Dec 20 09:01:44 2007
kccrsz: expanded controlfile section 11 from 13 to 27 records
  requested to grow by 13 record(s); added 1 block(s) of records

SQL> alter database create datafile ''/export/home/Oracle/compard01.dbf'';
Database altered.
-------------wait for several minutes------------------
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG;
SEQUENCE# APPLIE
---------- ------
        18 YES
        19 YES
        20 YES
        21 YES
        22 YES
        23 YES
        24 YES

Q6:standby 的日常檢查
A6:在Main DB上面執行:



SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /export/home/Oracle/dbs/arch/
Oldest online log sequence     11
Next log sequence to archive   12
Current log sequence           12

在Standby上面執行



SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG;
 SEQUENCE# APPLIE
---------- ------
         8 YES
         9 YES
        10 YES
        11 YES

發現standby 上面11已經apply完畢就說明正常,如果發現還沒apply到11,就說明2個數據庫之間存在差異,看情況,有些需要手工處理。

Q7:啟動關閉standby struct順序
A7:一般的是先開啟從的,再主的,不過感覺到過來也沒有什麼問題。
Q8:non data lose
A8:其實就是在standby作redo log的鏡像,如果standby 的redo沒有寫成功,那Main DB就會hung住,對效能影響比較大,我們這些生產的數據庫對效能要求較高,所以沒有實際測試,不作評論,大家有興趣的可以看看網上的文章。
Q9:日志不連續的情況下該怎麼辦
A9:copy Main DB''s archive log files to standby DB and recover manually.SQL:



recover automatic standby database;

or



recover standby database until cancel; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved