RMAN DUPLICATE创建DataGuard物理备库
Oracle推荐使用rman来创建物理备库,可以在不影响主库的情况下,轻松完成物理备库的创建。
这里只记叙物理备库与主库位于不用的主机,并且数据库的目录结构一致的情况,这应该也是Dataguard环境比较常见的部署方式,这种方式也比较简单。
系统运行环境为windows 2003 server 64bits + oracle 10g 10.2.0.4 64bits。
一、创建物理备库实例(物理备库端)
1、安装oracle 10g
只安装软件,不创建数据库。
2、创建空闲实例
1 | CMD> oradim -new -sid orcl |
此处指定的实例名为orcl,同时会创建系统服务OracleServiceorcl和OracleJobSchedulerorcl。
之后即可使用sqlplus / as sysdba连接到这个空闲实例。
3、创建standby的初始化参数文件
从主库创建pfile根据物理备库的实际情况进行相应修改即可
主库端执行:
1 | SQL> create pfile='d:\\INITorcl.ora' from spfile; |
将生成的INITorcl.ora拷贝到物理备机的$ORACLE_HOME/database目录下,并做相应修改,参见Oracle 10g DataGuard手记之基础配置
然后通过针对standby修改的INITorcl.ora为物理备库生成spfile
备库端执行:
1 | CMD> sqlplus / as sysdba; |
4、创建物理备库密码文件
备库必须通过Oracle NEt并以SYSDBA权限访问,因此密码文件是必须的,因为不能使用OS认证。
备库端执行:
1 | CMD> orapwd file=PWDorcl.ora password=yourpasswd |
这会在备库的$ORACLE_HOME/database目录下生成密码文件PWDorcl.ora
也可以直接从主库$ORACLE_HOME/database目录下将PWDorcl.ora拷贝到物理备库相应的目录下,这样更简单。
5、启动备库到nomount
备库端:
1 | CMD> sqlplus / as sysdba; |
因为此时尚没有控制文件和数据文件,因此只能启动到nomount状态
如果已经mount了,可以执行以下sql命令切换到nomount状态:
1 | SQL> alter database dismount; |
这是可能会有错误提示:
1 | ORA-02778: Name given for the log directory is invalid |
这是因为dump文件存储路径尚未建立,根据你参数文件的设置建立相关的dump路径,这里建立了这几个路径
1 | E:\\oracle\\product\\10.2.0\\admin\\orcl\\{adump,bdump,cdump,udump} |
然后再执行
1 | SQL> startup nomount |
还有可能会有错误提示:
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01263: Name given for file destination directory is invalid
OSD-04018: Unable to access the specified directory or device.
O/S-Error: (OS 2) 系统找不到指定的文件。
这是因为参数db_recovery_file_dest指向的路径没有建立起来,这里根据参数文件创建目录
E:\oracle\product\10.2.0\flash_recovery_area
6、配置监听文件,创建监听服务
可以从主库拷贝$ORACLE_HOME/NETWORK/ADMIN/目录下的文件tnsname.ora,listener.ora,sqlnet.ora到备库相同的位置,并作相应的修改,特别要注意主机名部分。
只安装默认没有创建监听服务,lsnrctl命令可以在没有监听服务时自动创建监听服务
备库端:
1 | CMD> lsnrctl |
启动监听:
1 | LSNRCTL> start |
这样会建立起tns监听系统服务OracleOraDb10g_home1TNSListener
7、提前创建控制文件所在的目录
参数文件中有记载的控制文件详细路径,参数名称为*.control_files。物理备库需要根据此参数的设置提前建立好控制文件所需要的上层各级目录,比如提前建立好如下目录层次:
1 | E:\\oracle\\product\\10.2.0\\oradata\\orcl |
否则执行duplicate命令时会出现如下错误:
1 | RMAN-00571: =========================================================== |
二、RMAN全备主库并为备库生成控制文件
1、对主库执行全备份
RMAN正常全备主库,可以使用也可以不使用恢复目录,最重要一点,在物理备库上要可以以相同的路径访问到主库的全备份。可以在备库上建立相同的备份文件存放路径,然后通过ftp等方式将主库全备份拷贝至备库主机相同位置。也可以使用NFS等网络路径,这样可以避免在主备库之间拷贝全备份。
比如:
1 | RMAN> BACKUP DATABASE FORMAT '\\\\cifs_server\\RMAN\\bak_%U' |
2、创建物理备库控制文件
有多种方式为物理备库生成控制文件。
备份主库时同时为备库生成控制文件
通过使用INCLUDE CURRENT CONTROLFILE FOR STANDBY语句,可以在备份集中生成备库的控制文件,类似如下:
1
2
3RMAN> BACKUP DATABASE FORMAT 'D:\\RMAN\\bak_%U'
INCLUDE CURRENT CONTROLFILE FOR STANDBY
PLUS ARCHIVELOG FORMAT 'D:\\RMAN\\ARC_%U';
使用RMAN COPY命令
1
RMAN> COPY CURRENT CONTROLFILE FOR STANDBY TO 'D:\\RMAN\\control01.ctl';
使用alter database语句
sqlplus登录主库端执行
1
SQL> alter database create standby controlfile as 'd:\\rman\\control01.ctl';
然后rman连接target(主库)和catalog恢复目录(如果使用的话),然后执行
1
RMAN>CATALOG CONTROLFILECOPY 'd:\\rman\\control01.ctl';
这样RMAN就知道去那里找物理备库的控制文件了。
注意:物理备库中控制文件所在路径必须提前建立起来。
三、创建物理备库
1、用RMAN连接主库、物理备库和恢复目录,使用target关键字连接主库,使用auxiliary关键字连接待创建的物理备库,catalog关键字连接恢复目录数据库
1 | $ rman target sys/passwd@primarydb auxiliary sys/passwd@standbydb catalog user/passwd@catalogdb |
然后执行
1 | rman> duplicate target database for standby nofilenamecheck; |
因为是异机相同目录结构复制到备库,所以必须指定参数nofilenamecheck,不然rman会晕菜。
如果不指定dorecover选项,则不进行日志恢复,物理备库创建完成后打开日志恢复自然就可以同步到主库一致的状态了。
如果RMAN数据库备份有增量备份,则应该打开DORECOVER选项以便恢复增量备份集。
如果指定了DORECOVER选项,可能会遇到如下错误:
1 | RMAN-06026: some targets not found - aborting restore |
具体原因和解决办法参见[2].
备库创建完成后rman将其置于mounted状态。
2、创建备库时并不会将主库的online redo log files和standby redo log files拷贝到备库,但是控制文件中包含了这些信息。
“因为在备份前主库创建了standby redo log,备库是根据主库的信息创建的,一开始它是包含了主库的standby redo log信息,如果主库设置的日志传送方式是LGWR,当主库发生日志切换时,备库的RFS会尝试使用standby redo log来存储主库传送过来的日志,因为此时备库实际上是不存在standby redo log的,所以备库会报错。当备库尝试打开字典信息的所有standby redo log失败以后,备库会自动把日志传送方式转为ARCN,并同时清除数据字典中的standby redo log信息。”参见DG使用中遇到的几个错误。
因此如果需要开启实时redo apply的话,需要手动提前添加standby redo log文件,如下:
备库端:
[sql]
SQL>alter database add standby logfile group 4 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO01.LOG’) size 50M;
Database altered.
SQL>alter database add standby logfile group 5 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO02.LOG’) size 50M;
Database altered.
SQL>alter database add standby logfile group 6 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO03.LOG’) size 50M;
Database altered.
SQL>alter database add standby logfile group 7 (‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\STDBYREDO04.LOG’) size 50M;
Database altered.
[/sql]
然后就可以打开realtime redo apply了,如下打开实时日志应用:
备库端:
[sql]
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
[/sql]
3、此时会后台日志文件中会报如下错误
1 | ORA-19527: physical standby redo log must be renamed |
物理standby并不需要在线redo日志,因为其并不以读写方式打开。但当物理standby要switch over成为主库时是必须要使用在线redo log的,在switch over之前,oracle会清除online redo log文件,为了加快switch over进度,oracle会在开启日志应用之时提前将物理standby的online redo log文件clear。oracle为了防止意外清除了主库的online redo log文件,即使物理standby与主库不在同一台主机上,只要其路径相同则必须明确的设置log_file_name_convert参数,这样才能避免此错误提示。
因此可以通过alter system set log_file_name_convert更改此参数设置或者在备库初始化文件中添加此参数并重新生成spfile启动数据库
pfile中添加:
1 | *.log_file_name_convert='E:\\oracle\\product\\10.2.0\\oradata\\orcl\\redo01.log','E:\\oracle\\product\\10.2.0\\oradata\\orcl\\redo01.log','E:\\oracle\\product\\10.2.0\\oradata\\orcl\\redo02.log','E:\\oracle\\product\\10.2.0\\oradata\\orcl\\redo02.log','E:\\oracle\\product\\10.2.0\\oradata\\orcl\\redo03.log','E:\\oracle\\product\\10.2.0\\oradata\\orcl\\redo03.log' |
4、检查下两边的日志同步情况
[sql]
SQL>select sequence# from v$archived_log where applied=’YES’;
[/sql]
如果oracle后台日志出现类似错误:
1 | ORA-00313: open failed for members of log group 4 of thread 1 |
只要将对应的日志组clear就可以了:
1 | SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; #如果正在应用redo日志,需要先取消 |
物理备库创建完成。
备注:如果重新启动物理备库,只能以mount方式打开,否则会出现错误提示:
1 | SQL> startup |
关闭后重新以mount方式打开即可:
1 | SQL> shutdown immediate; |
References:
[1]Creating a Standby Database with Recovery Manager
[2]RMAN-06026 tips
===
[erq]