Chinaunix首页 | 论坛 | 博客
  • 博客访问: 936791
  • 博文数量: 119
  • 博客积分: 6248
  • 博客等级: 准将
  • 技术积分: 1419
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-08 14:14
文章分类

全部博文(119)

文章存档

2014年(1)

2012年(1)

2011年(2)

2010年(22)

2009年(81)

2008年(12)

分类: LINUX

2010-07-05 17:42:51

看到oracle官方文档说oracle 11g dataguard在物理standby机器上出于open状态也可以应用redo,所以就在本地试验了下,确实如此,这样既可以应用redo也可以进行数据查询和数据库的备份.既解决了数据的容灾也解决了主数据库的压力.
 

Oracle dataguard 简介

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

Dataguard 配置:

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                          //primarySTANDBY服务器上都

                                           执行

 

在主服务器上启动数据库实例

SQL> startup;

$ sqlplus system/oracle@node1      //primarySTANDBY服务器上都进行测

                                     试下看时候能正常连接

 

STANDBY服务器上启动数据库实例

 

//创建4stanby 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;             //启动实时应用

测试dataguard数据是否同步

测试同步是否正常方法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;

 

  取得当前数据库各线程已归档文件最大序列,如果primarystandby最大序号不

  相同,必须将多出的序号对应到归档文件复制到待转换的STANDBY服务器.要是

  primary完全不可用了,此时可能会丢失一些数据.

 

  启动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;

 

  关于测试我这里就不做了,只要能查询插入应该没有什么问题.

阅读(7300) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~