分类: LINUX
2010-07-05 17:42:51
Dataguard分为2类:
物理standby: 此类型分为redo应用、read-only模式、read-write模式,当处于redo应用
的时候,不能进行相关的查询操作,当处于read-only时,不能应用redo,
是在oracle 11G版本之后,在read-only下可以应用redo,当处于read-write
时,但暂停从primary接受redo数据.
逻辑 standby: 此类型可以在read-write模式下,可以从primary接受redo数据,并且可以
应用redo.
关于2者的区别和特点,大家可以自己在网上进行搜索,我这里就不一一说了.
2种类型的相关进程:
物理standby相关进程
_ Remote file server (RFS)
负责从主数据库上接收归档文件
_ Archiver (ARCn)
将日志进行归档
Managed recovery process (MRP)
将归档文件应用到备用机上
逻辑standby相关进程
_ Remote file server (RFS)
负责从主数据库上接收归档文件
_ Archiver (ARCn)
将日志进行归档
Logical standby process (LSP)
将归档文件应用到备用机上
本次试验使用vmware server 1.6虚拟机,相关的IP规划如下:
192.168.137.93 primary数据库
192.168.137.94 standby数据库
在2个服务器上执行如下操作:
# vi /etc/hosts
192.168.137.93 node1
192.168.137.94 node2
数据库: oracle 11G
在primary服务器上执行如下操作
SQL> ALTER DATABASE FORCE LOGGING; //将primary数据库设置为FORCE
LOGGING模式
SQL> create pfile from spfile; //创建一个pfile,可以方便编辑,我这里把spfile放到另外一个路径,让oracle读取pfile.
pfile文件添加如下内容:
*.DB_UNIQUE_NAME=uqn_node1 //自定义一个unique_name名字
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(uqn_node1,uqn_node2)' //此处为主备服务器的unique_name
*.LOG_ARCHIVE_DEST_2='SERVICE=node2 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=uqn_node2'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.LOG_ARCHIVE_MAX_PROCESSES=30
*.FAL_SERVER=node2 //这里为net service name
*.FAL_CLIENT=node1
*.STANDBY_FILE_MANAGEMENT=AUTO
假如数据库处在非归档模式下执行下面的sql(此步骤因是否处于归档模式而定)
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
为STANDBY数据创建控制文件
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/home/oradata/wiliiwin.ctl';
SQL> ALTER DATABASE OPEN;
复制primary服务器的文件(数据文件、密码文件、pfile文件、控制文件)到STANDBY服务器上
# cd /home/oracle/dbs
# cp initora10.ora orapwora10 /home/oradata/
# cd /home/
$ scp -r admin/ oradata/ oracle@node2:/home/oradata
到STANDBY服务器上执行下面的操作
$ cd /home/oradata/ora10
$ rm -rf control0*
$ mv ../wiliiwin.ctl control01.ctl
$ cp control01.ctl control02.ctl
$ cp control01.ctl control03.ctl
$ cd /home/oracle/dbs
$ mv /home/oradata/initora10.ora .
$ mv /home/oradata/orapwora10 .
$ vi initora10.ora //需要把里面的内容稍微修改下
*.DB_UNIQUE_NAME=uqn_node2 //自定义一个unique_name名字
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(uqn_node1,uqn_node2)' //此处为主备服务器的unique_name
*.LOG_ARCHIVE_DEST_2='SERVICE=node1 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=uqn_node1'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.LOG_ARCHIVE_MAX_PROCESSES=30
*.FAL_SERVER=node1 //这里为net server
*.FAL_CLIENT=node2
*.STANDBY_FILE_MANAGEMENT=AUTO
$ lsnrctl start //在primary和STANDBY服务器上都
执行
在主服务器上启动数据库实例
SQL> startup;
$ sqlplus system/oracle@node1 //在primary和STANDBY服务器上都进行测
试下看时候能正常连接
在STANDBY服务器上启动数据库实例
//创建4个stanby redo 大小最好与主服务器大小相同,并且多一个文件,也在Primary服务器上也做如下操作,方便之后的角色切换.
SQL> startup mount;
SQL> alter database add standby logfile group 4 '/home/oradata/ora10/stdREDO01.LOG' size 50m;
SQL> alter database add standby logfile group 5 '/home/oradata/ora10/stdREDO02LOG' size 50m;
SQL> alter database add standby logfile group 6 '/home/oradata/ora10/stdREDO03LOG' size 50m;
SQL> alter database add standby logfile group 7 '/home/oradata/ora10/stdREDO04LOG' size 50m;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; //启动实时应用
测试同步是否正常方法1
在STANDBY服务器:
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
4 04-MAY-10 04-MAY-10
5 04-MAY-10 04-MAY-10
在Primary服务器:
SQL> ALTER SYSTEM SWITCH LOGFILE; //触发归档
现在再回到STANDBY服务器上:
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
4 04-MAY-10 04-MAY-10
5 04-MAY-10 04-MAY-10
6 04-MAY-10 04-MAY-10
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# APP
---------- ---
4 YES
5 YES
6 YES
发现有一条新的记录,说明同步是正常的.
测试同步是否正常方法2
在Primary服务器上创建一个表
SQL> create table wiliiwin(id integer, name char(10));
SQL> insert into wiliiwin values(1,'wiliiwin');
SQL> insert into wiliiwin values(2,'wiliiwiner');
SQL> insert into wiliiwin values(3,'wiliiwinsi');
SQL> ALTER SYSTEM SWITCH LOGFILE;
在STANDBY服务器上
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; //取消执行
redo
//报错ORA-16136: Managed Standby Recovery not active
是由于MRP0服务没有启动,如下是查看各服务状态sql语句
SQL>select process,status,sequence# from v$managed_standby;
SQL>RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; //启动
MRP0服务
SQL> ALTER DATABASE OPEN; //打开数据库,由于使用的oracle 11g
所以现在也可以应用redo.
SQL> select * from wiliiwin;
ID NAME
---------- ----------
1 wiliiwin
2 wiliiwiner
3 wiliiwinsi //可以看到数据已经同步过来了,由于oracle 11G
在open状态下也可以执行redo,所以现在在primary
做相关的操作,STANDBY也照样可以同步过来
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; //使STANDBY恢复到mount状态
分为2种切换:
Switchover:
无损切换,通常是用户手动触发或者有计划的让其自动触发,不会导致数据丢失
Failover:
不可预知的原因导致Primary数据库故障并且短期内不能恢复就需要failover,可能会导致数据的丢失.
在执行failover之前,尽可能将原Primary数据库的可用redo都复制到
standby数据库.
如果要转换角色的standby处于maximum protection模式,需要你首先将其
切换到Maximum Performance模式,操作如下:
SQL> ALTER DATABASE SET STANDBY DATABASE MAXIMUM PERFORMANCE;
Switchover切换步骤
在primary数据库检查是否支持switchover操作
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
-----------------
TO STANDBY
如果该列值为”TO STANDBY”则表示primary数据库支持转换为STANDBY角色
注意:如果是第一次做Switchover的话,这里应该是SESSIONS ACTIVE状态,不用理
会他,继续下面的操作.
在primary数据库启动switchover
先把primary转换为standby的角色
SQL> alter database commit to switchover to physical standby;
在primary数据库重启动到mount
SQL> shutdown immediate;
SQL> startup mount;
在STANDBY数据库上检查是否支持switchover操作
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
值为”TO PRIMARY”,说明支持转换.
注意:第一次转换这里可能为 not allow,不用理会,继续下面的操作.
在STANDBY数据库转换角色到Primary
SQL> alter database commit to switchover to primary;
SQL> alter database open; //如果处于read-only状态,需要先shutdown再
startup;
验证数据是否可以同步,按照以前的测试方法进行测试
在新的primary数据库上执行
SQL> insert into wiliiwin values(4,’wiliansi’);
然后在新的STANDBY数据库上执行
SQL> select * from wiliiwin;
Failover切换
检查归档文件是否连续
在STANDBY数据库上查询V$ARCHIVE_GAP视图,看归档文件是否连续
SQL> SELECT THREAD#,LOW_SEQUENCE#,HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果返回的有记录,按照列出的记录号复制对应的归档文件到待转换的STANDBY服
务器.
必须确保所有已生成的归档文件均已存在于STANDBY服务器,不然可能会数据不一
致造成转换时的报错.文件复制之后,将其加入数据字典
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE ‘filespecl‘;
检查归档文件是否完整
SQL> select distinct thread#,max(sequence#)over(partition by thread#)
a from v$archived_log;
取得当前数据库各线程已归档文件最大序列,如果primary和standby最大序号不
相同,必须将多出的序号对应到归档文件复制到待转换的STANDBY服务器.要是
启动failover
SQL> alter database recover managed standby database finish force;
切换物理STANDBY角色到primary
SQL> alter database commit to switchover to primar;
启动新的primary数据库
SQL> alter database open;
关于测试我这里就不做了,只要能查询插入应该没有什么问题.