oracle_DG+broker+Keepalived的部署文件

czxin788發表於2016-03-09

OracleDG+Broker+keepalived的安裝

 

一、環境:

 

主機名

ip

例項名

唯一名

主庫

oracle01.123.com

 172.16.2.17

orcl

orclpri

備庫

oracle02.123.com

 172.16.2.18

orcl

orcldg

 

二、拓撲圖

oracle_DG+broker+Keepalived的部署文件

 

 

三、建立資料庫

1、系統環境、硬體環境檢測   注:主備庫一樣配置

[root@oracle01 ~]# cat /etc/issue

CentOS release 5.6 (Final)

Kernel \r on an \m

[root@oracle01 ~]# uname -a

Linux oracle01.123_dev.com 2.6.18-238.el5 #1 SMP Thu Jan 13 15:51:15 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

[root@oracle01 ~]# cat /proc/meminfo

MemTotal:      4043724 kB

[root@oracle01 ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

                       39G  3.9G   34G  11% /

/dev/sda1              99M   13M   81M  14% /boot

tmpfs                 2.0G     0  2.0G   0% /dev/shm

 

2、安裝包安裝

 

yum -y installbinutils-2.17.50.0.6

yum -y installcompat-libstdc++-33-3.2.3

yum -y installelfutils-libelf-0.125

yum -y installelfutils-libelf-devel-0.125

yum -y installelfutils-libelf-devel-static-0.125

yum -y installgcc-4.1.2

yum -y installgcc-c++-4.1.2

yum -y installglibc-2.5-24

yum -y installglibc-common-2.5

yum -y installglibc-devel-2.5

yum -y installglibc-headers-2.5

yum -y installkernel-headers-2.6.18

yum -y installksh-20060214

yum -y installlibaio-0.3.106

yum -y installlibaio-devel-0.3.106

yum -y installlibgcc-4.1.2

yum -y installlibgomp-4.1.2

yum -y installlibstdc++-4.1.2

yum -y installlibstdc++-devel-4.1.2

yum -y installmake-3.81

yum -y installsysstat-7.0.2

yum -y installunixODBC-2.2.11

yum -y installunixODBC-devel-2.2.11

yum -y installbinutils-2.17.50.0.6

yum -y installcompat-libstdc++-33-3.2.3

yum -y installelfutils-libelf-0.125

yum -y installelfutils-libelf-devel-0.125

yum -y installelfutils-libelf-devel-static-0.125

yum -y installgcc-4.1.2

yum -y installgcc-c++-4.1.2

yum -y installglibc-2.5-24

yum -y installglibc-common-2.5

yum -y installglibc-devel-2.5

yum -y installglibc-headers-2.5

yum -y installkernel-headers-2.6.18

yum -y installksh-20060214

yum -y installlibaio-0.3.106

yum -y installlibaio-devel-0.3.106

yum -y installlibgcc-4.1.2

yum -y installlibgomp-4.1.2

yum -y installlibstdc++-4.1.2

yum -y installlibstdc++-devel-4.1.2

yum -y installmake-3.81

yum -y installsysstat-7.0.2

yum -y installunixODBC-2.2.11

yum -y installunixODBC-devel-2.2.11

 

 

 

 

 

3、使用者建立

# groupadd  oinstall

# groupadd  dba

# groupadd  oper

# useradd  -g oinstall -G dba,oper oracle

# passwd oracle

oracle

4、修改核心引數:

# vi /etc/sysctl.conf

####oracle add

fs.aio-max-nr = 1048576

fs.file-max = 6815744

kernel.shmall=4194304

#kernel.shmmax以位元組為單位,實體記憶體數量*1024*1024*2,為記憶體的2    

kernel.shmmax=2147483648  

kernel.sem = 250 32000 100 128

kernel.shmmni = 4096

fs.file-max = 6815744          

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 4194304 

net.core.rmem_max = 4194304 

net.core.wmem_default = 262144   

net.core.wmem_max = 1048576

5、修改資源限制:

# vi /etc/security/limits.conf

oracle          soft    nofile          1024

oracle          hard    nofile          65536

oracle          soft    nproc           2047

oracle          hard    nproc           16384

oracle          soft    stack           10240

oracle          hard    stack           32768

6、建立目錄:

# mkdir -p /u01/app/oracle

# chown -R oracle:oinstall /u01

# chmod -R 775 /u01

7、修改概要檔案

[oracle@oracle01 ~]$ vi .bash_profile

export ORACLE_SID=orcl

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export PATH=$PATH:$ORACLE_HOME/bin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

PATH=$PATH:$HOME/bin

8、解壓安裝包

[oracle@oracle01 install]$ pwd

/u01/install

[oracle@oracle01 install]$ ls

db_112040_Linux-x86-64_1of7.zip  db_112040_Linux-x86-64_2of7.zip

9、圖形介面安裝

Oracle使用者下

$dbca

Sid:orcl

字符集:AMERICAN_AMERICA.AL32UTF8

修改預設日誌檔案大小為:200M

root身份執行兩個指令碼

10、建立監聽和資料庫:

圖形介面下建立監聽,oracle執行:

$ netca

$ lsnrctl status

$ netstat -tlnp | grep 1521

圖形介面建立dboracle執行:

$ dbca

Sid orcl;

字符集

11、測試:

sqlplus測試:

$ sqlplus sys/sys@orcl as sysdba

$ sqlplus / as sysdba

SQL> show user

SQL> select count(*) from hr.employees;

SQL> exit

12、修改效能引數

alter system set db_writer_processes=6 scope=spfile

             db_writer_processes   6

             dml_locks      2000

             job_queue_processes 4

             open_cursors        3000

             open_links    100

             sec_case_sensitive_logon=false

 

小知識:

dml_locks這個引數呢,主要是用來規定TM鎖的總數,實際上這個引數可以設定為0,表示我們要取消資料庫獲得TM表級鎖的能力,這時候資料庫的資料封鎖粒度實際只有一級,就是行級(TX)。這樣設定之後,其實資料行的updte修改仍能進行,但是會話只能是獲得了TX鎖,而不能獲得任何的TM鎖,由於在更新資料庫的時候沒有任何TM鎖的保護,所以資料庫中任何的DDL語句都是不能執行的(ORA-00069: cannot acquire lock -- table locks disabled for my_table)

當然這樣做的雖然可以提高資料庫的效能,但是也會帶來一些小小的麻煩。

為了不在全域性使這樣的改變生效,我們還可以針對table來讓他生效

alter table my_table disable table lock;

alter table my_table enable table lock;

 

job_queue_processes引數,用於設定job佇列可以啟動的程式數。job_queue_processes取值範圍為01000,總共可建立多少個job程式由job_queue_processes引數來決定。job_queue_processes引數,當設定該值為0的時候則任意方式建立的job都不會執行。此外對於Scheduler jobs方式還受限制於scheduler屬性MAX_JOB_SLAVE_PROCESSES的設定。

可以透過DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE來設定max_job_slave_processes

過小的引數值導致job不得不進行等待。而過大的引數值則消耗更多的系統資源。

 

 

open_cursors指定一個會話一次可以開啟的遊標 (環境區域) 的最大數量, 並且限制 PL/SQL 使用的 PL/SQL 遊標快取記憶體的大小, 以避免使用者再次執行語句時重新進行語法分析。請將該值設定得足夠高, 這樣才能防止應用程式耗盡開啟的遊標。

當設定SESSION_CACHED_CURSOR的值之後,當有parse請求的時候,Oracle會從library cache中查詢。如果有超過3次同樣的parse請求,這個遊標將會存入Session的遊標快取中。對於將來同樣的查詢,就甚至不要soft parse,直接從Session的遊標快取中取。OPEN_CURSOR中會儲存儲存在SESSION_CACHED_CURSOR以及開啟的遊標(不是精確值)

 

 

OPEN_LINKS:有個儲存過程,裡面已經有4dblink了,但是由於業務需要,還需要再加幾個,在加到第五個的時候,系統忽然丟擲一個錯誤:ora-02020 too many database links in use。諮詢Oracle工程師,得出的結論是在oracle的系統引數中,OPEN_LINKSopen_links_per_instanse兩個引數設定問題,系統預設為4,並沒有對這個引數修改

 

sec_case_sensitive_logonOracle11g之前的版本中密碼是不區分大小寫的(使用雙引號強制除外)。在Oracle11g版本中對此有所增強。從此密碼有了大小寫的區分,這個大小寫敏感特性是透過SEC_CASE_SENSITIVE_LOGON=true引數來控制的。

 

重啟資料庫後引數設定生效

 

資料庫建立完畢

                               

四、oracle dg搭建

1、首先將主備的Oracle資料庫設定為歸檔模式
1)sql>shutdown normal/immediate;
2)sql>startup mount;
3)sql>alter database archivelog;
4)sql>alter database open;
5)archive log list
;

Database log mode        Archive Mode

Automatic archival         Enabled

Archive destination        USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     114

Next log sequence to archive   116

Current log sequence             116

2、SQL> alter database force logging;

Database altered.

3、listener.ora  主庫

vi /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

LISTENER =

  (DESCRIPTION_LIST =

(DESCRIPTION =

# 這裡面寫主機名的原因是可以保證netstat -utnalp |grep 1521看到的結果是0 0.0.0.0:1521,從而可以保證任何客戶端都能telnet 1521

      (ADDRESS = (PROTOCOL = TCP)(HOST = oracle01.123.com)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orclpri) #唯一名

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = orcl)

        (SERVICE_NAME=orclpri) #唯一名

 )

 )

ADR_BASE_LISTENER = /u01/app/oracle

備庫 listener.ora

/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

LISTENER =

  (DESCRIPTION_LIST =

(DESCRIPTION =

# 這裡面寫主機名的原因是可以保證netstat -utnalp |grep 1521看到的結果是0 0.0.0.0:1521,從而可以保證任何客戶端都能telnet 1521

 (ADDRESS = (PROTOCOL = TCP)(HOST = oracle02.123.com)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcldg) #唯一名

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = orcl)

        (SERVICE_NAME=orcldg) #唯一名

 )

 )

ADR_BASE_LISTENER = /u01/app/oracle

 

4vi  /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

tnsnames.ora 主庫備庫一致

 

ORCLDG =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcldg)

    )

  )

 

ORCLPRI =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orclpri)

    )

5         測試(主備同樣測試)

conn sys/oracle @orclpri as sysdba

  conn sys/sys@orcldg  as sysdba

6、主庫檢視日誌情況

SQL> select member,group#,status from v$logfile;

MEMBER                                                                               GROUP# STATUS

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

/u01/app/oracle/oradata/orcl/redo03.log                                                   3

/u01/app/oracle/oradata/orcl/redo02.log                                                   2

/u01/app/oracle/oradata/orcl/redo01.log                                                   1                            

 

SQL> select group#,status,bytes,blocksize,status from v$log;

    GROUP# STATUS                BYTES  BLOCKSIZE STATUS

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

         1 INACTIVE          209715200        512 INACTIVE

         2 CURRENT           209715200        512 CURRENT

         3 INACTIVE          209715200        512 INACTIVE

7、新增standby logfile (主庫和備庫都新增standby log)

standby logfile的含義:將來備庫可以用standby logfile接收主庫傳過來的日誌並在備庫做恢復。這個備庫standby logfile的大小一定是和主庫(online log)日誌一樣大的。另外,備庫standby logfile日誌組個數:

官方說法:

備庫standby logfile日誌組的個數=(每個例項下online logfile日誌組的個數+1*執行緒數

比如雙節點rac,那麼就有兩個執行緒,如果每個執行緒的日誌組個數是2,那麼就是3*2,也就是說你的dg備庫要建立6standby日誌檔案,並且要和你的執行緒對應。

因為本例是單例項的資料庫,所以只有一個例項,因此需要建立的standby log的個數為:(3+1)*1=4

Sql>

alter database add STANDBY logfile group 4 '/u01/app/oracle/oradata/orcl/redo04.log' size 200m

alter database add STANDBY logfile group 5 '/u01/app/oracle/oradata/orcl/redo05.log' size 200m

alter database add STANDBY logfile group 6 '/u01/app/oracle/oradata/orcl/redo06.log' size 200m

alter database add STANDBY logfile group 7 '/u01/app/oracle/oradata/orcl/redo07.log' size 200m

透過Select * from v$logfile看新加的standby log(型別為standby)和以前的online log

 

8、修改主庫的引數(/u01/app/oracle/product/11.2.0/db_1/dbs/inioracl.ora

db_unique_name=orclpri

local_listener=orclpri ##連線自身的tnsname裡面的服務名

#db_file_name_convert :主庫資料檔案路徑,備庫資料檔案路徑

*.db_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/orcl/'

# log_file_name_convert:主庫的日誌檔案路徑,備庫的日誌檔案路徑

*.log_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/orcl/'

*.fal_client='ORCLPRI' #(配置tnsnames.ora網路服務名,fal_server複製丟失的歸檔檔案到這裡)

*.fal_server='orcldg' #(配置tnsnames.ora網路服務名,假如轉換為備庫角色時,從這裡獲取丟失的歸檔檔案)

*.log_archive_config='dg_config=(orclpri,orcldg)' #啟動db接受或傳送redo data,包括所有庫的db_unique_name

*.log_archive_dest_1='location=/home/oracle/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orclpri'  #(主庫歸檔目的地) 

*.log_archive_dest_2='service=orcldg  LGWR SYNC AFFIRM valid_for=( all_logfiles,primary_role) db_unique_name=orcldg' #log_archive_dest_2service調整為lgwr sync affirm,這是broker要求的. #(當該庫充當主庫角色時,設定物理備庫redo data的傳輸目的地,兩種歸檔方式LGWR ARCn,ARCn只支援最高效能的保護模式;ASYNC非同步傳輸,SYNC同步傳輸) ;LGWR支援最大效能和最大保護

*.log_archive_format='ARC_%t_%S_%r.arc'

*.standby_file_management='AUTO' #主從都改,為了將來主從能夠來回切換做做準備。把主庫的standby_file_management改成auto功能就是即將來主庫建立資料檔案,備庫也自動建立,如果不設定這個引數,將來備庫不會自動建立。

*.undo_management='auto'

*.service_names='orcl'

log_archive_max_processes=4 #增加歸檔程式數量

9、複製密碼檔案,引數檔案(spfile)到備庫

/u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl

                                   Spfileorcl.ora

scp orapworcl

.....

 

10、在備庫生成pfile,

備庫:[oracle@oracle02 admin]$ sqlplus / as sysdba

Sql>create pfile from spfile;

vi /u01/app/oracle/product/11.2.0/db_1/dbs/ initorcl.ora

修改以下引數為:

 db_unique_name=orcldg

local_listener=orcldg ##連線自身的tnsname裡面的服務名

#db_file_name_convert :主庫資料檔案路徑,備庫資料檔案路徑

*.db_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/orcl/'

# log_file_name_convert:主庫的日誌檔案路徑,備庫的日誌檔案路徑

*.log_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/orcl/'

*.fal_client='ORCLDG' #(配置tnsnames.ora網路服務名,fal_server複製丟失的歸檔檔案到這裡)

*.fal_server='orclpri' #(配置tnsnames.ora網路服務名,假如轉換為備庫角色時,從這裡獲取丟失的歸檔檔案)

*.log_archive_config='dg_config=(orcldg,orclpri)' #啟動db接受或傳送redo data,包括所有庫的db_unique_name

*.log_archive_dest_1='location=/home/oracle/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orcldg' #(主庫歸檔目的地)

#log_archive_dest_2 service調整日誌風格為lgwr sync affirm,這是broker要求的

*.log_archive_dest_2='service=devdb1 LGWR SYNC AFFIRM valid_for=( all_logfiles,primary_role) db_unique_name=orclpr#(當該庫充當主庫角色時,設定物理備庫redo data的傳輸目的地,兩種歸檔方式LGWR ARCn,ARCn只支援最高效能的保護模式;ASYNC非同步傳輸,SYNC同步傳輸)

*.log_archive_format='ARC_%t_%S_%r.arc'

*.standby_file_management='AUTO' #主從都改,為了將來主從能夠來回切換做做準備。把主庫的standby_file_management改成auto功能就是即將來主庫建立資料檔案,備庫也自動建立,如果不設定這個引數,將來備庫不會自動建立。

*.undo_management='auto'

*.service_names='orcl'

log_archive_max_processes=4 #增加歸檔程式數量

上面是備庫需要改的引數,同樣主庫也需要改這些引數,只不過是在主庫改時有些引數與主庫是相反設定的。

小知識:

對於STANDBY_ARCHIVE_DEST引數,實際上從10gr2開始就感覺是可有可無了,在11g中,被標記

為廢棄,不再被支援。這實際上是一次簡化。

 

對於LOG_ARCHIVE_DEST_n引數,如果設定了VALID_FOR=(ALL_LOGFILES,ALL_ROLES),那麼在不

定義STANDBY_ARCHIVE_DEST引數時,Oracle就會選擇LOG_ARCHIVE_DEST_n引數作為歸檔目標。

 

當然也可以設定獨立的LOG_ARCHIVE_DEST_n引數,設定VALID_FOR=(STANDBY_LOGFILE,*)

屬性,則可以使用該路徑作為備用歸檔路徑。

 

當然,即使所有設定都不滿足備用歸檔使用,Oracle會使用一個預設路徑:

SQL> show parameter standby

 

NAME                                 TYPE        VALUE

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

standby_archive_dest                 string      ?/dbs/arch

standby_file_management              string      MANUAL

 

備庫生成spfile

sql>create spfile from pfile;

File created.

SQL> startup nomount

SQL> !ps -ef|grep dmon_orcl   #檢查是否生效

oracle   17773     1  0 11:44 ?        00:00:00 ora_dmon_orcl

oracle   17779 17733  0 11:44 pts/0    00:00:00 /bin/bash -c ps -ef|grep dmon_orcl

oracle   17781 17779  0 11:44 pts/0    00:00:00 grep dmon_orcl

11、備庫透過rman複製資料檔案

在主庫上進行備份:

在主庫備份前把以前路徑的備份片刪除了:

delete backup;

list backup

delect copy

crosscheck copy;

crosscheck archivelog all;

crosscheck backup;

然後在主庫上執行:

configure channel device type disk format '/home/oracle/rmanbk/%d_%I_%s_%p.bkp';

backup as compressed backupset database include current controlfile for standby plus archivelog;

將主庫的備份集scp 到從庫的/home/oracle/rmanbk目錄,這個目錄路徑要和主庫備份集的路徑一樣(這是因為備份集的路徑記錄在控制檔案裡面)

下面的rman命令是在備庫上執行:

$  rman target sys/oracle@orcl auxiliary sys/oracle@orcldg nocatalog

Recovery Manager: Release 11.2.0.4.0 - Production on Mon Jul 27 11:46:23 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: orcl (DBID=1038061657)

using target database control file instead of recovery catalog

connected to auxiliary database: orcl (not mounted)

 

RMAN> duplicate target database for standby from active database nofilenamecheck;

如果執行上面的命令報ORA-17628: Oracle error 19505 returned by remote Oracle serve,請檢視是否備庫沒有建立資料檔案存放路徑呢

mkdir /u01/app/oracle/oradata/orcl/

12、檢查standby database的狀態

SQL> select database_role,protection_mode,protection_level from v$database;

SQL> select sequence# ,applied from v$archived_log;

13、開始Redo應用

主庫

SQL> alter system archive log current;

備庫,11g可以只讀開啟庫應用日誌

SQL> alter database open;  //備庫

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

也可以使用alter database recover managed standby database using current logfile disconnect from session;應用日誌。

沒有using current logfileapply standby archived log.

using current logfile是當日志傳到standby redo log的時候就去應用,是real-time的,必須要有standby redo log.

註釋:本例子用using current logfile,這樣可以置為最大效能模式,用來做broker

在備庫看日誌主庫是否傳過來日誌並應用:

SQL> select sequence# ,applied from v$archived_log;

五、配置broker

1、   配置broker前提

主從資料庫都需要開啟flashback database

select flashback_on from v$database;  在主從都看 檢視是否開啟

shut immediate

startup mount

alter database flashback on;                     //開啟閃回

主從資料庫必須置為最大可用狀態,如果不是也不要著急,一會用dgmgrl來切成最大可用。

select protection_mode,database_role,protection_level from v$database

另外,主從資料庫都要使用spfile

 show parameter spfile

還有,主從資料庫都要啟用broker:

dg_broker_start=true

alter system set dg_broker_start=true;

2、開始配置broker

在主庫上使用dgmgrl連線到資料庫.建立配置.

[oracle@dg1 admin]$ dgmgrl

DGMGRL> connect sys/oracle

DGMGRL> create configuration ' orclpribroker' as primary database is 'orclpri' connect identifier is 'orclpri';

Configuration "orclpricfg" created with primary database "orclpri"

DGMGRL>

這裡的引數要說明一下.orclpricfg是配置的名稱,這裡可以隨便填.PRIMARY DATABASE IS orclpri ,這兒的orclpri是指databasedb_unique_name,connect identifier is orclpri′這裡的orclpri是指tnsname.ora連線到主庫的net service name.

小知識:刪除配置用DGMGRL> remove configuration;

我們可以使用show confiruration檢視配置資訊.

DGMGRL> show configuration

Configuration - orclpricfg

 Protection Mode: MaxAvailability

 Databases:

   orclpri - Primary database

Fast-Start Failover: DISABLED

Configuration Status:

DISABLED

 

3、新增standby database到配置

還是在主庫上

DGMGRL> add database 'orcldg' as connect identifier is orcldg maintained as physical;

Database "orcldg" added

這裡的引數要說明一下.add database orcldg ,這兒的orcldg是指databasedb_unique_name,AS CONNECT IDENTIFIER IS orcldg 這裡的orcldg是指tnsname.ora連線到standby databasenet service name.

DGMGRL> show configuration

 

Configuration - orclpricfg

 Protection Mode: MaxAvailability

 Databases:

   orclpri - Primary database

   orcldg - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:

DISABLED

 

 

4、修改DG broker 引數

還是在主庫上執行:

DGMGRL> edit database 'orclpri' set property 'logxptmode'='sync';

Property "logxptmode" updated

DGMGRL> edit database 'orcldg' set property 'logxptmode'='sync';

Property "logxptmode" updated

5、修改快速故障轉移的延遲時間(預設為30秒,有些少!):

DGMGRL> edit configuration set property FastStartFailoverThreshold=10;

主庫終止 從庫延遲10s後從庫再啟動

FastStartFailoverThreshold (表示觀察者與備庫同主庫斷網後幾秒,自動啟動failover)
注意:在生產中要把FastStartFailoverThreshold這個引數調大點,要不在生產中發生網路不暢通的情況下,等10s就自動切換了,所以還是改大點吧,我改的是3分鐘



6、啟動快速故障轉移:

DGMGRL> enable fast_start failover;

Enabled.

 

注意:兩個資料庫必須置為最大可用模式,如果不是,可用用如下命令來操作:

DGMGRL> edit configuration set protection mode as MAXAvailability;

Succeeded.

再啟動

DGMGRL> enable fast_start failover;

注意:有小夥伴在執行上面的命令後,報:
ORA-16569-Data Guard configuration is not enabled
解決辦法:執行enable configuration;  後再執行 enable fast_start failover;

DGMGRL> show configuration;

Configuration - orclpricfg

 Protection Mode: MaxAvailability

 Databases:

   orclpri - Primary database

     Warning: ORA-16819: fast-start failover observer not started

 

   orcldg - (*) Physical standby database

     Warning: ORA-16819: fast-start failover observer not started

Fast-Start Failover: ENABLED

Configuration Status:

WARNING

DGMGRL>

DGMGRL> start observer;

Observer started

 上面的報錯說明沒有開啟broker監控,下面用start observer開啟一下,就好了。

 

7、必須有個程式監控主庫的狀態(在備庫)

[oracle@oracle02 ~]$ dgmgrl

DGMGRL> connect sys/oracle

DGMGRL> start observer;

Observer started

 

備註:這個是後臺啟動的方式

dgmgrl -logfile $HOME/observer.log sys/abc123 "start observer" &



8、開啟新的視窗:

 

[oracle@shsrv ~]$dgmgrl

DGMGRL> connect sys/oracle@orclpri

Connected.

DGMGRL> show configuration;

 

Configuration - orclpricfg

 

 Protection Mode: MaxAvailability

 Databases:

   orclpri - Primary database

   orcldg - (*) Physical standby database

 

Fast-Start Failover: ENABLED

 

Configuration Status:

SUCCESS

 

9、.驗證swictover

手工將從庫(orcldg)切換為主的角色:

DGMGRL> switchover to 'orcldg';   //從庫上執行

Performing switchover NOW, please wait...

New primary database "orcldg" is opening...

Operation requires shutdown of instance "orclpri" on database

"orclpri"Shutting down instance "orclpri"..

.ORACLE instance shut down.Operation requires startup of instance "orclpri" on database

"orclpri"Starting instance "orclpri"...

ORACLE instance started.

Database mounted.Switchover succeeded,

new primary is "orcldg"

orclpri

SQL> select database_role,switchover_status from v$database;  //在主庫2.17上檢視

DATABASE_ROLE    SWITCHOVER_STATUS

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

PHYSICAL STANDBY NOT ALLOWED

orcldg

SQL> select database_role,switchover_status from v$database; //在備庫2.18上檢視

DATABASE_ROLE    SWITCHOVER_STATUS

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

PRIMARY          TO STANDBY

 

10、failover 驗證:

 

在主庫上做shutdown abort的操作,備庫會主動的切換為主庫!

中止主資料庫。

shutdown abort

檢視觀察器日誌:

DGMGRL> start observer

Initiating Fast-Start Failover to database

"orclpri"...Performing failover NOW, please wait...

Failover succeeded, new primary is "orcldg"

透過登入到新主資料庫上的 dgmgrl 檢視 Broker 配置。 您會看到之前的主資料庫現在已禁用。

dgmgrl sys/oracle@orcldg

Configuration  Name:                

FSF  Enabled: YES

Protection Mode:     MaxAvailability

Databases:

               orcldg - Primary database

               orclpri - Physical standby database (disabled)          -

Fast-Start Failover target

Fast-Start Failover: ENABLED

Current status for "FSF":

Warning: ORA-16608: one or more databases have warnings

 

11、將之前中止的主資料庫恢復為備用資料庫

透過安裝資料庫啟動恢復。注意,資料庫此時不會開啟。僅當觀察器驗證主資料庫仍為主資料庫後,主資料庫才會開啟。如果觀察器發現該資料庫不再是主資料庫,會嘗試將其恢復為故障切換的目標備用資料庫。

恢復的第一步是將資料庫閃回到備用資料庫變為主資料庫的 SCN 處(新主資料庫上的v$database.standby_became_primary_scn)。如閃回資料庫部分中所述,閃回資料庫將分成兩個階段進行:恢復階段和介質恢復階段。在恢復階段,閃回資料庫使用閃回資料庫日誌中的前映像塊將資料庫恢復到standby_became_primary_scn 之前的一點。在介質恢復階段中,閃回資料庫應用重做以將資料庫帶到standby_became_primary_scn。為使閃回資料庫成功,閃回資料庫日誌中必須包括足夠的可用歷史記錄,並且恢復點和 standby_became_primary_scn 之間生成的所有重做必須可用。如果閃回資料庫失敗,自動恢復將停止,您將需要手動執行基於 SCN 的恢復以恢復到standby_became_primary_scn,直到完成該恢復。

一旦閃回資料庫成功,觀察器會將該資料庫轉換為備用資料庫,執行回彈並開始應用服務。

 

startup mount  //在執行過shut abort上的資料庫執行

DGMGRL> reinstate database orclpri; #注意,必須把資料庫啟動到mout狀態才能執行reinstate的恢復命令,其他狀態執行恢復會失敗的。

另外,如果你執行reinstate命令失敗,可用嘗試把要恢復的資料庫重啟到mount狀態,再執行reinstate命令

#####

12、測試資料是否同步

主庫

SQL> conn test/test #建立使用測試賬號

Connected.

SQL> create table t2(id number,name varchar2(10));

 

Table created.

 

SQL> select * from cat; 

 

TABLE_NAME                  TABLE_TYPE

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

T2                              TABLE

SQL> desc t2;

 Name                                             Null?    Type

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

 ID                                                     NUMBER

 NAME                                                       VARCHAR2(10)

SQL> insert into t2 values(1,'gg');

 

1 row created.

 

SQL> insert into t2 values(2,'dd');

 

1 row created.

 

SQL> select * from t2;

 

         ID NAME

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

          1 gg

          2 dd

 

SQL> commit;

 

Commit complete.

備庫:

SQL> conn test/test;

Connected.

SQL> select * from cat;

 

TABLE_NAME                  TABLE_TYPE

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

T2                              TABLE

SQL> desc t2;

 Name                                             Null?    Type

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

 ID                                                     NUMBER

 NAME                                                       VARCHAR2(10)

SQL> select * from t2;

 

         ID NAME

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

          1 gg

          2 dd

注:經測試同步正常

六、keepalived的安裝

本方案安裝keepalived的作用是提供一個vip 172.16.2.24,當主庫發生故障後,可以自動將vip漂移到備庫,從而使應用不用再修改資料庫連線。

1、 下載keepalived

2、 安裝keepalived

[root@localhost ~]# tar xf keepalived-1.2.1.tar.gz

[root@localhost ~]# cd keepalived-1.2.1

[root@localhost keepalived-1.2.1]# ./configure --prefix=/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.18-194.el5xen-i686/

===> keepalived預設不支援LVS,需要指定核心原始碼。

[root@localhost biji]# uname -r

        2.6.18-194.el5xen

yum -y install kernel-xen-devel  如果/usr/src/kernels為空,就需要安裝yum -y install kernel-devel

安裝過程中IPVS即是LVS

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

[root@localhost keepalived-1.2.1]# make

[root@localhost keepalived-1.2.1]# make install

3、 主庫Keepalived的配置

[root@localhost keepalived-1.2.1]# cd /etc/keepalived/

[root@localhost keepalived]# cp keepalived.conf keepalived.conf.default

[root@localhost keepalived]# vim keepalived.conf  #主庫

global_defs {

   notification_email {

chenzhixin@123.com

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_oracle {

 

                script "/usr/local/script/check_oracle_status.sh"   ###監控指令碼

 

                interval 2                                        ###監控時間

         weight -20 #註釋:即該節點出現故障後下面的priority的值減去20

}

 

vrrp_instance chk_oracle {

    state MASTER

    interface eth0

    virtual_router_id 17

    priority 100

    nopreempt #主庫重新恢復後不槍佔vip

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

track_script {

 

                chk_oracle                       ###執行上面定義的chk_oracle

 

        }

 

    virtual_ipaddress {

        172.16.2.24 #vip

    }

}

4、 備庫keepalived配置

[root@localhost keepalived]# vim keepalived.conf  #備庫

global_defs {

   notification_email {

chenzhixin@123.com

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_oracle {

 

                script "/usr/local/script/check_oracle_status.sh"   ###監控指令碼

 

                interval 2                                        ###監控時間

                  weight -20 #註釋:即該節點出現故障後下面的priority的值減去20

}

 

vrrp_instance chk_oracle {

    state BACKUP

    interface eth0

    virtual_router_id 17

    priority 99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

track_script {

 

                chk_oracle                       ###執行上面定義的chk_oracle

 

        }

 

    virtual_ipaddress {

        172.16.2.24

    }

}

 

5、 配置指令碼

兩個機器上都配置如下指令碼,讓keepalived每隔2s執行以下該指令碼,用來監控oraclesmon程式,從而判斷本節點的oracle執行是否正常。如果發現smon程式不在,立即把vip切換到備機。

cat /usr/local/script/check_oracle_status.sh

#!/bin/bash

count=`ps -elf |grep ora_smon |grep -v grep |wc -l`

if [ $count  -gt 0 ]; then

        echo 0

    exit 0

else

        echo 1

    exit 1

fi

說明:

keepalived會定時執行指令碼並對指令碼執行的結果進行分析,動態調整vrrp_instance的優先順序。

如果指令碼執行結果為0,並且weight配置的值大於0,則優先順序相應的增加

如果指令碼執行結果非0,並且weight配置的值小於0,則優先順序相應的減少

其他情況,維持原本配置的優先順序,即配置檔案中priority對應的值。

這裡需要注意的是:

1 優先順序不會不斷的提高或者降低

2 可以編寫多個檢測指令碼併為每個檢測指令碼設定不同的weight

3 不管提高優先順序還是降低優先順序,最終優先順序的範圍是在[1,254],不會出現優先順序小於等於0或者優先順序大於等於255的情況

這樣可以做到利用指令碼檢測業務程式的狀態,並動態調整優先順序從而實現主備切換。

 

6、 排錯

如果在執行keepalived時出現任何問題,可以觀察tail -f /var/log/messages來判斷問題。

 

 

 

 

 

 





附件列表


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

相關文章