搭建Oracle DataGuard--记录自己搭建期间踩过的坑

近期公司要求搭建一个Oracle DG的主备库,因为之前只是看过相关的文档没仔细研究过,所以这次搭建的时候很多坑我都踩了,我觉得很有必要总结下来!!!

 

一、安装Data Guard的主要步骤。

  1. 在主库上安装Oracle软件以及创建实例,在备库上只安装软件不创建实例。
  2. 主库上创建pfile并修改参数、监听和TNS。
  3. 将主库上的pfile、监听文件、TNS文件拷贝到备库并修改相应的内容。
  4. 使用RMAN备份主库,然后在备库使用RMAN执行复制数据库操作。
  5. 复制完成之后打开备库为READ ONLY(只读模式),测试主库操作是否更新到备库。

 

二、Data Guard的详细过程。

  • 打开Forced Logging 模式

先确认primary库处于归档模式,然后开启强制归档。

SQL> archive log list;

SQL>alter database force logging;

  • 创建standby日志

查看数据库的日志组个数与大小,因为我们创建standby日志组的个数是原日志组个数+1再与thread的积,size不能小于原日志文件的大小。

SQL> select group#,bytes/1024/1024 from v$log; 

SQL>alter database add standby logfile '/u01/app/oracle/oradata/orcl/standby01.log' size 50m;

SQL>alter database add standby logfile '/u01/app/oracle/oradata/orcl/standby02.log' size 50m;

SQL>alter database add standby logfile '/u01/app/oracle/oradata/orcl/standby03.log' size 50m;

SQL>alter database add standby logfile '/u01/app/oracle/oradata/orcl/standby04.log' size 50m;

  • 主库上创建监听并修改参数和TNS

其实网上关于这块的内容还是比较多,与DG的参数就只与几个参数相关,大概就是日志,文件的位置的转换,GAP的处理,其实GAP已经会自动的处理,不过我们还是可以配置FAL_SERVER,FAL_CLIENT参数。修改的时候可以先创建一个pfile然后在文本编辑器里面修改添加相应的参数,或者直接在数据库里面用语句修改然后创建pfile。这里我是在数据库中用语句修改后创建的pfile。

SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(htz,htzb)'; 

SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch/orcl/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl';

SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=htzb LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl2';

SQL> alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;

SQL>alter system set FAL_SERVER=orcl;

SQL> alter system set FAL_CLIENT=orcl2; 

SQL>alter system set db_unique_name=orcl scope=spfile;

SQL>alter system set db_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/orcl/' scope=spfile;

SQL>alter system set log_file_name_convert='/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/orcl/' scope=spfile; 

SQL>create pfile from spfile;

创建监听的话我一般使用netca来创建动态监听,既简单又高效,反正一路回车就能创建好。

[oracle@11g admin]$netca   

 

 

然后创建TNS,这里一定要注意,参数当中的orcl和orcl2是必须要配置好的TNS字符串,所以TNS文件一定配置正确不然还会影响后面RMAN的使用。

[oracle@11g admin]$cat tnsname.ora

orcl2 = 

  (DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521)) 

    ) 

    (CONNECT_DATA = 

      (SERVER = dedicate) 

      (SERVICE_NAME = orcl) 

    ) 

  ) 

 

orcl = 

  (DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521)) 

    ) 

    (CONNECT_DATA = 

      (SERVER = dedicate) 

      (SERVICE_NAME = orcl) 

    ) 

  ) 

配置好监听之后打开监听。

[oracle@11g admin]lsnrctl start

 

 

  • 将文件拷贝到备库并修改参数、TNS和监听

进入$ORACLE_HOME下dbs目录,把整个目录拷贝到相同的目录,特别是其中的密码文件一定要正确,否则SQL*PLUS登录时会报密码错误。(这个坑我踩的很蛋疼,当时百度了半天都不知道为什么一直登录不上)

[oracle@11g admin]$scp ./* 192.168.1.112:/u01/app/oracle/product/11.2.0/dbhome_1/dbs

然后进入$ORACLE_HOME下network/admin目录,把整个目录也拷贝到相同的目录,然后修改其中的监听文件和TNS文件。

[oracle@11g admin]$scp ./* 192.168.1.112:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin

[oracle@11g admin]$vi listener.ora

 

SID_LIST_LISTENER = 

  (SID_LIST = 

    (SID_DESC = 

     (GLOBAL_DBNAME = orcl) 

     (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1/) 

     (SID_NAME = orcl) 

    ) 

   ) 

 

LISTENER = 

  (DESCRIPTION = 

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))

  )  

这里制定目录的方式是静态监听的方式,这样的作用是会让Oracle服务在nomount时的状态为unkonw,不会是block。如果为block会导致RMAN连接不上nomount数据库,配置好监听之后打开监听。

[oracle@11g admin]lsnrctl start

[oracle@11g admin]$cat tnsname.ora

 

orcl2 = 

  (DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521)) 

    ) 

    (CONNECT_DATA = 

      (SERVER = dedicate) 

      (SERVICE_NAME = orcl) 

    ) 

  ) 

 

orcl = 

  (DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521)) 

    ) 

    (CONNECT_DATA = 

      (SERVER = dedicate) 

      (SERVICE_NAME = orcl) 

    ) 

  ) 

这里的配置其实也不用改,因为是从主库上拿过来的。

在备库dbs目录下的pfile参数也要修改一下,主要是几个参数要改成备库的名称,我就直接把参数贴下面了。

*.db_unique_name//数据库唯一名称

*.log_archive_dest_1//这个地址都是归档的本地地址

*.log_archive_dest_2//这个地址都必须指向对方的归档地址

还需要注意的一点就是这些在主库上拷贝过来的参数所指的目录一定要在备库上创建好包括闪回恢复区的目录,不然用pfile启动数据库的时候会报错。

 

  • 备份主库并启动备库到nomount状态

备份主库就直接用RMAN就行了,进入主库敲下面命令

[oracle@11g admin]$rman target /

RMAN>backup database plus archivelog;

RMAN>backup current controlfile for standby;

然后进入备库,在sqlplus里面启动数据库到nomount状态,查看监听会发现一个nukonw状态的服务。

[oracle@11g admin]sqlplus / as sysdba

SQL>startup nomount

[oracle@11g admin]lsnrctl status

 
  1. LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 06-SEP-2012 18:13:23 
  2.  
  3. Copyright (c) 1991, 2010, Oracle.  All rights reserved. 
  4.  
  5. Starting /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait... 
  6.  
  7. TNSLSNR for Linux: Version 11.2.0.2.0 - Production 
  8. System parameter file is /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora 
  9. Log messages written to /u01/app/oracle/diag/tnslsnr/11gdg/listener/alert/log.xml 
  10. Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.100.31)(PORT=1521))) 
  11.  
  12. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.31)(PORT=1521))) 
  13. STATUS of the LISTENER 
  14. ------------------------ 
  15. Alias                     LISTENER 
  16. Version                   TNSLSNR for Linux: Version 11.2.0.2.0 - Production 
  17. Start Date                06-SEP-2012 18:13:24 
  18. Uptime                    0 days 0 hr. 0 min. 0 sec 
  19. Trace Level               off 
  20. Security                  ON: Local OS Authentication 
  21. SNMP                      OFF 
  22. Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora 
  23. Listener Log File         /u01/app/oracle/diag/tnslsnr/11gdg/listener/alert/log.xml 
  24. Listening Endpoints Summary... 
  25.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.112)(PORT=1521))) 
  26. Services Summary... 
  27. Service "orcl2" has 1 instance(s). 
  28.   Instance "orcl2", status UNKNOWN, has 1 handler(s) for this service... 
  29. The command completed successfully 

 

  • 复制主库到备库

在备库里面执行rman target 账户/密码@主库TNS auxiliary 账户/密码@备库TNS(这里辅助实例必须要在后面加上账户和密码以及TNS,如果不加也能直接进入显示也是下面这样,但是主库的RMAN是没有连接上备库的辅助实例,如果这里报错可能是TNS配置问题)

[oracle@11g admin]$ rman target sys/oracle@orcl auxiliary sys/oracle@orcl2

 
  1. Recovery Manager: Release 11.2.0.2.0 - Production on Fri Sep 7 05:50:46 2012 
  2.  
  3. Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved. 
  4.  
  5. connected to target database: orcl (DBID=1898407945) 
  6. connected to auxiliary database: orcl2 (not mounted) 
  7. RMAN> run { 
  8. allocate channel prmy1 type disk; 
  9. allocate channel prmy2 type disk; 
  10. allocate channel prmy3 type disk; 
  11. allocate channel prmy4 type disk; 
  12. allocate auxiliary channel stby type disk; 
  13. duplicate target database for standby from active database nofilenamecheck; 
  14.  } 

执行上面这个脚本就能直接复制主库到备库,如果不加备库的密码账户和TNS在执行这些脚本的时候也报RMAN的连接错误,我当时也是百度了很久才找到问题。

  • 下面把备库启动到open only

复制脚本完成并没有报错之后就可以打开数据库然后开启DG功能并验证主库操作是否更新到备库,进入在备库中SQL> alter database open read only;  

SQL> alter database recover managed standby database using current logfile disconnect from session;

这样就已经在备库中打开DG功能了。

然后在主库中做一些操作

SQL> create table scott.test1 as select * from dba_objects;

SQL> alter system archive log current; 

因为DG是基于归档的数据库主备,所以任何操作都必须要生成归档或者应用到归档日志中才能显示在备库当中。

你可能感兴趣的:(Oracle)