`
qjoycn
  • 浏览: 1214785 次
文章分类
社区版块
存档分类
最新评论

Oracle Data Guard Linux 平台 Physical Standby 搭建实例

 
阅读更多

DataGuard环境:

操作系统:redhat4.7

Primary数据库:

IP地址:10.85.10.1

数据库SIDorcl

DB_UNIQUE_NAMEorcl_pd

Standby数据库:

IP地址:10.85.10.2

数据库SIDorcl

DB_UNIQUE_NAMEorcl_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.oratnsnames.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.oraunix下的格式是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.oratnsnames.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;
关闭顺序:先primarystandby;

在备库将实例启动到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搭建结束。

注意:如果在主库执行alterdatabaseclearunarchivedlogfilealterdatabaseopenresetlogs, 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)确认没有活动的会话连接在数据库中;

3PRIMARY数据库处于打开的状态,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数据库进行备份。

<!--EndFragment-->
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics