Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1050142
  • 博文数量: 67
  • 博客积分: 2212
  • 博客等级: 大尉
  • 技术积分: 3956
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-09 10:04
个人简介

南非蚂蚁,著名Linux专家,知名IT作家。毕业于西安电子科技大学通信工程专业,爱好计算机,毕业后从事计算机行业。曾就职于新浪网、阿里云(万网),任职系统架构师。曾出版畅销书《循序渐进Linux》、《高性能Linux服务器构建实战》作者。

文章存档

2016年(5)

2015年(4)

2014年(8)

2013年(1)

2012年(38)

2011年(8)

2009年(3)

分类: Oracle

2012-01-10 09:33:30

dataGuard是oracle提供的一种数据库级别的HA方案,最主要功能是冗灾、数据保护、故障恢复等。当然根据配置的不同,DATA GUARD还可以具备以下特点:高可用、性能提升、数据保护以及故障恢复等。
DATA GUARD可以分为物理STANDBY和逻辑STANDBY两种。二者的最大差别在于,物理STANDBY应用的是主库的归档日志,而逻辑STANDBY应用的是主库的归档日志中提取的SQL语句。由于二者这一点的区别,决定了物理STANDBY无论从逻辑结构和物理结构都是和主库保持一致,而逻辑STANDBY则只需保证逻辑结构一致,且逻辑STANDBY在应用SQL语句的时候,数据库可以处于打开的状态。

 如果从DATA GUARD的保护模式分,可以分为三种不同的保护模式:
最大性能(maximize performance):这是data guard默认的保护模式。primay上的事务commit前不需要从standby上收到反馈信息,该模式在primary故障时可能丢失数据,但standby对primary的性能影响最小。
最大可用(maximize availability):在正常情况下,最大可用模式和最大保护模式一样;在standby不可用时,最大可用模式会自动降低成最大性能模式,所以standby故障不会导致primay不可用。只要至少有一个standby可用的情况下,即使primary down机,也能保证不丢失数据。
最大保护(maximize protection):最高级别的保护模式。primay上的事务在commit前必须确认redo已经传递到至少一个standby上,如果所有standby不可用,则primary会挂起。该模式能保证零数据丢失。

下面就通过实例演示下如何利用冷备创建standby database。

一、演示环境说明
primary server:
CentOS Linux4.4 + oracle 10.2.0.1
ORACLE_SID:orcl
主库ip:192.168.60.144
ORACLE_HOME: /free/oracle/product/10.2.0/db_1/
standby server:
SUSE Linux9 + oracle 10.2.0.1
ORACLE_SID:orcl
备库ip:192.168.60.253
ORACLE_HOME: /free/oracle/product/10.2.0/db_1/

二、配置步骤
首先,装好primary和standby上的oracle,建SID同为orcl的库,所有设置完全相同。然后停止shutdown两台上的oracle,将primary上的所有数据文件,控制文件,redo文件和password文件都copy到standby机器的相应位置。这样,我们就拥有了两台完全一样的oracle server。

1. 在primary database上设置force logging
SQL>alter database force logging;
2. 修改primary databse的初始化参数,主要增加参数如下:
*.control_files='/free/oracle/oradata/orcl/control01.ctl','/free/oracle/oradata/orcl/control02.ctl','/free/oracle/oradata/orcl/control03.ctl'
*.service_names=’primary’  #这个参数指定了主库的service name
*.log_archive_config='DG_CONFIG=(PRIMAYR,STANDBY)'
*.DB_UNIQUE_NAME='PRIMARY'
*.LOG_ARCHIVE_DEST_1= 'LOCATION=/free/oracle/orabak'
*.LOG_ARCHIVE_DEST_2= 'SERVICE=STANDBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY LGWR SYNC AFFIRM'  #如果不指定REOPEN,默认为300
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.LOG_ARCHIVE_FORMAT='arc%s%t%r.arc'
*.FAL_SERVER=' STANDBY '
*.FAL_CLIENT=' PRIMARY '
*.STANDBY_FILE_MANAGEMENT='AUTO'
*.standby_archive_dest='/free/oracle/orabak'

LOCK_NAME_SPACE
---这是参数当主数据库和备用数据在同一台机上时要设该参数,设为备用数据库的SID

3. 设置primary database为archivelog模式
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database open;
4. 在primary database上创建standby database的控制文件
SQL>shutdown immedaite;
SQL>startup mount;   
SQL>alter database create standby controlfile as ‘/free/oracle/oradata/orcl/controlstandby.ctl’
SQL>alter database open;
然后将该controlfile复制到standby server的对应位置。

5. 修改standby databse的初始化参数
*.service_names=’standby’ #这个参数指定了备库的service name
*.control_files='/free/oracle/oradata/orcl/controlstandby.ctl'
*.log_archive_config='DG_CONFIG=(PRIMARY,STANDBY)'
*.LOG_ARCHIVE_DEST_1= 'LOCATION=/free/oracle/orabak VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=STANDBY'
*.LOG_ARCHIVE_DEST_2= 'SERVICE=primary VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PRIMARY LGWR SYNC AFFIRM REOPEN=10' #如果不指定REOPEN,默认为300
#*.LOG_ARCHIVE_DEST_2= 'SERVICE=standby VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY LGWR SYNC REOPEN=10'
*.db_unique_name='STANDBY'
*.FAL_CLIENT='STANDBY'
*.FAL_SERVER='PRIMARY'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.STANDBY_ARCHIVE_DEST='/free/oracle/orabak'
*.STANDBY_FILE_MANAGEMENT='AUTO'
DB_FILE_NAME_CONVERT ----当primary和standby的数据文件路径不一致时使用
LOG_FILE_NAME_CONVERT ----当primary和standby的数据文件路径不一致时使用
LOCK_NAME_SPACE ----当主数据库和备用数据在同一台机上时设为备用数据库的SID
具体参数的说明请参考oracle在线文档

6. 设置primary database和standby database的tnsnames.ora,主备库两者的tnsnames.ora配置文件相同。
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.60.144)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = primary) #这个primayr为主库的 service name
)
)

standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.60.253)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = standby) #这个standby为备库的service name
)
)

7. 启动standby database

SQL>startup nomount
SQL>alter database mount standby database; #执行此命令后备库会处于手动恢复状态。

8. 启动primary database
SQL>startup

9. 启动standby database到recover manage模式

SQL>alter database recover managed standby database disconnect;
#执行此命令后,备库会切换到自动恢复模式。
如果要启动到实时日志应用模式
SQL>alter database recover managed standby database using current logfile; #切换备库到适时应用日志模式,即real-time apply。执行这个命令后光标会停止在那里。
或者alter database recover managed standby database using current logfile disconnect from session;  #执行这个命令后,会切断这个session,执行的功能与上面相同。

但是之前需要先创建standby logfile,使用如下命令创建standby logfile:

alter database add standby logfile group 4
‘/free/oracle/oradata/orcl st_redo4.log’ size 50M
同时还需要修改主库的参数LOG_ARCHIVE_DEST_2的配置
由于事先已经配置好了备库的LOG_ARCHIVE_DEST_2参数,这里无需在进行配置。
关于standby redo file文件,一些特性简单说明如下:
当dataguard运行在max protection 或max availability时,因为必须使用LGWR日志传输方式 即时的将日志传送到standby,因此需要用到standby redo log。
其实主库产生的日志会同步写到主库的redo log 和备库的standby redo log上。同时主库日志切换时,standby redo log也会进行日志切换,因此standby redo log中的信息是与主库的redo file是 适时同步的,在备库进行恢复的时候,是利用standby redo log进行的,因此也可以说standby redo log是主库和备库直接同步的一个桥梁。
创建的standby redo log大小必须和主库的redo大小相等,创建的组数量 建议比主库的redo file多一组,这样做的目的是日后备用,这也是oracle官方的建议。
但是根据我的测试,我创建四组standby redo log,真正利用的只有两组。
10. 切换standby database到read only模式

SQL> alter database recover managed standby database cancel;    #首先取消备库的自动恢复模式
SQL>alter database open read only;
如果要切换回recover manage模式
SQL> alter database recover managed standby database disconnect from session;

三、功能切换
Switchover状态切换

首先在primary上操作:
1. 首先查看切换状态:
SQL>select switchover_status from v$database
switchover_status的值如果是To standby,可以直接switchover,如果是sessions active, 则需要在switchover的命令后面加上    。
2. 执行切换主库到备库:
SQL>alter database commit to switchover to physical standby;
3.关闭数据库:
SQL>shutdown immediate;
4. 启动到mount状态:
SQL>startup mount;

然后在standby上操作
1.查看切换状态:
SQL> select switchover_status from v$database;
switchover_status的值如果是To primary,可以直接switchover,如果是sessions active, 则需要在switchover的命令后面加上with session shutdown
2. 执行切换备库到主库:
SQL>alter database commit to switchover to primary;
3.关闭备库:
SQL>shutdown immediate;
4.重新启动备库
SQL>startup;

小窍门:要想顺利的实现switchover,最好在每台server上都同时设置好primary和standby的一些初始化参数,虽然其中一些参数只有在primary或者standby其中之一上起作用。

Failover状态切换
在备库上进行切换:
1.首先停止备库的自动恢复状态:
SQL>alter database recover managed standby database finish;
如果没有使用过standby redo log的话执行:
SQL>alter database recover managed standby database finish skip standby logfile;
2.切换备库到主库:
SQL>alter database commit to switchover to primary;
3. 关闭数据库:
SQL>shutdown immediate;
4. 启动数据库:
SQL>startup;
Active状态切换:
Active是从8i延续过来的,其实不建议采用:

在备库上执行切换:
1:alter database recover managed standby database cancel;
2:alter database activate standby database;
3:shutdown immediate

总结一下Failover 和 Switchover 的区别

在9i 的dataguad环境中:
1:执行Switch Over 必须是Primary 正常,并且是必须Primary 主动先Switch成 standby.然后standby 才能switch 成primary。
2:如果需要作成primary出问题,standby 能接管的话,必须作 failover ,而不是SwitchOver。

Failover
将主数据库offline,备用数据库online,这种操作由系统和软件失败引起。 即使在备用数据库上应用重做日志,也可能出现数据丢失的现象,除非备用数据库运行在 guaranteed protection 模式。
原主数据库重新使用时必须重新启动实例。
其它的备用数据库也需重新启动实例。

Switchover
故意将主数据库offline,而将另一备用数据库online,它能够切换到备用数据库而不需同步操作。如:可使用 Switchover 完成系统的平滑升级。 即使在备用数据库上不应用重做日志,也不会造成数据的丢失。
数据库不需重新启动实例。这使主数据库几乎能立即在备用数据库上恢复它的功能,因此可经常进行定期维护而不需中断操作。
Failover和Switchover的区别为:
当Failover发生,备用数据库切换为主数据库之后,它丢失了备用数据库的所有能力,也就是说,不能再返回到备用模式;而Switchover可以,备用数据库可切换为主数据库,也可从主数据库再切换回备用数据库。

四、相关视图
v$archive_dest
v$archive_dest_status
v$log_history
v$archvied_log
v$managed_standby
v$archive_gap

五、常见问题

1. 日志无法传送
SQL>select dest_name,status,error from v$archive_dest;
察看相应的归档路径的状态是否valid,否则根据error信息进行处理
2. 无法使用alter database重命名data file
   在standby上,当设置standby_file_management为auto时,不允许下列操作
alter database rename
alter database add/drop logfile
alter database add/drop standby logfile member
alter database create datafile as
3. switchover失败
SQL>alter database commit to switchover to physical standby
错误:ORA-01093:alter database close only permitted with no session connected
可以察看引起该错误的活动session
SQL> select sid,process,program from v$session where type='USER' and
sid<>(select distinct sid from v$mystat);
然后根据查出的sid结合v$session视图最后用
alter system kill session ‘sid,serial’ 来kill掉进程,断开该session
或者使用如下命令来做switchover
SQL>alter database commit to switchover to physical standby with session shutdown;
4. 在standby database的read only模式下做report时出现错误:
ora-01220:file base sort illegal before database is open.
可能原因:standby database没有temporary tablespace
5:当主机和备机在运行过程中,把备机停下来,主机的归档日志将不能传到备机,当把备机服务起来后,主机的归档日志也不能传到备机,需要把主机的所有服务都重启一次才可以传日志。
请问为什么需要把主机要重启一次呢?有没有不需要重启主机就可以解决此问题呢?
发生这种情况时,核查几处:
(1). show parameter log_archive_dest;
(2). select REOPEN_SECS,MAX_FAILURE from V$ARCHIVE_DEST;
察看是否是因为由于备机没有开机,造成primary node无法正常传送archived log,并且达到了最大允许的失败次数。如果是这样,可以通过alter system set log_archive_dest...来重置属性值,恢复日志的正常传送。
也可以手工传送相关的日志到备机,
     对于物理standby:ALTER DATABASE REGISTER LOGFILE '/xxx/xxx/arcr_xxx.arc'
     对于逻辑standby: ALTER DATABASE REGISTER LOGICAL LOGFILE '/xxx/xxx/arcr_xxx.arc'

(3). 执行SELECT MESSAGE FROM V$DATAGUARD_STATUS; 察看相关信息,还有根据dataguard的不同类型来察看相关的view来确定当前的状态,具体参见dataguard的官方文档。

阅读(3211) | 评论(2) | 转发(4) |
给主人留下些什么吧!~~

我要去水立方2012-01-21 00:45:19

常见问题的原因分析的挺到位的

走西口1232012-01-12 22:22:53

不错,学习了!