一、 概述:
本文主要从oracle数据库的DG(DATA GUARD)搭建,DG_BROKER和FSFO(Fast-Start Failover)配置等方面阐述了oracle数据库高可用环境的搭建,从而实现数据库透明failover,减少数据库故障带来的影响。
注:文中各命令的执行如没有特别注明,均在主库上执行。
二、 Data Guard环境搭建
1 . 设置归档模式
DG环境的搭建必须要把数据库启动到归档模式,并且为了避免开发人员使用nologging语句,我们还要把数据库设置为force logging。
查看数据库是否运行在归档模式:
#su - oracle
$sqlplus / as sysdba
SQL>archive log list;
如图所示,数据库运行在非归档模式,下面我们开始操作,把数据库修改为归档模式:首先关闭数据库
SQL>shutdown immediate;
启动数据库到mount状态下
SQL>startup mount;
SQL>select open_mode from v$database;
查询结果必须是MOUNTED哦,如果输出的是其它方式,证明操作有误,请重新关闭数据库进行操作
把数据库修改为归档模式并打开数据库:
SQL>alter database archivelog;
SQL>alter database open;
SQL>archive log list;
图中可以看到我们数据库已经运行在归档模式了,其中Archive destination就是归档日志存放的路径,稍后我们会修改下存放路径。
数据库打开后,我们需要把数据库设为force logging:
SQL>alter database force logging;
SQL> select name,log_mode,force_logging from v$database;
2 .添加standby日志:
standby logfile的数量和大小均要与redo logfile相同
查询主库当前redo logfile的数量
SQL> select thread#,group#,members,bytes/1024/1024 from v$log;
从图中可以看到我们主库有三组大小为50M的redo logfile,故我们也需要创建同样数量和大小的standby logfile:
SQL> alter database add standby logfile group 11 ('/data/oradata/ocrl/redo/redo11_stb01.log') size 50M;
SQL> alter database add standby logfile group 12 ('/data/oradata/ocrl/redo/redo12_stb01.log') size 50M;
SQL> alter database add standby logfile group 13 ('/data/oradata/ocrl/redo/redo13_stb01.log') size 50M;
SQL> select group#,thread#,sequence#,archived,status from v$standby_log;
3.设置数据库口令文件的使用模式
执行以下命令查看remote_login_passwordfile的值是否EXCLUSIVE
SQL>show parameter remote_login_passwordfile;
如果不是,执行以下命令进行设置,并且重启数据库,使其生效:
SQL>alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;
SQL>shutdown immediate;
SQL>startup;
4.参数设置
DG的搭建需要修改许多数据库的参数,并且部分参数主备库之间有点区别,这需要各位在配置过程细心一点。
a) 主库的参数配置
SQL>show parameter db_unique_name
SQL> alter system set log_archive_config='dg_config=(ocrl,ocrls)' scope=spfile;
其中dg_config填写的是主备库的db_unique_name。
设置归档日志的存放位置:
SQL>alter system set log_archive_dest_1='LOCATION=/data/oradata/ocrl/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=ocrl' scope=spfile;
SQL>alter system set log_archive_dest_2='SERVICE=ocrls ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ocrls' scope=spfile;
注:第一个ocrls是tnsname.ora的连接名,第二个ocrls是DB_UNIQUE_NAME
启用设置的日志路径:
SQL>alter system set log_archive_dest_state_1=enable scope=spfile;
SQL>alter system set log_archive_dest_state_2=enable scope=spfile;
设置归档日志进程的最大数量(视实际情况调整):
SQL>alter system set log_archive_max_processes=30 scope=both;
设置standby库从哪个数据库获取归档日志(只对standby库有效,在主库上设置是为了在故障切换后,主库可以成为备库使用):
SQL>alter system set fal_server=ocrls scope=both;
启用OMF功能:
SQL> alter system set db_create_file_dest='/data/oradata/ocrl/datafile' scope=spfile;
如果主备库文件的存放路径不同,还需要设置以下两个参数(需要重启数据库生效):
SQL> alter system set db_file_name_convert='/data/oradata/ocrls/datafile','/data/oradata/ocrl/datafile','/data/oradata/ocrls/tempfile','/data/oradata/ocrl/tempfile' scope=spfile;
SQL> alter system set log_file_name_convert='/data/oradata/ocrls/redo','/data/oradata/ocrl/redo' scope=spfile;
这步路径的先后顺序在主备库上的设置是不一样的,大家要注意!
b) 备库参数设置
完成了以上步骤后,通过以下命令生成一个pfile文件给备库使用:
SQL> create pfile from spfile;
打开生成的文件
修改部分参数,具体如下:
*.audit_file_dest='/u01/app/oracle/admin/ocrls/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/data/oradata/ocrls/control/control01.ctl','/data/oradata/ocrls/control/control02.ctl'#Restore Controlfile
*.db_block_size=8192
*.db_create_file_dest='/data/oradata/ocrls/datafile'
*.db_domain=''
*.db_file_name_convert='/data/oradata/ocrl/datafile','/data/oradata/ocrls/datafile','/data/oradata/ocrl/tempfile','/data/oradata/ocrls/tempfile'
*.db_name='ocrl' //(这个保持跟主库一样,不能修改)
*.db_unique_name='ocrls' //(设置备库的名字)
*. fal_server=ocrl
*.db_recovery_file_dest_size=10737418240
*.db_recovery_file_dest='/data/oradata/ocrls/flashback'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ocrlsXDB)'
*.fal_server='OCRL'
*.log_archive_config='dg_config=(ocrl,ocrls)'
*.log_archive_dest_1='LOCATION=/data/oradata/ocrls/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=ocrls'
*.log_archive_dest_2='SERVICE=ocrl ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ocrl'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=30
*.log_file_name_convert='/data/oradata/ocrl/redo','/data/oradata/ocrls/redo'
*.memory_target=718m
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
配置参数的时候要注意,有些地方跟主库的不一样哦!
c) 密码文件配置
密码文件是创建DG不可缺少的一部分,主库的密码文件一般在$ORACLE_HOME/dbs,命名格式是:orapw+db_unique_name
上图是主库的密码文件,如果不存在此文件,我们可以通过以下命令生成一个:
#su - oracle
$cd $ORACLE_HOME/dbs
$orapwd file=orapwocrl password=oracle
我们将密码文件和刚才修改好的pfile一起拷贝到备库的$ORACLE_HOME/dbs目录下,并重命名密码文件的名字:
主库上copy到备库的方法
备库上修改密码文件名和参数文件
5 .listener.ora与tnsnames.ora配置
这两个文件均在$ORACLE_HOME/network/admin目录下,如果没有,可以自行创建一下
a) 备库配置
listener.ora内容如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.44)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ocrls)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrls)
)
)
ADR_BASE_LISTENER =/u01/app/oracle/
tnsname.ora内容如下:
ocrls =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.44)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ocrls)
)
)
重启一下监听:
$lsnrctl stop
$lsnrctl start
做完以上配置后,在主备库上执行以下命令,确保两个主机之间网络相通:
$tnsping oratest
$tnsping testdg
主库上执行:
备库上执行:
b) 主库配置
listener.ora内容如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.44)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ocrls)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrls)
)
)
ADR_BASE_LISTENER =/u01/app/oracle/
tnsname.ora内容如下:
ocrl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.43)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ocrl)
)
)
ocrls =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.44)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ocrls)
)
)
执行以下命令重启监听,使配置生效:
$lsnrctl stop
$lsnrctl start
6. 目录创建
参数和网络配置好后,我们需要为备库dump文件创建相应的目录(对照主库$ORACLE_BASE/admin):
ocrls:/home/oracle@standby>mkdir -p $ORACLE_BASE/admin/ocrls/adump
ocrls:/home/oracle@standby>mkdir -p $ORACLE_BASE/admin/ocrls/dpdump
为数据库文件创建目录(就是之前db_file_name_convert和log_file_name_convert的目录)
ocrls:/data/oradata/ocrls@standby>mkdir -p /data/oradata/ocrls/redo/
ocrls:/data/oradata/ocrls@standby>mkdir -p /data/oradata/ocrls/datafile/
ocrls:/data/oradata/ocrls@standby>mkdir -p /data/oradata/ocrls/control/
7 .RMAN复制创建 standby库
准备工作都完成了,那我们可以开始standby库的创建了。
注:以下操作在备库完成
a) 文件复制
首先,我们使用之前修改的pfile把备库启动到nomount状态,生成spfile:
$echo $ORACLE_SID (确认SID是否我们设置的)
$sqlplus / as sysdba
SQL> startup nomount pfile='/u01/app/oracle/product/12.1.0/db_1/dbs/initocrls.ora'
SQL> create spfile from pfile;
SQL>shutdown immediate;
SQL>exit;
从spfile启动:
复制数据文件,在备库上操作
ocrls:/home/oracle@standby>rman target sys/oracle@ocrl auxiliary sys/oracle@ocrls
确认我们已经连接上主库和备库后,执行以下命令:
RMAN> duplicate target database for standby from active database;
命令执行完后,可以看到主库在开始复制文件到备库中
耐心等待任务的完成,如果中间有错误导致异常退出,需要根据错误信息进行分析。
以下表示执行成功:
复制完成后,打开数据库开启实时同步:
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect from session;
查看数据库状态
$sqlplus / as sysdba
SQL>select database_role from v$database;
登录到备库上查看:
$sqlplus / as sysdba
SQL>select database_role from v$database;
检查归档日志是否能正常传输(日志的序号必须是一样的):
主库
SQL> select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG;
备库
SQL> select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG;
b) 切换日志测试
主库
SQL> alter system switch logfile;
SQL> select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG;
备库
SQL> select max(sequence#) from v$archived_log;
这样,我们的DG已经配置成功了!
8 .故障切换
我们配置DG的目的就是为了在主库出现故障时,备库能够提供服务,保证业务的正常运行。DG的故障切换分为switchover和failover两种:
a) SWITCHOVER
switchover是用户有计划的进行停机切换,能够保证不丢失数据,下面我们来看下switchover是怎样操作的:
登录主库:
$sqlplus / as sysdba
SQL> select switchover_status from v$database;(查看主库状态)
查询结果是TO STANDBY 或 SESSIONS ACTIVE表明可以进行切换;
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
SQL>shutdown immediate;
SQL> startup mount;
SQL> select database_role from v$database;
登录备库:
$sqlplus / as sysdba
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
TO PRIMARY 或 SESSIONS ACTIVE表明可以切换成主库;
现在可以把备库切换成主库了
SQL> alter database commit to switchover to primary with session shutdown;
SQL> ALTER DATABASE OPEN;
SQL> select switchover_status,database_role,open_mode from v$database;
从上图可以看出,我们已经switchover切换成功了!
记住:这时候要在现在的备库上开启同步:
SQL> alter database recover managed standby database using current logfile disconnect from session;
b) FAILOVER
为了能够在failover后能够恢复DG,需要在主库上开启flashback,如果不开启flashback的话,DG只能重新构建相对比较麻烦。
由于主库已经不可访问,我们所有的操作都在备库完成:
SQL> alter database recover managed standby database cancel;
SQL> alter database recover managed standby database finish force;
SQL> select database_role from v$database;
SQL> alter database commit to switchover to primary;
SQL> alter database open; 或者 shutdown immediate+startup
现在利用flashback重建DG
在新的主库上执行下面操作:
SQL> select to_char(standby_became_primary_scn) from v$database;
在之前的主库上,也就是现在的备库上执行下面的操作:
SQL> startup mount
SQL> flashback database to scn 9978113; //这个值为在新主库上查询到的SCN值
SQL> alter database convert to physical standby;
SQL> shutdown immediate
SQL> startup
SQL> alter database recover managed standby database using current logfile disconnect from session;
至此failover 切换和切换过如何恢复就已经完成
三、 DG_broker配置
上面给大家讲解了DG切换的过程,是不是感觉DG的切换特别麻烦,步骤比较多,有没有办法实现就敲一条命令就可以完成所有的配置呢?答案是肯定的,DG_broker就是为此而诞生的,下面给大家演示下DG_broker使用:
DG_broker其实就是dgmgrl工具,安装数据库软件或数据库管理客户端都可以获取到这个工具,本文中是另外使用一台主机安装数据库软件进行配置。
首先我们配置dgmgrl主机的tnsnames.ora配置,具体参考上文DG配置部分,使其可以访问到主备库,接下来就是dgmgrl的配置了(之前我们做过switchover,所以下面的演示,主备库跟上文是相反的,大家要注意):
a) 配置broker
在主库上进行配置,也可以在备库上或者另找一台机器上配置都可以
修改dg_broker_config_file参数。如果是在RAC环境中,这个把这个文件把到共享的存储上面,如果有ASM可以放到ASM中。
修改一下监听
主库:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.43)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ocrl)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrl)
)
(SID_DESC =
(GLOBAL_DBNAME = ocrl_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrl)
)
)
备库
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.180.44)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ocrls)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrls)
)
(SID_DESC =
(GLOBAL_DBNAME = ocrls_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrls)
)
)
记住要重启监听
主库和备库上都要执行
SQL> show parameter dg_broker_config_file
这里就用默认的路径,也可以自己指定。
启用BROKER
在两个数据库上都执行:
SQL> alter system set dg_broker_start=true;
在其中任意一台做下面的操作就可以了,另它安装了client的客户端也是可以的.
这里选择在主库上执行
ocrl:/home/oracle@oracle1>dgmgrl
DGMGRL> connect sys/oracle@ocrl //连接数据库
DGMGRL> help create //help是帮助命令
DGMGRL> create configuration dg as primary database is ocrl connect identifier is ocrl;
这里报错:
这个错误可以通过在Primary 和 Standby上取消log_archive_dest_n参数来解决,实际这一块的参数应当是交给DG broker 来管理了,不再需要人为介入设置。
在主备库上执行下面的命令
SQL> alter system set log_archive_dest_2='';
再次执行:create configuration dg as primary database is ocrl connect identifier is ocrl;
启用配置文件
DGMGRL> enable configuration
增加备库到配置文件中
DGMGRL> help add
DGMGRL> add database ocrls as connect identifier is ocrls;
查看配置文件
DGMGRL> show configuration
查看某个数据库的配置消息
DGMGRL> show database verbose ocrl
DGMGRL> show database verbose ocrls
#这里要注意了。broker里面的连接的service_name是<db_unique_name>_DGMGRL,因为我们静态监听中的GLOBAL_NAME是DB_UNIQUE_NAME,所以这里我们要修改
StaticConnectIdentifier #不然在切换的时候会报错的。
所以上面要修改监听文件,如果不修改监听文件的话,那也可以执行下面的命令来修改StaticConnectIdentifier//这也是一种方法
DGMGRL>edit database corl set property StaticConnectIdentifier= '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.168.43)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ocrl)(INSTANCE_NAME=ocrl)(SERVER=DEDICATED)))';
DGMGRL> edit database ocrls set property StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.168.44)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ocrls)(INSTANCE_NAME=ocrls)(SERVER=DEDICATED)))';
b) 开始切换
DGMGRL> switchover to ocrls;
再次查看配置文件
DGMGRL> show configuration
发现主备已经成功完成切换了
四、 FSFO(fast start failover 快速启动故障)
DG_broker已经配置完了,可是还是需要我们进行手动切换,如果我们想让数据库自动切换,那么还需要配置FSFO了。
a) 启用闪回
FSFO 将闪回数据库用作将故障主数据库恢复为备用数据库流程的一部分,所以我们需要启用数据库的闪回功能:
主库和备库操作一样
设置闪回区的大小,这个大小要足够大,不然闪回区满了会导致数据库宕机
b) 启用FSFO
启用了主备库的闪回功能后,我们就可以启动FSFO了,登录dgmgrl连接主库:
ocrl:/home/oracle@oracle1>dgmgrl
DGMGRL> connect sys/oracle@ocrl
DGMGRL> show configuration
DGMGRL> enable fast_start failover;
可是我们发现DGMGRL告警了,那是因为我们没有启动观察器(observer)的原因,那我们接下来就启动观察器吧!(由于observer的启动会一直占用session 窗口的,所以建议写成脚本挂后台)
这里我们在备库上执行
登录dgmgrl主机执行以下命令:
nohup dgmgrl sys/oracle@ocrl "start observer file=FSFO.dat">>fsfo.log 2>&1 &
启动observer后,我们再看一下配置状态
DGMGRL> show configuration
这样我们的FSFO就配置完成了,下面我们模拟主库宕机后,FSFO的切换:
- 直接把主库的关掉
SQL> shutdown abort
- 查看我们observer的日志//在备库上
从日志中可以发现FSFO已经切换备库的角色了!
附录:
db_name:数据库名。数据库创建完成后,参数db_name被写入参数文件,格式如下:db_name=oratest
SID:实例标识(OS环境变量中$ORACLE_SID)
db_unique_name:在Data Guard里,主从服务器中的数据库,都有一样的DB_NAME。然而它们和RAC环境下不一样,不代表同一个库(主备机中均有自己的数据库文件,不像RAC环境中通过多个实例通过磁盘阵列共享一个库)。但是它们的db_unique_name 是不一样的,用以标识不同的数据库,这个可以自己定义的。
service_name:服务名。service name是连接数据库的时候使用的别名。需要注意的是,service_name主要用于数据库网络连接时,可以有多个,可以随意命名,可以通过系统初始化参数service_name设置。一般情况下,service_name的缺省值为db_name.db_domain,同global_name相同。
Net service name:网络服务名,即连接描述符。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。网络服务名被记录在tnsnames.ora文件中,由自己随意命名。
global_name:全局数据库名。在windows操作系统中,利用Database Configuration Assistant创建数据库时,要求输入就是全局数据库名。通常,它的名字是由db_name.db_domain构成。
DG(DATA GUARD):是oracle数据库实现高可用的一种方式,主库通过redo apply(针对物理standby库)或sql apply(针对逻辑standby库)方式实现主库与备库的同步,本文中的standby库均为物理standby。
DG_BROKER:由于DG的切换需要管理员输入一堆命令,并且切换步骤繁琐,影响数据库主备切换的速度。此工具可以帮助管理员只输入一条指令即可实现数据库的主备切换。
FSFO(Fast-Start Failover快速启动故障切换):依赖于DG_BROKER,实现DG环境自动故障切换(在未配置前,DG的主备切换需要人工干预)