天天看點

災備

RAC (oracle應用叢集) 互相備份

DATAGARD (災備)      資料備援

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

Data Guard三種保護模式

Oracle Data Guard為我們提供了非常人性化的三種保護模式,其目的應用于不同的保護級别和場合,存在的目的就是讓我們的資料庫,健健康康活着,創造出自己的價值

1)保護最大化:主庫與備庫實時同步資料,如果主庫挂了,備庫也不能前進,等主庫好了,備庫才能前進(在寫入主庫的redo日志時同時寫入備庫redo日志,并且保證至少有一個備庫redo日志可用【當你有多個備庫時】),最大限度的保證資料的完整性,不允許丢資料。實際生産很少用

2)可用最大化:主庫與備庫實時同步資料,當網絡或備庫出現問題時,不影響主庫的工作

而是轉換為“性能最大化”模式,等備庫恢複正常後,再轉換為可用最大化模式。實際生産很少用

3)性能最大化:主庫與備庫是異步傳輸資料(定期傳日志),保證主庫的性能最好,如果主庫挂了,盡最大努力恢複備庫。實際生産很多用

總結:最大保護和最大可用都需要至少一個備庫的redo日志可用。最大性能有可能丢資料,隻能盡最大努力去恢複備庫

1.解除安裝8.2 上的oracle

[oracle@sq18 ~]$ /oracle/app/oracle/product/10.2.0/db_1/bin/localconfig delete

(擷取解除安裝資訊)

[oracle@sq18 ~]$ cd $ORACLE_HOME/bin

[oracle@sq18 bin]$ su root

[root@sq18 bin]# /oracle/app/oracle/product/10.2.0/db_1/bin/localconfig delete

(删除本地配置,第二行報錯不影響)

[root@sq18 bin]# rm -rf /etc/oraInst.loc /etc/oratab

[root@sq18 bin]# rm -rf /etc/oracle/

[root@sq18 bin]# rm -rf /usr/local/bin/coraenv /usr/local/bin/dbhome /usr/local/bin/oraenv

[oracle@sq ~]$ rm -rf $ORACLE_BASE/*

2.主機8.2重新安裝

[oracle@sq ~]$ vi .bash_profile

ORACLE_SID=TEST

(把之前配置好的sid改為8.5一樣的TEST)

oracle 登陸重新安裝

./runInstaller 

3.重裝完後

$ cd $ORACLE_HOME/dbs

沒有spfile

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

主庫8.2

1.确認為歸檔模式

2.确認主庫強制寫日志

SQL> select force_logging from v$database;

(所有sql語句nologging操作時 也會強制寫日志)

SQL> alter database force logging;

3.修改主備資料庫的參數檔案

[oracle@sq123 ~]$ cd /oracle/app/oracle/product/10.2.0/db_1/dbs/

[oracle@sq123 dbs]$ more spfileTEST.ora (複制到記事本添加下面内容)

DB_UNIQUE_NAME=TEST   --show parameter DB_UNIQUE_NAME确認主庫名稱

LOG_ARCHIVE_CONFIG='DG_CONFIG=(db82,db85)'    --此處為主庫網絡連接配接串(tnsnames.ora)

LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=TEST'               --主庫的歸檔日志路徑

LOG_ARCHIVE_DEST_2='SERVICE=db82 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=TEST'

FAL_SERVER=db82                 --網絡異常恢複後自動将延遲的歸檔日志傳輸到備庫,此處為主庫網絡連接配接串(tnsnames.ora)

FAL_CLIENT=db85 

STANDBY_FILE_MANAGEMENT=AUTO    (預設隻傳遞資料,此作用主庫把新建立的資料檔案也傳到備庫)

[oracle@sq123 admin]$ vi tnsnames.ora 

db85 =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = TEST)

  )

db82 =

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

[oracle@sq123 ~]$ mkdir /home/oracle/archive

[oracle@sq123 ~]$ vi initnew.ora

(把記事本中内容粘貼到建立文檔)

SQL> startup pfile='/home/oracle/initnew.ora' force

SQL> show parameter ARCHIVE(檢視到剛才配置的值生效了)

SQL> show parameter fal

---------

修改備庫的參數檔案

把主庫的參數檔案拷貝到備庫

備庫8.2上

[oracle@sq18 dbs]$ mkdir /home/oracle/archive

[oracle@sq18 dbs]$ cd $ORACLE_HOME/dbs

修改3行

LOG_ARCHIVE_DEST_2='SERVICE=db85 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=TEST'

FAL_SERVER=db85

FAL_CLIENT=db82

[oracle@sq18 admin]$ sqlplus sys/123456 as sysdba

(報錯沒有相應目錄)

[oracle@sq18 admin]$ mkdir -p /oracle/app/admin/TEST/adump

[oracle@sq18 admin]$ mkdir -p /oracle/app/admin/TEST/bdump

[oracle@sq18 admin]$ mkdir -p /oracle/app/admin/TEST/cdump

[oracle@sq18 admin]$ mkdir -p /oracle/app/flash_recovery_area

[oracle@sq18 admin]$ mkdir -p /oracle/app/admin/TEST/udump

(連接配接成功)

SQL> startup nomount force;

4、保證資料庫兩邊的密碼檔案中的密碼一緻(主備資料庫sys使用者密碼必須相同)

5、保證主備資料庫之間通過tns網絡連接配接串能夠互相連通對方

85上本地測試

[oracle@sq123 ~]$ sqlplus sys/123456@db85 as sysdba(成功)

[oracle@sq123 ~]$ sqlplus sys/123456@db82 as sysdba (不成功)

把85上的listener.ora  ,tnsnames.ora複制過去

[oracle@sq18 ~]$ lsnrctl start

85上

[oracle@sq123 ~]$ sqlplus sys/123456@db82 as sysdba

(還是不成功,報權限錯誤,但sys登陸不可能出現權限問題,因為82上沒有密碼檔案)

82上

[oracle@sq18 ~]$ cd $ORACLE_HOME/dbs(沒有密碼檔案)

85上(拷貝密碼檔案過去)

[oracle@sq123 dbs]$ scp orapwTEST [email protected]:$ORACLE_HOME/dbs

[oracle@sq123 dbs]$  sqlplus sys/123456@db82 as sysdba(連接配接成功)

[oracle@sq18 dbs]$ sqlplus sys/123456@db85 as sysdba(成功)

6.遷移主庫資料庫檔案到備庫,以下RMAN操作全部在主庫執行

主庫上85

[oracle@sq123 ~]$ mkdir db_bak

RMAN> backup full database format='/home/oracle/db_bak/%U' include current controlfile for standby;

82上(傳輸備份片檔案到備庫的相同備份目錄下)

[oracle@sq18 ~]$ mkdir /home/oracle/db_bak

[oracle@sq18 app]$ mkdir -p oradata/TEST/

[oracle@sq123 db_bak]$ scp * [email protected]:/home/oracle/db_bak/

RMAN> connect auxiliary sys/123456@db82(85上,一定不要退出上次的RMAN連接配接)

RMAN> duplicate target database for standby nofilenamecheck;

7.檢視程序

SQL> select process from v$managed_standby;

(沒有災備的程序)

檢視歸檔錯誤資訊

SQL> select error from v$archive_dest;

SQL> alter database mount;

SQL> alter system switch logfile;

PROCESS

ARCH

LNS

(已經有了程序,lns傳輸程序)

RFS

(已經有了程序,rfs接收程序)

備庫具有恢複日志程序,需要手動激活此程序

SQL> alter database recover managed standby database disconnect from session;

SQL>  select process from v$managed_standby;

MRP0

SQL> create spfile from pfile='/home/oracle/initnew.ora';

8.驗證

85 主庫上

SQL> create table t01 as select * from dba_objects;

SQL> commit;

(主庫隻有切換日志時,備庫會同步,但主庫日志變化 備庫會記錄到歸檔日志中)

SQL> alter database recover managed standby database cancel;

(備庫上,隻有把恢複日志程序取消,才可以打開資料庫)

SQL> alter database open;

SQL> select count(*) from t01;(已經有了)

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

注意:

(1)備用資料庫在日志恢複過程中(MRP程序存在期間)資料庫處于MOUNTED狀态,此時備用資料庫無法打開供讀取使用

(2)打開備用資料庫

     停止備用庫的日志恢複程序MRP

     alter database recover managed standby database cancel;

     open備用資料庫,備用資料庫預設打開為隻讀方式

     alter database open;

(3)重新啟動備用資料庫的MRP程序,資料庫自動從OPEN狀态轉換到MOUNT 狀态

     alter database recover managed standby database disconnect from session;

(4)mrp程序停止期間,隻要RFS程序存在,那麼不影響日志的接收

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

     本文轉自陳繼松 51CTO部落格,原文連結:http://blog.51cto.com/chenjisong/1737593,如需轉載請自行聯系原作者