Dataguard日常维护及故障解决

一、   dataguard环境要求

2.1数据库版本必须为企业版,版本最好在9i以上,主备库数据库的版本必须一致。

2.2 主备数据库所在操作系统版本以及位数要求一样。

2.3 主备库硬件配置可以不一样,看具体应用。

2.4 主数据库和备数据库都可以是单实例的,也可以是RAC

2.5 同一个dataguard环境中数据库名必须一样。主备库的目录结构要求一样(逻辑备库可以不一样)。

2.6关闭192.168.113.133的双机(服务、实例、监听)

2.7Share和mount后cp文件

2.8Unix转换dos2unix –ascii copy….sh copy….sh

二、   对主库的修改

3.1修改归档方式

要使用dataguard做数据库容灾,主库必须处于归档模式下。如果已经是归档模式则跳过此步。修改归档模式步骤

SQL> archive log list;

Database log mode             No Archive Mode

Automatic archival            Disabled

Archive destination           /opt/arch

Oldest online log sequence    1

Current log sequence          3

可见当前数据库处于非归档模式.

--关闭数据库

SQL> shutdown immediate;   

启动数据库到mount阶段

SQL> startup mount;

修改数据库为归档模式

SQL> alter database archivelog;

Database altered.

打开数据库

SQL> alter database open;

查看当前数据库模式

SQL> archive log list;

Database log mode             Archive Mode

Automatic archival            Enabled

Archive destination           /opt/arch

Oldest online log sequence    1

Next log sequence to archive  3

Current log sequence          3

可见数据库已经处于归档模式 。

归档模式修改完成。

3.2打开Forced Logging模式

   查询当前日志模式

   SQL>select FORCE_LOGGING from v$database;

       FOR

       ---

       NO

   可见当前数据库为非强制日志模式

   修改数据库为强制日志模式

   SQL> alter database force logging;

       Database altered.

   再次查询

   SQL> select FORCE_LOGGING from v$database;

       FOR

       ---

       Yes

提示:关于FORCE LOGGING

想必大家知道有一些DDL语句可以通过指定NOLOGGING子句的方式避免写redo log(目的是提高速度,某些时候确实有效),指定数据库为FORCE LOGGING模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作而忽略类似NOLOGGING之类的指定参数。如果在执行force logging时有nologging之类的语句在执行,则force logging会等待直到这类语句全部执行。FORCE LOGGING是做为固定参数保存在控制文件中,因此其不受重启之类操作的影响(只执行一次即可),如果想取消,可以通过alter database no force logging语句关闭强制记录。

3.3创建密码文件

   [oracle@localhost ~]$ orapwd file=orapworcl password=123 force=y

   该密码文件默认生成位置为$ORACLE_HOME/dbs目录.主备库的密码必须一致,否则归档日志无法在主备库之间同步。

3.4修改初始化参数

增加以下参数,如果在初始化参数已经有配置,则看需要做相应的修改。

1、与主库角色相关的初始化参数说明:

DB_NAME

注意保持同一个Data Guard环境中所有数据库DB_NAME相同

DB_UNIQUE_NAME

为每一个数据库指定一个唯一的名称,以标示同一个dataguard环境中不同的数据库。

LOG_ARCHIVE_CONFIG 

该参数通过DG_CONFIG属性罗列同一个Data Guard中所有DB_UNIQUE_NAME(含主库db及备库db),以逗号分隔。

例如:LOG_ARCHIVE_CONFIG='DB_CONFIG=(orcl,orcl2)'

LOG_ARCHIVE_DEST_n 

归档文件的生成路径。该参数非常重要,dataguard就是通过这里的设置传输日志的。

LOG_ARCHIVE_DEST_STATE_n

指定参数值为ENABLE,标示对应的LOG_ARCHIVE_DEST_n参数是否有效。

REMOTE_LOGIN_PASSWORDFILE

推荐设置参数值为EXCLUSIVE或者SHARED,注意保证相同Data Guard配置中所有db服务器sys密码相同。如果不同日志传输会失败。数据库默认是EXCLUSIVE,一般不用修改。

LOG_ARCHIVE_FORMAT

指定归档文件格式。一般也不用修改,保持默认即可

 

2、以下参数为备库角色相关的参数,建议在主库的初始化参数中也进行设置,这样在主备库角色相互转换后不需要做修改dataguard也能正常运行。

FAL_SERVER 

指定备库到主数据库的连接服务名,FAL_SERVER = orcl2日志所在服务器。

FAL_CLIENT 

指定主库到备库的连接服务名,FAL_CLIENT = orcl日志接收客户端。

 

STANDBY_FILE_MANAGEMENT

如果主库的数据文件发生修改(如新建,重命名等)则按照本参数的设置在备库中做相应修改。设为AUTO表示自动管理。设为MANUAL表示需要手工管理。

例如:STANDBY_FILE_MANAGEMENT=AUTO

 

下面开始修改主库的初始化参数。

db_name参数已经设置,不用修改

SQL> alter system set db_unique_name =’orcl’ scope=spfile;

System altered.

 

SQL> alter system set log_archive_config='dg_config=(orcl,orcl2)' scope=spfile;

System altered.

---这里的orcl和orcl2为db_unique_name

 

SQL> alter system set log_archive_dest_1='location=/opt/arch' scope=spfile;

System altered.

--/opt/arch为本地的归档目录,需要手动创建该目录,当然也可以指定别的路径。

注意oracle账号对该目录又可读写的权限。

 

SQL> alter system set log_archive_dest_state_1=enable scope=spfile;

System altered.

--这个通常不用修改,系统默认的就是enable。

SQL>alter system set log_archive_dest_2='service=orcl2

valid_for=(online_logfiles,primary_role) arch async NOAFFIRM

db_unique_name=orcl2' scope=spfile;

System altered.

-----这里的service为主库连接到备库的服务名,后面会在tnsnames.ora文件中配置

valid_for参数说明这个归档日志目的地在本数据库为主库的角色下才需要把online_logfile传输到备库去。arch async NOAFFIRM说明的是同步的方式,这个同步的方式有三种方式,最大保护,最大性能,最大可用。每个方式有不同的设置,具体见第五项说明。

 

SQL> alter system set log_archive_dest_state_2=enable scope=spfile;

System altered.

以上修改的是作为主库角色需要的参数,为了方便以后主备库切换,建议在主库中也配置作为备库角色的相关参数。

SQL> alter system set fal_server=orcl2 scope=spfile;

System altered.

 

SQL> alter system set fal_client=orcl scope=spfile;

System altered.

 

SQL> alter system set standby_file_management=auto scope=spfile;

System altered.

生成静态参数文件,以备后面给备库使用。

SQL> create pfile from spfile;

File created.

重新启动主库,使参数生效。

3.5用rman工具备份主库

创建一个备份文件存放目录,本例为/opt/rmanbk,同时赋予oracle账号可读写该目录。

[root@localhost opt]# mkdir rmanbk

[root@localhost opt]# chown oracle:oinstall rmanbk

--注意以上用root账号创建目录

开始备份数据库

[oracle@localhost ~]$ rman target /

Recovery Manager: Release10.2.0.1.0 - Production on Tue Aug 17 09:40:45 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: ORCL (DBID=1564056489)

RMAN>backup full database format='/opt/rmanbk/%d_%s.dbf' plus archivelog delete input;

 

Starting backup at 17-AUG-10

current log archived

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=147 devtype=DISK

channel ORA_DISK_1: starting archive log backupset

channel ORA_DISK_1: specifying archive log(s) in backup set

input archive log thread=1 sequence=3 recid=1 stamp=727261781

input archive log thread=1 sequence=4 recid=2 stamp=727263902

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2010_08_17/o1_mf_annnn_TAG20100817T094503_66mtf0qt_.bkp tag=TAG20100817T094503 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:04

channel ORA_DISK_1: deleting archive log(s)

archive log filename=/opt/arch/1_3_726573806.dbf recid=1 stamp=727261781

archive log filename=/opt/arch/1_4_726573806.dbf recid=2 stamp=727263902

Finished backup at 17-AUG-10

 

Starting backup at 17-AUG-10

using channel ORA_DISK_1

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/opt/oradata/orcl/system01.dbf

input datafile fno=00003 name=/opt/oradata/orcl/sysaux01.dbf

input datafile fno=00002 name=/opt/oradata/orcl/undotbs01.dbf

input datafile fno=00004 name=/opt/oradata/orcl/users01.dbf

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/rmanbk/ORCL_2.dbf tag=TAG20100817T094507 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:01:05

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/rmanbk/ORCL_3.dbf tag=TAG20100817T094507 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

Finished backup at 17-AUG-10

 

Starting backup at 17-AUG-10

current log archived

using channel ORA_DISK_1

channel ORA_DISK_1: starting archive log backupset

channel ORA_DISK_1: specifying archive log(s) in backup set

input archive log thread=1 sequence=5 recid=3 stamp=727263976

channel ORA_DISK_1: starting piece 1 at 17-AUG-10

channel ORA_DISK_1: finished piece 1 at 17-AUG-10

piece handle=/opt/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2010_08_17/o1_mf_annnn_TAG20100817T094616_66mth9qz_.bkp tag=TAG20100817T094616 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02

channel ORA_DISK_1: deleting archive log(s)

archive log filename=/opt/arch/1_5_726573806.dbf recid=3 stamp=727263976

Finished backup at 17-AUG-10

主库备份完成

3.6创建备库控制文件

SQL> alter database create standby controlfile as '/opt/rmanbk/control01.ctl';

 

Database altered.

创建一个备库使用的控制文件。

到此我们已经为备库准备好了静态参数文件,备库控制文件,主库数据库备份。

在备库主机上建一目录,把上述文件通过scp命令传输到备库主机上。其中备份目录要和主库上的备份目录路径一样,不然在用rman还原备库时候会找不到文件。即在备库上也建一个目录/opt/rmanbk,我们把所有的文件都放在这个目录下。

[oracle@localhost ~]$ scp /opt/rmanbk/* [email protected]:/opt/rmanbk/

The authenticity of host '192.168.18.205 (192.168.18.205)' can't be established.

RSA key fingerprint is de:b4:0e:e6:c5:56:71:47:e1:69:5e:f1:c5:8b:48:b4.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.18.205' (RSA) to the list of known hosts.

[email protected]'s password:

control01.ctl                                    100% 6896KB  6.7MB/s  00:00   

ORCL_2.dbf                                  100% 523MB 11.6MB/s  00:45   

ORCL_3.dbf                                      100% 6976KB  6.8MB/s  00:00 

上述已经传输了备份文件和备库的控制文件,下面把主库的静态参数文件传输到备库

[oracle@localhost~]$

scp $ORACLE_HOME/dbs/initorcl.ora [email protected]:/opt/rmanbk/

[email protected]'s password:

initorcl.ora                                    100% 1419    1.4KB/s  00:00

3.7创建备库的redo log

 

sql> alter database add standby logfile group 4 ('D:\oracle\product\10.2.0\oradata\smsdb\STANDBYRD01.LOG') size 50M;

sql> alter database add standby logfile group 5 ('D:\oracle\product\10.2.0\oradata\smsdb\STANDBYRD02.LOG') size 50M;

 sql> alter database add standby logfile group 6 ('D:\oracle\product\10.2.0\oradata\smsdb\STANDBYRD03.LOG') size 50M;

3.8修改listener.ora和tnsnames.ora

修改listener.ora文件,修改这部分内容,目的是使用oracle服务在监听器中静态注册。

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

 )

修改成(增加红色部分内容)

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

   (SID_DESC =

     (GLOBAL_DBNAME = orcl)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (SID_NAME = orcl)

   )

  )

【备注】

当使用静态注册的时候, 

(SID_NAME = orcl)中的sid_name务必要小写,不管数据库中instance_name参数是否是大写。不然通过静态注册的服务无法连接数据库实例。同oracle用户的环境变量ORACLE_SID一样,也必须用小写。

修改静态注册可以使用netmgr工具配置。

修改tnsnames.ora文件,增加主库连接到备库的服务名并修改对本地的连接用ip表示.

这样主备库可以统一。

orcl =

 (DESCRIPTION =

   (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.18.32)(PORT = 1521))

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = orcl)

   )

 )

orcl2 =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.18.205)(PORT = 1521))

   )

   (CONNECT_DATA =

     (SERVICE_NAME = orcl2)

   )

 )

 

host地址根据实际情况修改。

到此对主库的修改基本完成。

三、   对备库的修改

4.1设置oracle环境变量和oracle实例名

修改oracle账号根目录下的.bash_profile文件。增加红色部分代码。目的是创建一个数据库实例sid。

[oracle@localhost ~]$ vi .bash_profile

# .bash_profile

 

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

       . ~/.bashrc

fi

 

# User specific environment and startup programs

 

PATH=$PATH:$HOME/bin

 

export PATH

export LC_ALL=en_US.UTF-8

export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1

export PATH=$PATH:$ORACLE_HOME/bin

export NLS_LANG=american_america.ZHS16GBK

export ORACLE_SID=orcl2

4.2建立备库的参数文件

备库的参数文件我们根据主库的参数文件做一些修改即可。

拷贝/opt/rmanbk/initorcl.ora到$ORACLE_HOME/dbs/initorcl2.ora。注意要修改参数文件名称。(oracle数据库默认的静态参数文件名称为init+$ORACLE_SID+.ora)

[oracle@localhost ~]$ cp /opt/rmanbk/initorcl.ora $ORACLE_HOME/dbs/initorcl2.ora

修改initorcl2.ora文件内容,需要修改的部分以及修改后如下:

*.db_unique_name='ORCL2'

*.fal_client='ORCL2'  

*.fal_server='ORCL'

*.log_archive_dest_2='service=orcl valid_for=(online_logfiles,primary_role) arch async NOAFFIRM db_unique_name=orcl'

删除*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

删除 (如果备库不存在flash目录则删除)

*.db_recovery_file_dest='/opt/oracle/product/10.2.0/db_1/flash_recovery_area'

删除(如果备库不存在flash目录则删除)

*.db_recovery_file_dest_size=2147483648

 

别的不需要改动。尽量保持主备库的sga和pga相关参数一样。

 

4.3建立备库相关的目录

参考主库在备库上建立相关的数据库目录

[oracle@localhost ~]$ mkdir /opt/arch

创建备库的本地归档目录

[oracle@localhost ~]$ mkdir /opt/oradata/orcl 

创建数据库目录

[oracle@localhost ~]$ mkdir /opt/rmanbk

创建数据库备份文件目录

[oracle@localhost ~]$  

mkdir -p $ORACLE_HOME/admin/orcl/{adump,bdump,cdump,dpdump,pfile,udump}

创建数据库后台运行日志目录,这些目录是需要同参数文件中的设置一致的。

4.4建立备库密码文件

可以手动建也可以拷贝主库的密码文件,前提是主备库设置的密码要一致,否则日志传输会失败。

[oracle@localhost ~]$orapwd file=orapworcl2 password=123 force=y

注意文件名称不能有误,否则主库连接不上备库,导致归档日志同步失败

4.5修改listener.ora和tnsnames.ora

可以拷贝主库的listener.ora,tnsnames.ora,sqlnet.ora三个文件到备库。方法同上3.6。

sqlnet.ora文件和tnsnames.ora文件不用修改,与主库保持一样即可。

 

修改listener.ora文件,修改这部分内容,目的是使用oracle服务在监听器中静态注册。

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

 )

修改成(增加红色部分内容)

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (PROGRAM = extproc)

   )

   (SID_DESC =

     (GLOBAL_DBNAME = orcl2)

     (ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

     (SID_NAME = orcl2)

   )

  )

这个时候在主备库上分别用tnsping命令测试orcl和orcl2服务名看是否通。如果不通则修改检查以上文件配置是否正确。

[oracle@localhost admin]$ tnsping orcl2

TNSPingUtility for Linux: Version10.2.0.1.0 - Production on 18-AUG-2010 19:32:00

 

Copyright (c) 1997, 2005, Oracle. All rights reserved.

Used parameter files:

/opt/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora

 

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.205)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl2)))

OK (0 msec)

 

[oracle@localhost admin]$ tnsping orcl

TNSPingUtility for Linux: Version10.2.0.1.0 - Production on 18-AUG-2010 19:33:38

Copyright (c) 1997, 2005, Oracle. All rights reserved.

Used parameter files:

/opt/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora

 

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.18.32)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))

OK (10 msec)

从上面两个服务名均已经互通。

4.6恢复控制文件

拷贝三份备库控制文件到数据库目录

[oracle@localhost rmanbk]$ cp control01.ctl /opt/oradata/orcl/control01.ctl

[oracle@localhost rmanbk]$ cp control01.ctl /opt/oradata/orcl/control02.ctl

[oracle@localhost rmanbk]$ cp control01.ctl /opt/oradata/orcl/control03.ctl

4.7用RMAN还原出备库

[oracle@localhost ~]$ rman target /

Recovery Manager: Release10.2.0.1.0 - Production on Wed Aug 18 19:46:59 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database (not started)

RMAN> startup mount;

Oracle instance started

database mounted

Total System Global Area    167772160 bytes

Fixed Size                    1218292 bytes

Variable Size                62916876 bytes

Database Buffers             96468992 bytes

Redo Buffers                  7168000 bytes

启动数据库到mount阶段,准备还原

RMAN> restore database;

Starting restore at 18-AUG-10

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=157 devtype=DISK

 

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00001 to /opt/oradata/orcl/system01.dbf

restoring datafile 00002 to /opt/oradata/orcl/undotbs01.dbf

restoring datafile 00003 to /opt/oradata/orcl/sysaux01.dbf

restoring datafile 00004 to /opt/oradata/orcl/users01.dbf

channel ORA_DISK_1: reading from backup piece /opt/rmanbk/ORCL_2.dbf

channel ORA_DISK_1: restored backup piece 1

piece handle=/opt/rmanbk/ORCL_2.dbf tag=TAG20100817T094507

channel ORA_DISK_1: restore complete, elapsed time: 00:01:05

Finished restore at 18-AUG-10

RMAN>exit

退出rman恢复管理器

到此备库基本建立完成。

4.8开启备库

创建备库的动态参数文件

SQL> create spfile from pfile;

关闭数据库

SQL> shutdown immediate;

启动备库到mount状态

SQL> startup mount;

开始应用日志恢复

SQL> alter database recover managed standby database disconnect from session;

使备库处于日志恢复模式(备用模式)。

SQL> select process,status from v$managed_standby;

PROCESS  STATUS

--------- ------------

ARCH     CONNECTED

ARCH     CONNECTED

RFS      IDLE

MRP0     WAIT_FOR_LOG

这时候备库的进程有以上几个,

RFS - 远程文件接收进程

MRP0 -日志应用进程

 

到此,需要测试一下备库是否可以接收到主库的归档日志。可在主库中手动归档一个日志文件(alter system switch logfile),然后查看在备库的归档目录中是否生成有新的归档日志文件,也可以在备库中用一下语句查询是否存在日志归档记录。

select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

 

备注:

对于物理备库(physical standby)来说,处于日志恢复模式的时候数据库是不能打开的。如果要打开只能先关闭日志恢复模式,然后以read only(只读方式)打开。

(oracle11G版本可以在read only下应用归档日志)

SQL>alter database recover managed standby database cancel;

停止日志恢复模式

SQL>alter database open read only;

打开数据库。

物理备库在只读模式下可以增加临时文件。
SQL> alter database temp add tempfile '/opt/oradata/orcl/temp02.dbf' size100mreuse;

这个时候备库还是可以接收主库传输过来的归档日志文件,只是不能应用日志而已。

当用read only方式打开备库后只有重新启动才能使备库重新回到备用模式。

4.9切换到DATAGUARD最大可用模式并开启实时应用

一般情况下,到4.8步骤为止,dataguard的物理备库已经可以正常使用了。只是这时dataguard处于默认的最大性能模式,这个模式下,主库的重做日志只有在归档之后才会传输到备库上,然后备库才会应用日志。如果在归档之前主库数据库意外down机,那么这部分未归档的数据肯会丢失。为了避免这种情况的发生,可以使用最大可用模式。Oracle推荐最大可用模式使用LGWR ASYNC(异步)NOAFFIRM模式传输。实际的生产库推荐这种模式。在standby不可用时,最大可用模式会自动降低成最大性能模式,所以standby故障不会导致primay不可用。对于dataguard模式的介绍。以下是在dataguard默认的最大性能模式下切换到实际生成用途的最大可用模式.

 

1,在备库上增加备用重做日志文件,大小跟主库的在线重做日志一样。组的数量最好比在线重做日志多一两组(可调)。

sql>alterdatabaserecovermanagedstandbydatabasecancel;

--先取消日志应用

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup4('/opt/oradata/primary/std_redo01.log')size50M;

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup5 ('/opt/oradata/primary/std_redo02.log')size50M;

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup6 ('/opt/oradata/primary/std_redo03.log')size50M;

sql > system altered

sql>alterdatabaseaddstandbylogfilegroup7

 ('/opt/oradata/primary/std_redo04.log')size50M;

sql > system altered

 

sql>recovermanagedstandbydatabasedisconnectfromsession;

------非实时应用模式或者用下面的语句开启备库的实时应用模式

sql>recovermanagedstandbydatabaseusing current logfile

disconnectfromsession;

 

鉴于后面主备库切换的需要,在主库上也增加备用重做日志。当然要把主库处于mount状态下才可添加。可在下面统一修改。

2,在主库上做修改(两个地方:一个是修改log_archive_dest_2参数,二是添加备用日志文件)

sql>shutdownimmediate;

sql> startupmount;

sql>altersystemsetlog_archive_dest_2=’service=orcl

 valid_for=(online_logfiles,priamry_role) lgwr async noaffirm

db_unique_name=orcl2’scope=spfile;

sql>alterdatabaseaddstandbylogfilegroup4('/opt/oradata/primary/std_redo01.log')size50M;

sql>systemaltered

sql>alterdatabaseaddstandbylogfilegroup5 ('/opt/oradata/primary/std_redo02.log')size50M;

sql>systemaltered

sql>alterdatabaseaddstandbylogfilegroup6 ('/opt/oradata/primary/std_redo03.log')size50M;

sql>systemaltered

sql>alterdatabaseaddstandbylogfilegroup7

 ('/opt/oradata/primary/std_redo04.log')size50M;

sql>systemaltered

sql > alter database set standby database to maximize availability;

--------切换到最大可用模式

sql > alter database open;

打开数据库

 

【注意事项】

1,lgwr async noaffirm参数下主库的模式保护级别为RESYNCHRONIZATION

 

SQL>selectdatabase_role,PROTECTION_MODE,PROTECTION_LEVELfromv$database;

DATABASE_ROLE   PROTECTION_MODE     PROTECTION_LEVEL

-----------   ----------------    ---------------

PRIMARY        MAXIMUMAVAILABILITYRESYNCHRONIZATION

 

备库的查询结果为:UNPROTECTED

 

DATABASE_ROLE     PROTECTION_MODE     PROTECTION_LEVEL

---------------- -------------------- --------------------

PHYSICALSTANDBY  UNPROTECTED         UNPROTECTED

 

2,lgwr sync affirm参数下主库的模式保护级别为MAXIMUMAVAILABILITY

 

SQL>selectdatabase_role,PROTECTION_MODE,PROTECTION_LEVELfromv$database;

DATABASE_ROLE   PROTECTION_MODE     PROTECTION_LEVEL

-----------   ----------------    ---------------

PRIMARY        MAXIMUMAVAILABILITYMAXIMUMAVAILABILITY

 

备库的查询结果为:MAXIMUMAVAILABILITY

 

DATABASE_ROLE     PROTECTION_MODE          PROTECTION_LEVEL

---------------- --------------------     --------------------

PHYSICALSTANDBY  MAXIMUMAVAILABILITY    MAXIMUMAVAILABILITY

 

为了不给生产库带来太大的影响,推荐使用第一种参数。对于主库采用lgwr传输日志的方式。日志是实时传输的,至于备库是否采用实时恢复模式都是不会丢失数据的。

四、   DATAGUARD的三种保护模式说明

Dataguard有三种保护模式,最大保护、最大可用性和最大性能,对主库的性能影响和对网络的要求依次降低。
  在最大保护模式下,备库一旦无法接收日志,主库的所有操作被挂起,与备库的日志传输恢复正常时才会恢复,如果挂起时间较长,主库实例会中断,因此一般生产环境中很少会使用这种模式。在最大可用性模式下,当与备库的日志传输断开时,主库会自动切换到最大性能模式。dataguard默认的配置是最大性能模式。

三种模式的日志同步参数设置如下表:

 

最大保护模式

最大可用模式

最大性能模式

Redo archival process

LGWR

LGWR

LGWR or ARCH

Network transmission
mode

SYNC

SYNC

SYNC or ASYNC when using LGWR process. SYNC if using ARCH process.

Disk write option

AFFIRM

AFFIRM

AFFIRM or NOAFFIRM

Standby redo log required?

Yes

Yes

No, but it is recommended

 三种模式在故障发生时候得不同点如下表:

 

最大保护模式

最大可用模式

最大性能模式

对主数据库性能影响

最大

中等

最小

数据丢失可能性

不会

正常情况下不会丢数据,除非刚刚处于最大性能模式

会丢数据

故障发生时描述

当备库日志不可到达时,主数据库会down机,不适合生成用途。

当备库的日志不可到达时会自动切换到最大性能模式。故障排除后自动切换回最大可用模式。

备库日志不可到达不会影响主库的可用性。

是否需要standy redo file

需要

需要

不需要

最大保护和最大可用模式都需要用到备用重做日志(standby redo logfile )

添加原则:

standby redo log的文件大小与primary数据库online redo log文件大小相同。

standby redo log的组数最好比主库多。

添加方法:

先停止备库的日志应用。

sql>alter database recover managed standby database cancel;

sql > alter database add standby logfile group 4

('/opt/oradata/primary/std_redo01.log') size50M;

 

sql > alter database add standby logfile group 5

('/opt/oradata/primary/std_redo02.log') size50M;

 

sql > alter database add standby logfile group 6

('/opt/oradata/primary/std_redo03.log') size50M;

 

sql > alter database add standby logfile group 7

('/opt/oradata/primary/std_redo04.log') size50M;

 

sql>alter database recover managed standby database disconnect from session;

鉴于主备发生角色转换的需要,也应该在主库上同样添加备用日志文件。

切换standby的保护模式,在主库上执行


SQL>ALTER DATABASE SET STANDBY DATABASE TO maximize protection;
SQL>ALTER DATABASE SET STANDBY DATABASE TO maximize performance;

缺省的保护模式
SQL>ALTER DATABASE SET STANDBY DATABASE TO maximize availability;
说明:切换保护模式的操作必须在primay执行,且primay必须处于mount状态,如果在open状态执行,则报ORA-01126错。
ORA-01126: database must be mounted EXCLUSIVE and not open for this operation。
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database set standby database to maximize availability;
SQL> alter database open;
     注:此处会报ORA-03113错误。
     ORA-03113: end-of-file on communication channel
     这时需要先修改日志传送方式为lgwr同步方式,否则,数据库是无法open的。
SQL> conn / as sysdba
SQL> startup mount;
SQL> alter system set log_archive_dest_2='service=orcl2 lgwr sync affirm

db_unique_name=orcl2';
SQL> alter database open;

 

【注意】在主库修改了保护模式后需要重启后,备库的保护模式才会被修改.只有最大可用和最大保护模式才可能实现DG的数据实时同步。修改实时同步的方法:

SQL> alter database recover managed standby database using current logfile disconnect from session;

 

五、   Dataguard日常维护

6.1主备库的起停和维护

Dataguard关闭(先关主库再关备库)

Dataguard开启(先开备库再开主库)

6.2日常的监控视图

1,select dest_name,status,error from v$archive_dest;

在主库上执行只主要是查看日志归档目的地是否可用,如果远程归档目录不可用则error会显示错误信息。

SQL> select dest_name,status,error from v$archive_dest;

 

DEST_NAME           STATUS              ERROR

-------------------- -------------------- --------------------

LOG_ARCHIVE_DEST_1  VALID

LOG_ARCHIVE_DEST_2  VALID

LOG_ARCHIVE_DEST_3  INACTIVE

LOG_ARCHIVE_DEST_4  INACTIVE

LOG_ARCHIVE_DEST_5  INACTIVE

LOG_ARCHIVE_DEST_6  INACTIVE

LOG_ARCHIVE_DEST_7  INACTIVE

LOG_ARCHIVE_DEST_8  INACTIVE

LOG_ARCHIVE_DEST_9  INACTIVE

LOG_ARCHIVE_DEST_10 INACTIVE

10 rows selected.

如上记录则代表备库归档日志目录有效且正常。

 

2,select database_role,LOG_MODE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;主要查询数据库的主备角色,以及当前dataguard保护的模式,主备库上查询结果不同。

 

SQL>select database_role,LOG_MODE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

 

DATABASE_ROLE   LOG_MODE    PROTECTION_MODE     PROTECTION_LEVEL

---------------- ------------ -------------------- --------------------

PRIMARY         ARCHIVELOG  MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

 

3, select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

主要查询归档日志的应用情况。主备库上查询结果不同,在主库上对于每个归档文件会有

两条记录。下面是在备库上的查询结果,可以看见日志应用都YES。

SQL> select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

NAME                           SEQUENCE# APP

------------------------------ ---------- ---

/opt/arch/1_5_726573806.dbf            5 YES

/opt/arch/1_6_726573806.dbf            6 YES

/opt/arch/1_7_726573806.dbf            7 YES

/opt/arch/1_8_726573806.dbf            8 YES

/opt/arch/1_9_726573806.dbf            9 YES

/opt/arch/1_10_726573806.dbf          10 YES

/opt/arch/1_11_726573806.dbf          11 YES

/opt/arch/1_12_726573806.dbf          12 YES

/opt/arch/1_13_726573806.dbf          13 YES

如果有发现日志不连续,则需要对照主库的归档日志序列,判断是否有丢失的日志,如果有则需要手动注册日志并应用归档。(方法:从主库的归档目录拷贝相应的归档文件到备库上注册alter database register physical logfile '/opt/arch/归档文件名’;然后手动应用日志alter database recover automatic standby database;

在测试过程中发现oracle10G下把丢失的归档日志文件考入指定目录会自动注册,不需手动注册。)

 

4,select process,status from v$managed_standby;

--查询主备库上的进程信息。

5,select message_num,message from v$dataguard_status;

--查看dataguard的状态信息。

6,select * from v$archive_gap;

--在备库检查是否有日志缺失

6.3主备库的切换方法

主备库的切换主要在两种情况下切换,Switchover和Failover,这两种切换都需要手工执行完成。

一是Switchover(计划中的切换,不会丢失数据)

二是Failover(当主库出现故障的时候需要主备库切换角色)

1,Switchover的切换方法

主库端:

select switchover_status from v$database;

如果是to standby表可以正常切换.

直接执行alter database commit to switchover to physical standby;

否则执行:alter database commit to switchover to physical standby with session shutdown;

shutdown immediate;

startup nomount;

alter database mount standby database;

alter database recover managed standby database disconnect from session;

 

备库端:

select switchover_status from v$database;

如果是to_primary表可以正常切换.

执行: alter database commit to switchover to primary;

否则执行: alter database commit to switchover to primary with session shutdown;

shutdown immediate;

startup;

2,Failover切换方法

(1)判断主数据库确实出现严重的硬件故障或其他原因导致主数据库无法启动。

(2)在物理备用数据库上检查是否有archive redo log gaps

   SQL>SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

(3)消除archive redo log gaps

从主数据库上或其他备份的地方把没有传到物理备用数据库的archive redo log传到物理备用数据库上,并注册到物理备用数据库的controlfile中。

  SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'archive redo log文件名称';

重复2,3步骤直到V$ARCHIVE_GAP视图无记录存在。

(4)在物理备用数据库上发起failover操作

SQL > ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

(5)把物理备用数据库转化成主用角色

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

(6)把新的主用数据库重新启动

  SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP;

(7)对新的主用数据库做全备份.

6.4归档日志的处理

1, 物理备库中已经应用的归档日志需定期删除.

 rman> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

删除7天前的归档日志文件。删除之后最好做一个全备份。

2, 先手动删除归档日志文件,然后再RMAN里执行下面2条命令以更新控制文件
crosscheck archivelog all;
delete expired archivelog all;

3, 取消对备库传送日志
ALTER SYSTEM SET log_archive_dest_state_2=’DEFER’ ;

 

六、   常见故障

7.1备库重启后,在主库上归档出现ORA-03113错误

SQL> select dest_name,status,error from v$archive_dest;

 

DEST_NAME                     STATUS                        ERROR

------------------------------ --------

LOG_ARCHIVE_DEST_1           VALID

LOG_ARCHIVE_DEST_2      ERROR          ORA-03113: end-of-file on   communication channel

解决办法:在主库执行

SQL> alter system set log_archive_dest_state_2= enable;

这个命令式手动触发主库区尝试连接备库。

其实这种情况下,只要保证主备库之间的网络和配置是正确的。dataguard会自动恢复这个错误。这个周期默认是300秒,也可以在log_archive_dest_2的参数中添加reopen参数指定这个主备库之间失败后继续尝试的周期。

7.2ORA-01031: insufficient privileges错误

SQL> select dest_name,status,error from v$archive_dest;

DEST_NAME                     STATUS                        ERROR

---------------------- -----------------------------------------------

LOG_ARCHIVE_DEST_1            VALID

LOG_ARCHIVE_DEST_2            ERROR             ORA-01031: insufficient

                                                             Privileges

解决办法:统一主备库的数据库密码文件,或者重建密码文件,sys密码设置成一样。

然后在主库执行

SQL> alter system set log_archive_dest_state_2= enable;

7.3ORA-16191: Primary log shipping client not logged on standby

SQL> select dest_name,status,error from v$archive_dest;

 

DEST_NAME                     STATUS                        ERROR

------------------------------ -----------

LOG_ARCHIVE_DEST_1            VALID

LOG_ARCHIVE_DEST_2           ERROR                    ORA-16191: Primary log   shipping client not logged on standby

解决办法:统一主备库的数据库密码文件,或者重建密码文件,sys密码设置成一样。

然后在主库执行

SQL> alter system set log_archive_dest_state_2= enable;

7.4发现备库一直无法应用日志,MRP0进程显示WAIT_FOR_GAP的问题

发现从主库传来的日志无法应用

在备库检查,
SQL> select sequence#,applied from v$archived_log;

 SEQUENCE# APP
———- —
       930 NO
       931 NO
       932 NO
       933 NO
       934 NO
       935 NO
       936 NO
       937 NO
       938 NO
       939 NO
       940 NO
然后开始查看有没有mrp

[oracle@HJITBACKUP bdump]$ ps -ef | grep mrp
oracle   31896     1  0 14:37 ?        00:00:00 ora_mrp0_flow
oracle   32001 31820  0 15:17 pts/1    00:00:00 grep mrp

看来有,接着查gap,发现备库上有此进程,

SQL> select * from v$archive_gap
  2  ;

no rows selected

查询视图没有发现,

在接着检查V$MANAGED_STANDBY

SQL> select process,status from v$managed_standby;

PROCESS   STATUS
——— ————
ARCH      CONNECTED
ARCH      CONNECTED
MRP0     WAIT_FOR_GAP
RFS       IDLE
RFS       IDLE

发现MRP0在等待GAP,进一步查看此视图

select process,status,group#,thread#,sequence#,block#,blocks from v$managed_standby;

PROCESS   STATUS       GROUP#        THREAD#  SEQUENCE#     BLOCK#     BLOCKS
——— ———— ———- ———- ———- ———- ———-
ARCH      CONNECTED    N/A                 0          0          0          0
ARCH      CONNECTED    N/A                 0          0          0          0
MRP0      WAIT_FOR_GAP N/A                 1       928          0          0
RFS       IDLE         N/A                 0          0          0          0
RFS       IDLE         N/A                 0          0          0          0
发现日志928没有应用,

原来是由于主库删除了928,导致备库没法应用,所以只能从备份中恢复,restore archivelog
至此问题处理完毕。

查询备库状态
SQL> select process,status from v$managed_standby;

PROCESS   STATUS
——— ————
ARCH      CONNECTED
ARCH      CONNECTED
MRP0      WAIT_FOR_LOG
RFS       IDLE
RFS       IDLE
所以当standby装完后,在主库切换日志后,这里状态应该是
MRP0      WAIT_FOR_LOG才是正常的状态

七、   注意事项

建议在主备库的涉及到名称地方都统一用小写字母,避免在配置过程出现莫名的错误。

如果在主库执行alter database clear unarchived logfile或alter database open resetlogs,则dataguard要重建。

在连续恢复模式下工作之前,需要保证之前所有的归档日志己经应用到备用库上。因为在连续恢复模式的情况下,oracle不会应用之前的归档日志,而只会应用后面陆续到来的归档日志。

新建表、表空间、datafile都能通过日志应用到备库,但新建一个临时表空间和rename datafile均不能应用到备库上。

出现归档日志gap时,需要找出相应的归档日志,然后将这些归档日志copy到备用节点的log_archive_dest目录下面。然后ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;

应当实时察看standby库的alert文件,就能清晰明了地知道主备更新的情况。这也是排错的重要方法。

 

相关视图

V$ARCHIVE_DEST
V$ARCHIVE_DEST_STATUS
V$ARCHIVE_GAP
V$ARCHIVED_LOG
V$DATABASE
V$DATAFILE
V$DATAGUARD_STATUS
V$LOG
V$LOGFILE
V$LOG_HISTORY
V$STANDBY_LOG

你可能感兴趣的:(数据库)