• oracle的读写分离实现


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

      同样,在Oracle作为后台数据库的架构中,我们也可以这么做。实现的方式有很多种。
      有基于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';
  • 相关阅读:
    反击黑客之对网站攻击者的IP追踪
    如何使用Nginx对抗DDoS攻击?
    nginx网站攻击防护
    Ora-01536:超出了表空间users的空间限量
    ASP.Net请求处理机制初步探索之旅
    ASP.Net请求处理机制初步探索之旅
    ASP.Net请求处理机制初步探索之旅
    自己动手写工具:百度图片批量下载器
    自己动手写游戏:坦克撕逼大战
    【大型网站技术实践】初级篇:海量图片的分布式存储设计与实现
  • 原文地址:https://www.cnblogs.com/wangzhuxing/p/8520206.html
Copyright © 2020-2023  润新知