DataGuard环境:
操作系统:redhat4.7
Primary数据库:
IP地址:10.85.10.1。
数据库SID:orcl
DB_UNIQUE_NAME:orcl_pd
Standby数据库:
IP地址:10.85.10.2
数据库SID:orcl。
DB_UNIQUE_NAME:orcl_st
一.Primary端的配置
1.主库设置为forcelogging模式
SQL>alterdatabaseforcelogging;
2.主库设为归档模式
SQL>archiveloglist;
SQL>shutdownimmediate
SQL>startupmount
SQL>alterdatabasearchivelog;
SQL>archiveloglist;
3.添加redologfile
添加一个新的StandbyRedologs组(注意组号不要与当前存在的OnlineRedologs组重复),并为该组指定一个成员:
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP4('/u01/app/oracle/oradata/orcl/redo04.log')size50M;
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP5('/u01/app/oracle/oradata/orcl/redo05.log')size50M;
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP6('/u01/app/oracle/oradata/orcl/redo06.log')size50M;
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP7('/u01/app/oracle/oradata/orcl/redo07.log')size50M;
4.修改listener.ora和tnsnames.ora文件
Listener.ora文件:
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PLSExtProc)
(ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
(PROGRAM=extproc)
)
(SID_DESC=
(GLOBAL_DBNAME=orcl)
(ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
(SID_NAME=orcl)
)
)
LISTENER=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost.localdomain)(PORT=1521))
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
)
)
注意:SID_LIST_LISTENER配置的是静态注册,如果没有该参数,而且DataGuard启动顺序又不正确,那么在主库可能会报PING[ARC1]:Heartbeatfailedtoconnecttostandby'orcl_st'.Erroris12514.错误,导致归档无法完成。
OracleListener动态注册与静态注册
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx
Tnsnames.ora文件
ORCL_ST=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.2)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
ORCL_PD=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.1)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
5.创建备库的密码文件和控制文件
SQL>alterdatabasecreatestandbycontrolfileas'/u01/control01.ctl';
--说明:判断一个数据库是Primary还是Standby,就是通过控制文件来判断的。
[oracle@localhostdbs]$orapwdfile=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworclpassword=admin
如果已经存在,就不用创建了。缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)
6.修改初始化参数文件
SQL>createpfile='/u01/initorcl.ora'fromspfile;
在initorcl.ora 添加如下内容:
####主库参数######
*.DB_NAME ='orcl';
#--监听中配置的
*.DB_UNIQUE_NAME='orcl_pd'
#--列出DG中所有DB_UNIQUE_NAME
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_pd,orcl_st)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pd'
*.LOG_ARCHIVE_DEST_2='service=orcl_stDB_UNIQUE_NAME=orcl_st'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
#####备库参数#######
*.FAL_SERVER=orcl_st
*.FAL_CLIENT=orcl_pd
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/archive'
#如果主备库目录不同,还需要添加:
#*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
#*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
--注意:orcl_st,orcl_pd是在tnsnames文件中配置的
用'/u01/initorcl.ora'这个pfile启动数据库,并生成spfile。
SQL>shutdownimmediate
Databaseclosed.
Databasedismounted.
ORACLEinstanceshutdown.
SQL>startuppfile='/u01/initorcl.ora';
ORACLEinstancestarted.
TotalSystemGlobalArea167772160bytes
FixedSize1218316bytes
VariableSize79694068bytes
DatabaseBuffers83886080bytes
RedoBuffers2973696bytes
Databasemounted.
Databaseopened.
SQL>createspfilefrompfile='/u01/initorcl.ora';
Filecreated.
二.Standby端配置
1.创建备库存放数据文件和后台跟踪目录,这个目录可以和主库相同,如果不同,就需要在主库的初始化文件中进行转换。
如:
*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
$ORACLE_BASE/ORADATA/ORCL
$ORACLE_BASE/admin/orcl
$ORACLE_BASE/admin/orcl/adump
$ORACLE_BASE/admin/orcl/bdump
$ORACLE_BASE/admin/orcl/cdump
$ORACLE_BASE/admin/orcl/dpdump
$ORACLE_BASE/admin/orcl/pfile
$ORACLE_BASE/admin/orcl/udump
$ORACLE_BASE/admin/orcl/
2.将主库的密码文件,控制文件,数据文件,参数文件,日志文件copy到备库。
说明一点,这个控制文件是我们自己创建的standby控制文件。将copy过来的控制文件再复制三份就可以了。主备的控制文件是不一样的。这里除了采用直接copy文件之外,还可以采用Rman恢复来做。直接copy需要停数据库,如果采用RMAN的话,就不需要停机了。
[oracle@localhostorcl]$pwd
/u01/app/oracle/oradata/orcl
[oracle@localhostorcl]$ls
control01.ctlredo01.logredo04.logredo07.logtemp01.dbf
control02.ctlredo02.logredo05.logsysaux01.dbfundotbs01.dbf
control03.ctlredo03.logredo06.logsystem01.dbfusers01.dbf
[oracle@localhostorcl]$scp*.dbf10.85.10.2://u01/app/oracle/oradata/orcl
[oracle@localhostu01]$scp*.ctl10.85.10.2://u01/app/oracle/oradata/orcl
[oracle@localhostu01]$scp*.log10.85.10.2://u01/app/oracle/oradata/orcl
[oracle@localhostu01]$scpinitorcl.ora10.85.10.2://u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@localhostdbs]$scporapworcl10.85.10.2://u01/app/oracle/product/10.2.0/db_1/dbs
3.修改初始化参数文件
修改之后如下:
####主库参数######
*.DB_NAME ='orcl';
#--监听中配置的
*.DB_UNIQUE_NAME='orcl_pd'
#--列出DG中所有DB_UNIQUE_NAME
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_pd,orcl_st)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_st'
*.LOG_ARCHIVE_DEST_2='service=orcl_pdDB_UNIQUE_NAME=orcl_pd'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
#####备库参数#######
*.FAL_SERVER=orcl_pd
*.FAL_CLIENT=orcl_st
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/archive'
#如果主备库目录不同,还需要添加:
#*.log_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
#*.db_file_name_convert='/u02/oradata/orcl/','/u03/oradata/orcl/'
4.修改listener.ora和tnsnames.ora文件,如果不存在,就从主库上copy过去。
5.在备库添加redologfile
如果主库没有添加redologfile,可以先用copy过来的初始化文件将数据库启动到mount状态。在创建个spfile,最后添加redolog。
SQL>startupmountpfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora'
ORACLEinstancestarted.
SQL>createspfilefrompfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';
添加一个新的StandbyRedologs组(注意组号不要与当前存在的OnlineRedologs组重复),并为该组指定一个成员:
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP4('/u01/app/oracle/oradata/orcl/redo04.log')size50M;
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP5('/u01/app/oracle/oradata/orcl/redo05.log')size50M;
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP6('/u01/app/oracle/oradata/orcl/redo06.log')size50M;
SQL>ALTERDATABASEADDSTANDBYLOGFILEGROUP7('/u01/app/oracle/oradata/orcl/redo07.log')size50M;
提示,由于从Primary数据库复制文件时并没有复制OnlineRedologs,因此物理Standby数据库在第一次启动REDO应用时,会在Alert文件中报OnlineRedoLogfile文件不存在,没有关系,物理Standby会自动重建这批文件,同时你也不用担心会丢失数据,OnlineRedologs中的数据会以归档文件的形式从Primary端接收。
至此,DataGuard的操作已经完成,下面来开始验证。
注意DataGuard启动顺序:
启动顺序:先standby,后primary;
关闭顺序:先primary后standby;
在备库将实例启动到mount状态:
SQL>startupnomount;
SQL>alterdatabasemountstandbydatabase;
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASECANCEL;
SQL>alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;
在备库启动监听:
$lsnrctlstart
在主库启动实例:
SQL>startup;
在主库启动监听:
$lsnrctlstart
在主库验证归档目录是否有效:
SQL>SELECTSTATUS,DESTINATION,ERRORFROMV$ARCHIVE_DEST;
如果有错误,要排查原因。
SQL>altersystemswitchlogfile;
SQL>selectmax(sequence#)fromv$archived_log;
MAX(SEQUENCE#)
--------------
70
主备查询结果一致,DataGuard搭建结束。
注意:如果在主库执行alterdatabaseclearunarchivedlogfile或alterdatabaseopenresetlogs, 则dataguard要重建。
三.一些其他操作
1.首先查看当前的保护模式---primary数据库操作
SQL>selectprotection_mode,protection_levelfromv$database;
PROTECTION_MODEPROTECTION_LEVEL
----------------------------------------
MAXIMUMPERFORMANCEMAXIMUMPERFORMANCE
2.设置新的数据保护模式并重启数据库--primary数据库操作
当保护模式更改顺序:
maximizeprotection--->maximizeavailability---->maximizeperformance
当在把dataguard的保护级别按这上面的顺序减低的时候,不需要primary库在mount状态,否则primary必须在mount状态。
如:
SQL>alterdatabasesetstandbydatabasetomaximizeavailability;
alterdatabasesetstandbydatabasetomaximizeavailability
*
ERRORatline1:
ORA-01126:databasemustbemountedinthisinstanceandnotopeninany
instance
SQL>shutdownimmediate
Databaseclosed.
Databasedismounted.
ORACLEinstanceshutdown.
SQL>startupmount;
ORACLEinstancestarted.
TotalSystemGlobalArea167772160bytes
FixedSize1218316bytes
VariableSize79694068bytes
DatabaseBuffers83886080bytes
RedoBuffers2973696bytes
Databasemounted.
SQL>alterdatabasesetstandbydatabasetomaximizeavailability;
Databasealtered.
SQL>alterdatabaseopen;
alterdatabaseopen
*
ERRORatline1:
ORA-03113:end-of-fileoncommunicationchannel
报错了,这是因为最大可用性需要先修改日志传送方式为lgwr同步方式,否则,数据库是无法open.
Maximumprotection/AVAILABILITY模式必须满足以下条件
RedoArchivalProcess:LGWR
NetworkTranmissionmode:SYNC
DiskWriteOption:AFFIRM
StandbyRedoLogs:Yes
standbydatabasetype:PhysicalOnly
SQL>altersystemsetlog_archive_dest_2='service=orcl_stlgwrsyncAFFIRM';
Systemaltered.
SQL>shutdownimmediate
Databaseclosed.
Databasedismounted.
ORACLEinstanceshutdown.
SQL>startupmount;
ORACLEinstancestarted.
TotalSystemGlobalArea167772160bytes
FixedSize1218316bytes
VariableSize79694068bytes
DatabaseBuffers83886080bytes
RedoBuffers2973696bytes
Databasemounted.
SQL>alterdatabasesetstandbydatabasetomaximizeavailability;
Databasealtered.
SQL>alterdatabaseopen;
Databasealtered.
SQL>selectprotection_mode,protection_levelfromv$database;
PROTECTION_MODEPROTECTION_LEVEL
----------------------------------------
MAXIMUMAVAILABILITYMAXIMUMAVAILABILITY
alterdatabasesetstandbydatabasetomaximizeperformance;
提示:maximize后可跟{PROTECTION|AVAILABILITY|PERFORMANCE},分别对应最大保护,最高可用性及最高性能。
在最大保护模式下,直接关闭备库是不行的,如果在备库上关闭数据库,会有如下提示:
SQL>shutdownimmediate
ORA-01154:databasebusy.Open,close,mount,anddismountnotallowednow
SQL>
在最大保护模式下,备库是不允许关闭的,此时首先关闭主库,然后备库就可以顺利关闭了。
注意:主库的保护模式修改之后,备库的模式也会改变,和主库保持一致。
3.查看日志归档情况
主库进行日志切换:
SQL>Altersystemswitchlogfile;
selectmax(sequence#)fromv$archived_log;
selectmax(sequence#)fromv$log_history;
selectgroup#,sequence#,archived,statusfromv$log;
selectname,sequence#,appliedfromv$archived_log;
selectsequence#,appliedfromv$archived_log;
若不同步,
1)看log日志,archive是否有丢失
2)可以在备库坐如下操作:
alterdatabaserecovermanagedstandbydatabasecancel;
alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;
四.主备库切换
4.1Switchover
一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATAGUARD环境不会被破坏,原来DATAGUARD环境中的所有物理和逻辑STANDBY都可以继续工作。
在进行DATAGUARD的物理STANDBY切换前需要注意:
1)确认主库和从库间网络连接通畅;
2)确认没有活动的会话连接在数据库中;
3)PRIMARY数据库处于打开的状态,STANDBY数据库处于MOUNT状态;
4)确保STANDBY数据库处于ARCHIVELOG模式;
5)如果设置了REDO应用的延迟,那么将这个设置去掉;
6)确保配置了主库和从库的初始化参数,使得切换完成后,DATAGUARD机制可以顺利的运行。
主库:
1.查看switchover状态
SQL>SELECTSWITCHOVER_STATUSFROMV$DATABASE;
SWITCHOVER_STATUS
--------------------
TOSTANDBY
附:A:switchover_status出现sessionactive/notallowed
当出现sessionactive的时候表示还有活动的session,则运行
Alterdatabasecommittoswitchovertophysicalstandbywithsessionshutdown;
当出现notallowed时,在官方文档说转换会不成功,但是我测试的时候成功了。
B.ora-01153:anincompatiblemediarecoveryisactive
运行下面代码
Alterdatabaserecovermanagedstandbydatabasefinish;
或者Alterdatabaserecovermanagedstandbydatabasefinishforce;
Alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;
2切换成备库
SQL>Alterdatabasecommittoswitchovertophysicalstandbywithsessionshutdown;
或者
SQL>ALTERDATABASECOMMITTOSWITCHOVERTOPHYSICALSTANDBY;
Databasealtered.
3启动到mount和应用日志状态
SQL>SHUTDOWNIMMEDIATE
SQL>startupnomount;
SQL>alterdatabasemountstandbydatabase;
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEDISCONNECTFROMSESSION;
4.查看数据库模式
SQL>selectdest_name,status,database_mode,recovery_mode,protection_modefromv$archive_dest_status;
SQL>selectstatus,database_modefromv$archive_dest_status;
备库:
1.查看switchover状态
SQL>SELECTSWITCHOVER_STATUSFROMV$DATABASE;
TOPRIMARY
附:若不是用此语句切换:ALTERDATABASECOMMITTOSWITCHOVERTOPRIMARYwithsessionshutdown
补充:若出现:ORA-16139:mediarecoveryrequired
是因为没有执行:alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;
2.切换成主库
SQL>ALTERDATABASECOMMITTOSWITCHOVERTOPRIMARY;
Databasealtered.
SQL>shutdownimmediate;
SQL>startup;
SQL>altersystemswitchlogfile;
3.查看数据库模式
SQL>selectdest_name,status,database_mode,recovery_mode,protection_modefromv$archive_dest_status;
SQL>selectstatus,database_modefromv$archive_dest_status;
验证同步:
SQL>selectmax(sequence#)fromv$archived_log;
MAX(SEQUENCE#)
--------------
78
4.2.Failovers:
FAILOVER切换一般是PRIMARY数据库发生故障后的切换,这种情况是STANDBY数据库发挥其作用的情况。这种切换发生后,可能会造成数据的丢失。而且这个过程不是可逆的,DATAGUARD环境会被破坏。
由于PRIMARY数据库已经无法启动,所以FAILOVER切换所需的条件并不多,只要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。
1. 查看是否有日志GAP,没有应用的日志:
SQL>SELECTUNIQUETHREAD#,MAX(SEQUENCE#)OVER(PARTITIONBYTHREAD#)LASTFROMV$ARCHIVED_LOG;
SQL>SELECTTHREAD#,LOW_SEQUENCE#,HIGH_SEQUENCE#FROMV$ARCHIVE_GAP;
如果有,则拷贝过来并且注册
SQL>ALTERDATABASEREGISTERPHYSICALLOGFILE'路径';
重复查看直到没有应用的日志:
2.然后停止应用归档:
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASECANCEL;
Databasealtered.
3.下面将STANDBY数据库切换为PRIMARY数据库:
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEFINISH;
或SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEFINISHFORCE;
Databasealtered.
SQL>SELECTDATABASE_ROLEFROMV$DATABASE;
DATABASE_ROLE
----------------
PHYSICALSTANDBY
SQL>ALTERDATABASECOMMITTOSWITCHOVERTOPRIMARY;
Databasealtered.
SQL>ALTERDATABASEOPEN;或者shutdownimmediate+startup
Databasealtered.
检查数据库是否已经切换成功:
SQL>SELECTDATABASE_ROLEFROMV$DATABASE;
DATABASE_ROLE
----------------
PRIMARY
至此,FAILOVER切换完成。这个时候应该马上对新的PRIMARY数据库进行备份。