1.1 Dataguard实施前准备
Oracle安装分包括2块,安装DB 软件和升级。 如果是10g的话,可以先将DB升级到10.2.0.5。 升级的原因是为了避免某些bug。先安装软件,升级,升级完在用DBCA 创建实例。 这样比安装DB 和创建实例之后升级要简单点。
(1)redo 文件默认是50M,改成100M
(2)每个redo group里改成2个 redo logfile。 大小100M (只保留2组red log)
(3)检查一下字符集:ZHS16GBK
(4)设置SGA,PGA 大小。
OLTP 系统一般的规则是:
SGA=内存*80%*80%
PGA=内存*80%*20%
注释: 本次实施中 {SID} = oratest
2 Dataguard实施步骤
2.1 Primary端设置
2.1.1 设置oracle为归档模式
查看当前归档模式情况: archive log list
设置本地归档目录: 修改init{SID}.ora文件
*.log_archive_dest_1='LOCATION=/home/ora_arch'
*.log_archive_format='%t_%s_%r.dbf'
注意:
oracle startup启动数据库查询启动文件的顺序:
1. spfile{SID}.ora文件 (为二进制文件不可以手动更改)
2. spfile.ora文件
3. init{SID}.ora文件 (可以更改)
4. pfile.ora文件
设置为归档模式,命令如下:
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> archive log list;
2.1.2 设置主数据库为force logging 模式
SQL> alter database force logging;
2.1.3 添加red log file
添加一个新的Standby Redologs组(注意组号不要与当前存在的Online Redologs组重复),并为该组指定一个成员
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 100M;
2.1.4 创建备库的密码文件和控制文件
SQL> alter database create standby controlfile as '/home/u01/control01.ctl';
-- 说明: 判断一个数据库是Primary还是Standby,就是通过控制文件来判断的。
拷贝/home/u01/product/10R2/db/dbs/orapw{SID} 至 /home/u01.
2.1.5 修改初始化参数文件
SQL> create pfile='/home/u01/initorcl.ora' from spfile;
在initorcl.ora 添加如下内容:
*.DB_UNIQUE_NAME='PRIMARY'
*.FAL_CLIENT='primary'
*.FAL_SERVER='standby'
*.log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)'
*.log_archive_dest_1='LOCATION=/home/ora_arch db_unique_name=PRIMARY'
*.log_archive_dest_2='SERVICE=STANDBY DB_UNIQUE_NAME=STANDBY'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.standby_archive_dest='/home/ora_arch'
*.standby_file_management='AUTO'
注意:
如果主库和备库的数据文件位置不同,还需要加如下2个参数:
*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
TNS设置:
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.6)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.7)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
用'/home/u01/init{SID}.ora' 这个pfile 启动数据库,并生成spfile。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile='/home/u01/init{SID}.ora';
ORACLE instance started.
Total System Global Area 1090519040 bytes
Fixed Size 2020128 bytes
Variable Size 301993184 bytes
Database Buffers 771751936 bytes
Redo Buffers 14753792 bytes
SQL> create spfile from pfile='/home/u01/init{SID}.ora';
File created.
2.1.6 修改listener.ora 和tnsnames.ora 文件
Listener.ora 文件: (本次不做修改, 启动时先从库. 关闭时先关闭主库)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /home/u01/product/10R2/db)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /home/u01/product/10R2/db)
(SID_NAME = orctest
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
注意:SID_LIST_LISTENER 配置的是静态注册,如果没有该参数,而且Data Guard 启动顺序又不正确,那么在主库可能会报 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 错误,导致归档无法完成。
tnsnames.ora 文件
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.6)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.21.7)(PORT = 1521))
)
(CONNECT_DATA =
(SID = oratest)
)
)
2.2 Standby 端配置
2.2.1 创建备库存放数据文件和后台跟踪目录
这个目录可以和主库相同,如果不同,就需要在主库的初始化文件中进行转换。
如: *.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
2.2.2 将主库的密码文件,控制文件,数据文件,参数文件,日志文件copy到备库
说明一点,这个控制文件是我们自己创建的standby 控制文件。将copy过来的控制文件再复制三份就可以了。
主备的控制文件是不一样的。这里除了采用直接copy 文件之外,还可以采用Rman恢复来做。 直接copy 需要停数据库,如果采用RMAN 的话,就不需要停机了。
文件如下:
(初始安装oracle, 没有其他数据文件; 若对现网数据库做DG,需要拷贝相应的文件)
control01.ctl redo01.log redo04.log redo07.log temp01.dbf
control02.ctl redo02.log redo05.log sysaux01.dbf undotbs01.dbf
control03.ctl redo03.log redo06.log system01.dbf users01.dbf
2.2.3 修改初始化参数文件
修改之后如下:
*.log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)'
*.log_archive_dest_1='LOCATION=/home/ora_arch db_unique_name=STANDBY'
*.log_archive_dest_2='SERVICE=PRIMARY DB_UNIQUE_NAME=PRIMARY'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.fal_client='STANDBY'
*.fal_server='PRIMARY'
*.DB_UNIQUE_NAME='STANDBY'
*.standby_archive_dest='/home/ora_arch'
2.2.4 配置Listener.ora和tnsnames.ora
如果不存在,就从主库上copy 过去。
2.2.5 在备库添加redo log file
如果主库没有添加redo log file,可以先用copy 过来的初始化文件将数据库启动到mount 状态。在创建个spfile,最后添加redo log。
SQL> startup mount pfile='/home/u01/init{SID}.ora'
ORACLE instance started.
SQL> create spfile from pfile='/home/u01/init{SID}.ora';
添加一个新的Standby Redologs组(注意组号不要与当前存在的Online Redologs组重复),并为该组指定一个成员:
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/home/u01/product/oradata/oratest/redo04.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/home/u01/product/oradata/oratest/redo05.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/home/u01/product/oradata/oratest/redo06.log') size 100M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/home/u01/product/oradata/oratest/redo07.log') size 100M;
提示: 在主库上面已经添加了standby redologs 可以先用下面语句删除掉. 再重新添加
alter database drop standby logfile group 4;
查看配置情况:
SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;
GROUP# THREAD# SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
4 1 0 YES UNASSIGNED
5 0 0 YES UNASSIGNED
6 0 0 YES UNASSIGNED
7 0 0 YES UNASSIGNED
提示,由于从Primary数据库复制文件时并没有复制Online Redologs,因此物理Standby数据库在第一次启动REDO应用时,会在Alert文件中报Online Redo Logfile文件不存在,没有关系,物理Standby会自动重建这批文件,同时你也不用担心会丢失数据,Online Redologs中的数据会以归档文件的形式从Primary端接收。
至此,Data Guard 的操作已经完成,下面来开始验证。
注意: tns的primary和standby配置需要先通过测试. 保证通信无误后再启动双机服务.
Data Guard 启动顺序:
启动顺序:先standby ,后primary;
关闭顺序:先primary 后standby;
2.3 验证Dataguard状态
在备库将实例启动到mount 状态:
SQL> startup nomount;
SQL> alter database mount standby database ;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> alter database recover managed standby database disconnect from session;
//希望实时应用(MANAGED REAL TIME APPLY) 需要使用下面语句进行启动:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY USING CURRENT LOGFILE DISCONNECT FROM SESSION;
在备库启动监听:
$lsnrctl start
在主库启动实例:
SQL> startup;
在主库启动监听:
$lsnrctl start
在主库验证归档目录是否有效:
SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;
如果有错误,要排查原因。
SQL> alter system switch logfile;
查看归档日志情况.
SQL> archive log list;
主备查询结果一致,Data Guard 搭建结束。
3 主备切换
由于目前数据库由3台服务器组成,因此做主备切换后,需要重新对GIS分析数据库做Stream同步。 下面主要介绍主从切换。
Data Guard主从数据库双向切换:
A.准备工作
(1)首先查询主库状态,确认可以做切换:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
------------------
TO STANDBY
SWITCHOVER_STATUS有三个状态: to standby、 sessions active、 not allowed(该状态下无法切换)
(2)在从库上面确认所有的archive log 都已经apply:
select sequence#,first_time,next_time,applied from v$archived_log;
(3)在主库上switch logfile:
Alter system switch logfile;
(4)观察从库上已经 apply所有archive log:
select sequence#,first_time,next_time,applied from v$archived_log;
查看是否仍然有连接
select username,program from v$session where status='ACTIVE';
B.切换:
(1)将主库转变为可切换状态:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
--------此时会有日志切换,并传输到旧standby点。Standby端会自动cancel(查看alter{SId}.log日志。
(2)standby
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
(3)原primary
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
alter database mount standby database;
(4)原primary
alter system set log_archive_dest_state_2=defer scope=both;
(5)原standby
RECOVER MANAGED STANDBY DATABASE CANCEL-------系统已自动执行。(会报异常错误, 可忽略)
shutdown immediate;
startup
(6)原standby( new primary)
alter system set log_archive_dest_state_2=enable scope=both;
(7)新的primary
ALTER SYSTEM SWITCH LOGFILE;
查看archive log是否自动传输
(8)原来的primary 新的standby
RECOVER MANAGED STANDBY DATABASE disconnect; (清除原有日志信息)
(9)新的primary
ALTER SYSTEM SWITCH LOGFILE;
(10)新standby
archive log list; 查看
经测试,系统双向切换成功,目前整套系统工作正常。
4 主库失败,启用备库(Failovers)
1. 查看是否有日志GAP,没有应用的日志:
SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果有,则拷贝过来并且注册
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路径';
重复查看直到没有应用的日志:
2. 然后停止应用归档:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; Database altered.
3. 下面将STANDBY数据库切换为PRIMARY数据库:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
或SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
Database altered.
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
SQL> ALTER DATABASE OPEN; 或者 shutdown immediate+startup
Database altered.
检查数据库是否已经切换成功:
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PRIMARY
至此,FAILOVER切换完成。这个时候应该马上对新的PRIMARY数据库进行备份。