读写分离(四)——Oracle

  一、读写分离架构适用的应用

       1)读远大于写的场景

              如果只有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制。

       2) 读操作不要求数据强一致

              一般对时延的容忍在秒级以上。

 

       就数据库层面来讲,大部分传统行业核心库采用集中式的架构思路,采用高配的小型机做主机载体,因为数据库本身和主机强大的处理能力,数据库端一般能支撑业务的运转,因此,Oracle读写分离式的架构相对MYSQL来讲,相对会少。

  二、  Oracle读写分离实现的方式

     Oracle读写分离实现的方式有很多种:

2.1 利用Oracle自身组件   

2.1.1DG方案

        DG方案也叫ADG方案,英语全称Physical Standby(Active DataGuard)。支持恢复与只读并行,但由于并不是日志的逻辑应用机制,在读写分离的场景中最为局限 ,将生产机的logfiles传递给容灾机,通过Redo Apply技术来保障数据镜像能力,物理上提供了与生产数据库在数据块级的一致性镜像,也叫physical方式。Physical方式支持异步传输方式,但容灾机处在恢复状态,不可用;

2.1.2Logical Standby

        通过SQL Apply(即Log Miner)技术,将接收到的日志文件还原成SQL语句,并在逻辑备份数据库上执行,从而达到数据一致性的目的,也叫logical 方式。logical方式只支持同步传输方式,但容灾机可以处在read-only状态

2.1.3Streams

        实时将数据复制到另外一个库供读取。最灵活,但最不稳定。

2.2 选择商业化第三方的产品

      老牌的Shareplex,还是本土DSG公司的RealSync和九桥公司的DDS,或是Oracle新贵GoldenGate,都是可供选择的目标。

      随着GoldenGate被Oracle收购和推广,个人认为GoldenGate在容灾、数据分发和同步方面将大行其道。

DSG RealSync同步du软件的实现方案:

 

三、logical standby实现Oracle数据库的读写分离

3.1、创建物理standby

配置主库(也就是主要执行写操作的数据库)的初始化参数

*.log_archive_config='dg_config=(webdb,webdg)'

*.log_archive_dest_2='service=webdb_standby lgwr sync affirm  valid_for=(online_logfiles,primary_role) db_unique_name=webdg'

*.log_archive_dest_state_2='enable'

修改主库的tnsnames.ora文件

在tnsnames.ora文件中增加一个条目,名称为webdb_standby。这个就是log_archive_dest_2中service的名称。这里的主库版本是10g,所以使用LGWR进程将日志传输到备用节点上,而在11g中使用的进程将是LNS。

WEBDB_STANDBY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = webdb)

    )

  )



WEBDB_READER =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = webreader)

    )

  )

配置备用库(读库)的初始化参数

*.db_unique_name='webdg'

*.fal_client='webdb_standby'

*.fal_server='webdb_primary'

*.log_archive_config='dg_config=(webdb,webdg)'

*.log_archive_dest_1='location=+VG2 valid_for=(all_logfiles,all_roles) db_unique_name=webdg'

修改备用库的tnsnames.ora文件

WEBDB_PRIMARY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = webdb)

    )

  )



WEBDB_STANDBY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = webdb)

    )

  )

在tnsnames.ora文件中增加两个条目,名称为webdb_standby和webdb_primary,分别是fal_client和fal-_server参数对应的值,用于检测归档日志gap。

备份主库的数据库和控制文件

这里我们可以使用原有的全库备份,再新备份控制文件用于standby。

Backup current ontrolfile for standby format ‘/u03/webdb_rman/ctl.standby’;

在备用库上恢复主库数据文件

restore database;

在备用库上添加standby logfile

ALTER DATABASE ADD STANDBY LOGFILE group 21 ('+VG2/webdb/standby_redo21.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 22 ('+VG2/webdb/standby_redo22.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 23 ('+VG2/webdb/standby_redo23.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 24 ('+VG2/webdb/standby_redo24.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 25 ('+VG2/webdb/standby_redo25.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 26 ('+VG2/webdb/standby_redo26.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 27 ('+VG2/webdb/standby_redo27.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 28 ('+VG2/webdb/standby_redo28.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 29 ('+VG2/webdb/standby_redo29.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 30 ('+VG2/webdb/standby_redo30.log')  SIZE 52428800 reuse;

ALTER DATABASE ADD STANDBY LOGFILE group 31 ('+VG2/webdb/standby_redo31.log')  SIZE 52428800 reuse;

在备用库上做恢复操作

recover database;

/u03/webdb_rman@db3=>webdb$rman target /

Recovery Manager: Release 10.2.0.4.0 - Production on Mon May 14 10:08:06 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

connected to target database: WEBDB (DBID=2446281945, not open)

RMAN> recover database;

Starting recover at 14-MAY-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=4384 devtype=DISK

starting media recovery

恢复出错后直接退出。

重启备用库到实时恢复模式

startup nomount;

alter database mount standby database;

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

检查主库上保护模式和保护级别

在主库上sqlplus中执行下列SQL

select protection_mode,protection_level from v$database;

结果应该是两个列的值是一致的,才是正常状态。

SQL> select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

如果protection_level的值是RESYNCHRONIZATION,如下所示

SQL> select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM AVAILABILITY RESYNCHRONIZATION

这表示DATAGUARD的模式是有问题的,需要解决后才能进行下一步操作。

3.2、转换为逻辑 standby

创建用于读库的初始化参数文件和密码文件

在备用库的操作系统上$ORACLE_HOME/dbs目录下,准备两个文件,分别是逻辑库webreader的初始化参数文件和密码文件。

密码文件orapwwebreader由orapwwebdb直接复制。

初始化参数文件initwebreader.ora从initwebdb.ora复制后做些修改操作,修改的参数项只要是下面列出的这些。

/u01/app/oracle/product/10.2.0/db/dbs@db3=>webreader$more initwebreader.ora

*.audit_file_dest='/u01/app/oracle/admin/webreader/adump'

*.background_dump_dest='/u01/app/oracle/admin/webreader/bdump'

*.core_dump_dest='/u01/app/oracle/admin/webreader/cdump'

*.user_dump_dest='/u01/app/oracle/admin/webreader/udump'

*.db_name='webreader'

*.db_unique_name='webdg'

*.fal_client='webdb_reader'

*.fal_server='webdb_primary'

*.log_archive_config='dg_config=(webdb,webdg)'

*.log_archive_dest_1='location=+VG2/ valid_for=(all_logfiles,all_roles) db_unique_name=webdg'

创建用于读库的tnsname条目

在备用库的操作系统上$ORACLE_HOME/network/admin/tnsnames.ora文件中增加一个新的条目webdb_reader。

WEBDB_READER =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = webreader)

    )

  )

增加读库的侦听对象

在备用库的操作系统上$ORACLE_HOME/network/admin/listener.ora文件中,增加新实例webreader的侦听对象。

/u01/app/oracle/product/10.2.0/db/network/admin@db3=>webreader$more listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db/network/admin/listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = webdb)

      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db)

    )

    (SID_DESC =

      (SID_NAME = webdg)

      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db)

    )

    (SID_DESC =

      (SID_NAME = webreader)

      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db)

    )

  )



LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

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

    )

  )

在备用库上取消恢复管理模式

alter database recover managed standby database cancel ;

在主库上创建logical standby的数据字典

EXECUTE DBMS_LOGSTDBY.BUILD;

这一步一定要执行成功,并且必须在其他操作之前执行,否则后面执行 alter database recover to logical standby webreader; 会一直等待。

注意:

该过程会自动启用primary 数据库的补充日志(supplemental logging)功能(如果未启用的话)。

该过程执行需要等待当前所有事务完成,因此如果当前有较长的事务运行,可能该过程执行也需要多花一些等待时间。

该过程是通过闪回查询的方式来获取数据字典的一致性,因此oracle 初始化参数UNDO_RETENTION 值需要设置的足够大。

切换物理Standby为逻辑Standby

我们将读库,也就是logical standby数据库名称定义为webreader。

alter database recover to logical standby webreader;

注意:

这一步很关键。如果执行成功了,目标基本就实现了。

但很可能会遇到两种错误。

执行操作一直hang。这是因为密码文件中sys密码不一致,需要建立与主库一致的密码文件。

备库监听没有包含standby的实例信息,需要在监听文件中添加实例信息。在监听器参数文件的配置中,我们已经添加了所有实例的侦听信息。即使多加了也不影响监听器的正常运行。

正常的执行过程应该如下所示:

SQL> alter database recover managed standby database cancel ;

Database altered.


SQL> alter database recover to logical standby webreader;

alter database recover to logical standby webreader

*

ERROR at line 1:

ORA-16254: change db_name to WEBREADER in the client-side parameter file (pfile)

ORA-17503: ksfdopn:2 Failed to open file +VG1/webdb/temp01.dbf

ORA-15173: entry 'temp01.dbf' does not exist in directory 'webdb'

这一步执行不成功,也会完成。在关闭打开后可以正常使用。

/u01/home/oracle@db3=>webdb$export ORACLE_SID=webreader

/u01/home/oracle@db3=>webreader$sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Mon May 14 10:55:53 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> startup open

ORACLE instance started.

Total System Global Area 5.1540E+10 bytes

Fixed Size                  2179936 bytes

Variable Size            6425676960 bytes

Database Buffers         4.5097E+10 bytes

Redo Buffers               14594048 bytes

Database mounted.

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> alter database open resetlogs;

Database altered.

 

备用库上临时文件处理

在备用库上临时文件需要重建,我选择新增一个临时文件。在不同的环境中,临时文件可能会有很多个。

alter tablespace temp add tempfile '+VG2/webdb/temp02.dbf' size 10240M;

调整主库上log_archive_dest_2的参数值

在物理standby模式下,这个参数的service值是指向webdb_standby的,现在在逻辑standby模式下,它需要修改为指向webdb_reader。

alter system set log_archive_dest_2='service=webdb_reader lgwr sync affirm  valid_for=(online_logfiles,primary_role) db_unique_name=webdg';

 

参考:

1)https://www.cnblogs.com/southdom/articles/4786440.html

2)https://blog.csdn.net/qq_20544709/article/details/80883571

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值