摘 要
搭建data guard环境,利用RMAN DUPLICATE命令创建physical standby。 创建备库之前需要有备库的参数文件;同时连接主数据库和备用数据库,启动备库到nomount状态。备库必须工作在recover managed模式下才能应用主库的redo数据。当dataguard创建成功后,在计划需求下手工的switchover,或者在主库故障发生的情况下手工的执行failover,以确保正常的生产工作。为了确保dataguard的正常工作,必须经常检查dataguard的健康状况来确保dataguard的安全稳定。
一:系统环境介绍
我们在进行DATAGUARD搭建的时候,需要首先确定要进行dataguard搭建的服务器的内存,磁盘,操作系统等各方面的情况,以此来确定相应的实施方案。
1.1 服务器硬件介绍
内存的大小
[root@nxqpri ]# free -g
total used free shared
23 23 0
磁盘的规划
[root@nxqpri ]#df -h
Filesystem Size Used Avail Use% Mounted o
/dev/sda1 29G 6.7G 21G 25% /
/dev/sda2 1.0T 234G 738G 25% /u01
tmpfs 12G 0 12G 0% /dev/shm
CPU的个数
[root@nxqpri ~]#cat /proc/cpuinfo |grep physical |wc -l
48
服务器的型号
[root@nxqpri ~]#dmidecode |grep "Product Name"
Product Name: PowerEdge R710
1.2 服务器软件介绍
操作系统版本:
[root@nxqpri ~]#cat /etc/issue |grep Linux
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
操作系统的内核信息
[root@nxqpri ~]#uname -a
Linux nxqpri 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
数据库的版本信息
SQL>select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit
1.3 网络环境介绍
数据库的服务器只配置了内网网络
主库的IP地址
[root@nxqpri ~]#ifconfig eth0
eth0 Link encap:Ethernet HWaddr D4:AE:52:63:94:53
inet addr:192.168.1.252 Bcast:192.168.1.255 Mask:255.255.255.0
备库的IP的地址
[root@nxqstd ~]#ifconfig eth0
eth0 Link encap:Ethernet HWaddr D4:AE:52:64:16:83
inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0
二:DATAGUARD的搭建
2.1 primary database(主库)的搭建
1.使用OUI安装数据库软件
在primary(主库)搭建数据库软件,建立lsnrctl监听,采用dbca搭建实例,在standby(备库)上搭建数据库软件,建立监听,但是不需要采用dbca建立实例。
使用DBCA创建数据库,全局数据库名:orcl 实例名:orcl
2.以oracle身份登录系统,连接主库,启动到 mount状态,数据库处于正常启动状态先停库再启动
SQL>Startup mount
3.修改数据库强制记录日志
SQL>alter database force logging;
4. 确定数据库是否处于归档模式库,如果创建数据库时没有选择归档,将数据库改为归档模式
a.查询数据库是否处于归档
SQL> archive log list;
b.更改数据库为归档模式(改模式不能在Startup启动模式下)
SQL>alter database archivelog;
5.开启闪回数据库(不是必须的)
SQL> alter database flashback on;
Database altered.
6.根据spfile文件创建pfile,关闭数据库。
SQL>Create pfile from spfile
SQL>shutdown immediate
7.修改pfile 文件
a.备份修改文件
#cp $ORACLE_HOME/dbs/initorcl.ora $ORACLE_HOME/dbs/initorcl.ora.bak
#vim $ORACLE_HOME/dbs/initorcl.ora
b.在参数文件文件里面添加如下内容
为每个数据库指定唯一性名称
db_unique_name='pdb'
允许数据库发送和接收日志
log_archive_config='dg_config=(pdb,sdb)'
两个参数连接的是网络字符名
fal_server=sdb
fal_client=pdb
表示的是本地归档日志的存储路径
log_archive_dest_1='location=‘/u01/app/archivelog'
表示当数据库处于什么角色的时候,将什么日志,以什么样的方式传输到哪台远端服务器
log_archive_dest_2='service=sdb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=sdb'
允许重做日志传输到指定目的地
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
当设置成auto的时候,你对primary database的数据文件的增加,resize等操作的时候,standbydatabase将会自动的进行同步而不需要DBA在standby进行人工的干预
standby_file_management=AUTO
***** /u01/app/archivelog主备服务器上该目录比较存在
8.采用pfile文件启动数据库。(确定数据库是否能正常启动)
SQL>startup pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
9.为主数据库创建监听,在oracle用户下
[oracle@nxqpri admin]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin
创建监听后添加以下内容,连接服务名默认为orcl
[oracle@nxqpri admin]$ vi listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(PROGRAM = extproc)
)
)
创建连接服务服务监听
[oracle@nxqpri admin]$ vi tnsnames.ora
PDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.252)(PORT = 5530))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
SDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.254)(PORT = 5530))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
2.2 NFS的搭建(可以不用nfs)
通过合理的使用NFS,能够简化文件的传输和降低磁盘的压力。
1、在主库上面(192.168.1.252)上修改文件
[root@nxqpri ~]# vi /etc/exports
/u01/app/archivelog 192.168.1.0/24(rw,no_root_squash,async)
[root@nxqpri ~]# chkconfig --list|grep portmap
portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@nxqpri ~]# service portmap start
[root@nxqpri ~]# service nfs start
2.在备用数据库上面(192.168.1.254)进行nfs挂载
查看能否识别到主库(192.168.1.252)上面的nfs磁盘:
[root@nxqst ~]# showmount -e 192.168.1.190
Export list for 192.168.1.190:
/u01/e3data 192.168.1.0/24
如果能够识别的到,那么进行挂载
# mount -t nfs -o rw,bg,tcp,hard,nointr,wsize=32768,rsize=32768 192.168.1.252:/u01/app/archivelog /u01/app/archivelog
在生产环境操作的时候,如果网络带宽的速度没有磁盘的速度快,一般要加上相关的参数进行限制
mount -t nfs -o rw,bg,tcp,hard,nointr,wsize=32768,rsize=32768 192.168.1.5:/dgbackup /dgbackup
2.3:使用RMAN备份数据库(主库)
1.备份当前的控制文件
RMAN > rman target sys/oracle
RMAN > backup format '/u01/app/archivelog/bk_%U' current controlfile for standby
此处的路径为NFS挂载的路径
2.备份数据和归档
RMAN > backup format '/u01/app/archivelog/dbk_arch_%U' database plus archivelog;
也可以选择不备份归档日志文件
2.2 physical standby database(备库)创建
1.安装数据库软件,本实验选择安装软件的路径与主库相同
这个步骤只安装软件,不安装数据库,软件的版本也应该和主库的一样
2.参考主库创建备库上相应的文件目录(注意目录名及位置不能写错,否则创建过程会失败)
需要添加的文件目录如下:
闪回区的相关目录添加:
[oracle@nxqpri ~]$ cd $ORACLE_BASE
[oracle@nxqpri oracle]$ mkdir flash_recovery_area
[oracle@nxqpri flash_recovery_area]$ mkdir ORCL
[oracle@nxqpri ORCL]$ mkdir onlinelog
Dump文件相关目录的添加
[oracle@nxqpri ~]$ cd $ORACLE_BASE
[oracle@nxqpri oracle]$ mkdir admin
[oracle@nxqpri admin]$ mkdir orcl
[oracle@nxqpri orcl]$ mkdir {a,b,c,dp,u}dump
[oracle@nxqpri orcl]$ mkdir pfile
数据库参数文件放置位置目录的添加
[oracle@nxqpri orcl]$ cd $ORACLE_BASE
[oracle@nxqpri oracle]$ mkdir oradata/
[oracle@nxqpri oracle]$ cd oradata/
[oracle@nxqpri oradata]$mkdir orcl
归档日志目录添加
$ mkdir/u01/app/archivelog
3.传输相关的文件
将主库上面的参数文件,密码文件传输到备用数据库上面去,在备用数据库上面放在的位置应该和主库该文件放置的位置一样。
参数文件
[oracle@nxqpri ]$scp /u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
oracle@192.168.1.254:/u01/app/oracle/product/11.2.0/db_1/dbs/
密码文件
[oracle@nxqpri ]$scp /u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl.ora
oracle@192.168.1.254:/u01/app/oracle/product/11.2.0/db_1/dbs/
注意:要是ssh的端口做了修改的话,我们需要在scp过程的时候,添加 –P [端口数] 参数来进行传输。
4、备用数据库参数的修改
参数的含义同主库的含义一样
db_unique_name='sdb'
log_archive_config='dg_config=(pdb,sdb)'
fal_server=pdb
fal_client=sdb
log_archive_dest_1='location=/u01/app/archivelog'
log_archive_dest_2='service=pdb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=pdb'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
standby_file_management=AUTO
5. 为备库创建监听(方法同主库)
netca
6. 为备库创建网络服务命名(方法同主库)
[root@dgsto-pri u01]# vi /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
HPPRI =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.40.201)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hppri)
)
)
7.此时启动两台服务器的监听,并确认是否能够正常的连接
lsnrctl start 启动监听
lsnrctl stop 停止监听
lsnrctl status 查看监控运行状态
tnsping + 实例名 检查是否能识别到其他实例
sqlplus sys/oracle@egap as sysdba 检查是否能登录数据库
sqlplus sys/oracle@egapdb as sysdba 检查是否能登录数据库
8.使用initsdb.ora启动数据库到nomount状态。
SQL> startup nomount pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
9. 启动rman使用 rman duplicate 创建备用数据库
[oracle@nxqstd ]$ rman target sys/oracle@pdb auxiliary sys/oracle
Recovery Manager: Release 10.2.0.1.0 - Production on Tue Nov 11 18:01:00 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: DB (DBID=1434261387)
connected to auxiliary database: DB (not mounted)
RMAN> duplicate target database for standby nofilenamecheck;
在启用恢复模式之前可以先用建好standbylog日志文件
10.修改数据库为恢复管理模式,以使备库能够应用主库的redo 数据,达到同步
SQL> alter database recover managed standby database disconnect from session;
11. 查看备用数据库的日志应用情况
SQL> select sequence#,first_time,next_time,applied from v$archived_log order by sequence#;
SEQUENCE# FIRST_TIM NEXT_TIME APP
---------- --------- --------- ---
13 11-NOV-08 11-NOV-08 YES
14 11-NOV-08 12-NOV-08 YES
15 12-NOV-08 12-NOV-08 YES
16 12-NOV-08 12-NOV-08 YES
12.为两数据库分别创建standby日志文件
主库
SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/standbylog01.log' size 500m;
SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/standbylog02.log' size 500m;
SQL> alter database add standby logfile group 7 '/u01/app/oracle/oradata/orcl/standbylog03.log' size 500m;
SQL> alter database add standby logfile group 8 '/u01/app/oracle/oradata/orcl/standbylog04.log' size 500m;
备库
停止redo应用
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/standbylog01.log' size 500m;
Database altered.
SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/standbylog02.log' size 500m;
Database altered.
SQL> alter database add standby logfile group 7 '/u01/app/oracle/oradata/orcl/standbylog03.log' size 500m;
Database altered.
再起动redo应用
SQL> alter database recover managed standby database disconnect from session;
Database altered
11.再次查看备库日志应用情况
SQL> select sequence#,first_time,next_time,applied from v$archived_log order by sequence#;
SEQUENCE# FIRST_TIM NEXT_TIME APP
---------- --------- --------- ---
15 11-NOV-08 11-NOV-08 YES
16 11-NOV-08 12-NOV-08 YES
17 12-NOV-08 12-NOV-08 YES
18 12-NOV-08 12-NOV-08 YES
12.确定相关教程都已经启动
SQL> select process,status from v$managed_standby;
PROCESS STATUS
--------- ------------
ARCH CLOSING
ARCH CLOSING
MRP0 WAIT_FOR_LOG
RFS IDLE
RFS IDLE
查询归档日志序列和磁盘空间
select sequence#,applied,deleted from v$archived_log;
快速查看DG的报错信息
select error from v$archive_dest where target='STANDBY'
至此物理standby已经搭建成功
三:手工的switchover与failover
3.1 手工的switchover
1.查看主数据库可转换的状态
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
2.执行切换命令转换primary 到 physical standby
SQL>alter database commit to switchover to physical standby with session shutdown
Database altered.
如果查询到的可转换状态为to standby,则切换命令为
SQL>alter database commit to switchover to physical standby
3.关闭数据库并启动到mount状态
SQL> shutdown immediate;
SQL> startup mount;
Database mounted.
4. 查看备库可转换的状态
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
5.将备库 转换为primary
SQL> alter database commit to switchover to primary;
Database altered.
6.将新的主库打开
SQL>shutdown immediate;
SQL> startup ;
Database opened.
注:在打开新的主数据库时,如果新的主数据库在作为备用库时曾以READ ONLY的方式打开过,则应重启数据库,否则可直接执行如下操作
SQL> alter database open;
Database altered.
7.Sdb作为新备库启动,设置恢复管理模式
SQL> alter database recover managed standby database disconnect from session;
Database altered.
8.查看新备库pdb的日志应用情况
3.2 手动的failover
1.对备用数据库进行失败转移初始化
SQL> alter database recover managed standby database finish force;
Database altered.
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
当进行失败转移后,数据库的保护模式将由最大可用模式变为最大性能模式
2.将备库转换为主库并打开新的主库
SQL> alter database commit to switchover to primary;
Database altered.
SQL> alter database open;
Database altered.
4、DATAGUARD的日常检查工作
1.确定主库,并查看当前的日志号
SQL> select database_role from v$database;
DATABASE_ROLE
----------------
PRIMARY
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/archivelog
Oldest online log sequence 417
Next log sequence to archive 420
Current log sequence 420
2:确定备用数据库不存在日志断点:
SQL> select * from v$archive_gap;
no rows selected
3:确定备用数据库,并查看当前应用的日志序号
SQL> select sequence#,applied from v$archived_log;
SEQUENCE# APP
---------- ---
414 YES
415 YES
416 YES
417 YES
418 YES
419 YES
4.在主库查看当前日志传输是否正常
SQL> col status for a10
SQL> col destination for a10
SQL> col error a10
SQL> col error for a10
SQL> select dest_id,status,destination,error from v$archive_dest where dest_id <=2;
DEST_ID STATUS DESTINATIO ERROR
---------- ---------- ---------- ----------
1 VALID /u01/app/archivelog
2 VALID sdb
5.在备库上面确认相关的进程已经启动
SQL> select process,status,sequence# from v$managed_standby;
PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 419
ARCH CLOSING 418
MRP0 WAIT_FOR_LOG 420
RFS IDLE 0
RFS IDLE 420
RFS IDLE 0
通过以上的过程可以确认,DG是处于健康状态的
6.已经被应用的日志的删除
因为相关的日志已经在备用数据库上面被引用,基于空间的考虑,我们可以删除一些日志,只保留部分日志。
相关删除脚本如下:
6.1 建立相关的定时任务
[root@nxqpri ~]# crontab -l
0 03 * * * su - oracle -c "/home/oracle/rman_del.sh"
相关删除的脚本
[oracle@nxqpri ~]$ cat rman_del.sh
rman target sys/oracle msglog=/home/oracle/log/`date '+%Y%m%d'`.log cmdfile=/home/oracle/rman_del.rman
[oracle@nxqpri ~]$ cat rman_del.rman
run {
#allocate channel cha_full type disk;
#CONFIGURE CONTROLFILE AUTOBACKUP ON;
#crosscheck backup;
#crosscheck archivelog all;
delete noprompt archivelog until time "sysdate-10";
#release channel cha_full;
}
附Switchover_Status值的含义
NOT ALLOWED
当前的数据库不是带有备用数据库的主数据库
PREPARING DICTIONARY
该逻辑备用数据库正在向一个主数据库和其他备用数据库发送它的重做数据,以便为切换做准备
PREPARING SWITCHOVER
接受用于切换的重做数据时,逻辑备用配置会使用它
RECOVERY NEEDED
备用数据库还没有接收到切换请求
SESSIONS ACTIVE
在主数据库中存在活动的SQL会话;在继续执行之前必须断开这些会话
SWITCHOVER PENDING
适用于那些已收到主数据库切换请求但是还没有处理该请求的备用数据库
SWITCHOVER LATENT
切换没有完成并返回到主数据库
TO LOGICAL STANDBY
主数据库已经收到了来自逻辑备用数据库的完整的字典
TO PRIMARY
该备用数据库可以转换为主数据库
TO STANDBY
该主数据库可以转换为备用数据库