大数据库读写分离解决方案设计-DG实施方案设计.doc
word1. 项目背景介绍1.1 目的通过DG实现主库与备库同步,主库作为业务应用库,备库作为查询库,应用根据不同需求配置对应数据库;1.2 测试环境在2台使用ORACLE 的DataGuard组件实现容灾。设备配置(VMWare虚拟机环境)清单如下:主机型号数据实例配置数据库版本RedHat 5.4(32位)ORCLCPU:1MEM:2GOracle 11RedHat 5.4(32位)ORCLCPU:1MEM:2G2. Oracle DataGuard 介绍备用数据库standby database是ORACLE 推出的一种高可用性(HIGH AVAILABLE)数据库方案,在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份,可以实现快速切换与灾难性恢复。 l STANDBY DATABASE的类型:有两种类型的STANDBY:物理STANDBY和逻辑STANDBY两种类型的工作原理可通过如如下图来说明:physical standby提供与主数据库完全一样的拷贝块到块,数据库SCHEMA,包括索引都是一样的。它是可以直接应用REDO实现同步的。 logical standby如此不是这样,在logical standby中,逻辑信息是一样的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO转换成SQL语句,然后在STANDBY上执行SQL语句。逻辑STANDBY除灾难恢复外还有其它用途,比如用于用户进展查询和报表,但其数据库用户相关对象均需要有主键。² 本次实施将选择物理STANDBY(physical standby)方式l 对主库的保护模式可以有以下三种模式: Maximum protection (最高保护Maximum availability 最高可用性Maximum performance (最高性能三种保护模式区别如下:保护模式数据丢失保护重做传输最高保护零数据丢失双重故障保护LGWR SYNC 将重做同步传输至两个站点,网络中断会导致主Database宕机最高可用性零数据丢失单重故障保护LGWR SYNC 重做同步传输最高性能最少的数据丢失LGWR ASYNC 或 ARCH 重做异步传输² 基于项目应用的特征与需求,本项目比拟适合采用Maximum availability 最高可用性模式实施。3. Dataguard 实施前提条件和须知事项:l 灾备环境中的所有节点必须安装一样的操作系统,尽可能令详细补丁也保持一样。 l 灾备环境中的所有节点必须安装完全一样版本的Oracle数据库软件,包括版本号和发布号,比如必须都是Oracle 11.2.0.1 l 主库必须处于归档ARCHIVELOG模式。 l 灾备环境中所有节点的硬件和操作系统架构必须一样l 主库可以是单实例,也可以是RAC。 l 主节点和备用节点之间的硬件配置可以不同,比如CPU数量,存数量,存储的配置等等。 l 配置灾备环境的数据库用户必须具有SYSDBA权限。4. Oracle软件安装1. 要实施DataGurad的前,需要在主机RedHat-Primary和备机RedHat-Standby上进展ORACLE软件的根底安装。2. 备机根底软件的安装有两种方式供选择:1) 源始安装介质安装采用ORACLE数据库安装介质进展软件安装。2) “克隆主站源数据库分别对主站源数据库进展tar压缩并FTP/rcp至备机上,然后展开压缩文件。² 通常出于便捷的原因,备机的Oracle初始建立可采用上述的第二种方式。测试环境中直接对虚拟机进展了拷贝,因此相当于采用了第二种方式。现场环境下,如果主节点不是RAC环境,也可以采用第二种方式。4.1 环境配置RedHat5-Primary (primary , IP )以下简称主库Single Instance Primary说明IPOracle单实例InstanceORCLData,Control File,Redo File$ORACLE_BASE/oradataRedHat5-Standby (standby, IP ) ,以下简称从库。Single Instance Standby说明IPOracle单实例InstanceORCLData,Control File,Redo File$ORACLE_BASE/oradata4.2 系统硬件环境检查4.2.1 检查存相关项检查服务器的存,可以通过如下命令:rootlocalhost # grepMemTotal /proc/meminfo另外与存相关的swap 交换分区的设置也很重要,通常有如下的规如此:实际存建议swap 交换空间大小- -1G-2G 1.5 倍于存2G-16G 与存一样超过16G 设置为16G 即可查看当前服务器swap 交换分区大小,可以通过如下命令:rootlocalhost # grep SwapTotal /proc/meminfo查看系统当前共享存,可以通过df 命令,例如:rootlocalhost # df -h /dev/shm4.2.2 查看系统架构本步用来查看处理器的架构类型,需要确认ORACLE 安装包与处理器架构相符,不然安装时必然报错。查看当前系统的处理器架构可以通过如下命令:rootlocalhost # uname mi6864.2.3 检查磁盘空闲空间首先/tmp 至少要有1g 的空闲空间,查看/tmp 的磁盘空间,也可以通过df 命令查看,例如:rootlocalhost # df -h /tmp在执行安装之前,建议执行df -h 命令,查看当前是否有充裕的空闲空间来安装和创建数据库。rootjssnode1 # df h4.3 安装操作系统软件包l (32位 RedHat5.4)查看软件包是否已经安装:rootlocalhost # rpm -aq binutils pat-libstdc+-33rootlocalhost # rpm -aq | grep elfutils-libelfrootlocalhost # rpm -aq | grep gccrootlocalhost # rpm -aq | grep glibcrootlocalhost # rpm -aq | grep kshrootlocalhost # rpm -aq | grep libaiorootlocalhost # rpm -aq | grep libgccrootlocalhost # rpm -aq | grep libgomprootlocalhost # rpm -aq | grep libstdc+rootlocalhost # rpm -aq | grep make-3rootlocalhost # rpm -aq | grep sysstatrootlocalhost # rpm -aq | grep unixODBC通过以上命令来查看是否有未安装的软件包,可将未安装的软件包放到/rpm下,因有些包会相互依赖,最简单的方式是将rpm包下的软件包一起安装:rootlocalhost #cd rpmrootlocalhostrpm#pwd/root/rpmrootlocalhostrpm#lsrootlocalhostrpm#rpm Uvh *l 64位需安装的操作系统软件包pat-libstdc+-33-3.2.3 (32 bit)glibc-2.5-24 (32 bit)glibc-devel-2.5 (32 bit)ksh-20060214libaio-0.3.106 (32 bit)libaio-devel-0.3.106 (32 bit)libgcc-4.1.2 (32 bit)libstdc+-4.1.2 (32 bit)unixODBC-2.2.11 (32 bit)unixODBC-devel-2.2.11 (32 bit)4.4 修改核参数如下将要进展配置的核心参数均拥有默认值(或者说最小值),需要对其进展配置的原因,是为了获得更好了性能,因此对于产品服务器来说,务必根据实际情况进展配置,不适当的值反倒可能适得其反。使用vi 命令编辑/etc/sysctl.conf 文件,例如:rootlocalhost# 将如下容参加该文件:fs.aio-max-nr = 1048576fs.file-max = 6815744kernel.shmall = 2097152kernel.shmmax = 536870912kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 9000 65500net.core.rmem_default = 262144net.core.rmem_max = 4194304net.core.wmem_default = 262144net.core.wmem_max = 1048586注意,某些参数可能已经存在于该文件,注意修改参数值即可。这里各参数所指定的值仅供参考,请根据实际情况进展修改,一般来说只需要对kernel.shmmax 这个参数的参数值进展修改即可,该参数建议修改为物理存的一半(以字节为单位)。编辑完之后存盘退出,然后运行如下命令重新加载并验证参数是否正确:rootjssnode1 # sysctl -p4.5 修改系统时间修改主机与备机的系统时间一致4.6 创建用户和组与安装目录并配置环境变量创建用户和组:rootlocalhost # groupadd oinstallrootlocalhost #groupadd dbarootlocalhost #useradd -g oinstall -G dba oraclerootlocalhost #passwd oracle验证nobody用户:rootlocalhost #idnobody创建Oracle的安装目录:注: (因虚拟机环境安装Linux时没有手动分区,导致挂载点 /空间不足,所以将oracle安装到了/home/db下,现场环境下Oracle应安装到/opt或单独分区)rootlocalhost # cd /homerootlocalhosthome#mkdir db改变文件系统/home/db的所有者为oracle,以便将Oracle安装到此目录rootlocalhosthome#chown oracle:oinstall dboraclelocalhost$vi .bash_profile# .bash_profile# Get the aliases and functionsif -f /.bashrc ; then . /.bashrcfi# User specific environment and startup programsORACLE_SID=orcl ORACLE_BASE=/home/db/oracle export ORACLE_SID ORACLE_BASE ORACLE_HOME export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"umask PATH=$PATH:/$ORACLE_HOME/bin:$HOME/bin export PATH4.7 安装Oracle数据库本节略5. 配置DataGuard过程5.1 备注“SQL>:表示在sqlplus环境下执行,通常是以sysdba身份登录来执行命令“$或 oraclelocalhost $:表示在命令行中执行的命令5.2 判断DataGuard是否安装SQL>select * from v$option where parameter = 'Oracle Data Guard;5.3 网络配置192.168.204.131orcl-192.168.204.132(orcldg)5.4 监听配置l 主库oraclelocalhost $ cd $ORACLE_HOME/network/adminoraclelocalhost admin$viLISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.131)(PORT = 1521) ) )SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (SID_NAME = orcl) (ORACLE_HOME = /home/db/oracle/product/11.2.0/db_1) ) ) 注意:SID_LIST_LISTENER 配置的是静态注册,如果没有该参数,而且Data Guard 启动顺序又不正确,那么在主库可能会报 PINGARC1: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 错误,导致归档无法完成。oraclelocalhost admin$vi ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.131)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )ORCLDG = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.132)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = orcldg) ) )l 备库oraclelocalhost admin$vi LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.132)(PORT = 1521) ) ) )SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcldg) (SID_NAME = orcl) (ORACLE_HOME = /home/db/oracle/product/11.2.0/db_1) ) ) oraclelocalhost admin$vi ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.131)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )ORCLDG = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.132)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = orcldg) ) )5.5 主库前期准备设置强制写日志SQL>select FORCE_LOGGING from v$database;NOSQL> alter database force logging;SQL> select FORCE_LOGGING from v$database;YES5.6 创建口令文件并将文件传输到备库在主库上创建密码文件,并将文件传到备库的相关位置oraclelocalhost dbs$ pwd/home/db/db_1/dbsoraclelocalhost bin$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracleoraclelocalhost bin$ cd $ORACLE_HOME/dbs/oraclelocalhost dbs$ ls 缺省情况下,win下口令文件的格式是,unix下的格式是orapwSID(大小写敏感传送文件:oraclelocalhost dbs$scp -cp orapworcl oracle192.168.204.132:/home/db/db_1/dbsorapworcl 100% 1536 1.5KB/s 00:00oraclelocalhost dbs$5.7 创建备份库需要的控制文件并传输到备库创建控制文件SQL>shutdown immediateSQL>startup mount; SQL>alter database create standby controlfile as '/tmp/stdby_control01.ctl' SQL>alter database open;$scp -rp /tmp/stdby_control01.ctl oracle192.168.204.132:/home/db/oracle/oradata/ORCL/controlfile/$scp -rp /tmp/stdby_control01.ctl oracle192.168.204.132:/home/db/oracle/flash_recovery_area/ORCL/controlfile/-手工复制几份(未执行)$ cd /tmp-5.8 修改主库初始化参数 创建主库pfilesql > create pfile from spfile;修改pfileoraclelocalhost dbs$*.db_unique_name=orcl*.log_archive_config='dg_config=(orcl,orcldg)' *.log_archive_dest_1='location=/home/db/oracle/oradata/ORCL/archive valid_for=(all_logfiles,all_roles) db_unique_name=orcl' *.log_archive_dest_2='service=orcldg lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcldg' *.log_archive_dest_state_1=enable *.log_archive_dest_state_2=defer*.log_archive_format=%t_%s_%r.arc *.fal_server=orcldg*.fal_client=orcl*.standby_file_management=autopfile 拷贝到备库上oraclelocalhost dbs$创建主库spfileSQL>Shutdown immediateSQL>initorcl.ora'SQL> create spfile from initorcl.ora'SQL> shutdown immediate;SQL > startup5.9 修改数据库运行在归档模式下SQL > SHUTDOWN IMMEDIATE; SQL > STARTUP MOUNT; SQL > ALTER DATABASE ARCHIVELOG; SQL > ALTER DATABASE OPEN;5.10 备份生产数据库$scp -rp /home/db/oracle/oradata/ORCL oracle192.168.204.132:/home/db/oracle/oradata/$scp rp /home/db/oracle/admin/orcl oracle192.168.204.132:/home/db/oracle/admin5.11 修改备库pfile*.db_unique_name=orcldg*.log_archive_config='dg_config=(orcldg,orcl)' *.log_archive_dest_1='location=/home/db/oracle/oradata/ORCL/archive valid_for=(all_logfiles,all_roles) db_unique_name=orcldg' *.log_archive_dest_2='service=orcl lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl' *.log_archive_dest_state_1=enable *.log_archive_dest_state_2=enable *.log_archive_format=%t_%s_%r.arc *.fal_server=orcl*.fal_client=orcldg*.standby_file_management=auto*.control_files='/home/db/oracle/oradata/ORCL/controlfile/stdby_control01.ctl','/home/db/oracle/flash_recovery_area/ORCL/controlfile/stdby_control01.ctl'5.12 在备库上创建spfilesql>shutdown immediatesql>create spfile from pfile;5.13 启动物理备用数据库SQL>startup nomountSQL>alter database mount standby database;5.14 配置Standby Redo Log在两边都配置standby redo log在主库查看日志组的数量和每个日志文件的大小SQL> SELECT GROUP#, BYTES FROM V$LOG;在备库库查看日志组的数量和每个日志文件的大小SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;在主备库创建日志组和redo log文件SQL> ALTER DATABASE ADD STANDBY LOGFILEgroup 4(4.rdo') SIZE 50M; SQL> ALTER DATABASE ADD STANDBY LOGFILE group 5 5.rdo') SIZE 50M;SQL>ALTER DATABASE ADD STANDBY LOGFILE group 6 6.rdo') SIZE 50M;SQL>ALTERDATABASE ADD STANDBY LOGFILE group 77.rdo') SIZE 50M;备注:删除日志组redo log文件的方法SQL>ALTER DATABASE DROP STANDBY LOGFILE GROUP N;(N代表数字)5.15 Start Redo Apply在主数据库上设置DataGuard的保护模式.把主数据库启动到mount状态设置好DataGuard的保护模式.SQL>alter system set log_archive_dest_state_2=ENABLE scope=both;SQL>shutdown immediate;SQL>startup mount;SQL>alter database set standby database to maximize availability;SQL>alter database open;在备用数据库上启动日志传输#实时应用日志SQL>alter database recover managed standby database using current logfile disconnect from session; 查看哪些归档日志被APPLY了SQL>select sequence#,applied from v$archived_log order by sequence#;在主库强制日志切换到当前的online redo log file.SQL>alter system archive log current;在备库查看新的被归档的redo dataSQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;在备库查看接收到的被应用的redoSQL> select sequence#,applied from v$archived_log order by sequence#;查看数据库的角色SQL>select database_role,protection_mode,protection_level from v$database;在主库查看日志传送情况SQL> Select dest_name,status,error from v$archive_dest;DEST_NAME STATUS ERROR- - -LOG_ARCHIVE_DEST_1 VALIDLOG_ARCHIVE_DEST_2 VALID 31 rows selected. 两个节点都正常。验证同步情况在主库切换日志: SQL> alter system switch logfile;System altered. SQL> select sequence# from v$archived_log;SEQUENCE#- 15 16 SQL> alter system switch logfile; System altered. SQL> select sequence# from v$archived_log; SEQUENCE#- 17 18 在备库进展验证:SQL> select sequence#,applied from v$archived_log; SEQUENCE# APP- - 13 YES 4 NO 14 YES 15 YES 16 YES 18 NO 16 YES 17 YES 18 YES 19 YES 同步成功。至此Oracle 的Data Guard 环境已经搭建完成。5.16 DataGuard日常维护在日常维护中,请严格按照以下顺序来操作:启动顺序启动的时候,先启动备库,然后启动主库。一、启从、主库的监听Listener从库orcldg:$lsnrctl start主库orcl:$lsnrctl start二、启动备库数据库,执行如下:$sqlplus “/ as sysdbaSQL> startup nomountSQL> alter database mount standby database;#让备库处于standbySQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE disconnect;#开始同步三、启动主库数据库(上述第二步执行完毕后,方可执行如下命令):SQL>startup关闭顺序关闭的时候正好相反,先关闭主库,然后关闭从库。l 关闭主库CMD>su oracleCMD>sqlplus “/ as sysdbaSQL>shutdown immediate;l 关闭从库su oracleCMD>sqlplus “/ as sysdbaSQL>alter database recover managed standby database cancel;#停止同步SQL>shutdown immediate查看备库的数据SQL>alter database recover managed standby database cancel;SQL> alter database open read only;Database altered.SQL> select count(1) from user_tables;.SQL操作完成后,需执行以下语句以令从库继续处于接收状态:SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE disconnect;5.17 主备库切换1. 查看主库的状态:确认a是否可以做switch overl 不能切换的情况SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS -SESSIONSACTIVE在这种情况下,说明还有活动session,需要先kill掉,只留下当前sys进程select sid,SERIAL# from v$session where sid>10; SID SERIAL# - - 12 14 17 3 查出当前连接session SQL> select distinct ss.sid from v$mystat ss; 杀掉其他session SQL> alter system kill session '12,14' System alteredl 可以切换的情况SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;SWITCHOVER_STATUS-TO STANDBYSQL> alter database mit to switchover to physical standby withsession shutdown;3.关闭、装载主数据库SQL> shutdown abort;SQL> startup mount;SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;SWITCHOVER_STATUS-TOPRIMARY1 row selected注:如果是TOPRIMARY表示可以正常切换,不过还会遇到NOT ALLOWED和PENDING或者LATENT,实际操作下来如果备库的switchover_status为not allowed或者to primary都可以正常切换SQL> alter database mit to switchover to primary with session shutdown;SQL> ALTER DATABASE OPEN;7. 在新的备库服务器上启动 REDO apply。SQL> alter da