使用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;
到此,数据库读写分离完全成功.
相关推荐
总的来说,Logical Standby 是 Oracle 数据库实现读写分离的一种高效方案,它结合了数据复制和高可用性,提供了良好的读写性能分离和灾难恢复能力。在设计数据库架构时,应当根据业务需求、资源限制和技术能力来选择...
在Oracle环境中,实现读写分离的方法多种多样,包括但不限于RAC架构、Streams数据复制、第三方数据复制软件如Golden Gate或DSG,以及Logical Standby技术。本文将重点讨论如何利用Data Guard的Logical Standby功能来...
**Oracle Active Data Guard (ADG)** 是一种常用的读写分离实现方式。它通过将主数据库的日志文件(Redo Log Files)传递给从数据库,利用Redo Apply技术来保证数据的一致性。这种方式提供了物理级别的数据镜像能力...
首先,DataGuard是Oracle数据库自带的高级数据保护和复制技术,它通过实时传输和应用日志文件来实现主数据库和备数据库之间的同步。DataGuard提供了三种日志传输方式:ARCH传输、LGWR同步传输和LGWR异步传输。此外,...
Oracle Standby Database技术是Oracle数据库系统提供的一种高可用性和灾难恢复解决方案。该技术的核心在于创建一个实时同步或接近实时同步的备用数据库(Standby Database),它可以在主数据库(Primary Database)...
Oracle数据库中的Standby Database是一种高可用性和灾难恢复解决方案,它通过实时同步主数据库的数据到备用数据库,确保在主数据库出现故障时,可以迅速切换到备用数据库进行服务,从而最大限度地减少业务中断。...
通过上述步骤,可以成功地将物理 Standby 数据库转换为逻辑 Standby 数据库,从而实现更加灵活的数据同步方式,满足不同场景下的需求。逻辑 Standby 数据库不仅可以用于数据保护,还可以用于读取只操作、报表生成等...
它支持物理 standby 和 logical standby,能实现快速故障切换和数据同步。 6. GoldenGate:Oracle GoldenGate 提供了实时数据复制功能,可以在不同地理位置的数据库间实现低延迟的数据同步,支持异构环境,适用于...
Oracle数据库安全管理是确保数据安全和保护企业敏感信息的关键环节。本文将深入探讨Oracle数据库安全的几个核心方面,包括概要文件、用户管理以及权限和角色的管理。 首先,概要文件是Oracle数据库安全策略的核心...
### Oracle数据库同步技术详解 #### 一、Oracle 数据同步技术概览 Oracle 数据库作为业界广泛使用的数据库管理系统之一,为了满足企业级应用对于数据高可用性和灾难恢复的需求,提供了多种数据同步技术。这些技术...
4. APnn(Logical Standby / Streams Apply Process Coordinator Process):APnn进程负责从reader服务器获取事务并将其传递给apply服务器。这里的nn是进程的编号。 这些背景进程都是Oracle数据库的重要组成部分,...
Oracle DataGuard 提供了一套全面的高可用性方案,包括物理备用数据库(Physical Standby)和逻辑备用数据库(Logical Standby)。物理备用数据库是主数据库的一个实时副本,通过redo应用保持与主数据库的一致性。...
Oracle数据库的高级复制技术是数据库管理员和开发人员在大型分布式系统中进行数据同步和管理的重要工具。本资源“ORACLE数据库高级复制技术.sql”可能包含了关于Oracle数据库复制的一些实用脚本或示例,用于演示如何...
9. **数据库复制技术**:Oracle的逻辑和物理复制技术(如Logical Standby、GoldenGate)用于实现数据的实时同步,这对于分布式系统和灾难恢复至关重要。 10. **数据库云服务**:随着云计算的发展,Oracle也提供了云...
2、逻辑数据模型(Logical Database Model)•在概念数据模型的基础上,逻辑数据模型考虑了特定DBMS的特性,将CDM转化为更接近数据库实际实现的形式。这个阶段,数据结构和操作更加明确,如字段类型、长度等细节被...
8. 复制技术(Replication):Oracle提供了几种复制解决方案,如逻辑复制(Logical Replication)、物理复制(Physical Replication)和流复制(Stream Replication),以满足不同场景下的数据同步需求。 9. 高可用...
此外,Oracle数据库还提供了其他高级恢复机制,如闪回恢复(Flashback Recovery)和逻辑恢复(Logical Recovery)。闪回恢复允许用户恢复到过去的某个时间点,而逻辑恢复则可以在数据误删除或损坏的情况下,通过导出...
Oracle数据同步技术是Oracle数据库系统中实现分布式环境中数据一致性的重要机制。该技术主要包括Standby/DataGuard、Stream Advanced Replication等方法,旨在确保多台数据库服务器之间的数据实时或近实时的同步,以...
1. 数据复制:Oracle提供了多种数据复制技术,如Logical Standby(逻辑备用)、GoldenGate和Data Guard。这些技术可以实现实时或近实时的数据同步,用于灾难恢复、负载均衡和数据分发。 2. 并行查询:Oracle的并行...