千家信息网

oracle11g dataguard 完全手册

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一、前言:网络上关于dataguard的配置文章很多,但是很多打着oracle11g的文章实际都是只能在9 10 上运行,比如FAL_CLIENT在11g中已经废弃,但是现在网络上的文章都是没有标注这
千家信息网最后更新 2026年11月01日oracle11g dataguard 完全手册

一、前言:
网络上关于dataguard的配置文章很多,但是很多打着oracle11g的文章实际都是只能在9 10 上运行,比如FAL_CLIENT在11g中已经废弃,但是现在网络上的文章都是没有标注这一点。而且对于具体含义语焉不详对于新手只能知其然而不知其所以然。这篇文章我就想让像我这样的人对于dataguard配置不仅仅知道怎么配置,还要知道为什么需要这样配置,这样的效果才是最好的。
这篇文章不仅仅是记录如何配置,还介绍了为什么是这样,以及注意要点,我希望这个文章可以作为进行dataguard配置的一个参考手册。

二、前提
1.主库是归档模式:
如果我们不清楚为什么是归档模式,那我们就应该也不会清楚dataguard是用来做什么的。透过很多修饰的官方语言,我们需要明确DG(dataguard简称,后同)实际上的作用就是用来高可用。而实现原理就是从主库获取数据到从库,在主库发生异常的时候,从库接管主库,完成身份的变化。可以一个主库,最多9个从库。同时分为逻辑standby和物理standby这里我们讨论的是物理standby.
一旦创建并配置成 standby 后,dg 负责传输 primary数据库 redo data 到 standby 数据库,standby 数据库通过应用接收到的 redo data 保持与 primary 数据库的事务一致。
这下清楚了吧,需要保证主从库一致,需要传输archive log和redo log到从库,如果不是归档模式无法保证主从库的数据一致。

2.从库只需要安装数据库软件,数据从主库传输后完成。

3.很多人说11g有了active dataguard(ADG),逻辑standby 实际上已经没什么用处了。

4.主从库硬件最好一致。oracle数据库版本需要一致。
(1)内存检查项:
# grep MemTotal /proc/meminfo
交换分区检查项:如果内存在1-2G,swap是1.5倍;2-16G,1倍;超过16G,设置为16G即可。
# grep SwapTotal /proc/meminfo
查看共享内存大小:
# df -h /dev/shm


(2)查看系统处理器架构,与oracle安装包一致
# uname -m


(3)空间空间 /tmp必须大于1G
# df -h /tmp

5.配置环境数据库用户必须有sysdba权限
6.后面的环境:主库 192.168.215.101 数据库实例名:orcl db_unique_name:orcl
从库 192.168.215.102 数据库实例名:orcl db_unique_name:orcldg

三、配置
1.判断DG是否已经安装:
select * from v$option where parameter = 'Oracle Data Guard';
如果是true表示已经安装可以配置,否则需要安装相应组件。

2.设置主库为强制记录日志。
默认情况下数据库操作会记录redo log,但是在一些特定的情况下可以使用nologging来不生成redo信息
(1)表的批量INSERT(通过/*+APPEND */提示使用"直接路径插入"。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是
所有索引修改会生成redo,但是所有索引修改会生成redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
(2)LOB操作(对大对象的更新不必生成日志)。
(3)通过CREATE TABLE AS SELECT创建表
(4)各种ALTER TABLE操作,如MOVE和SPLIT
(5)在一些表迁移和表空间迁移中,可以使用alter table a nologging;或者alter tablespace snk nologging;在操作完成后再修改回logging状态。
这里需要多说一句,如果你使用nologging导入大批量数据,以后对这些数据的修改会在redo或者archive log中,但是基准的数据是没有的,所以一旦介质损坏是无法完全恢复的,必须在使用nologging完成切换回logging后,做一次全备或者0级备份。

(1)强制记录日志:sql>alter database force logging;
(2)检查状态(YEs为强制):sql>select name,force_logging from v$database;
(3)如果需要在主库添加或者删除数据文件时,这些文件也会在备份添加或删除,使用如下:
sql>alter system set standy_file_management='AUTO';
默认此参数是manual手工方式 sql>show parameter standby

3.创建standby log files(备用日志文件)
从库使用standby log files来保存从主库接收到的重做日志。既然主要是从库在使用,那为什么需要在主库上也建立
standby log files?原因主要由两个:一是主库可能转换为备库,而备库是需要有standby log files的 二是如果主库
建立了standby log files那备库会自动建立。
建立standby如要注意以下几点:
<1>standby log files的大小和redo log files一样。
查询redo log files文件大小(默认50M,3个):select group#,bytes/1024/1024 as M from v$log
<2>一般而言, standbyredo 日志文件组数要比 primary 数据库的 online redo 日志文件组数至少多一个。
推荐 standbyredo 日志组数量基于 primary 数据库的线程数(这里的线程数可以理解为 rac 结构中的 rac
节点数)。
有一个推荐的公式可以做参考:(每线程的日志组数+1)*最大线程数
假设现在节点是1个,则=(3+1)*1=4
如果是双节点 则=(3+1)*2=8
这里我们创建4个standby logfile:
另:不建议组号group#紧挨着redo,因为后续redo有可能调整,这里我们从建立从11到14的standby logfile

?

1234567# cd $ORACLE_BASE/oradata/orcl/ # mkdir dg # chown oracle:dba dg sql> alter database add standby logfile group 11 '/opt/oracle/oradata/orcl/dg/standby11.log' size 50M; sql> alter database add standby logfile group 12 '/opt/oracle/oradata/orcl/dg/standby12.log' size 50M; sql> alter database add standby logfile group 13 '/opt/oracle/oradata/orcl/dg/standby13.log' size 50M; sql> alter database add standby logfile group 14 '/opt/oracle/oradata/orcl/dg/standby14.log' size 50M;


4.密码文件和控制文件的创建传输
(1)一般数据库默认就有密码文件,存放在$ORACLE_HOME/dbs/orapwSID 这里为orapworcl
如果没有sql>orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle
(2)检查REMOTE_LOGIN_PASSWORDFILE值是否为 EXCLUSIVE
sql>show parameter REMOTE_LOGIN_PASSWORDFILE
如果值不是EXCLUSIVE,则:alter system set remote_login_passwordfile=exclusive scope=spfile;
(3)密码文件需要scp到从库
# scp orapworcl oracle@192.168.215.102:/opt/oracle/11.2/dbs 提示输入yes
(4)控制文件:
11g的控制文件一共两份,内容一样,一份在$ORACLE_BASE/oradata/orcl/control01.ctl
一份在/opt/oracle/flash_recovery_area/orcl/control02.ctl

生成standby控制文件:

?

1234sql>shutdown immediate sql>startup mount sql>alter database create standby controlfile as '/tmp/standby_control01.ctl'; sql>startup open;


然后在备库建立对应的目录,并授权
mkdir orcl--- chown oracle:oinstall(或dba) orcl

?

scp control01.ctl oracle@192.168.215.102:/opt/oracle/oradata/orcl scp control02.ctl oracle@192.168.215.102:/opt/oracle/flash_recovery_area/orcl/


5.db_name和db_unique_name
默认db_name和db_unique_name和实例名是一致的,这里是orcl
需要注意在DG中主库和从库的db_unique_name是不能一致的,需要区分开的。
这里我们设置主库的db_unique_name为orcl,从库为orcldg
sql>show parameter db_unique_name
设置:alter system set db_unique_name=orcl scope=spfile;
--注意虽然默认db_unique_name和db_name是一致的,但是需要显式设置,否则在spfile中没有此参数

6.闪回数据库:
强烈建议开启数据库闪回功能。闪回允许你将数据库还原到以前的某一时间点。当发生故障转移时,这个功能非常有用,
它能让你将老的主库闪回到故障前,然后将其转换为备库。如果没有启用闪回功能,你就必须重建备库,意味着要再复制一次数据文件。
除了这个好处,闪回还能在某些情况下让你避免从备份恢复数据。

(1)快速恢复区(Flash/Fast Recovery Area),默认是配置的,但是需要确认这个区域的磁盘够大,至少300G以上(默认3G)
sql>show parameter db_recovery_file_dest
可以修改位置:sql>alter system set db_recovery_file_dest='新路径';
更改大小:sql>alter system set db_recovery_file_dest_size=400G;

(2)查看是否启用,默认是不开启的
sql>select flashback_on from v$database;
开启:sql>alter database flashback on;
如果你碰到 ORA-01153 报错,那一定是在备库进行此操作。你需要先取消重做日志应用,启用闪回日志,然后重新启用日志应用。
在主库启用闪回日志,不会同步备库也启用。你必须手动在主库和备库上均启用闪回日志。
如果不启用闪回日志,当出现故障转移时,你将需要完全重新开始创建一个备库。

7.SQL*NET设置
(1)配置主库的监听
虽然可以通过netca来进行配置,但是除了这个默认的外,我们还需要一个静态注册SID_LIST_LISTENER,如果没有此从参数而且
dataguard启动顺序不正确,主库会报PING[ARC1]:Heartbeat failed to connect to standby '***'.Error is 12514导致归档无法完成
配置如下

?

SID_LIST_LISTENER= (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = /opt/oracle/11.2) (SID_NAME = orcl) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = primaryDB)(PORT = 1521)) ) )

#vi $ORACLE_HOME/network/admin/listener.ora 加入上面的内容

(2)配置tnsnames
#vi $ORACLE_HOME/network/admin/tnsnames.ora

?

ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.215.101)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) ORCLDG = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.215.102)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcldg) ) )


(3)传输到备库并修改listener.ora和tnsnames.ora

scp $ORACLE_HOME/network/admin/listener.ora oracle@192.168.215.102:/opt/oracle/11.2/network/admin/scp $ORACLE_HOME/network/admin/tnsnames.ora oracle@192.168.215.102:/opt/oracle/11.2/network/admin/          --listener.ora:          SID_LIST_LISTENER   (SID_LIST =     (SID_DESC =        (GLOBAL_DBNAME = orcldg)        (ORACLE_HOME = /opt/oracle/11.2)        (SID_NAME = orcl)      )    ) LISTENER =   (DESCRIPTION_LIST =     (DESCRIPTION =       (ADDRESS = (PROTOCOL = TCP)(HOST = standbyDB)(PORT = 1521))     )   )


tnsnames.ora:不需要修改

8.重做日志传输配置
(1)配置归档日志位置:
查询已经设置的归档路径sql:archive log list或者show parameter log_archive_dest_1

?

sql> alter system set log_archive_dest_1='LOCATION=/opt/oracle/oradata/orcl/archive1 valid_for=(all_logfiles,primary_role) db_unique_name=orcl' scope=spfile;


还可以使用快速恢复区作为归档目录,如LOCATION=use_db_recovery_file_dest
官方文档里说使用 valid_for=(online_logfiles, all_roles),这将导致备库无法归档备用日志文件,因为它们不是在线日志。
但如果使用 all_logfiles 选项,主备库将都能归档在线以及备用日志。
如果你想在备库进行备份,并同时备份归档日志的话,必须使用 all_logfiles。

(2)配置重做日志到备份库:

?

sql>alter system set log_archive_dest_2='SERVICE=orcldg lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcldg';


(3)要注意STANDBY_ARCHIVE_DEST 参数不需要,已经被官方弃用。设置此参数后启动数据库,只会报 ORA-32004:
obsolete or deprecated parameter(s) specified for RDBMS instance 错。

9.配置FAL_SERVER
这个参数指定当日志传输出现问题时,备库到哪里去找缺少的归档日志。它用在备库接收的到的重做日志间有缺口的时候。
这种情况会发生在日志传输出现中断时,比如你需要对备库进行维护操作。在备库维护期间,没有日志传输过来,这时缺口就出现了。
设置了这个参数,备库就会主动去寻找那些缺少的日志,并要求主库进行传输。
你是主库,就填写:
fal_server=从库
从库上就反过来:
fal_server=主库
注意:FAL_CLIENT在11g中已经废弃,虽然可以配置但是已经不起作用了。

sql>alter system set FAL_SERVER='orcldg';

10.Data Guard 配置里的另外一个库的名字
sql> alter system set log_archive_config = 'dg_config=(orcl,orcldg)';

以上的办法是我们采用alter system的方式在线修改,还有一种比较方便的办法(但是容易出错,所以方便和安全什么时候都不可兼得)
sql>create pfile from spfile;
# 手工修改pfile
sql>create spfile from pfile;
然后用pfile生成spfile 同时传输pfile到从库修改后生成spfile
注意手工增加:
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable

vi initorcl.ora

?

orcl.__db_cache_size=180355072 orcl.__java_pool_size=4194304 orcl.__large_pool_size=4194304 orcl.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=264241152 orcl.__sga_target=494927872 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=289406976 orcl.__streams_pool_size=8388608 *.audit_file_dest='/opt/oracle/admin/orcl/adump'*.audit_trail='db'*.compatible='11.2.0.0.0'*.control_files='/opt/oracle/oradata/orcl/control01.ctl','/opt/oracle/flash_recovery_area/orcl/control02.ctl'#Restore Controlfile *.db_block_size=8192 *.db_domain=''*.db_name='orcl'*.db_recovery_file_dest='/opt/oracle/flash_recovery_area'*.db_recovery_file_dest_size=4039114752 *.diagnostic_dest='/opt/oracle'*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'*.fal_server='orcldg'*.job_queue_processes=1000 *.log_archive_config='dg_config=(orcl,orcldg)'*.log_archive_dest_1='LOCATION=/opt/oracle/oradata/orcl/archive1 valid_for=(all_logfiles,primary_role) db_unique_name=orcl'*.log_archive_dest_2='SERVICE=orcldg lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcldg'*.log_archive_format='orcl_%t_%s_%r.dbf'*.memory_target=756023296 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE'*.standby_file_management='AUTO'*.undo_tablespace='UNDOTBS1'

scp initorcl.ora oracle@192.168.215.102:/opt/oracle/11.2/dbs/
修改备库的initorcl.ora 修改参数如下:

?

*.db_name='orcl' *.db_unique_name='orcldg' *.fal_server='orcl' *.log_archive_config='dg_config=(orcldg,orcl)' *.log_archive_dest_1='LOCATION=/opt/oracle/oradata/orcl/archive1 valid_for=(all_logfiles,primary_role) db_unique_name=orcldg' *.log_archive_dest_2='SERVICE=orcl lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcl'


然后sql>create spfile from pfile;

11.传输主库数据到备库
(1)scp -l 8192 -rp /opt/oracle/oradata/orcl/ oracle@192.168.215.102:/opt/oracle/oradata/
注意目的地不要加orcl 会自动创建目录的
-l是limit限制,这样最大是8192/8=1M速度,是为了解决stalled问题
-rp 循环子目录文件
(2)建立spfile中需要的目录
如/opt/oracle/admin/orcl/adump dpdump pfile

12.启用物理备用数据库
sql>startup nomount
sql>alter database mount standby database;
(1)启动 redo 应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
启动实时应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
这个命令指示备库开始使用备用日志文件进行恢复。它也告诉备库命令完成后回到命令行界面

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
此时只是暂时 redo 应用,并不是停止 Standby 数据库,standby 仍会保持接收只不过不会再应用
接收到的归档,直到你再次启动 redo 应用为止

(2)停止standby
正常情况下,首先
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
然后再sql>shutdown immediate
当然也可以直接shutdown immediate

(3)备用服务器的管理模式与只读模式
<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;


这个时候,可以给数据库增加临时数据文件(这个在热备份的时候是没有备份过来的)
如alter tablespace temp add tempfile '/u02/oradata/test/temp01.dbf' size 100M;

<4>.从只读方式到管理恢复方式
SQL> recover managed standby database disconnect from session;

(4)应用物理备库的几点监控
如果上面出了问题或者我们不知道成功了没有,可以用下面的方法检测

<1>确认主备库里的归档目的地配置都是有效的
select DEST_ID, STATUS, DESTINATION, ERROR from V$ARCHIVE_DEST where DEST_ID<=2;
目的地状态status应该显示为 VALID,注意如果上面没有执行redo应用会有一条error信息

<2>确认重做日志是否真的被应用了,在主库执行
select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG where name = 'JED2' order by FIRST_TIME;
如果归档和日志应用均正常,APPLIED 和 ARCHIVED 列都应该是 YES。(如果没有应用redo,applied应该是NO)
很多教程里都让这个查询以 SEQUENCE# 列排序,但我不推荐。如果以 SEQUENCE# 列排序,当你做了一次故障转移后,序列号会再从1开始,
这时使用这个查询,你将不能在结果最后看到最新的记录。我曾经很奇怪为什么查不到新记录,其实是因为新记录不是出现在最后,
我没看到。所以,这个查询都是以 FIRST_TIME 列排序.

<3>主库上检查是否有重做日志缺口
如果你发现日志没有被应用,那可能是重做日志有了缺口,这种情况下备库无法进行日志应用。但如果你的 FAL_SERVER 参数设置正确,这应该不会有问题
select STATUS, GAP_STATUS from V$ARCHIVE_DEST_STATUS where DEST_ID = 2;
如果一切正常,应该返回 VALID 和 NO GAP .切记启用redo应用才能显示No GAP

<4>在主备库上执行以下查询查看数据库状态
select * from V$DATAGUARD_STATUS order by TIMESTAMP;

<5>检查是否成功:
主库上查看日志传送情况:
sql>select dest_name,status,error from v$archive_dest;
应该log_archive_dest_1和2状态应该是valid
切换几次日志:
sql>alter system switch logfile;
查看日志序号:
sql>select sequence# from v$archived_log;
备库验证:
sql>select sequence#,applied from v$archived_log;

13.dataguard启动关闭顺序
(1)监听
先启从库再起主库
#lsnrctl start
(2)启动
先启从库:
sql>startup nomount
sql>alter database mount standby database;
sql>alter database recover managed standby database using current logfile disconnect from session;
在启主库
sql>startup
(3)关闭:和开启正好相反
先关主库:
sql>shutdown immediate
再关从库:
sql>alter database recover managed standby database cancel;
sql>shutdown immediate;

日志 数据 配置 数据库 文件 应用 传输 一致 参数 生成 备份 模式 情况 备用 查询 检查 方式 时候 状态 大小 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江苏根荣互联网科技 互联网和科技技术 互联网科技官网 美国互联网保险保险科技 圆梦互联网科技 互联网科技卖菜 互联网女皇 腾讯科技 佩信高科技互联网 中国最先进互联网科技公司 济南和联互联网科技有限公司 剑昆互联网络科技有限公司临桂 中化能源互联网科技招聘 南平创想时代互联网科技有限公司 广州新华互联网科技学校电竞方面 朱啸虎曾投资哪些互联网科技企业 济南有互联网科技公司吗 富国互联网金融科技混合基金 世界互联网科技成果奖 数字互联网科技有限公司 颐高云石互联网科技 湖南永感互联网科技有限公司 高科技互联网 天下捷融互联网科技 深圳市运趣互联网科技有限公司 移动互联网科技股 科技与互联网哪个更好 怎样加入科技互联网 有人说阿里系是互联网科技企业 互联网科技企业商标注意事项 兰石爱特工业互联网科技分公司
0