一、 dataguard环境要求
2.1 数据库版本必须为企业版,版本最好在9i以上,主备库数据库的版本必须一致。
2.2 主备数据库所在操作系统版本以及位数要求一样。
2.3 主备库硬件配置可以不一样,看具体应用。
2.4 主数据库和备数据库都可以是单实例的,也可以是RAC。
2.5 同一个dataguard环境中数据库名必须一样。主备库的目录结构要求一样(逻辑备库可以不一样)。
2.6 关闭192.168.113.133的双机(服务、实例、监听)
2.7 Share和mount后cp文件
2.8 Unix转换 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: Release 10.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/* oracle@192.168.18.205:/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.
oracle@192.168.18.205'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 oracle@192.168.18.205:/opt/rmanbk/
oracle@192.168.18.205'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
TNS Ping Utility for Linux: Version 10.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
TNS Ping Utility for Linux: Version 10.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: Release 10.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' size 100m reuse;
这个时候备库还是可以接收主库传输过来的归档日志文件,只是不能应用日志而已。
当用read only 方式打开备库后只有重新启动才能使备库重新回到备用模式。
4.9 切换到DATAGUARD最大可用模式并开启实时应用
一般情况下,到4.8步骤为止,dataguard的物理备库已经可以正常使用了。只是这时dataguard处于默认的最大性能模式,这个模式下,主库的重做日志只有在归档之后才会传输到备库上,然后备库才会应用日志。如果在归档之前主库数据库意外down机,那么这部分未归档的数据肯会丢失。为了避免这种情况的发生,可以使用最大可用模式。Oracle推荐最大可用模式使用LGWR ASYNC(异步)NOAFFIRM 模式传输。实际的生产库推荐这种模式。在standby不可用时,最大可用模式会自动降低成最大性能模式,所以standby故障不会导致primay不可用。对于dataguard模式的介绍。以下是在dataguard默认的最大性能模式下切换到实际生成用途的最大可用模式.
1, 在备库上增加备用重做日志文件,大小跟主库的在线重做日志一样。组的数量最好比在线重做日志多一两组(可调)。
sql>alter database recover managed standby database cancel;
--先取消日志应用
sql > system altered
sql > alter database add standby logfile group 4 ('/opt/oradata/primary/std_redo01.log') size 50M;
sql > system altered
sql > alter database add standby logfile group 5 ('/opt/oradata/primary/std_redo02.log') size 50M;
sql > system altered
sql > alter database add standby logfile group 6 ('/opt/oradata/primary/std_redo03.log') size 50M;
sql > system altered
sql > alter database add standby logfile group 7
('/opt/oradata/primary/std_redo04.log') size 50M;
sql > system altered
sql > recover managed standby database disconnect from session;
------非实时应用模式或者用下面的语句开启备库的实时应用模式
sql > recover managed standby database using current logfile
disconnect from session;
鉴于后面主备库切换的需要,在主库上也增加备用重做日志。当然要把主库处于mount状态下才可添加。可在下面统一修改。
2, 在主库上做修改(两个地方:一个是修改log_archive_dest_2参数,二是添加备用日志文件)
sql > shutdown immediate;
sql > startup mount;
sql > alter system set log_archive_dest_2=’service=orcl
valid_for=(online_logfiles,priamry_role) lgwr async noaffirm
db_unique_name=orcl2’ scope=spfile;
sql > alter database add standby logfile group 4 ('/opt/oradata/primary/std_redo01.log') size 50M;
sql > system altered
sql > alter database add standby logfile group 5 ('/opt/oradata/primary/std_redo02.log') size 50M;
sql > system altered
sql > alter database add standby logfile group 6 ('/opt/oradata/primary/std_redo03.log') size 50M;
sql > system altered
sql > alter database add standby logfile group 7
('/opt/oradata/primary/std_redo04.log') size 50M;
sql > system altered
sql > alter database set standby database to maximize availability;
--------切换到最大可用模式
sql > alter database open;
打开数据库
【注意事项】
1, lgwr async noaffirm参数下主库的模式保护级别为RESYNCHRONIZATION
SQL> select database_role,PROTECTION_MODE,PROTECTION_LEVEL from v$database;
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
----------- ---------------- ---------------
PRIMARY MAXIMUM AVAILABILITY RESYNCHRONIZATION
备库的查询结果为:UNPROTECTED
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
---------------- -------------------- --------------------
PHYSICAL STANDBY UNPROTECTED UNPROTECTED
2, lgwr sync affirm参数下主库的模式保护级别为MAXIMUM AVAILABILITY
SQL> select database_role,PROTECTION_MODE,PROTECTION_LEVEL from v$database;
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
----------- ---------------- ---------------
PRIMARY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
备库的查询结果为:MAXIMUM AVAILABILITY
DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
---------------- -------------------- --------------------
PHYSICAL STANDBY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
为了不给生产库带来太大的影响,推荐使用第一种参数。对于主库采用lgwr传输日志的方式。日志是实时传输的,至于备库是否采用实时恢复模式都是不会丢失数据的。
四、 DATAGUARD的三种保护模式说明
Dataguard有三种保护模式,最大保护、最大可用性和最大性能,对主库的性能影响和对网络的要求依次降低。
在最大保护模式下,备库一旦无法接收日志,主库的所有操作被挂起,与备库的日志传输恢复正常时才会恢复,如果挂起时间较长,主库实例会中断,因此一般生产环境中很少会使用这种模式。在最大可用性模式下,当与备库的日志传输断开时,主库会自动切换到最大性能模式。dataguard默认的配置是最大性能模式。
三种模式的日志同步参数设置如下表:
| 最大保护模式 | 最大可用模式 | 最大性能模式 |
Redo archival process | LGWR | LGWR | LGWR or ARCH |
Network transmission | 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') size 50M;
sql > alter database add standby logfile group 5
('/opt/oradata/primary/std_redo02.log') size 50M;
sql > alter database add standby logfile group 6
('/opt/oradata/primary/std_redo03.log') size 50M;
sql > alter database add standby logfile group 7
('/opt/oradata/primary/std_redo04.log') size 50M;
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.2 ORA-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.3 ORA-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
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7862652/viewspace-710020/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7862652/viewspace-710020/