ORACLE DG专题3--手把手部署DG 物理备库

前言

         笔者前文已介绍了ORACLE DG的成员身份与数据保护模式等相关理论知识,从本文开始,将进入ORACLE DG理论与实践相结合模式,深入理解ORACLE DG的内在原理与基本运维技能。本文讲述如何使用rman恢复方式搭建ORACLE DG物理备库—physical standby。

部署前规划

         oracle DG要求主备数据库的DB_NAME相同,db_unique_name不同,DG根据db_unique_name区分主备库。根据此要求,规划DG主备如下表所示,

 

primary db

standby db

IP

99.12.98.194

55.14.17.100

hostname

t24app1sg

mqserver02n

db_name

T24APDB

T24APDB

db_unique_name

T24APDB

T24APDBDG

附加说明:

  • 主库

  • 备库

      安装oracle软件后使用dbca创建一个空的oracle实例。数据库名与主库保持相同,建议datafile路径、快速恢复区路径也保持与主库相同,不相同也行,只是后续需要进行文件名转换。

主库端配置

开启主库归档模式

此操作详细步骤从略,以下只列出可能用到的操作SQL语句。

  • 检查数据库归档模式
SQL> archive log list;
  • 开启归档模式(此操作需要数据库处于mount---12c)
SQL> alter database archivelog;

开启db的强制写日志模式

oracle有些DDL(如create table)支持NOLOGGING子句,即建表时不会产生重做日志,由于物理备库是应用主库的重做日志而来,所以主库必须打开FORCE LOGGING模式。

  • 检查FORCE LOGGING状态
SQL> select force_logging from v$database;
FORCE_LOGGING
---------------------------------------
NO
  • 打开force logging
SQL> ALTER DATABASE FORCE LOGGING;
  • 再次检查force logging模式
SQL> select force_logging from v$database;

补充:

  • 关闭force logging模式
SQL> ALTER DATABASE NO FORCE LOGGING;

配置监听和tnsname

正常情况下primary db应该是已经正常配置了监听,无需重复配置,只需查看监听状态,确认能通过监听连接到实例上。

  • 查看监听状态
$ lsnrctl status

Service "T24APDB " has 1 instance(s).
  Instance "T24APDB", status READY, has 1 handler(s) for this service...

说明:此服务下有对应的instance,状态为ready,表示动态监听。主库由于一直正常使用,可以是动态监听。

  • 配置tns连接串(tnsnames.ora)

1. 增加到主库自身的连接串(可用于客户端访问)。

T24APDB =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = T24APDB)

    )  

  )

配置完毕后可使用tnsping进行测试。

2. 增加主库到备库的TNS连接串

T24APDBDG =

  (DESCRIPTION =

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

          (CONNECT_DATA =

           (SERVER = DEDICATED)

           (SERVICE_NAME = T24APDBDG)

      )  

  )

此条TNS暂时还不能测试,因为备库还没有配置监听。

添加data guard参数

  • 从spfile生成pfile(重新生成一个pfile,用于编辑)
SQL> create pfile='/home/oracle/T24APDB_PR.ora' from spfile;
  • 修改pfile添加DG配置参数(主库vim T24APDB_PR.ora)
*.db_unique_name='T24APDB '

说明:db_unique_name严格区分大小写


*.log_archive_config='dg_config=(T24APDB,T24APDBDG)'

说明:dg_config参数指定的是DG环境中的db_unique_name,所有unique name通过逗号分割;

        

*.log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(all_logfiles,all_roles) db_unique_name= T24APDB '

说明:valid_for参数的含义是当本数据库处于all_roles即任何角色时到往本地路径log_archive_dest_1下归档all_logfiles(online redo log和standby redo log),若为ASM管理,location环境ASM路径(如+ARCH);


*.log_archive_dest_2='service=T24APDBDG reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=T24APDBDG'

说明:valid_for参数的含义是当数据库为primary_role主库角色时往远程路径log_archive_dest_2下归档online_logfiles(online redo log)。其中的service= T24APDBDG,指定归档传输TNS路径;lgwr:指定redo data传输使用的传输方式,lgwr async的组合表示redo data使用lgwr进程采用异步传输的方式同步到db_unique_name 为T24APDBDG 的standby db;


*.log_archive_dest_state_1=enable

*.log_archive_dest_state_2=enable

说明:启用归档目的地,该参数对应的值有三个,分别如下:

enable:启用归档目的地

defer:禁用归档目的地

ALTERNATE:作为备用归档目的地


*.standby_file_management='auto'

说明:该参数的意思是standby db的文件管理方式是auto,而非manual。设置该参数值为auto主要目的是:主库如果添加、删除表空间或者数据文件时,会自动在备库相应的添加、删除表空间或者数据文件。


*.fal_server='T24APDBDG'

说明:指定故障转移的目标端(主库)。即出现故障时往tnsname='T24APDBDG'指定的目标端切。通常不会设置故障转移的自动切换,都是dba按照自己的意愿,往最适合接管  primary db的standby db上去切。


*.fal_client='T24APDB

说明:指定发送故障的客户端,即本地db。

最终新加的pfile配置如下:

用新pfile重启主库

SQL> shutdown immediate
SQL> create spfile from pfile='/home/oracle/T24APDB_PR.ora'
SQL> startup

可能的报错:

ORA-01078: failure in processing system parameters
ORA-16032: parameter LOG_ARCHIVE_DEST_1 destination string cannot be translated
ORA-19801: initialization parameter DB_RECOVERY_FILE_DEST is not set

原因:DB_RECOVERY_FILE_DEST未解析到,导致log_archive_dest_state_1解析失败;

修改方案:将pfile文件中DB_RECOVERY_FILE_DEST放到LOG_ARCHIVE_DEST_1参数的前面;

创建standby redo log文件

     添加standby redo log文件的目的是在后续执行rman duplicate时可以直接从主库复制standby redo log,而不用再在standby db端创建standby redo log。直接从主库复制的好处有如下几条:

1、保证主库和备库有相同的standby redo log,即省了在备库端创建的麻烦又能保证主备库完全相同,这样在switchover时可以直接切换,无需做任何更改;

2、如果主库有多套dg备库,所有的dg备库的standby redo log是完全相同的,这样管理起来方便。

创建standby redo log的原则:

  • Each standby redo log file must be at least as large as the largest redo log file in the redo log of the redo source database.

每个standby 重做日志至少和online重做日志一样大;

  • The standby redo log must have at least one more redo log group than the redo log at the redo source database, for each redo thread at the redo source database.

standby重做日志数量至少比online重做日志多一个。

  • 查询重做日志
select group#,type,member from v$logfile;

  • 添加standby redo log
alter database add standby logfile '/odata/datafile/standby_01.log' size 100m;
alter database add standby logfile '/odata/datafile/standby_02.log' size 100m;
alter database add standby logfile '/odata/datafile/standby_03.log' size 100m;
alter database add standby logfile '/odata/datafile/standby_04.log' size 100m;
  • 再次查询重做日志
select group#,type,member from v$logfile;

备库端配置

确保备库与主库目录相同

若不相同,后续需要进行转化;此处从略。

生产备库的密码文件

由于后面需要通过RMAN主库远程登录备库进行恢复,此处需要配置备库SYS用户的密码。有如下集中方法:

  1. 直接将主库的orapwT24APDB密码文件拷贝到备库;
  2. 使用orapwd命令创建密码文件
orapwd file='/u01/app/oracle/product/12.1.0/dbhome_1/dbs/orapwT24APDBDG' password=TEST

  • 创建standby的初始化参数

与主库类似,创建备库的DG参数(vim initT24APDBDG.ora)。如下:

*.db_name='T24APDB'

*.db_recovery_file_dest='/data/T24APDBDG'

*.db_recovery_file_dest_size=48318382080

*.db_unique_name='T24APDBDG'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=eppsXDB)'

*.fal_client='T24APDBDG'

*.fal_server='T24APDB'

*.log_archive_config='dg_config=(T24APDB,T24APDBDG)'

*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=T24APDBDG'

*.log_archive_dest_2='SERVICE=T24APDB LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=T24APDB'

*.log_archive_dest_state_1='ENABLE'

*.log_archive_dest_state_2='ENABLE'

用pfile 将standby 启动到nomount状态

  • 把spfile文件重命名
$ mv spfileT24APDBDG.ora spfileT24APDBDG.ora.bak
  • 用pfile启动数据库到nomount状态
SQL> startup nomount;

备库端配置监听

备库由于处于nomount状态,要想通过SYS用户链接,需要配置静态监听(vim listener.ora)。

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = T24APDBDG)

      (SID_NAME=T24APDBDG)

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

      (SERVICE_NAME=T24APDBDG)

    )

  )

LISTENER =

  (DESCRIPTION=

       (ADDRESS=(PROTOCOL=tcp)(HOST=mqserver02n)(PORT=1521))

  )

注意上面的配置中,SID为实例名,GLOBAL_DBNAME为unique名,serive_name随便起(与主库配置的tnsname一致)。然后启动监听服务并查看。

$ lsnrctl start
$ lsnrctl status

Service "T24APDBDG" has 1 instance(s).
  Instance "T24APDB", status UNKNOWN, has 1 handler(s) for this service...

如上unknown状态的实例即为静态监听注册的实例。其中还有一个nomount状态注册的动态实例。

配置tnsname(vim tnsnames.ora)

T24APDBDG =

  (DESCRIPTION =

     (LOAD_BALANCE = OFF)(FAILOVER=ON)(CONNECT_TIMEOUT=3)(TRANSPORT_CONNECT_TIMEOUT=2)

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = T24APDBDG)

    )

  )

T24APDB =

  (DESCRIPTION =

     (LOAD_BALANCE = OFF)(FAILOVER=ON)(CONNECT_TIMEOUT=3)(TRANSPORT_CONNECT_TIMEOUT=2)

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = T24APDB)

    )

  )

测试主库和备库端tnsname配置是否正确

配置完主备的TNS后即可测试TNS联系连通性,主备都执行如下语句:

$tnsping T24APDB
$tnsping T24APDBDG

使用rman开启duplicate创建备库(主库操作)

  • 在主库上使用rman同时登录主备库,如下:
$ rman target SYS/SYSTEM@T24APDB auxiliary SYS/SYSTEM@T24APDBDG nocatalog

  • 执行duplicate创建备库

run {

allocate auxiliary channel c1 device type disk;

allocate auxiliary channel c2 device type disk;

duplicate target database for standby nofilenamecheck dorecover;

release channel c1;

release channel c2;

}

报错1:auxiliary file name /odata/datafile/SYSAUX0422.dbf conflicts with a file used by the target database

原因:目录不对应,主库这边需要加文件转换

解决方案:

     1. 将DG备库shutdown并重新startup 称nomount状态;---因为上面的操作中将备库设置成了mount状态;

     2. 主库rman重新登录两个库;

$ rman target SYS/SYSTEM@T24APDB auxiliary SYS/SYSTEM@T24APDBDG nocatalog

    3. 主库RMAN执行如下duplicate,其中加了文件转换。

run {

duplicate target database for standby from active database 

db_file_name_convert=('/odata/datafile','/data/T24APDBDG');

}

最后成功后如下:

此时备库就获得了主库完全的数据文件拷贝,备库处于mount状态。备库基本搭建完毕。

备库启动实时重做应用redo apply

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

执行完上述语句后,理论上主库与备库已经实时同步了,可以使用v$managed_standby查看备库的状态:

SQL> select process,status from v$managed_standby;

其中,MRP0处于APPLYING_LOG,即代表正常,此时可以查看备库的角色和打开模式。

SYS@T24APDBDG> select database_role,open_mode from v$database;

DATABASE_ROLE    OPEN_MODE

---------------- --------------------

PHYSICAL STANDBY MOUNTED

将备库设置为只读状态(可选)

         从ORACLE 11g开始,支持备库应用redo 日志的同时处于redo only状态。这样可以方法进行数据读操作。

SQL> recover managed standby database cancel

SQL> alter database open;

SQL> recover managed standby database using current logfile disconnect;

         说明:以上操作就是先取消日志应用,再打开数据库,最后启用日志应用。查询数据库的打开模式和角色如下图所示--read only with apply。完毕

总结

         本文step-by-step详细讲述了ORACLE物理备库的部署,除了rman的duplicate操作可能需要稍微注意一下,其他步骤应该不难。整个流程包含诸多知识点,如强制归档、归档模式、standby redo log、静态监听等等。读者在部署过程中要仔细琢磨各个步骤的作用,才能做到少出错或出错后懂得如何着手解决。

猜你喜欢

转载自blog.csdn.net/zhaogang1993/article/details/100930774