数据库读写分离解决方案--DG实施方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库读写分离解决方案
----oracle 11G ADG实施方案
1.项目背景介绍
1.1目的
通过DG实现主库与备库同步,主库作为业务应用库,备库作为查询库,应用根据不同需求配置对应数据库;
1.2测试环境
在2台RedHat5.4上使用ORACLE 的DataGuard组件实现容灾。
设备配置(VMWare虚拟机环境)清单如下:
2.Oracle DataGuard 介绍
备用数据库(standby database)是ORACLE 推出的一种高可用性(HIGH AVAILABLE)数据库方案,在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份,可以实现快速切换与灾难性恢复。
●STANDBY DATABASE的类型:
有两种类型的STANDBY:物理STANDBY和逻辑STANDBY
两种类型的工作原理可通过如下图来说明:
physical standby提供与主数据库完全一样的拷贝(块到块),数据库SCHEMA,包括索引都是一样的。
它是可以直接应用REDO实现同步的。
l ogical standby则不是这样,在logical standby中,逻辑信息是相同的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO转换成SQL语句,然后在STANDBY上执行SQL语句。
逻辑STANDBY除灾难恢复外还有其它用途,比如用于用户进行查询和报表,但其数据库用户相关对象均需要有主键。
✧本次实施将选择物理STANDBY(physical standby)方式
●对主库的保护模式可以有以下三种模式:
–Maximum protection (最高保护)
–Maximum availability (最高可用性)
–Maximum performance (最高性能)
✧基于项目应用的特征及需求,本项目比较适合采用Maximum availability (最
高可用性)模式实施。
3.Dataguard 实施前提条件和注意事项:
●灾备环境中的所有节点必须安装相同的操作系统,尽可能令详细补丁也保持相
同。
●灾备环境中的所有节点必须安装完全相同版本的Oracle数据库软件,包括版本
号和发布号,比如必须都是Oracle 11.2.0.1
●主库必须处于归档(ARCHIVELOG)模式。
●灾备环境中所有节点的硬件和操作系统架构必须相同
●主库可以是单实例,也可以是RAC。
●主节点和备用节点之间的硬件配置可以不同,比如CPU数量,内存数量,存
储的配置等等。
●配置灾备环境的数据库用户必须具有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 192.168.204.131)以下简称主库
4.2系统硬件环境检查
4.2.1检查内存相关项
检查服务器的内存,可以通过下列命令:
[root@localhost ~]# grep MemTotal /proc/meminfo
另外与内存相关的swap 交换分区的设置也很重要,通常有下列的规则:实际内存建议swap 交换空间大小
-------------- -----------------------------
1G-2G 1.5 倍于内存
2G-16G 与内存相同
超过16G 设置为16G 即可
查看当前服务器swap 交换分区大小,可以通过下列命令:
[root@localhost ~]# grep SwapTotal /proc/meminfo
查看系统当前共享内存,可以通过df 命令,例如:
[root@localhost ~]# df -h /dev/shm
4.2.2查看系统架构
本步用来查看处理器的架构类型,需要确认ORACLE 安装包与处理器架构相符,不然安装时必然报错。
查看当前系统的处理器架构可以通过下列命令:
[root@localhost ~]# uname –m
i686
4.2.3检查磁盘空闲空间
首先/tmp 至少要有1g 的空闲空间,查看/tmp 的磁盘空间,也可以通过df 命令查看,例如:
[root@localhost ~]# df -h /tmp
在执行安装之前,建议执行df -h 命令,查看当前是否有充裕的空闲空间来安装和创建数据库。
[root@jssnode1 ~]# df –h
4.3安装操作系统软件包
(32位RedHat5.4)
binutils-2.17.50.0.6
compat-libstdc++-33-3.2.3
elfutils-libelf-0.125
elfutils-libelf-devel-0.125
elfutils-libelf-devel-static-0.125
gcc-4.1.2
gcc-c++-4.1.2
glibc-2.5-24
glibc-common-2.5
glibc-devel-2.5
ksh-20060214
libaio-0.3.106
libaio-devel-0.3.106
libgcc-4.1.2
libgomp-4.1.2
libstdc++-4.1.2
libstdc++-devel-4.1.2
make-3.81
sysstat-7.0.2
查看软件包是否已经安装:
[root@localhost ~]# rpm -aq binutils compat-libstdc++-33
[root@localhost ~]# rpm -aq | grep elfutils-libelf
[root@localhost ~]# rpm -aq | grep gcc
[root@localhost ~]# rpm -aq | grep glibc
[root@localhost ~]# rpm -aq | grep ksh
[root@localhost ~]# rpm -aq | grep libaio
[root@localhost ~]# rpm -aq | grep libgcc
[root@localhost ~]# rpm -aq | grep libgomp
[root@localhost ~]# rpm -aq | grep libstdc++
[root@localhost ~]# rpm -aq | grep make-3
[root@localhost ~]# rpm -aq | grep sysstat
[root@localhost ~]# rpm -aq | grep unixODBC
通过以上命令来查看是否有未安装的软件包,可将未安装的软件包放到~/rpm下,因有些包会相互依赖,最简单的方式是将rpm包下的软件包一起安装:
[root@localhost ~]#cd rpm
[root@localhost rpm]#pwd
/root/rpm
[root@localhost rpm]#ls
compat-libstdc++-33-3.2.3-61.i386.rpm
elfutils-libelf-devel-0.137-3.el5.i386.rpm
elfutils-libelf-devel-static-0.137-3.el5.i386.rpm
gcc-4.1.2-46.el5.i386.rpm
gcc-c++-4.1.2-46.el5.i386.rpm
glibc-devel-2.5-42.i386.rpm
glibc-headers-2.5-42.i386.rpm
kernel-headers-2.6.18-164.el5.i386.rpm
libaio-devel-0.3.106-3.2.i386.rpm
libgomp-4.4.0-6.el5.i386.rpm
libstdc++-devel-4.1.2-46.el5.i386.rpm
sysstat-7.0.2-3.el5.i386.rpm
unixODBC-2.2.11-7.1.i386.rpm
unixODBC-devel-2.2.11-7.1.i386.rpm
[root@localhost rpm]#rpm –Uvh *
64位需安装的操作系统软件包
binutils-2.17.50.0.6
compat-libstdc++-33-3.2.3
compat-libstdc++-33-3.2.3 (32 bit)
elfutils-libelf-0.125
elfutils-libelf-devel-0.125
gcc-4.1.2
gcc-c++-4.1.2
glibc-2.5-24
glibc-2.5-24 (32 bit)
glibc-common-2.5
glibc-devel-2.5
glibc-devel-2.5 (32 bit)
glibc-headers-2.5
ksh-20060214
libaio-0.3.106
libaio-0.3.106 (32 bit)
libaio-devel-0.3.106
libaio-devel-0.3.106 (32 bit)
libgcc-4.1.2
libgcc-4.1.2 (32 bit)
libstdc++-4.1.2
libstdc++-4.1.2 (32 bit)
libstdc++-devel 4.1.2
make-3.81
sysstat-7.0.2
unixODBC-2.2.11
unixODBC-2.2.11 (32 bit)
unixODBC-devel-2.2.11
unixODBC-devel-2.2.11 (32 bit)
4.4修改内核参数
下列将要进行配置的核心参数均拥有默认值(或者说最小值),需要对其进行配置的原因,是为了获得更好了性能,因此对于产品服务器来说,务必根据实际情况进行配置,不适当的值反倒可能适得其反。
使用vi 命令编辑/etc/sysctl.conf 文件,例如:
[root@localhost ~]# vi /etc/sysctl.conf
将下列内容加入该文件:
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
注意,某些参数可能已经存在于该文件,注意修改参数值即可。
这里各参数所指定的值仅供参考,请根据实际情况进行修改,一般来说只需要对kernel.shmmax 这个参数的参数值进行修改即可,该参数建议修改为物理内存的一半(以字节为单位)。
编辑完之后存盘退出,然后运行下列命令重新加载并验证参数是否正确:
[root@jssnode1 ~]# sysctl -p
4.5修改系统时间
修改主机与备机的系统时间一致
4.6创建用户和组及安装目录并配置环境变量
创建用户和组:
[root@localhost ~]# groupadd oinstall
[root@localhost ~]#groupadd dba
[root@localhost ~]#useradd -g oinstall -G dba oracle
[root@localhost ~]#passwd oracle
验证nobody用户:
[root@localhost ~]#id nobody
创建Oracle的安装目录:
注: (因虚拟机环境安装Linux时没有手动分区,导致挂载点” /”空间不足,所以将oracle安装到了/home/db下,现场环境下Oracle应安装到/opt或单独分区)
[root@localhost ~]# cd /home
[root@localhost home]#mkdir db
改变文件系统/home/db的所有者为oracle,以便将Oracle安装到此目录
[root@localhost home]#chown oracle:oinstall db
切换到oracle用户,修改.bash_profile
[oracle@localhost ~]$ vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs ORACLE_SID=orcl
ORACLE_BASE=/home/db/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 export ORACLE_SID ORACLE_BASE ORACLE_HOME export LD_ASSUME_KERNEL=2.6.18
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK" umask 022
PATH=$PATH:/$ORACLE_HOME/bin:$HOME/bin export PATH
4.7安装Oracle数据库
本节略
5.配置DataGuard过程
5.1备注
“SQL>”:表示在sqlplus环境下执行,通常是以sysdba身份登录来执行命令
“$”或” [oracle@localhost ~]$”:表示在命令行中执行的命令
5.2判断DataGuard是否安装
SQL>select * from v$option where parameter = 'Oracle Data Guard’; 5.3网络配置
192.168.204.131(orcl)------------------------------------192.168.204.132(orcldg)
5.4监听配置
主库
[oracle@localhost ~]$ cd $ORACLE_HOME/network/admin
[oracle@localhost admin]$ vi listener.ora
LISTENER =
(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 启动顺序又不正确,那么在主库可能会报 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 错误,导致归档无法完成。
[oracle@localhost admin]$ vi tnsnames.ora
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)
)
)
备库
[oracle@localhost admin]$ vi listener.ora
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)
)
)
[oracle@localhost admin]$ vi tnsnames.ora
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;
NO
SQL> alter database force logging;
SQL> select FORCE_LOGGING from v$database;
YES
5.6创建口令文件并将文件传输到备库
在主库上创建密码文件,并将文件传到备库的相关位置
[oracle@localhost dbs]$ pwd
/home/db/oracle/product/11.2.0/db_1/dbs
[oracle@localhost bin]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle
[oracle@localhost bin]$ cd $ORACLE_HOME/dbs/
[oracle@localhost dbs]$ ls
缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)
传送文件:
[oracle@localhost dbs]$scp -cp orapworcl **************.204.132://home/db/oracle/product/11.2.0/db_1/dbs
orapworcl 100% 1536 1.5KB/s 00:00 [oracle@localhost dbs]$
5.7创建备份库需要的控制文件并传输到备库
创建控制文件
SQL>shutdown immediate
SQL>startup mount;
SQL>alter database create standby controlfile as '/tmp/stdby_control01.ctl'; SQL>alter database open;
$scp -rp /tmp/stdby_control01.ctl
**************.204.132://home/db/oracle/oradata/ORCL/controlfile/
$scp -rp /tmp/stdby_control01.ctl
**************.204.132://home/db/oracle/flash_recovery_area/ORCL/controlfile/
-----------------------------------------------------------
手工复制几份(未执行)
$ cd /tmp/
$ cp sdtby_control01.ctl stdby_control02.ctl
$ cp sdtby_control01.ctl stdby_control03.ctl
----------------------------------------------------------------------------------------
5.8修改主库初始化参数
创建主库pfile
sql > create pfile from spfile;
修改pfile
[oracle@localhost dbs]$vi initorcl.ora
*.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=auto
pfile 拷贝到备库上
[oracle@localhost dbs]$scp –rp
/home/db/oracle/product/11.2.0/db_1/dbs/initorcl.ora
**************.204.132:/home/db/oracle/product/11.2.0/db_1/dbs/
创建主库spfile
SQL>Shutdown immediate
SQL>startup pfile='//home/db/oracle/product/11.2.0/db_1/dbs/initorcl.ora'
SQL> create spfile from pfile='//home/db/oracle/product/11.2.0/db_1/dbs/initorcl.ora'; SQL> shutdown immediate;
SQL > startup
5.9修改数据库运行在归档模式下
SQL > SHUTDOWN IMMEDIATE;
SQL > STARTUP MOUNT;
SQL > ALTER DATABASE ARCHIVELOG;
SQL > ALTER DATABASE OPEN;
5.10备份生产数据库
$scp -rp /home/db/oracle/oradata/ORCL **************.204.132://home/db/oracle/oradata/ $scp –rp/home/db/oracle/admin/******************.204.132://home/db/oracle/admin
5.11修改备库pfile
[oracle@localhost dbs]$vi initorcl.ora
*.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.c tl','/home/db/oracle/flash_recovery_area/ORCL/controlfile/stdby_control01.c tl'
5.12在备库上创建spfile
sql>shutdown immediate
sql>create spfile from pfile;
5.13启动物理备用数据库
SQL>startup nomount
SQL>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 LOGFILE group 4('/home/db/oracle/product/11.2.0/db_1/dbs/slog4.rdo') SIZE 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE group 5 ('/home/db/oracle/product/11.2.0/db_1/dbs/slog5.rdo') SIZE 50M;
SQL>ALTER DATABASE ADD STANDBY LOGFILE group 6 ('/home/db/oracle/product/11.2.0/db_1/dbs/slog6.rdo') SIZE 50M;
SQL>ALTER DATABASE ADD STANDBY LOGFILE group 7('/home/db/oracle/product/11.2.0/db_1/dbs/slog7.rdo') SIZE 50M;
备注:
删除日志组redo log文件的方法
SQL>ALTER DATABASE DROP STANDBY LOGFILE GROUP N;(N代表数字)
5.15Start 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 data
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
在备库查看接收到的被应用的redo
SQL> 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 VALID
LOG_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.16DataGuard日常维护
在日常维护中,请严格按照以下顺序来操作:
启动顺序
启动的时候,先启动备库,然后启动主库。
一、启从、主库的监听Listener
从库orcldg:
$lsnrctl start
主库orcl:
$lsnrctl start
二、启动备库数据库,执行如下:
$sqlplus “/ as sysdba”
SQL> startup nomount
SQL> alter database mount standby database; #让备库处于standby
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE disconnect; #开始同步
三、启动主库数据库(上述第二步执行完毕后,方可执行如下命令):
SQL>startup
关闭顺序
关闭的时候正好相反,先关闭主库,然后关闭从库。
●关闭主库
CMD>su – oracle
CMD>sqlplus “/ as sysdba”
SQL>shutdown immediate;
●关闭从库
telnet 120.4.7.50
su – oracle
CMD>sqlplus “/ as sysdba”
SQL>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 over
●不能切换的情况
SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
------------------
SESSIONS ACTIVE
在这种情况下,说明还有活动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 altered
可以切换的情况
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO STANDBY
2.将主库切换至备用模式
SQL> alter database commit to switchover to physical standby with session shutdown;
3.关闭、装载主数据库
SQL> shutdown abort;
SQL> startup mount;
4.查看备库准备向主库模式切换
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
1 row selected
注:如果是TO PRIMARY表示可以正常切换,不过还会遇到NOT ALLOWED和PENDING或者LATENT,实际操作下来如果备库的switchover_status为not allowed或者to primary都可以正常切换
5.切换备库至主库模式
SQL> alter database commit to switchover to primary with session shutdown;
6.打开新的主数据库
SQL> ALTER DATABASE OPEN;
7. 在新的备库服务器上启动 REDO apply。
SQL> alter database recover managed standby database using current logfile
disconnect from session;
5.18灾难恢复(failover)
Step 1 Flush any unsent redo from the primary database to the target standby database
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
Step 2 Verify that the standby database has the most recently archived redo log file for each primary database redo thread.
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) -
> OVER (PARTITION BY thread#) AS LAST from V$ARCHIVED_LOG;
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
Step 3 Identify and resolve any archived redo log gaps.
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
Step 4 Repeat Step 3 until all gaps are resolved.
Step 5 Stop Redo Apply.
Issue the following SQL statement on the target standby database:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Step 6 Finish applying all received redo data.
Issue the following SQL statement on the target standby database:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
Step 7 Verify that the target standby database is ready to become a primary database.
Step 8 Switch the physical standby database to the primary role.
Issue the following SQL statement on the target standby database:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
Step 9 Open the new primary database.
SQL> ALTER DATABASE OPEN;
Step 10 Back up the new primary database.
Oracle recommends that a full backup be taken of the new primary database.
Step 11 Restart Redo Apply if it has stopped at any of the other physical standby databases in your Data Guard configuration.
For example:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE -
> DISCONNECT FROM SESSION;
附:
1.启动到管理模式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database recover managed standby database disconnect from session;
2.启动到只读方式
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
SQL>alter database open read only;
3如果在管理恢复模式下到只读模式
SQL> recover managed standby database cancel;
SQL> alter database open read only;。