且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Oracle 11g DataGuard物理standby配置1

更新时间:2022-09-22 14:27:53


看到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
                                            service name
*.FAL_CLIENT=node2
*.STANDBY_FILE_MANAGEMENT=AUTO
 
$ lsnrctl start                       //primary
                                      STANDBY服务器上都执行
 
在主服务器上启动数据库实例
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状态



本文转自wiliiwin 51CTO博客,原文链接:http://blog.51cto.com/wiliiwin/344276