转载三思哥的ORACLE RAC数据库配置Dataguard环境
ORACLE 中的RAC特性保护的是实例,RMAN特性保持的是数据,而Dataguard特性则是连实例带数据一块"保"了,三个特性相互配合能够在一定程度上构建一个安全可靠高可用的ORACLE数据库平台。
之前三思笔记系列文章分别描述过RAC的创建、RMAN管理以及Dataguard特性应用等方面的内容,本文将通过实践,演示如何为RAC数据库创—ataguard配置。
一、做足准备工作Dataguard 环境的配置就跟谈恋爱似的,不是一个人说了算,必须要两个人(Primary?db+Standby?db)相互配合。不过在这两个真正搭上线之前,临出门拾掇拾掇还是非常有必要的,最起码得照照镜子,看看眼神够不够犀利,腰肢够不够芙蓉,做好往前推三百年,往后推三百年,总共六百年无人超越的思想准备。
我个人认为,DBA是个很严谨的岗位,因此同样要求从事这项工作的人也尽可能严谨,准备这个事儿呢,是为了让后续的操作更稳妥。对于Dataguard环境的创建,这个准备并不复杂,就当是环境初始化吧,如果看过之前的三思笔记--一步一步学Dataguard,那么本步准备工作就可以直接跳过了。
设定环境如下:
JSSDB>?show?parameter?log_archive_dest
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
log_archive_dest?????????????????????string
log_archive_dest_1???????????????????string??????location=/data/oradata/jssdbn1
?????????????????????????????????????????????????/archivelog
log_archive_dest_10??????????????????string
log_archive_dest_2???????????????????string??????service=jssstd?lgwr?async?vali
?????????????????????????????????????????????????d_for=(online_logfiles,primary
?????????????????????????????????????????????????_role)?db_unique_name=jssstd
log_archive_dest_3???????????????????string
log_archive_dest_4???????????????????string
log_archive_dest_5???????????????????string
log_archive_dest_6???????????????????string
log_archive_dest_7???????????????????string
log_archive_dest_8???????????????????string
log_archive_dest_9???????????????????string
log_archive_dest_state_1?????????????string??????enable
log_archive_dest_state_10????????????string??????enable
log_archive_dest_state_2?????????????string??????enable
log_archive_dest_state_3?????????????string??????enable
log_archive_dest_state_4?????????????string??????enable
log_archive_dest_state_5?????????????string??????enable
log_archive_dest_state_6?????????????string??????enable
log_archive_dest_state_7?????????????string??????enable
log_archive_dest_state_8?????????????string??????enable
log_archive_dest_state_9?????????????string??????enable
JSSDB>?show?parameter?fal;
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
fal_client???????????????????????????string
fal_server???????????????????????????string
JSSDB>?show?parameter?file_name_convert;
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
db_file_name_convert?????????????????string
log_file_name_convert????????????????string
JSSDB>?show?parameter?standby_file_management;
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
standby_file_management??????????????string??????MANUAL再来看看Standby:
JSSSTD>?show?parameter?log_archive_dest
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
log_archive_dest?????????????????????string
log_archive_dest_1???????????????????string??????location=/data1/jssstd/arclog
?????????????????????????????????????????????????valid_for=(all_logfiles,all_ro
?????????????????????????????????????????????????les)?db_unique_name=jssstd
log_archive_dest_10??????????????????string
log_archive_dest_2???????????????????string
log_archive_dest_3???????????????????string
log_archive_dest_4???????????????????string
log_archive_dest_5???????????????????string
log_archive_dest_6???????????????????string
log_archive_dest_7???????????????????string
log_archive_dest_8???????????????????string
log_archive_dest_9???????????????????string
log_archive_dest_state_1?????????????string??????enable
log_archive_dest_state_10????????????string??????enable
log_archive_dest_state_2?????????????string??????enable
log_archive_dest_state_3?????????????string??????enable
log_archive_dest_state_4?????????????string??????enable
log_archive_dest_state_5?????????????string??????enable
log_archive_dest_state_6?????????????string??????enable
log_archive_dest_state_7?????????????string??????enable
log_archive_dest_state_8?????????????string??????enable
log_archive_dest_state_9?????????????string??????enable
JSSSTD>?show?parameter?fal?
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
fal_client???????????????????????????string??????JSSSTD
fal_server???????????????????????????string??????jssdbn1,?jssdbn2
JSSSTD>?show?parameter?file_name_convert
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
db_file_name_convert?????????????????string??????+ASMDISK1/jssdb/datafile,?/dat
?????????????????????????????????????????????????a1/jssstd,?+ASMDISK1/jssdb/tem
?????????????????????????????????????????????????pfile,?/data1/jssstd
log_file_name_convert????????????????string??????+ASMDISK1/jssdb/onlinelog,?/da
?????????????????????????????????????????????????ta1/jssstd
JSSSTD>?show?parameter?standby_file_management
NAME?????????????????????????????????TYPE????????VALUE
------------------------------------?-----------?------------------------------
standby_file_management??????????????string??????AUTO其实根本不用看,肯定不合格,因为前面就没配过,从上述返回信息可以看出,Standby没有任何向Primary发送归档的设置,Primary端也没有fal相关的设置,像*_file_name_convert这类参数也未设置,另外standby?redo等也不用看了,前面也根本未创建(不过对于测试环境,这个问题倒也不影响),接下来就是要改这些初始化参数,操作如下:
JSSDB>?alter?system?set?fal_server=jssstd;
System?altered.
JSSDB>?alter?system?set?fal_client=jssdb;
System?altered.
JSSDB>?alter?system?set?db_file_name_convert=¨/data1/jssstd¨,¨+ASMDISK1/jssdb¨?scope=spfile;
System?altered.
JSSDB>?alter?system?set?log_file_name_convert=¨/data1/jssstd¨,¨+ASMDISK1/jssdb¨?scope=spfile;
System?altered.
JSSSTD>?alter?system?set?log_archive_dest_2=¨service=jssdb?lgwr?async?valid_for=(online_logfiles,primary_role)?db_unique_name=jssdb¨;
System?altered.参数修改完毕,接下来开始进行角色转换。就本例而言,需要先到Primary端关闭其它实例仅保留一台实例,然后执行下列语句:
JSSDB>?alter?database?commit?to?switchover?to?physical?standby?with?session?shutdown;
Database?altered.with?session?shutdown 子句专门用来处理,执行转换操作时仍有用户在连接的情况,如果附加了该子句,Primary数据库执行switchover,就会自动断开仍在连接该实例的无关会话。
重启原Primary,重启过后原Primary就是在以Standby身份运行了:
JSSDB>?shutdown?immediate
ORA-01507:?database?not?mounted
ORACLE?instance?shut?down.
JSSDB>?startup?mount
ORACLE?instance?started.
Total?System?Global?Area??285212672?bytes
Fixed?Size??????????????????2083368?bytes
Variable?Size?????????????176162264?bytes
Database?Buffers??????????100663296?bytes
Redo?Buffers????????????????6303744?bytes
Database?mounted.
JSSDB>?select?DATABASE_ROLE,open_mode?from?v$database;
DATABASE_ROLE????OPEN_MODE
----------------?----------
PHYSICAL?STANDBY?MOUNTED转到原Standby端操作:
JSSSTD>?alter?database?commit?to?switchover?to?primary;
Database?altered.注意,此时Standby要确保已启动REDO应用,否则转换时有可能失败。
重新启动原Standby:
JSSSTD>?shutdown?immediate
ORA-01507:?database?not?mounted
ORACLE?instance?shut?down.
JSSSTD>?startup
ORACLE?instance?started.
Total?System?Global?Area??285212672?bytes
Fixed?Size??????????????????2083368?bytes
Variable?Size??????????????88081880?bytes
Database?Buffers??????????188743680?bytes
Redo?Buffers????????????????6303744?bytes
Database?mounted.
Database?opened.
JSSSTD>?select?DATABASE_ROLE,open_mode?from?v$database;
DATABASE_ROLE????OPEN_MODE
----------------?----------
PRIMARY??????????READ?WRITE新的Primary诞生了,切换下日志,看看Standby端的接收是否正常:
JSSSTD>?select?thread#,max(sequence#)?from?v$archived_log?group?by?thread#;
???THREAD#?MAX(SEQUENCE#)
----------?--------------
?????????1????????????311
?????????2????????????144
JSSSTD>?alter?system?switch?logfile;
System?altered.
JSSSTD>?select?thread#,max(sequence#)?from?v$archived_log?group?by?thread#;
???THREAD#?MAX(SEQUENCE#)
----------?--------------
?????????1????????????312
?????????2????????????144由于新的Primary只有一个实例,因此其实我们只需要关注thread#1生成的日志即可,转到新的Standby看看:
JSSDB>?select?thread#,max(sequence#)?from?v$archived_log?group?by?thread#;
???THREAD#?MAX(SEQUENCE#)
----------?--------------
?????????1????????????312
?????????2????????????144成功接收,角色转换基本成功鸟!