`
frank1998819
  • 浏览: 725676 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

施用logical standby技术实现Oracle数据库的读写分离 (转)

 
阅读更多

使用logical standby技术实现Oracle数据库的读写分离

MySQL作为应用系统的后台数据库时,我们常常见到这样的架构,一拖二、一拖三等等。这是用MySQL的读写分离技术,实现数据的写入和读取分别在不同的库上,提升了数据库服务能力。

同样,在Oracle作为后台数据库的架构中,我们也可以这么做。实现的方式有很多种。

(链接: http://mikixiyou.iteye.com/blog/1527226 )

有基于RAC架构的,使用其中某个节点作为读库;

有基于Streams数据复制技术的,实时将数据复制到另外一个库供读取;

有使用第三方数据复制软件的,如Golden Gate(已经被Oracle收入囊中)DSG的,也是实时复制数据到另外一个库中。

还有使用Logical standby技术,实时复制数据到一个库,且该库是对应用而言是只读的。

我们这里介绍最后一个方法,利用dataguard技术中的logical standby实现Oracle数据库的读写分离。

一、创建物理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_2service的名称。这里的主库版本是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_standbywebdb_primary,分别是fal_clientfal­_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的模式是有问题的,需要解决后才能进行下一步操作。

二、转换为逻辑standby

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

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

密码文件orapwwebreaderorapwwebdb直接复制。

初始化参数文件initwebreader.orainitwebdb.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';

正式启动备用库

Logical Stadnby上启动sql apply

alter database start logical standby apply;

如果要启动实时应用特性,需要先在备库添加standby redo logfile。我们在创建physical standby时就已经添加了standby redo logfile,因此我们可以启动为实时复制数据模式。启动real time sql apply操作如下:

alter database stop logical standby apply;

alter database start logical standby apply immediate;

到此,数据库读写分离完全成功.

分享到:
评论

相关推荐

    运用logical standby技术实现Oracle数据库的读写分离

    在MySQL作为应用系统的后台数据库时,我们常常见到这样的架构,一拖二、一拖三等等。这是用MySQL的读写分离技术,实现...我们这里介绍最后一个方法,利用dataguard技术中的logical standby实现Oracle数据库的读写分离。

    如何实现Oracle数据库的读写分离

    这是用MySQL的读写分离技术,实现数据的写入和读取分别在不同的库上,提升了数据库服务能力。  同样,在Oracle作为后台数据库的架构中,我们也可以这么做。实现的方式有很多种。  有基于RAC架构的,使用其中某个...

    oracle数据库考试复习提纲

    关系数据库主要包括  数据定义  数据操作  数据控制  内模式(internal schema)  也称存储模式  模式(schema)  也称逻辑模式(logical schema)  外模式(external schema)  也称子模式...

    Logical Replication

    大多数人都知道Streaming Replication已经成为PostgreSQL的一部分,并且通常用于高可用性和读写分离,流复制是基于WAL日志的物理复制,适用于整个数据库实例的复制,并且备库是只读的。 Logical Replication属于...

    Oracle Concepts中英文对照版

    1.1 Oracle数据库体系结构 An Oracle database is a collection of data treated as a unit. The purpose of a database is to store and retrieve related information 数据库服务器是解决信息管理问题的核心组件...

    Oracle+Data+Guard+Linux+平台+Logical+Standby+创建实例

    DataGuard对于oracle初学者一直感觉是比较难的问题,看到这篇文章觉得不错,共享,大家一块学习

    《涂抹Oracle-三思笔记之一步步学Oracle》-李丙洋-源代码-6961.rar

    而logical目录中对应的是创建逻辑Standby时,Primary和Standby库中相关的配置文件; 目录13内文件为书中第13章出现的使用DataPump API实现导出的脚本; 目录14内文件为书中第14章,用来验证平台字节序的脚本; 目录...

    数据库灾难性恢复(数据库技术;灾难性;恢复;数据备份)

    正如在那部分中所见的,STANDBY方法允许当数据库副本处于暂挂状态时在辅助系统上执行数据库备份。 创建数据库副本已经创建了 DR解决方案的一部分。备份副本提高了保护级别。如果用双日志记录和用户出口程序正确实现...

    matlab开发-logical2cellstrcellstr2logical

    matlab开发-logical2cellstrcellstr2logical。从逻辑数组转换为字符串为“true”/“false”的单元格数组,然后再次进行转换。

    数据库性能监控

    session logical reads db block changes execute count user commits Concurrent Trans redo size redo writes parse count (total) parse count (hard) 指标项: #IO Latency db file sequential read(ms) log ...

    logicaldoc-community-installer-8.3.4.zip

    为了提供可靠的DMS平台,LogicalDOC的设计基于最佳的Java技术。主界面是基于Web的,无需安装其他任何东西。用户可以通过其浏览器访问系统。 LogicalDOC CE是100%免费的软件,并与开源数据库打包在一起;尽管它支持...

    logicaldoc-community-installer-8.3.4.exe

    为了提供可靠的DMS平台,LogicalDOC的设计基于最佳的Java技术。主界面是基于Web的,无需安装其他任何东西。用户可以通过其浏览器访问系统。 LogicalDOC CE是100%免费的软件,并与开源数据库打包在一起;尽管它支持...

    fuzzy logical学习资料

    fuzzy logical很好的学习资料

    Oracle 11g For Dummies.pdf

    The building blocks behind the database engine as well as Oracle’s physical and logical structures Hardware, software, system, and storage requirements for implementation How to recognize and ...

    开源文档管理系统LogicalDOC v6.3.rar

    LogicalDOC是一个采用Java开发的基于网页的文档管理系统,提供了快速的索引功能和基于浏览器的查询功能。提供 .NET和PHP版本,附带论坛和WebDAV的接口,支持文档导入导出到ZIP文件和邮箱文件。 文件夹可分层次组织,...

    Database Logical

    database logical script

    shl logical

    shl logical

    Logical Channel Descriptor and Allocation of Logical Channel Numbers

    Logical Channel Descriptor and Allocation of Logical Channel Numbers

    2010年10月最新ORACLE OCP培训教程

    Logical and Physical Database Structures 1-20 Course Examples: The HR Schema 1-22 Database Architecture: Summary of Structural Components 1-23 Summary 1-24 2 Installing the Oracle Database Software ...

    开源文档管理系统LogicalDOC v6.4.1

    它利用最佳的Java技术,实现了强大而灵活的解决方案。为用户提供了强大的搜索引擎(基于Lucene),(通过CXF的JAX-WS)Web服务接口。提供 .NET和PHP版本,附带论坛和WebDAV的接口,支持文档导入导出到ZIP文件和邮箱...

Global site tag (gtag.js) - Google Analytics