您的位置:首页 > 数据库 > Oracle

oracle11g dataguard 安装手册

2016-01-29 10:24 549 查看
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(通过提示使用“直接路径插入“。或采用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

?
1
2
3
4
5
6
7
8
# 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控制文件:

?
1
2
3
4
sql>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;

 

此文出处:http://www.cnblogs.com/tippoint/archive/2013/04/18/3029019.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: