oracle_DG+broker+Keepalived的部署文件
Oracle的DG+Broker+keepalived的安裝
一、環境:
|
主機名 |
ip |
例項名 |
唯一名 |
主庫 |
oracle01.123.com |
172.16.2.17 |
orcl |
orclpri |
備庫 |
oracle02.123.com |
172.16.2.18 |
orcl |
orcldg |
二、拓撲圖
三、建立資料庫
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
圖形介面建立db,oracle執行:
$ 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取值範圍為0到1000,總共可建立多少個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:有個儲存過程,裡面已經有4個dblink了,但是由於業務需要,還需要再加幾個,在加到第五個的時候,系統忽然丟擲一個錯誤:ora-02020 too many database links in use。諮詢Oracle工程師,得出的結論是在oracle的系統引數中,OPEN_LINKS和open_links_per_instanse兩個引數設定問題,系統預設為4,並沒有對這個引數修改
sec_case_sensitive_logon在Oracle的11g之前的版本中密碼是不區分大小寫的(使用雙引號強制除外)。在Oracle的11g版本中對此有所增強。從此密碼有了大小寫的區分,這個大小寫敏感特性是透過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
4、vi /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備庫要建立6個standby日誌檔案,並且要和你的執行緒對應。
因為本例是單例項的資料庫,所以只有一個例項,因此需要建立的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_2的service調整為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 logfile是apply 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是指database的db_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是指database的db_unique_name,而AS CONNECT IDENTIFIER IS orcldg 這裡的orcldg是指tnsname.ora連線到standby database的net 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執行以下該指令碼,用來監控oracle的smon程式,從而判斷本節點的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle cdc 非同步部署文件Oracle非同步
- zabbix agent 3.0部署文件 安裝部署
- 求助 大版本釋出的部署文件模板
- Mysql 雙主 + heartbeat + Mon 部署文件MySql
- mongo3.2.7部署文件Go
- Apache安裝及jboss部署說明文件Apache
- 伺服器監控系統部署文件伺服器
- 介面文件管理工具-DOClever部署實踐
- ambari2.2.1 for redhat6.6安裝部署文件Redhat
- OpenSearch 2.x 版本文件部署 CSS 丟失的問題CSS
- Windows+Nginx+H3C+ 文件服務 部署配置WindowsNginx
- Win10 部署 Confluence 文件管理系統Win10
- 2022最新IntellJ IDEA的zheng開發部署文件IntelIdea
- 2022最新IntellJ IDEA的mall開發部署文件IntelIdea
- GoldenGate Enterprise Manager Plug-In(12.1.0.3.0) 部署文件Go
- 讓你的文件從靜態展示到一鍵部署可操作驗證
- 時代億信文件安全管理系統成功部署青海電信
- 【DataGuard】部署Data Guard相關引數詳解 - Oracle官方文件描述Oracle
- 2022最新IntellJ IDEA諾依開發部署文件IntelIdea
- k8s-mongodb叢集部署(副本集) (包括規劃文件-攢)K8SMongoDB
- 夜鶯官方文件最佳化第一彈:手把手教你部署和架構講解,消滅所有部署失敗的 case!幹!架構
- 敏捷的文件敏捷
- Tornado 4.3文件翻譯: 使用者指南-執行和部署
- JSP生成WORD文件,EXCEL文件,PDF文件JSExcel
- [文件教程]onethink 這個子文件的含義
- Laravel API 文件生成器生成指定的 API 文件LaravelAPI
- Word文件與WPS文件的相互轉換(轉)
- 無需開發部署,秒建優雅的開源專案文件,這個工具用起來賊爽
- 文件模型中的段落,目錄,文件,是什麼意思?模型
- 文件的增刪改
- 本人翻譯的文件
- Word文件異地文件處理 借力“谷歌文件”谷歌
- LLM應用實戰: 文件問答系統Kotaemon-1. 簡介及部署實踐
- 怕寫文件?AI自動生成程式碼文件的外掛AI
- 分散式爬蟲的部署之Scrapyd批量部署分散式爬蟲
- storm的很好的入門文件ORM
- Docker 的部署方式Docker
- 只有官方文件的情況下建立資料庫需要參考的文件資料庫