oracle_DG+broker+Keepalived的部署文档

51 篇文章 2 订阅
22 篇文章 1 订阅
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,operoracle

# 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

exportORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export PATH=$PATH:$ORACLE_HOME/bin

exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

exportCLASSPATH=$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=6scope=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 formy_table)

当然这样做的虽然可以提高数据库的性能,但是也会带来一些小小的麻烦。

为了不在全局使这样的改变生效,我们还可以针对table来让他生效

alter tablemy_table disable table lock;

alter tablemy_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>shutdownnormal/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 toarchive   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  assysdba

6、主库查看日志情况

SQL> selectmember,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> selectgroup#,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 logfilegroup 4 '/u01/app/oracle/oradata/orcl/redo04.log' size 200m

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

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

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

通过Select * from v$logfile看新加的standbylog(类型为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/archivelogvalid_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 syncaffirm,这是broker要求的. #(当该库充当主库角色时,设置物理备库redo data的传输目的地,两种归档方式LGWRARCn,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 oracle@172.16.2.18:/u01/app/oracle/product/11.2.0/db_1/dbs

.....

 

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/archivelogvalid_for=(all_logfiles,all_roles) db_unique_name=orcldg' #(主库归档目的地)

#log_archive_dest_2service调整日志风格为lgwr sync affirm,这是broker要求的

*.log_archive_dest_2='service=devdb1 LGWR SYNC AFFIRM valid_for=( all_logfiles,primary_role) db_unique_name=orclpr#(当该库充当主库角色时,设置物理备库redodata的传输目的地,两种归档方式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 spfilefrom pfile;

File created.

SQL> startupnomount

SQL> !ps -ef|grepdmon_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 archivelogall;

crosscheck backup;

然后在主库上执行:

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

backup as compressedbackupset database include current controlfile for standby plus archivelog;

将主库的备份集scp 到从库的/home/oracle/rmanbk目录,这个目录路径要和主库备份集的路径一样(这是因为备份集的路径记录在控制文件里面)

下面的rman命令是在备库上执行:

$  rman targetsys/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 targetdatabase: orcl (DBID=1038061657)

using target databasecontrol file instead of recovery catalog

connected to auxiliarydatabase: orcl (not mounted)

 

RMAN> duplicatetarget database for standby from active database nofilenamecheck;

如果执行上面的命令报ORA-17628: Oracle error 19505returned by remote Oracle serve,请查看是否备库没有建立数据文件存放路径呢

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

12、检查standby database的状态

SQL> selectdatabase_role,protection_mode,protection_level from v$database;

SQL> selectsequence# ,applied from v$archived_log;

13、开始Redo应用

主库

SQL> alter systemarchive log current;

备库,11g可以只读打开库应用日志

SQL> alter databaseopen;  //备库

SQL> alter databaserecover managed standby database disconnect from session;

也可以使用alter database recover managedstandby 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> selectsequence# ,applied from v$archived_log;

五、配置broker

1、   配置broker前提

主从数据库都需要打开flashback database

select flashback_onfrom v$database;  在主从都看查看是否开启

shut immediate

startup mount

alter databaseflashback on;                     //开启闪回

主从数据库必须置为最大可用状态,如果不是也不要着急,一会用dgmgrl来切成最大可用。

selectprotection_mode,database_role,protection_level from v$database

另外,主从数据库都要使用spfile

 show parameterspfile

还有,主从数据库都要启用broker:

dg_broker_start=true

alter system setdg_broker_start=true;

2、开始配置broker

在主库上使用dgmgrl连接到数据库.创建配置.

[oracle@dg1admin]$ dgmgrl

DGMGRL> connect sys/oracle

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

Configuration"orclpricfg" created with primary database "orclpri"

DGMGRL>

这里的参数要说明一下.orclpricfg是配置的名称,这里可以随便填.PRIMARY DATABASE IS orclpri ,这儿的orclpri是指databasedb_unique_name,connectidentifier is orclpri′这里的orclpri是指tnsname.ora连接到主库的net service name.

小知识:删除配置用DGMGRL> remove configuration;

我们可以使用show confiruration查看配置信息.

DGMGRL>show configuration

Configuration- orclpricfg

 ProtectionMode: MaxAvailability

 Databases:

  orclpri - Primary database

Fast-StartFailover: DISABLED

ConfigurationStatus:

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

 ProtectionMode: MaxAvailability

 Databases:

  orclpri - Primary database

  orcldg - Physical standby database

Fast-StartFailover: DISABLED

ConfigurationStatus:

DISABLED

 

 

4、修改DG broker 参数

还是在主库上执行:

DGMGRL> editdatabase 'orclpri' set property 'logxptmode'='sync';

Property"logxptmode" updated

DGMGRL> editdatabase 'orcldg' set property 'logxptmode'='sync';

Property"logxptmode" updated

5、修改快速故障转移的延迟时间(默认为30秒,有些少!):

DGMGRL> editconfiguration set property FastStartFailoverThreshold=10;

主库终止从库延迟10s后从库再启动

FastStartFailoverThreshold (表示观察者与备库同主库断网后几秒,自动启动failover)

注意:在生产中要把FastStartFailoverThreshold这个参数调大点,要不在生产中发生网络不畅通的情况下,等10s就自动切换了,所以还是改大点吧,我改的是3分钟



6、启动快速故障转移:

DGMGRL> enablefast_start failover;

Enabled.

 

注意:两个数据库必须置为最大可用模式,如果不是,可用用如下命令来操作:

DGMGRL> editconfiguration set protection mode as MAXAvailability;

Succeeded.

再启动

DGMGRL> enablefast_start failover;

注意:有小伙伴在执行上面的命令后,报:

ORA-16569-Data Guard configuration is not enabled
解决办法:执行enable configuration;  后再执行 enable fast_start failover;

DGMGRL> showconfiguration;

Configuration - orclpricfg

 Protection Mode:MaxAvailability

 Databases:

   orclpri -Primary database

     Warning: ORA-16819: fast-start failoverobserver not started

 

   orcldg -(*) Physical standby database

     Warning: ORA-16819: fast-start failoverobserver not started

Fast-Start Failover:ENABLED

Configuration Status:

WARNING

DGMGRL>

DGMGRL> startobserver;

Observer started

 上面的报错说明没有开启broker监控,下面用start observer开启一下,就好了。

 

7、必须有个进程监控主库的状态(在备库)

[oracle@oracle02 ~]$ dgmgrl

DGMGRL> connect sys/oracle

DGMGRL> startobserver;

Observer started

 

备注:这个是后台启动的方式

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



8、打开新的窗口:

 

[oracle@shsrv~]$dgmgrl

DGMGRL> connectsys/oracle@orclpri

Connected.

DGMGRL> showconfiguration;

 

Configuration - orclpricfg

 

 Protection Mode:MaxAvailability

 Databases:

   orclpri -Primary database

   orcldg -(*) Physical standby database

 

Fast-Start Failover:ENABLED

 

Configuration Status:

SUCCESS

 

9、.验证swictover

手工将从库(orcldg)切换为主的角色:

DGMGRL> switchoverto 'orcldg';   //从库上执行

Performing switchoverNOW, please wait...

New primary database"orcldg" is opening...

Operation requiresshutdown of instance "orclpri" on database

"orclpri"Shuttingdown instance "orclpri"..

.ORACLE instance shutdown.Operation requires startup of instance "orclpri" on database

"orclpri"Startinginstance "orclpri"...

ORACLE instancestarted.

Database mounted.Switchoversucceeded,

new primary is "orcldg"

orclpri

SQL> selectdatabase_role,switchover_status from v$database;  //在主库2.17上查看

DATABASE_ROLE   SWITCHOVER_STATUS

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

PHYSICAL STANDBY NOTALLOWED

orcldg

SQL> select database_role,switchover_statusfrom v$database; //在备库2.18上查看

DATABASE_ROLE   SWITCHOVER_STATUS

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

PRIMARY         TO STANDBY

 

10、failover 验证:

 

在主库上做shutdown abort的操作,备库会主动的切换为主库!

中止主数据库。

shutdown abort

查看观察器日志:

DGMGRL> startobserver

Initiating Fast-StartFailover to database

"orclpri"...Performingfailover 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> reinstatedatabase orclpri; #注意,必须把数据库启动到mout状态才能执行reinstate的恢复命令,其他状态执行恢复会失败的。

另外,如果你执行reinstate命令失败,可用尝试把要恢复的数据库重启到mount状态,再执行reinstate命令

#####

12、测试数据是否同步

主库

SQL> conn test/test#创建使用测试账号

Connected.

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

 

Table created.

 

SQL> select * fromcat; 

 

TABLE_NAME                 TABLE_TYPE

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

T2                             TABLE

SQL> desc t2;

 Name                                            Null?    Type

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

 ID                                                    NUMBER

 NAME                                                      VARCHAR2(10)

SQL> insert into t2values(1,'gg');

 

1 row created.

 

SQL> insert into t2values(2,'dd');

 

1 row created.

 

SQL> select * fromt2;

 

         IDNAME

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

          1gg

          2dd

 

SQL> commit;

 

Commit complete.

备库:

SQL> conntest/test;

Connected.

SQL> select * fromcat;

 

TABLE_NAME                 TABLE_TYPE

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

T2                             TABLE

SQL> desc t2;

 Name                                            Null?    Type

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

 ID                                                    NUMBER

 NAME                                                      VARCHAR2(10)

SQL> select * fromt2;

 

         IDNAME

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

          1gg

          2dd

注:经测试同步正常

六、keepalived的安装

本方案安装keepalived的作用是提供一个vip 172.16.2.24,当主库发生故障后,可以自动将vip漂移到备库,从而使应用不用再修改数据库连接。

1、 下载keepalived

http://www.keepalived.org/download.html

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.confkeepalived.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"   ###监控脚本

 

               interval2                                       ###监控时间

         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"   ###监控脚本

 

               interval2                                       ###监控时间

                 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论坛 | chinaunix博客 | chinaunix论坛
北京皓辰网域网络信息技术有限公司. 版权所有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值