本文共 5827 字,大约阅读时间需要 19 分钟。
一、创建备份
物理Standby数据库相当于Primary数据库在某个时间点的镜像复制,因此在创建物理Standby数据库之前,至少要有一份Primary数据库的完整备份。
Oracle建议使用RMAN创建备份集,不过如果数据库规模不是太大,我个人更倾向于通过用户管理的方式创建备份集。
创建备份有三种方式:
1. RMAN 备份与恢复 -- 不需要shutdown 数据库
备份:
$ rman target /
RMAN> backup full format 'D:/FULL_%d_%T_%s.bak' database include current controlfile for standby;
RMAN> sql 'alter system archive log current';
RMAN> Backup ArchiveLog all format='D:/arch_%d_%T_%s.bak';
传送:
备份完后将备份文件拷到standby上同样的目录,强调:同样的目录,在standby进行rman 恢复即可
恢复:
$rman targetsys/admin@primaryauxiliary /
RMAN> duplicate target database for standby dorecover nofilenamecheck;
2. 用户管理方式 -- 不需要shutdown 数据库
用用户管理方式创建热备份就是备份表空间,可以分成三个步骤:
1)。 通过ALTER TABLESPACE BEGIN BACKUP命令标记指定表空间进入备份状态。
2)。 通过操作系统命令复制锁定表空间的数据文件。
3)。 通过ALTER TABLESPACE END BACKUP命令标记指定表空间结束备份。
例如,对USERS表空间进行备份:
SQL> select tablespace_name, file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
------------------------------ -------------------------------------------------
USERS /u01/app/oracle/oradata/orcl/users01.dbf
SYSAUX /u01/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /u01/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
SQL> ALTER TABLESPACE USERS BEGIN BACKUP;
Tablespace altered.
SQL> !cp /u01/app/oracle/oradata/orcl/users01.dbf /u01/users01.dbf
SQL> ALTER TABLESPACE USERS END BACKUP;
Tablespace altered.
3. 直接copy 文件 -- shutdown 进行
实例关闭后,拷贝数据文件到备库上即可。
二、创建Standby数据库控制文件
在Primary 库上执行如下语句,为Standby数据库创建控制文件:
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/backup/control01.ctl';
注 意:控制文件通常需要有多份,你要么手工将上述文件复制几份,要么用命令多创建几个出来。需要注意,如果选择多次执行上述命令创建出多份,务必确保执行创建时数据库处于MOUNT状态,否则几个控制文件的SCN有可能并不匹配,从而导致Standby数据库无法正常启动到MOUNT状态。
另外,创建完控制文件之后到Standby数据库创建完成这段时间内,要保证Primary数据库不再有结构上的变化(如增加表空间等),不然Primary和Standby同步时会有问题。
Data Guard 也是根据控制文件来判断哪个是standby的
三、配置Standby数据库的初始化参数文件
可按照下列步骤操作:
(1)创建PFILE客户端初始化参数文件。
由于SPFILE服务器端初始化参数文件为二进制格式,无法直接编辑,因此建议首先通过SPFILE创建PFILE,操作如下:
SQL> CREATE PFILE FROM SPFILE;
(2)修改初始化参数文件中的参数。
注意Primary和Standby不同角色对应初始化参数的配置。
注意保持各初始化参数中的路径准确有效。
四、复制文件到Standby服务器
复制文件到Standby服务器主要包括三部分:备份的数据文件、创建的Standby数据库控制文件和修改过的初始化参数文件。
五、配置Standby数据库
如果是Windows 环境下, 还需要创建新的OracleService。
oradim.exe -new -sid orcl -startmode m
oradim.exe -edit -sid orcl -startmode a
创建密钥文件,注意保持密码与Primary数据库一致。
配置监听并启动。
修改Primary数据库所在服务器和Standby数据库所在服务器的tnsnames.ora,各自增加对应的Net Service Name。
创建服务器端的初始化文件。
六、启动物理Standby数据库REDO应用
完成对Standby数据库的配置之后,就可以启动该Standby数据库了。物理Standby极少情况下可以以READ WRITE模式打开,某些情况下可以以READ ONLY模式打开,不过多数情况下,应该启动到MOUNT状态。
直接执行STARTUP命令打开物理Standby数据库,默认会以只读方式打开数据库,而不是READ WRITE模式,Oracle会根据控制文件判断是否是物理Standby,如果是则默认启动到READ ONLY模式,例如:
SQL> STARTUP;
……
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
----------
READ ONLY
跟你想的不一样是吧,那说明你的思维还没转过弯来。
通常情况下,我们将物理Standby数据库加载到MOUNT状态即可:
SQL> STARTUP MOUNT;
进入MOUNT状态后,Standby数据库就开始接收Primary数据库发送的归档REDO数据,然后你可以继续通过一些命令应用这些REDO数据。
例如,启动REDO应用:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
或者附加USING CURRENT LOGFILE子句启动实时应用:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
注意,要启动实时应用,Primary数据库在发送REDO数据时必须使用LGWR进程发送。如果使用ARCH方式发送REDO数据,Standby数据库无法启动实时应用,强行启动会报ORA-38500错误。
提 示: DISCONNECT FROM SESSION子句并非必需,该子句的作用呢,是指定启动完应用后自动退出到命令操作符前。如果不指定该子句的话,当前SESSION就会一直停留处理REDO应用,如果想做其他操作,就只能新建一个连接。
七、停止Standby数据库
跟启动一样,关闭Standby数据库也有很多讲究,某些情况下如果操作不当,关闭Standby数据库甚至会连带导致Primary数据库也关闭(这点后面会有详细介绍),幸好一般情况下不会出现这种情况,即使是像Primary数据库那样直接关闭,数据库也没有问题,毕竟Data Guard就是用于容灾的,别说普通的关闭数据库,就是直接拔电源也不怕,最多就是在Primary数据库的警告日志文件中记录一堆报错信息。
正常情况下,停止Standby数据库(含物理Standby和逻辑Standby)之前,应该首先停止Primary数据库,如果直接停止Standby数据库,轻则Primary数据库的Alert文件中记录一堆归档发送失败的错误信息,重则Primary直接shutdown。
不过,对于一些测试环境,偶尔也希望能在Primary数据库正常运行的情况下,停止Standby以进行一些其他操作,在这种情况下通常建议使用下列步骤:
首先是Primary端操作,修改Primary数据库的log_archive_dest_state_n参数,暂时取消向Standby数据库发送日志,例如:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER;
这样Standby端不可访问时,Primary数据库的Alert日志文件中也不会再报错了。
然后Standby端就可以停止REDO应用:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CALCEL;
最后才是关闭Standby数据库:
SQL> SHUTDOWN IMMEDIATE;
物理Standby创建的基本步骤就是这样。
Oracle Data Guard 环境搭建的完整实例,请参考我的CSDN Blog:
Oracle Data Guard Linux 平台 Physical Standby 搭建实例
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5547565.aspx
Oracle 10G windows 平台 DataGuard 实例
http://blog.csdn.net/tianlesoftware/archive/2009/10/27/4730092.aspx
八、用READ ONLY模式打开物理Standby
物理Standby可以有效分担Primary数据库压力,提升资源利用,实际上说的就是将物理Standby置于OPEN状态。
当以READ ONLY模式打开物理Standby,可以将一些不涉及数据库写操作的任务如查询、备份转移到Standby数据库端进行,通过这种方式来分担Primary数据库的压力。下面我们通过实际操作,详细了解Standby数据库在关闭状态、打开状态以及REDO应用状态中的转换。
1.物理Standby数据库从SHUTDOWN状态启动到READ ONLY状态
SQL>STARTUP
ORACLE instance started.
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
----------
MOUNTED
不过启动成功之后,并不是像普通Oracle数据库那样置于READ WRITE模式,而是进入到READ ONLY模式。
2.物理Standby数据库从REDO应用状态启动到READ ONLY状态
1)首先需要取消REDO应用,执行下列语句:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
注意:虽然当前是在MOUNT状态,但并不能直接ALTER DATABASE OPEN打开数据库,否则会报ORA-01154错误。
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
2)取消REDO应用后,再打开数据库:
SQL> ALTER DATABASE OPEN;
Database altered.
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
----------
MOUNTED
注意:OPEN的时候不需要附加READ ONLY子句,Oracle会根据控制文件判断是否是物理Standby,从而自动启动到READ ONLY模式。
3.物理Standby数据库从READ ONLY状态切换回REDO应用状态
要从OPEN状态切换回REDO应用状态,并不需要SHUTDOWN数据库再启动,直接执行启用REDO应用的语句即可,例如:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered.
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
----------
MOUNTED
由于只读打开时不能应用,查询的结果可能与Primary数据库并不同步的,这一点小小的缺憾降低了物理Standby提供报表服务,分担Primary数据库压力的实用性,对于这点呢,我们有两个解决方案:
改用逻辑Standby,由于逻辑Standby是打开状态下的实时应用,因此数据同步应该是没啥问题了(只要Primary数据库的数据类型都能被逻辑Standby支持)。
Oracle 11g全面改良了物理Standby,最突出的特点就是在READ ONLY打开模式下,可以边接收边应用了,所以可以考虑升级数据库到最新版本,当然新版本也有新版本的问题,如各种尚未暴露出来的Bug。