使用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_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的模式是有问题的,需要解决后才能进行下一步操作。
二、转换为逻辑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';
正式启动备用库
在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;
到此,数据库读写分离完全成功.
相关推荐
在MySQL作为应用系统的后台数据库时,我们常常见到这样的架构,一拖二、一拖三等等。这是用MySQL的读写分离技术,实现...我们这里介绍最后一个方法,利用dataguard技术中的logical standby实现Oracle数据库的读写分离。
这是用MySQL的读写分离技术,实现数据的写入和读取分别在不同的库上,提升了数据库服务能力。 同样,在Oracle作为后台数据库的架构中,我们也可以这么做。实现的方式有很多种。 有基于RAC架构的,使用其中某个...
关系数据库主要包括 数据定义 数据操作 数据控制 内模式(internal schema) 也称存储模式 模式(schema) 也称逻辑模式(logical schema) 外模式(external schema) 也称子模式...
大多数人都知道Streaming Replication已经成为PostgreSQL的一部分,并且通常用于高可用性和读写分离,流复制是基于WAL日志的物理复制,适用于整个数据库实例的复制,并且备库是只读的。 Logical Replication属于...
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 数据库服务器是解决信息管理问题的核心组件...
DataGuard对于oracle初学者一直感觉是比较难的问题,看到这篇文章觉得不错,共享,大家一块学习
而logical目录中对应的是创建逻辑Standby时,Primary和Standby库中相关的配置文件; 目录13内文件为书中第13章出现的使用DataPump API实现导出的脚本; 目录14内文件为书中第14章,用来验证平台字节序的脚本; 目录...
正如在那部分中所见的,STANDBY方法允许当数据库副本处于暂挂状态时在辅助系统上执行数据库备份。 创建数据库副本已经创建了 DR解决方案的一部分。备份副本提高了保护级别。如果用双日志记录和用户出口程序正确实现...
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 ...
为了提供可靠的DMS平台,LogicalDOC的设计基于最佳的Java技术。主界面是基于Web的,无需安装其他任何东西。用户可以通过其浏览器访问系统。 LogicalDOC CE是100%免费的软件,并与开源数据库打包在一起;尽管它支持...
为了提供可靠的DMS平台,LogicalDOC的设计基于最佳的Java技术。主界面是基于Web的,无需安装其他任何东西。用户可以通过其浏览器访问系统。 LogicalDOC CE是100%免费的软件,并与开源数据库打包在一起;尽管它支持...
fuzzy logical很好的学习资料
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是一个采用Java开发的基于网页的文档管理系统,提供了快速的索引功能和基于浏览器的查询功能。提供 .NET和PHP版本,附带论坛和WebDAV的接口,支持文档导入导出到ZIP文件和邮箱文件。 文件夹可分层次组织,...
database logical script
shl logical
Logical Channel Descriptor and Allocation of Logical Channel Numbers
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 ...
它利用最佳的Java技术,实现了强大而灵活的解决方案。为用户提供了强大的搜索引擎(基于Lucene),(通过CXF的JAX-WS)Web服务接口。提供 .NET和PHP版本,附带论坛和WebDAV的接口,支持文档导入导出到ZIP文件和邮箱...