一.oracle data guard 主要用于确保企业数据的高可用,数据保护和容灾恢复。
二.典型的dg 配置包含一个主库和一个或若干个备库。主库用于正常的企业操作使用,并且将redo 数据传送到备库中。备库可以在远程机器上,也可以再本机。通常配置如下图
三.data guard 的保护模式
①Maximum availability这种保护模式提供了最高级别的数据保护,不惜牺牲主库的可用性。在这种模式下,只有主库产生的需要recover的那些redo data 至少写入到了一个相同步的standby database 的standby redo log里,主库的事务才会提交。这种模式确保了数据的零丢失
②Maximum performance这种模式是data guard默认的保护模式,也算是最高级别的保护模式,不过不会影响主库的性能。只要事物产生的那些redo data 被写到了online log上事物就可以提交。这些redo data也需要向其他一个或多个的备库写,它可以和事物提交不同步。所以主库的性能在向备库写 redo data时不会受到影响。
③Maximum protection这种模式可以 确保当主机宕机时没有数据丢失。这种模式是在提交事物之前必须将要恢复的redo data写入到online log 和至少一个的standby database中,为了防止数据丢失,当redo data无法写入到被库时,主库直接shutdown。
四.配置
主库
IP: 192.168.163.139
sid: eras
db_unique_name: primary
备库
IP: 192.168.163.140
sid: eras
db_unique_name standby
1.数据库设置为归档模式,归档目录/home/oracle/archivelog/
关闭数据库,重启加载 sql>shutdown immediate; sql>startup mount;
设置归档,并创建归档目录sql>alter database archivelog; sql>!mkdir -p /home/oracle/archivelog
设置主备参数 sql>alter system set log_archive_dest_1=’location=/home/oracle/archivelog/ valid_for=(all_logfiles,all_roles) db_unqique_name=primary’ scope=spfile; (主库)
sql>alter system set log_archive_dest_1=’location=/home/oracle/archivelog/ valid_for=(all_logfiles,all_roles) db_unique_name=standby’ scope=spfile; (备库)
设置归档日志格式sql>alter system set log_archive_format=’%t_%s_%r.arc’ scope =spfile;
sql>alter system set remote_login_passwordfile=exclusive scope =spfile;
sql> alter database open
sql>alter system archive log start;
2.启用数据库闪回功能
查看闪回目录sql>show parameter db_recovery_file_dest;
修改闪回目录打下sql>alter system set db_recovery_file_dest_size=10G;
查看闪回功能的启用状态sql>select flashback_on from v$database;
启用闪回功能sql>alter database flashback on;
3.查看data guard是否安装,如未安装,需安装
sql>select * from v$option where parameter=’Oracle Data Guard’;
4.设置强制记录日志
sql>alter database force logging;
5.设置自动管理备库文件
sql>alter system set standby_file_management=’AUTO’;
6.添加日志文件组
在建立standby logfile时需要注意,standby logfile的大小不小于online redo log files的大小
查询 online redo log files 的大小 sql>select group#,bytes/1024/1024 as M from v$log;
一般,standby logfiles 日志文件组数要比primary数据库的online redo log files 日志文件组数至少多一个。
※不建议组号group#紧挨着online redo log file的组号,可以从11到14建立standby logfile
新建目录dg
sql>!mkdir /u01/app/oracle/oradata/eras/dg
sql>!chmod 777 /u01/app/oracle/oradata/eras/dg
添加日志文件组
sql>alter database add standby logfile group 11 ‘/u01/app/oracle/oradata/eras/dg/standby11.log’ size 50M;
sql>alter database add standby logfile group 12 ‘/u01/app/oracle/oradata/eras/dg/standby12.log’ size 50M;
sql>alter database add standby logfile group 13 ‘/u01/app/oracle/oradata/eras/dg/standby13.log’ size 50M;
sql>alter database add standby logfile group 14 ‘/u01/app/oracle/oradata/eras/dg/standby14.log’ size 50M;
※以上所有步骤,出标有主备的其他的主备库都一样。都需要执行一遍。
7.配置db_unique_name
先查看db_unique_name sql>show parameter db_unique_name;
主库: sql>alter system set db_unique_name=’primary’ scope=spfile;
备库: sql>alter system set db_unique_name=’standby’ scope=spfile;
名字加上引号保存的就是小写的,不加引号会自动保存成大写。
8.配置fal_server
主库: sql>alter system set fal_server=’standby’ scope=spfile;
sql>alter system set log_archive_config=’dg_config=(primary,standby)’ scope=spfile;
备库: sql>alter system set fal_server=’primary’ scope=spfile;
sql>alter system set log_archive_config=’dg_config=(primary,standby)’ scope=spfile;
9.配置重做日志到备库
主库: sql>alter system set log_archive_dest_2=’service=standby async valid_for=(online_logfiles,primary_role) db_unique_name=standby’ scope=spfile;
备库: sql>alter system set log_archive_dest_2=’service=primary async valid_for=(online_logfiles,primary_role) db_unique_name=primary’ scope=spfile;
10.复制主库密码文件到备库
密码文件位置为$ORACLE_HOME/dbs/orapweras
//生成密码文件(如果没有的话)
//orapwd file=$ORACLE_HOME/dbs/orapweras password=Oracle1521
关闭主备库
sql>shutdown immediate;
复制文件
scp /u01/app/oracle/product/12.1.0.2/db_1/dbs/orapweras [email protected]:/u01/app/oracle/product/12.1.0.2/db_1/dbs
提示输入密码
备库oracle用户的密码输入即可
11.复制主库standby控制文件到备库
备库控制文件在两个地方,因此需要复制两次
/u01/app/oracle/oradata/eras/control01.ctl
/u01/app/oracle/fast_recovery_area/eras/control02.ctl
关闭主备库sql>shutdown immediate;
主库
生成standby控制文件
sql>startup mount;
sql>alter database create standby controlfile as ‘/home/oracle/standby.ctl’;
sql>shutdown immediate;
复制改文件到备库
scp /home/oracle/standby1.ctl [email protected]:/u01/app/oracle/oradata/eras/control01.ctl
scp /home/oracle/standby1.ctl [email protected]:/u01/app/oracle/fast_recovery_area/eras/control02.ctl
12.配置主备库的listener.ora、tnsnames.ora文件
路径:$ORACLE_HOME/network/admin/listener.ora
(配置完后,主库终端执行tnsping standby,备库终端执行tnsping primary 如果都为ok则配置成功)
主库
vim $ORACLE_HOME/network/admin/listener.ora
SID_LIST=LISTENER=
(SID_LIST=
(SID_DESC=
(
(GLOBAL_DBNAME=primary)
(ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/db_1)
(SID_NAME=eras)
)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.163.139)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
vim $ORACLE_HOME/network/admin/tnsnames.ora
primary=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.139)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=primary.localdomain)
)
)
standby=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.140)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=standby.localdomain)
)
)
备库
vim $ORACLE_HOME/network/admin/listener.ora
SID_LIST=LISTENER=
(SID_LIST=
(SID_DESC=
(
(GLOBAL_DBNAME=standby)
(ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/db_1)
(SID_NAME=eras)
)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.163.140)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
vim $ORACLE_HOME/network/admin/tnsnames.ora
primary=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.139)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=primary.localdomain)
)
)
standby=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.163.140)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=standby.localdomain)
)
)
重启监听
先重启备库
lsnrctl stop
lsnrctl start
后重启主库
lsnrctl stop
lsnrctl start
13.复制主库文件到备库(保证主备库数据文件一致)
关闭主备库sql>shutdown immediate;
主库
scp –rp /u01/app/oracle/oradata/eras/* [email protected]:/u01/app/oracle/oradata/eras
※复制时会把主库的control01.ctl也复制到备库中,这个文件和步骤11生成的不一样,因此仍需要在执行一次
scp /home/oracle/standby.ctl[email protected]:/u01/app/oracle/oradata/eras/control01.ctl
启动与关闭physical standby database
备库
lsnrctl start
主库
lsnrctl start
备库
startup nomount;
alter databse mount standby database;
启动redo应用
alter database recover managed standby database disconnect from session;
主库
startup;
主库
shutdown immediate;
备库
alter database recover managed standby database cancel;
shutdown immediate;
查看数据库状态
select name,open_mode,database_role,protection_mode from v$database;
检查standby配置是否成功
1)确认主、备库里的归档目的地配置及传送都是有效的
select dest_name,status,destination,error from v$archive_dest where dest_id<=2;
log_archive_dest_1和2状态应该是valid
2)确认主库重做日志是否被应用了。
select sequence#, first_time, next_time, applied, archived from v$archived_log;
如果归档和日志应用均正常,APPLIED 和 ARCHIVED 列都应该是 YES。如果没有应用redo,applied应该是NO
3)检查主库是否有重做日志缺口
如果一切正常,应该返回 VALID 和 NO GAP
select status, gap_status from v$archive_dest_status where dest_id = 2;
4)检查主、备库data guard状态是否有错
select * from v$dataguard_status order by timestamp;
5)测试日志序号是否正确
在主库切换几次日志:
alter system switch logfile;
查看主库日志序号:
select max(sequence#) from v$archived_log;
验证备库日志序号
select max(sequence#) from v$archived_log;
备库服务器管理
启动模式
shutdown immediate;
startup nomount;
alter database mount standby database;
alter database recover managed standby database disconnect from session;
shutdown immediate;
startup nomount;
alter database mount standby database;
alter database open read only;
recover managed standby database cancel;
alter database open read only;
recover managed standby database disconnect from session;
alter database recover managed standby database cancel;
alter database recover managed standby database cancel;
shutdown immediate;