CategoryData Guard

对standby database 进行手动应用archive log

对standby database 进行手动应用archive log

recover managed standby database cancel;

recover automatic standby database ;

RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

====================查看状态语句============================================
SELECT MESSAGE FROM V$DATAGUARD_STATUS;

select process,pid,status,client_process from v$managed_standby ;

SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 

一步一步学Data Guard之基础篇

它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)………………….Oracle Data Guard。而对于我而言,我一定要亲切的叫它:DG(注:主要是因为打着方便)。

不少未实际接触过dg的初学者可能会下意识以为dg是一个备份恢复的工具。我要说的是,这种形容不完全错,dg拥有备份的功能,某些情况下它甚至可以与primary数据库完全一模一样,但是它存在的目的并不仅仅是为了恢复数据,应该说它的存在是为了确保企业数据的高可用性,数据保护以及灾难恢复(注意这个字眼,灾难恢复)。dg提供全面的服务包括:创建,维护,管理以及监控standby数据库,确保数据安全,管理员可以通过将一些操作转移到standby数据库执行的方式改善数据库性能。后面这一长串大家可以把它们理解成形容词,千万不要被其花哨的修饰所迷惑,要抓住重点,要拥有透明现象看本质的能力,如果没有那就要努力学习去拥有,下面我来举一个例子,比如我们夸人会说它聪明勇敢善良等等,这些就属于形容词,不重要,重点在于我们究竟想形容这个人是好人还是坏人。然后再回来看看oracle对dg功能上的形容,数据保护和灾难恢复应该都可以归结为高可用性,那么我们可以清晰的定位dg的用途了,就是构建高可用的企业数据库应用环境。

一、Data Guard配置(Data Guard Configurations)

Data Guard是一个集合,由一个primary数据库(生产数据库)及一个或多个standby数据库(最多9个)组成。组成Data Guard的数据库通过Oracle Net连接,并且有可能分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制,至于操作系统就更无所谓了(某些情况下),只要支持oracle就行了。

你即可以通过命令行方式管理primary数据库或standby数据库,也可以通过Data Guard broker提供的专用命令行界面(DGMGRL),或者通过OEM图形化界面管理。

1.Primary 数据库

前面提到,Data Guard包含一个primary数据库即被大部分应用访问的生产数据库,该库即可以是单实例数据库,也可以是RAC。

2.Standby 数据库

Standby数据库是primary数据库的复制(事务上一致)。在同一个Data Guard中你可以最多创建9个standby数据库。一旦创建完成,Data Guard通过应用primary数据库的redo自动维护每一个standby数据库。Standby数据库同样即可以是单实例数据库,也可以是RAC结构。关于standby数据库,通常分两类:逻辑standby和物理standby,如何区分,两类各有什么特点,如何搭建,这方面内容就是后面的章节主要介绍的,在这里呢三思先简单白话一下:

* 逻辑standby

就像你请人帮你素描画像,基本器官是都会有的,这点你放心,但是各器官位置啦大小啦肤色啦就不一定跟你本人一致了。

* 物理standby

就像拿相机拍照,你长什么样出来的照片就是什么样,眼睛绝对在鼻子上头。或者说就像你去照镜子,里外都是你,哇哈哈。具体到数据库就是不仅文件的物理结构相同,甚至连块在磁盘上的存储位置都是一模一样的(默认情况下)。

为什么会这样呢?这事就得从同步的机制说起了。逻辑standby是通过接收primary数据库的redo log并转换成sql语句,然后在standby数据库上执行SQL语句(SQL Apply)实现同步,物理standby是通过接收并应用primary数据库的redo log以介质恢复的方式(Redo Apply)实现同步。

另外,不知道大家是否注意到形容词上的细节:对于相机拍照而言,有种傻瓜相机功能强大而操作简便,而对于素描,即使是最简单的画法,也需要相当多的练习才能掌握。这个细节是不是也说明逻辑standby相比物理standby需要操作者拥有更多的操作技能呢?

二、Data Guard服务(Data Guard Services)

* REDO传输服务(Redo Transport Services)

控制redo数据的传输到一个或多个归档目的地。

* Log应用服务(Log Apply Services)

应用redo数据到standby数据库,以保持与primary数据库的事务一致。redo数据即可以从standby数据库的归档文件读取,也可直接应用standby redo log文件(如果实时应用打开了的话)。

* 角色转换服务(Role Transitions)

Dg中只有两种角色:primary和standby。所谓角色转换就是让数据库在这两个角色中切换,切换也分两种:switchover和failover

switchover:转换primary数据库与standby数据库。switchover可以确保不会丢失数据。

failover:当primary数据库出现故障并且不能被及时恢复时,会调用failover将一个standby数据库转换为新的primary数据库。在最大保护模式或最高可用性模式下,failover可以保证不会丢失数据。

注:上述各概念简要了解即可,这里写的太简单,不要咬文嚼字,不然你会越看越糊涂,相关服务在后面章节将会有详细介绍,不仅有直白的描述,还会有示例,再加上浅显的图片,就算你一看不懂,再看肯定懂:)

三、Data Guard保护模式(Data Guard Protection Modes)

对于Data Guard而言,其生存逻辑非常简单,好好活,做有意义的事,做黑多黑多有意义的事:)

由于它提供了三种数据保护的模式,我们又亲切的叫它:有三模:

* 最大保护(Maximum protection):

这种模式能够确保绝无数据丢失。要实现这一步当然是有代价的,它要求所有的事务在提交前其redo不仅被写入到本地的online redo log,还要同时提交到standby数据库的standby redo log,并确认redo数据至少在一个standby数据库可用(如果有多个的话),然后才会在primary数据库上提交。如果出现了什么故障导致standby数据库不可用的话,primary数据库会被shutdown。

* 最高性能(Maximum performance):

这种模式提供在不影响primary数据库性能前提下最高级别的数据保护策略。事务可以随时提交,当前primary数据库的redo数据也需要至少写入一个standby数据库,不过这种写入可以是不同步的。

如果网络条件理想的话,这种模式能够提供类似最高可用性的数据保护而仅对primary数据库有轻微的性能影响。

* 最高可用性(Maximum availability):

这种模式提供在不影响primary数据库可用前提下最高级别的数据保护策略。其实现方式与最大保护模式类似,也是要求所有事务在提交前必须保障redo数据至少在一个standby数据库可用,不过与之不同的是,如果出现故障导致无法同时写入standby数据库redo log,primary数据库并不会shutdown,而是自动转为最高性能模式,等standby数据库恢复正常之后,它又会再自动转换成最高可用性模式。

最大保护及最高可用性需要至少一个standby数据库redo数据被同步写入。三种模式都需要指定LOG_ARCHIVE_DEST_n初始化参数。LOG_ARCHIVE_DEST_n很重要,你看着很眼熟是吧,我保证,如果你完完整整学完dataguard,你会对它更熟。

 

Oralce10g data guard配置-安装配置

Oralce10g data guard配置-安装配置

体步骤如下:

一、主库操作

1、修改主库属性:
SQL> alter database force logging;
Database altered.
##查看状态
SQL> select FORCE_LOGGING from v$database;
FOR

YES

2、修改数据库为归档模式:
SQL> alter system set log_archive_dest_1=’LOCATION=/arch1/’ scope=both;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218292 bytes
Variable Size 79694092 bytes
Database Buffers 79691776 bytes
Redo Buffers 7168000 bytes
Database mounted.

SQL> alter database archivelog;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch1/
Oldest online log sequence 1
Next log sequence to archive 2
Current log sequence 2
SQL> alter database open;
Database altered.

3、添加standby logfile(也可以不加)

为主数据库添加”备用联机日志文件”,这里要保证备用日志文件与主库联机日志文件相同大小。
添加备用日志文件是规则:备用日志最少应该比redo log 多一个。推荐的备重做日志数依赖于主数据库上的线程数。

(每线程日志文件最大数目 + 1 ) * 线程数

SQL> select GROUP#,MEMBERS,BYTES/1024/1024 from v$log;
GROUP# MEMBERS BYTES/1024/1024
———- ———- —————
1 1 50
2 1 50
3 1 50
SQL> select GROUP#,MEMBER from v$logfile;
GROUP# MEMBER
———- —————————————-
3 /oracle/oradata/orcl/redo03.log
2 /oracle/oradata/orcl/redo02.log
1 /oracle/oradata/orcl/redo01.log
SQL> alter database add standby logfile
2 group 4(‘/oracle/oradata/orcl/std_redo04a.log’,’/oracle/oradata/orcl/std_redo04b.log’) size 50m,
3 group 5 (‘/oracle/oradata/orcl/std_redo05a.log’,’/oracle/oradata/orcl/std_redo05b.log’) size 50m,
4 group 6 (‘/oracle/oradata/orcl/std_redo06a.log’,’/oracle/oradata/orcl/std_redo06b.log’) size 50m,
5 group 7(‘/oracle/oradata/orcl/std_redo07a.log’,’/oracle/oradata/orcl/std_redo08b.dbf’) size 50m;
Database altered.

 
4、修改主库参数文件:

SQL> create pfile=’/oracle/orcl.ora’ from spfile;
File created.
orcl.__db_cache_size=79691776
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=71303168
orcl.__streams_pool_size=0
*.audit_file_dest=’/oracle/admin/orcl/adump’
*.background_dump_dest=’/oracle/admin/orcl/bdump’
*.compatible=’10.2.0.1.0′
*.control_files=’/oracle/oradata/orcl/control01.ctl’,’/oracle/oradata/orcl/control02.ctl’,’/oracle/oradata/orcl/control03.ctl’
*.core_dump_dest=’/oracle/admin/orcl/cdump’
*.db_block_size=8192
*.db_domain=”
*.db_file_multiblock_read_count=16
*.db_name=’orcl’
*.db_recovery_file_dest=’/oracle/flash_recovery_area’
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)’
*.job_queue_processes=10
*.DB_UNIQUE_NAME=’orclpri’ ##必须 定义每个数据库的唯一标识
*.log_archive_config=’DG_CONFIG=(orclpri,orclstandby)’ ###必须
*.log_archive_dest_1=’LOCATION=/arch1/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)’ DB_UNIQUE_NAME=’orclpri’ ###必须 本地的归档路径
*.LOG_ARCHIVE_DEST_2=’SERVICE=orclstandby arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orclstandby’ ###必须(远程服务器端的归档日志)
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.FAL_SERVER=orclstandby ### 定义FAL服务器的Oracle Net服务的名称
*.FAL_CLIENT=orclpri ### 定义备数据库的Oracle Net服务名 (这两个参数在主库可有可无,但备库必须有。ORACLE 老外工程师说这个必须有^_^)
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=150
*.remote_login_passwordfile=’EXCLUSIVE’
*.sga_target=167772160
*.undo_management=’AUTO’
*.undo_tablespace=’UNDOTBS1′
*.user_dump_dest=’/oracle/admin/orcl/udump’
*.STANDBY_FILE_MANAGEMENT=AUTO ###设置为AUTO,使得当数据文件添加到主数据库或者从主数据库删除的时候,对应的修改能够在备用数据库中自动执行
5、用pfile启动,再重新创建spfile.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile=’/oracle/orcl.ora’
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218292 bytes
Variable Size 79694092 bytes
Database Buffers 79691776 bytes
Redo Buffers 7168000 bytes 网管网bitsCN_com
Database mounted.
Database opened.
SQL>
SQL> create spfile from pfile=’/oracle/orcl.ora’;
File created

6、在主库创建密码文件、以及控制文件。
[oracle@node2 oracle]$ orapwd file=’/oracle/product/10.2.0/db_1/dbs/orapworcl.ora’ password=oracle entries=10
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS ‘/oracle/oradata/orcl/standby.ctl’;
Database altered.

7、TNS信息如下:
主库
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.239)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
orclpri =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.239)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
orclstandby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.211)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
监听信息如下
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SERVICE_NAME=orclpri)
(ORACLE_HOME = /oracle/product/10.2.0/db_1)
(SID_NAME=ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)

8、把数据库scp到备库相应的目录(包括密码文件、standby controlfile)

二备机操作

1、备份的参数文件内容
orcl.__db_cache_size=79691776
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=71303168
orcl.__streams_pool_size=0
*.audit_file_dest=’/oracle/admin/orcl/adump’
*.background_dump_dest=’/oracle/admin/orcl/bdump’
*.compatible=’10.2.0.1.0′
*.control_files=’/oracle/oradata/orcl/control01.ctl’,’/oracle/oradata/orcl/control02.ctl’,’/oracle/oradata/orcl/control03.ctl’
*.core_dump_dest=’/oracle/admin/orcl/cdump’
*.db_block_size=8192
*.db_domain=”
*.db_file_multiblock_read_count=16
*.db_name=’orcl’
*.db_recovery_file_dest=’/oracle/flash_recovery_area’
*.db_recovery_file_dest_size=2147483648 网管网bitsCN.com
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)’
*.job_queue_processes=10
*.DB_UNIQUE_NAME=’orclstandby’ ##必须 定义每个数据库的唯一标识
*.log_archive_config=’DG_CONFIG=(orclpri,orclstandby)’ ###必须
*.log_archive_dest_1=’LOCATION=/arch1/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)’ DB_UNIQUE_NAME=’orclstandby’ ###必须 本地的归档路径
*.LOG_ARCHIVE_DEST_2=’SERVICE=orclpri arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orclpri’ ###必须(远程服务器端的归档日志)
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.FAL_SERVER=orclstandby ### 定义FAL服务器的Oracle Net服务的名称
*.FAL_CLIENT=orclpri ### 定义备数据库的Oracle Net服务名 (这两个参数在主库可有可无,但备库必须有。ORACLE 老外工程师说这个必须有^_^)
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=150
*.remote_login_passwordfile=’EXCLUSIVE’
*.sga_target=167772160
*.undo_management=’AUTO’
*.undo_tablespace=’UNDOTBS1′
*.user_dump_dest=’/oracle/admin/orcl/udump’
*.STANDBY_FILE_MANAGEMENT=AUTO

2、修改上面参数文件里的
*.control_files=’/oracle/oradata/orcl/control01.ctl’,’/oracle/oradata/orcl/control02.ctl’,’/oracle/oradata/orcl/control03.ctl’
为:
*.control_files=’/oracle/oradata/orcl/standby.ctl’ ##在主机上生成的那个控制文件,也可以多放几份

3、TNS信息如下:
备库
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.239)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
orclpri =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.239)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
orclstandby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.211)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
监听信息如下
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SERVICE_NAME=orclstandby)
(ORACLE_HOME = /oracle/product/10.2.0/db_1)
(SID_NAME=ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)

4、用创建的参数文件启动数据库到nomount
SQL> startup pfile=’/oracle/orclstandby.ora’ nomount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 62916852 bytes
Database Buffers 100663296 bytes
Redo Buffers 2973696 bytes
SQL> ALTER DATABASE MOUNT STANDBY DATABASE;
Database altered.

5、修改备库处于应用归档状态

SQL> alter database recover managed standby database disconnect from session;
Database altered.

如果主库从不过来归档,可以通过在主库侧手工修改参数如下:
ALTER SYSTEM SET log_archive_dest_state_2=’DEFER’ SCOPE=MEMORY;
ALTER SYSTEM SET log_archive_dest_state_2=’ENABLE’ SCOPE=MEMORY;
7、测试

通过在主库执行alter system switch logfile;
切换日志可以观察到备库会自动应用通过主库传过来的日志。
三、切换测试
1、在主库端

select switchover_status from v$database;

如果是to standby 表可以正常切换。

直接执行

ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

否则执行:

ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
shutdown immediate;
startup nomount;
alter database mount standby database;

如果是to_primary 表可以正常切换。

2、在备库

在备库

SELECT SWITCHOVER_STATUS FROM V$DATABASE;
执行:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
否则执行:

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
shutdown immediate;
startup;

然后观察主备库日志,如果正常的话会看到备库会自动应用日志。

 

 

Oracle dataguard配置步骤(单一服务器)

Oracle dataguard配置步骤

rac,dataguard,stream被认为是oracle的高可用的三架马车。

三架马车各有侧重:

rac主要解决了单节点故障,实现负载均衡,也实现了高性能。常用于24×7的商业应用。

dataguard用冗余的方式实现高可用的,解决容灾。

stream更加丰富,主要是应用层面的数据共享。

前一段主要进行了rac的环境搭建,这两天在虚拟机上进行了dataguard环境搭建和测试,开始想对之前的rac作为primary ,但是一直没有成功。还是一步步从简单的开始,从单实例来做,创建一个单实例的数据库,在同一台机器上搭建一个standby数据库。将自己的搭建步骤整理写出来,加深印象,供以后搭建参考,搭建的难点在于参数文件的配置。
环境:

操作系统:RedHat 4 32位 2.6.9-89.ELsmp
数据库版本:oracle 10g 10.2.0.1
已经有一个单实例的数据库了。

我是参考三思笔记搭建的,数据库名字直接用上面的名字了。下面所指的主数据库,primary数据库都是指jssweb, standby数据库指jsspdg。

我的数据库路径是
oracle_home=/usr/oracle/product/10.2.0/db_1
ORACLE_BASE=/usr/oracle
文件路径是:/usr/oracle/oradata/数据库名字/数据文件,控制文件,日志文件和归档日志文件。

搭建步骤:

1、确定primary数据库是归档模式

SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /usr/oracle/oradata/jssweb
Oldest online log sequence 34
Next log sequence to archive 36
Current log sequence 36

如果非归档模式

先设置归档位置

参看参数

SQL> show parameter archive log;

NAME TYPE VALUE
———————————— ———————- ——————————
archive_lag_target integer 0
log_archive_config string DG_CONFIG=(jssweb,jsspdg)
log_archive_dest string
log_archive_dest_1 string LOCATION=/usr/oracle/oradata/j
ssweb VALID_FOR=(ALL_LOGFILES,
ALL_ROLES) DB_UNIQUE_NAME=jssw
eb

如果没有设置归档位置,先暂时设置一个归档位置,再重新启动数据为归档模式

SQL> alter system set log_archive_dest_1=’LOCATION=/usr/oracle/oradata/jssweb’

然后

SQL> shutdown immediate

……

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database open;

2、先确定primary数据库是FORCED LOGGING模式,目的是所有ddl语句都写redo log,及时是有nologging限制的ddl语句。

SQL> alter database force logging;
alter database force logging
*
ERROR at line 1:
ORA-12920: database is already in force logging mode

说明已经是FORCED LOGGING

3、创建standby数据库的文件夹。主要是standby和primary的启动参数文件需要用。

用oracle用户

在/usr/oracle/admin下创建jsspdg文件夹

在/usr/oracle/admin/jsspdg/下创建adump bdump cdump dpdump pfile udump这些文件夹。

4、创建standby的控制文件,控制文件名直接用control01.ctl

在主primary数据库中创建

登录主数据库

SQL> alter database create standby controlfile as ‘/usr/oracle/oradata/jsspdg/control01.ctl’;

5、创建主数据库的pfile,主要是在此pfile基础上修改primary和standby数据库的参数文件。

SQL> create pfile from spfile;

这时候在/usr/oracle/product/10.2.0/db_1/dbs/目录下会多出来一个initjssweb.ora的文件

我们就在这个参数文件的基础上进行修改
复制一份initjssweb.ora,重新命名为standby数据库的参数文件initjsspdg.ora,也可以在修改好的primary数据的参数文件的基础上修改。

[oracle@rac3 dbs]$cp initjssweb.ora initjsspdg.ora

修改主数据库的参数文件:initjssweb.ora

jssweb.__db_cache_size=92274688
jssweb.__java_pool_size=4194304
jssweb.__large_pool_size=4194304
jssweb.__shared_pool_size=62914560
jssweb.__streams_pool_size=0
*.audit_file_dest=’/usr/oracle/admin/jssweb/adump’
*.background_dump_dest=’/usr/oracle/admin/jssweb/bdump’
*.compatible=’10.2.0.1.0′
*.control_files=’/usr/oracle/oradata/jssweb/control01.ctl’,’/usr/oracle/oradata/jssweb/control02.ctl’,’/usr/oracle/oradata/jssweb/control03.ctl’
*.core_dump_dest=’/usr/oracle/admin/jssweb/cdump’
*.db_block_size=8192
*.db_domain=”
*.db_file_multiblock_read_count=16
*.db_name=’jssweb’
*.db_recovery_file_dest=’/usr/oracle/flash_recovery_area’
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jsswebXDB)’
*.job_queue_processes=10
*.log_archive_dest_1=’LOCATION=/usr/oracle/oradata/jssweb’
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=50
*.remote_login_passwordfile=’EXCLUSIVE’
*.sessions=60
*.sga_target=167772160
*.undo_management=’AUTO’
*.undo_tablespace=’UNDOTBS1′
*.user_dump_dest=’/usr/oracle/admin/jssweb/udump’

#添加下面内容;
DB_UNIQUE_NAME=jssweb
LOG_ARCHIVE_CONFIG=’DG_CONFIG=(jssweb,jsspdg)’
LOG_ARCHIVE_DEST_1=’LOCATION=/usr/oracle/oradata/jssweb VALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=jssweb’
LOG_ARCHIVE_DEST_2=’SERVICE=jsspdg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=jsspdg’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
FAL_SERVER=jsspdg
FAL_CLIENT=jssweb
DB_FILE_NAME_CONVERT=’/usr/oracle/oradata/jsspdg’,’/usr/oracle/oradata/jssweb’
LOG_FILE_NAME_CONVERT=’/usr/oracle/oradata/jsspdg’,’/usr/oracle/oradata/jssweb’
STANDBY_FILE_MANAGEMENT=AUTO

修改备数据库的参数文件:initjsspdg.ora 内容如下:

jsspdg.__db_cache_size=88080384
jsspdg.__java_pool_size=4194304
jsspdg.__large_pool_size=4194304
jsspdg.__shared_pool_size=67108864
jsspdg.__streams_pool_size=0
*.audit_file_dest=’/usr/oracle/admin/jsspdg/adump’
*.background_dump_dest=’/usr/oracle/admin/jsspdg/bdump’
*.compatible=’10.2.0.1.0′
*.control_files=’/usr/oracle/oradata/jsspdg/control01.ctl’
*.core_dump_dest=’/usr/oracle/admin/jsspdg/cdump’
*.db_block_size=8192
*.db_domain=”
*.db_file_multiblock_read_count=16
*.DB_FILE_NAME_CONVERT=’/usr/oracle/oradata/jssweb’,’/usr/oracle/oradata/jsspdg’
*.db_name=’jssweb’
*.db_recovery_file_dest=’/usr/oracle/flash_recovery_area’
*.db_recovery_file_dest_size=2147483648
*.DB_UNIQUE_NAME=’jsspdg’
*.FAL_CLIENT=’jsspdg’
*.FAL_SERVER=’jssweb’
*.job_queue_processes=10
*.LOG_ARCHIVE_CONFIG=’DG_CONFIG=(jssweb,jsspdg)’
*.LOG_ARCHIVE_DEST_1=’LOCATION=/usr/oracle/oradata/jsspdg VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=jsspdg’
*.LOG_ARCHIVE_DEST_2=’SERVICE=jssweb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=jssweb’
*.LOG_ARCHIVE_DEST_STATE_1=’ENABLE’
*.LOG_ARCHIVE_DEST_STATE_2=’ENABLE’
*.LOG_FILE_NAME_CONVERT=’/usr/oracle/oradata/jssweb’,’/usr/oracle/oradata/jsspdg’
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=50
*.REMOTE_LOGIN_PASSWORDFILE=’EXCLUSIVE’
*.sessions=60
*.sga_target=167772160
*.STANDBY_FILE_MANAGEMENT=’AUTO’
*.undo_management=’AUTO’
*.undo_tablespace=’UNDOTBS1′
*.user_dump_dest=’/usr/oracle/admin/jsspdg/udump’
service_names=jsspdg
instance_name=jsspdg

6、复制数据库文件,日志文件到standby的文件夹下:

复制方式很多可以直接拷贝,也可以用数据库复制

登录主库

SQL>alter database begin backup;

SQL>host cp /usr/oracle/oradata/jssweb/*.dbf /usr/oracle/oradata/jsspdg/

SQL>alter database end backup;

SQL>alter system archive log current ;

7、配置tnsnames和listener

tnsnames.ora

内容为:

JSSWEB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac3)(PORT = 1521))

)
(CONNECT_DATA =
(SERVICE_NAME = jssweb)
)
)

JSSPDG =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = jsspdg)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
listener.ora内容如下:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /usr/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac3)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)

测试配置正确与否,可以测试一下

tnsping jssweb

tnsping jsspdg

8、创建standby数据库jsspdg密码文件:

可以用orapwd创建

orapwd file=’/usr/oracle/product/10.2.0/db_1/dbs/orapwjsspdg’ password=sys entries=5

9、重启primary数据库和standby数据库

primary数据库jssweb

SQL>shutdown immediate

SQL>startup pfile=’/usr/oracle/product/10.2.0/db_1/dbs/initjssweb.ora’ nomount;

SQL>alter database mount;

SQL>alter database open;

也可以

SQL>shutdown immediate

SQL>create spfile from pfile;

SQL>startup

standby数据库jsspdg

SQL>create spfile from pfile;

SQL>startup mount;

10、启用redo

SQL> alter database recover managed standby database disconnect from session;

disconnect from session参数是可选的,如果不写需要另起一个session,当前session会挂起。

11、测试

主库:

SQL>ALTER SYSTEM SWITCH LOGFILE;
SQL> SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG ;

MAX(SEQUENCE#)
————–
35

STANDBY数据库
SQL> SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG ;

MAX(SEQUENCE#)
————–
35

如果结果一样说明执行成功。也可以直接去归档日志目录先查看归档的文件是否生成,两个数据库中都应该有。

至此环境已经搭建好了至于switchover和failover以后补充。

 

 

 

 

Oracle 11g DataGuard 配置

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – 64bit Production

Red Hat Enterprise Linux Server release 5.3 (Tikanga)

一、测试环境准备
1.主库和备库oracle版本一致,运行在相同平台如linux,服务器硬件可以不一样。
2.Primary 数据库必须运行于归档模式,并且务必确保在primary 数据库上打开FORCE LOGGING,以避免用户通过nologging 等方式避免写redo 造成对应的操作无法传输到standby 数据库。
3.Primary 和standby 数据库均可应用于单实例或RAC 架构下,并且同一个data guard 配置可以混合使用逻辑standby 和物理standby.
4.建议数据库必须采用相同的存储架构。比如存储采用ASM/OMF 的话,那不分primarty 或是standby也都需要采用ASM/OMF。
5.standby库的环境和primary一致。

二、调整主库
1.将主数据库改为强制产生日志模式
alter database force logging;
2. 创建密码
orapwd file=$ORACLE_HOME/dbs/orapwtest password=test entries=3
3. 修改主库的初始化参数
db_unique_name =’test01′
db_name指定数据库的名称,db_unique_name指定了数据库(主库和备库)的不同名称,是对db_name的唯一的标识。其实是为了区分db_name名一样的数据库,方便应用和管理。是10g以后的参数。
log_archive_config=’DG_CONFIG=(test01,test02)’
test01,test02是.db_unique_name
log_archive_dest_1=’location=/u01/app/oracle/arch/test/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=test01′
log_archive_dest_2=’SERVICE=test_db_02 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test02′
确定log_archive_dest_state_1
log_archive_dest_state_1= enable #默认就是enable
log_archive_dest_state_2= enable
/*以下部分为主机切换为备库使用*/
fal_server=test_db_02
fal_client=test_db_01
standby_file_management=auto
#如果主备库文件或路径不同
db_file_name_convert=’/u01/app/oracle/oradata/test’,’/u01/app/oracle/oradata/test’
log_file_name_convert=’/u01/app/oracle/oradata/test’,’/u01/app/oracle/oradata/test’

建议参数文件使用spfile,这样可以在不停库使用命令修改参数。
4. 确保数据库运行在archivelog模式下
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 2
Current log sequence 4
把数据库调整为archivelog模式下
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog ;
SQL> alter database open;

5.在主库上创建备用日志 (为切换而用)
alter database recover managed standby database cancel;#未执行
SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 SIZE 50M;
SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 SIZE 50M;
SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 SIZE 50M;

mkdir -p /u01/app/oracle/standby/test
SQL>alter database add standby logfile group 4(‘/u01/app/oracle/standby/test/stdby_redo04.log’) size 50M;
SQL>alter database add standby logfile group 5(‘/u01/app/oracle/standby/test/stdby_redo05.log’) size 50M;
SQL>alter database add standby logfile group 6(‘/u01/app/oracle/standby/test/stdby_redo06.log’) size 50M;

SQL>alter database recover managed standby database disconnect from session;#未执行

三、创建standby database
1. 在standby database 创建pwdfile
orapwd file=$ORACLE_HOME/dbs/orapwtest password=test entries=3
密码要与primary database相同
2. 修改standby database初始化参数
与primary database不同的参数如下:
db_unique_name=test02
log_archive_dest_1=’location=/u01/app/oracle/arch/test valid_for=(all_logfiles,all_roles) db_unique_name=test02′
log_archive_dest_2=’service=test_db_01 ARCH ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=test01′
fal_client=’test_db_02′
fal_server=’test_db_01′
db_file_name_convert=’/u01/app/oracle/oradata/TEST01/datafile’,’/u01/app/oracle/oradata/TEST02/datafile’
log_file_name_convert=’/u01/app/oracle/oradata/TEST01/onlinelog’,’/u01/app/oracle/oradata/TEST02/onlinelog’, ‘/u01/app/oracle/flash_recovery_area/TEST01/onlinelog’,’/u01/app/oracle/flash_recovery_area/TEST01/onlinelog’

修改完之后用如下语句查看
SQL> select * from V$DATAGUARD_CONFIG;

DB_UNIQUE_NAME
——————————————————————————————
test01
test02

4.创建好相应目录,dump文件目录,数据文件目录,归档目录
mkdir -p /u01/app/oracle/oradata
mkdir -p /u01/app/oracle/flash_recovery_area
mkdir -p /u01/app/oracle/arch/test

5. 配置standby database的listener.ora 和tnsnames.ora文件同主库
重起监听并检验是否可以tnsping通
6. 启动standby database到nomount状态
SQL> startup nomount
7. 用RMAN的duplicate功能创建standby database,11g可以不做备份直接复制到备库:
RMAN> rman auxiliary /
connect target sys/test@test_db_01
duplicate target database for standby dorecover nofilenamecheck;

检查standby database的状态
SQL> select database_role,protection_mode,protection_level from v$database;
SQL> select sequence# ,applied from v$archived_log order by sequence#;
8.开始Redo应用
主库
SQL> alter system archive log current;
备库,11g可以只读打开库应用日志
SQL> alter database open read only;
SQL> alter database recover managed standby database disconnect from session;

也可以使用alter database recover managed standby database using current logfile disconnect from session;应用日志。
没有using current logfile是去apply standby archived log.
有using current logfile是当日志传到standby redo log的时候就去应用,是real-time的,必须要有standby redo log.
四.备用服务器的管理模式与只读模式
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;
5.从只读方式到管理恢复方式
SQL> recover managed standby database disconnect from session;

五.主备切换
主库
lsnrctl stop

SQL> alter database commit to switchover to physical standby with session shutdown;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database recover managed standby database disconnect;

lsnrctl start

备库

SQL> alter database commit to switchover to primary;
SQL> shutdown immediate;
SQL> startup

六.附件
以下是配置文件内容:
listener.ora

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle6)(PORT = 1521))
)

tnsnames.ora

TEST_DB_02 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.202.5)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test02)
)
)

TEST_DB_01 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.202.6)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test01)
)
)
pfile

test.__db_cache_size=1526726656
test.__java_pool_size=16777216
test.__large_pool_size=16777216
test.__oracle_base=’/u01/app/oracle’#ORACLE_BASE set from environment
test.__pga_aggregate_target=1342177280
test.__sga_target=2013265920
test.__shared_io_pool_size=0
test.__shared_pool_size=436207616
test.__streams_pool_size=0
*.audit_file_dest=’/u01/app/oracle/admin/test/adump’
*.audit_trail=’db’
*.compatible=’11.1.0.0.0′
*.control_files=’/u01/app/oracle/oradata/test/control01.ctl’,’/u01/app/oracle/oradata/test/control02.ctl’,’/u01/app/oracle/oradata/test/control03.ctl’
*.db_block_size=8192
*.db_domain=’greatsky.com’
*.db_name=’test’
*.db_recovery_file_dest=’/u01/app/oracle/flash_recovery_area’
*.db_recovery_file_dest_size=2147483648
*.db_unique_name=’test01′
*.diagnostic_dest=’/u01/app/oracle’
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)’
*.fal_client=’TEST_DB_01′
*.fal_server=’TEST_DB_02′
*.log_archive_config=’dg_config=(test01,test02)’
*.log_archive_dest_1=’location=/u01/app/oracle/arch/test/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=test01′
*.log_archive_dest_2=’SERVICE=test_db_02 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test02′
*.memory_target=3347054592
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile=’EXCLUSIVE’
*.service_names=’test.greatsky.com’,’test01.greatsky.com’
*.standby_file_management=’AUTO’
*.undo_tablespace=’UNDOTBS1′

 

Oracle 10g 11g DataGuard 配置

1.方式 physic standby configuration 最大性能模式

2.目的 生产库比较大,如果用rman做备份如果哪一天坏掉恢复起来太慢。
决定采用dataguard的容灾方案。
3.优点:在备机上做恢复,从主库上通过rman同步过来作,恢复速度快。Oracle11g一个重大的功能改进
就是DATA GUARD可以在打开的情况下应用归档。这个功能使得STANDBY数据库可以轻松的替PRIMARY来分担
查询的压力。
4.缺点:不能还原到某一时刻。
测试环境准备
1.主库也备库oracle版本一致,运行在相同平台如linux,服务器硬件可以不一样。
2.Primary 数据库必须运行于归档模式,并且务必确保在primary 数据库上打开FORCE LOGGING,
以避免用户通过nologging 等方式避免写redo 造成对应的操作无法传输到standby 数据库。
3.Primary 和standby 数据库均可应用于单实例或RAC 架构下,并且同一个data guard 配置可以混合
使用逻辑standby 和物理standby.
4.建议数据库必须采用相同的存储架构。比如存储采用ASM/OMF 的话,那不分primarty 或是standby
也都需要采用ASM/OMF。
5.standby库的环境和primary一致
物理standby创建步
1.先安装primary库(oracle11g)
以sysdba登录primary库,开启归档,open状态。
设置primary库为force Logging模式(为了便于切换,建议standby库也设置为force logging),这样所有的改变都会放入重做日志中,确保了可靠的恢复。
SQL> ALTER DATABASE FORCE LOGGING;
在主库上创建备用日志 (为切换而用)
alter database recover managed standby database cancel;
alter database add standby LOGFILE GROUP 5 (‘/u01/app/oracle/oradata/oracle11/stdy_redo05.log’,’/u01/arch/onlinelog/stdy_redo05.log’) size 50m;
alter database add standby LOGFILE GROUP 6 (‘/u01/app/oracle/oradata/oracle11/stdy_redo06.log’,’/u01/arch/onlinelog/stdy_redo06.log’) size 50m;
alter database add standby LOGFILE GROUP 7 (‘/u01/app/oracle/oradata/oracle11/stdy_redo07.log’,’/u01/arch/onlinelog/onlinelog/stdy_redo07.log’) size 50m;
alter database recover managed standby database disconnect from session;
更改主库的pfile文件
*.db_name=’oracle11′
*.DB_UNIQUE_NAME=’oracle11′
*.log_archive_config=’DG_CONFIG=(oracle11,guard2)’ #oracle11,guard2是tns里配置名字.
*.log_archive_dest_1=’location=/u01/arch/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)’ DB_UNIQUE_NAME=’oracle11′
*.LOG_ARCHIVE_DEST_2=’SERVICE=guard2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=oracle11′
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
/*以下部分为主机切换为备库使用*/
*.FAL_SERVER=guard2
*.FAL_CLIENT=oracle11
*.DB_FILE_NAME_CONVERT=’guard2′,’oracle11′
*.LOG_FILE_NAME_CONVERT=’/u01/app/oracle/oradata/oracle11′,’/u01/app/oracle/oradata/oracle11′
*.STANDBY_FILE_MANAGEMENT=AUTO
*.remote_login_passwordfile=’EXCLUSIVE’

配置primary库的tnsname.ora
[oracle@modem admin]$ more tnsnames.ora
oracle11 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.239)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle11)
)
)

guard2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle11)
)
)
配置primary库的listener.ora
[oracle@modem admin]$ more listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = oracle11)
(ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
)

)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.239)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

再次启动primary到mount状态。
SQL> shutdown immediate;
SQL> startup mount;
用RMAN作一次全库备份,采用默认目录
创建备库的控制文件
SQL> alter database create standby controlfile as ‘/home/oracle/controlbak.ctl’;
Database altered.
这样以上的主库已经配置完毕。

下面是建备库
1.把主库shutdown immediate
在备库上把主库的/u01/app /u01/arch /etc/oraInst.loc /etc/oratab /usr/local/bin/oraenv 拷贝过来。
更改备库相关配置
1.更改initoracle11.ora
*.control_files=’/u01/app/oracle/oradata/oracle11/controlguard1.ctl’,’/u01/app/oracle/oradata/oracle11/
controlguard2.ctl’,’/u01/app/oracle/oradata/oracle11/controlguard3.ctl’
*.db_name=’oracle11′
*.DB_UNIQUE_NAME=’oracle11′
*.log_archive_config=’DG_CONFIG=(oracle11,guard2)’
*.log_archive_dest_1=’location=/u01/arch/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)’ DB_UNIQUE_NAME=’oracle11′
*.LOG_ARCHIVE_DEST_2=’SERVICE=oracle11 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=oracle11′
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.FAL_SERVER=oracle11 #注意与主库刚好相反
*.FAL_CLIENT=guard2 #注意与主库刚好相反
*.DB_FILE_NAME_CONVERT=’guard2′,’oracle11′
*.LOG_FILE_NAME_CONVERT=’/u01/app/oracle/oradata/oracle11′,’/u01/app/oracle/oradata/oracle11′
*.STANDBY_FILE_MANAGEMENT=AUTO

把主库上备份的控制文件/home/oracle/controlbak.ctl 对应复制三制保存为controlguard1.ctl,controlguard2.ctl,controlguard3.ctl
这样备库也做完了。

测试
先开启主备数据库的监听
sqlplus sys/****@oracle11 as sysdba
sqlplus sys/****@guard2 as sysdba
在主库和备库分别登录,如果能登录说明监听没问题。

在主库上 startup启动数据库到open
在备库上 startup mount 然后
启动redo 应用
SQL> alter database recover managed standby database disconnect from session;
查看同步情况
首先连接到primary 数据库
SQL> show parameter instance_name;
SQL> select sequence#, first_time, next_time, applied, fal from v$archived_log order by sequence#;
数据验证
最后,我们在主库上创建一个表并插入一些数据,然后模拟日志切换,最后在备库上验证数据的传输情况。
主库上建测试表
SQL> create table randy (id number);
Table created.

SQL> insert into randy values(1);
1 row created.

SQL> /
1 row created.

SQL> /
1 row created.

SQL> commit;
Commit complete.

SQL> select * from randy;

ID
———-
1
1
1

主库上模拟日志切换
SQL> alter system archive log current;

System altered.

查看备库告警日志文件
Fri Mar 20 10:04:29 2009
MRP0 started with pid=24, OS id=7410
MRP0: Background Managed Standby Recovery process started (oracle11)
Fast Parallel Media Recovery enabled
Managed Standby Recovery not using Real Time Apply
parallel recovery started with 2 processes
Waiting for all non-current ORLs to be archived…
Media Recovery Log /u01/arch/1_483_673887649.dbf
Media Recovery Log /u01/arch/1_484_673887649.dbf
Media Recovery Waiting for thread 1 sequence 485 (in transit)
–可以发现主库的数据已经传送过来。

以只读模式打开备库,验证数据
SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database open read only;

Database altered.

SQL> select * from randy;

ID
———-
1
1
1

恢复备库的standby状态
SQL> alter database recover managed standby database disconnect from session;
Database altered.

Oracle11g一个重大的功能改进就是DATA GUARD可以在打开的情况下应用归档。这个功能使得STANDBY数据库可以轻松的替PRIMARY来分担查询的压力。
—————————————————————————–
主备库切换

将主库切换到备用状态
SQL> alter database commit to switchover to physical standby;
Database altered.

SQL> shutdown immediate
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 67111156 bytes
Database Buffers 96468992 bytes
Redo Buffers 2973696 bytes

SQL> alter database mount standby database;
Database altered.

SQL> select name,open_mode,protection_mode,database_role from v$database;

NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
——— ———- ——————– —————-
GUARD1 MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY

SQL> alter database recover managed standby database disconnect from session;

Database altered.

将备库转换成主库模式
SQL> alter database commit to switchover to primary;
Database altered.

SQL> shutdown immediate
ORA-01507: database not mounted

ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 62916852 bytes
Database Buffers 100663296 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.

查看主备库告警日志文件

 
发表于: 2009-03-20,修改于: 2009-03-20 15:15 已浏览825次,有评论6条 推荐 投诉

网友评论
本站网友 时间:2009-03-20 14:15:53 IP地址:203.86.81.★

真详细,赞一个

cj_gameboy 时间:2009-04-29 11:45:14 IP地址:218.94.9.★

正好需要,谢谢

cong_rong520 时间:2009-09-29 11:12:56 IP地址:116.228.66.★

alter database recover managed standby database cancel;

cong_rong520 时间:2009-09-29 11:14:05 IP地址:116.228.66.★

执行了这句 alter database recover managed standby database cancel;
报错
ERROR at line 1:
ORA-01665: control file is not a standby control file

chenwenming 时间:2009-10-01 15:04:43 IP地址:123.182.164.★

创建备库的控制文件
SQL> alter database create standby controlfile as ‘/home/oracle/controlbak.ctl’;
Database altered.
然后把standby控制文件考到备机上

这步你做了吗?

本站网友 时间:2009-10-10 19:52:55 IP地址:58.61.116.★

在建备库时*.DB_UNIQUE_NAME=’oracle11′ 参数应该改为’guard2′ 吧。

 

在单机的linux虚拟机上配置DG

在单机的linux虚拟机上配置DG,记录过程

环境介绍:
linux 4.7 AS 32位
ORACLE Release 10.2.0.1.0
主库 tdb
备库 std
ORACLE_BASE=/opt/oracle
ORACLE_HOME=/opt/oracle/product/10.2/db_1

一、配置主库

1.为备库新建目录
mkdir -p /opt/oracrs/std/admin
cd /opt/oracrs/std/admin
mkdir arch bdump cdump pfile udump
mkdir -p /opt/oracrs/std/oradata

2.设置主库强制日志
alter database force logging ;
3.新建口令文件
cd $ORACLE_HOME/dbs
orapwd file=orapwtdb password=oracle force=y

4.配置备重做日志
alter database add standby logfile group 4 (‘/opt/oracrs/tdb/oradata/redo04.log’,’/opt/oracrs/tdb/oradata/redo042.log’) size 100m ;
alter database add standby logfile group 5 (‘/opt/oracrs/tdb/oradata/redo05.log’,’/opt/oracrs/tdb/oradata/redo052.log’) size 100m ;
alter database add standby logfile group 6 (‘/opt/oracrs/tdb/oradata/redo06.log’,’/opt/oracrs/tdb/oradata/redo062.log’) size 100m ;
alter database add standby logfile group 7 (‘/opt/oracrs/tdb/oradata/redo07.log’,’/opt/oracrs/tdb/oradata/redo072.log’) size 100m ;
–alter database add standby logfile group 8 (‘/opt/oradata/PROD/oradata/redo08.log’,’/opt/oradata/PROD/oradata/redo082.log’) size 100m ;
–alter database add standby logfile group 9 (‘/opt/oradata/PROD/oradata/redo09.log’,’/opt/oradata/PROD/oradata/redo092.log’) size 100m ;
–alter database add standby logfile group 10 (‘/opt/oracrs/std/oradata/redo10.log’,’/opt/oracrs/std/oradata/redo102.log’) size 100m ;
–alter database add standby logfile group 11 (‘/opt/oracrs/std/oradata/redo11.log’,’/opt/oracrs/std/oradata/redo112.log’) size 100m ;

5.配置初始化参数
SQL> create pfile=’/opt/oradata/backup/inittdb2.ora’ from spfile ;
拷贝一份到/opt/oracrs/std/admin/pfile,名字叫initstd.ora,给备库使用
修改主库的pfile文件inittdb2.ora,修改后内容如下:
PROD.__db_cache_size=159383552
tdb.__db_cache_size=171966464
PROD.__java_pool_size=4194304
tdb.__java_pool_size=4194304
PROD.__large_pool_size=20971520
tdb.__large_pool_size=20971520
PROD.__shared_pool_size=104857600
tdb.__shared_pool_size=96468992
PROD.__streams_pool_size=4194304
tdb.__streams_pool_size=0
*.BACKGROUND_DUMP_DEST=’/opt/oradata/PROD/bdump’
*.COMPATIBLE=’10.0.0′
*.CONTROL_FILES=’/opt/oradata/PROD/oradata/control01.ctl’,’/opt/oracle/admin/control02.ctl’,’/opt/oracle/control03.ctl’
*.CORE_DUMP_DEST=’/opt/oradata/PROD/cdump’
*.cursor_sharing=’SIMILAR’
*.db_16k_cache_size=16777216
*.DB_BLOCK_SIZE=8192
*.DB_FILE_NAME_CONVERT=’/opt/oracrs/std/oradata/’,’/opt/oradata/PROD/oradata/’,’/opt/oracrs/std/oradata/’,’/opt/oradata/backup/’
*.DB_NAME=’PROD’
*.DB_UNIQUE_NAME=’tdb’
*.FAL_CLIENT=’tdb’
*.FAL_SERVER=’std’
*.JOB_QUEUE_PROCESSES=20
*.large_pool_size=20971520
*.local_listener=’PROD_S’
*.LOG_ARCHIVE_CONFIG=’DG_CONFIG=(tdb,std)’
*.LOG_ARCHIVE_DEST_1=’LOCATION=/home/oracle/backup VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=tdb’
*.LOG_ARCHIVE_DEST_2=’SERVICE=std LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=std’
*.LOG_ARCHIVE_DEST_STATE_1=’ENABLE’
*.LOG_ARCHIVE_DEST_STATE_2=’ENABLE’
*.log_checkpoints_to_alert=TRUE
*.LOG_FILE_NAME_CONVERT=’/opt/oracrs/std/oradata/’,’/opt/oradata/PROD/oradata/’,’/opt/oracrs/std/oradata/’,’/opt/oracrs/tdb/oradata/’
*.OPEN_CURSORS=500
*.PGA_AGGREGATE_TARGET=50M
*.processes=1000
*.REMOTE_LOGIN_PASSWORDFILE=’EXCLUSIVE’
*.resource_manager_plan=’WEEKDAYS’
*.SGA_TARGET=300M
*.STANDBY_FILE_MANAGEMENT=’AUTO’
*.UNDO_MANAGEMENT=’AUTO’
*.UNDO_TABLESPACE=’UNDOTBS1′
*.USER_DUMP_DEST=’/opt/oradata/PROD/udump’

6.用参数文件启动主库到mount,开启归档
alter database archivelog ;
二、配置备库
7.关闭主库,冷备复制
复制日志,数据文件

8.用参数文件启动主库tdb到mount,创建standby控制文件
tdb>startup mount pfile=’/opt/oradata/backup/inittdb2.ora’ ;
tdb>alter database create standby controlfile as ‘/opt/oracrs/std/oradata/control01.ctl’ ;
tdb>alter database open ;
9.修改备库的参数文件initstd.ora,修改后内容如下:
*.BACKGROUND_DUMP_DEST=’/opt/oracrs/std/admin/bdump’
*.CONTROL_FILES=’/opt/oracrs/std/oradata/control01.ctl’
*.CORE_DUMP_DEST=’/opt/oracrs/std/admin/cdump’
*.DB_NAME=PROD
*.DB_UNIQUE_NAME=std
*.JOB_QUEUE_PROCESSES=20
*.large_pool_size=20971520
*.OPEN_CURSORS=500
*.COMPATIBLE=’10.0.0′
*.PGA_AGGREGATE_TARGET=50M
*.processes=1000
*.SGA_TARGET=300M
*.UNDO_MANAGEMENT=AUTO
*.UNDO_TABLESPACE=UNDOTBS1
*.USER_DUMP_DEST=’/opt/oracrs/std/admin/udump’
LOG_ARCHIVE_CONFIG=’DG_CONFIG=(tdb,std)’
LOG_ARCHIVE_DEST_1=’LOCATION=/opt/oracrs/std/admin/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std’
LOG_ARCHIVE_DEST_2=’SERVICE=tdb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=tdb’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
FAL_SERVER=tdb
FAL_CLIENT=std
DB_FILE_NAME_CONVERT=’/opt/oradata/PROD/oradata/’,’/opt/oracrs/std/oradata/’,’/opt/oradata/backup/’,’/opt/oracrs/std/oradata/’
LOG_FILE_NAME_CONVERT=’/opt/oradata/PROD/oradata/’,’/opt/oracrs/std/oradata/’,’/opt/oracrs/tdb/oradata/’,’/opt/oracrs/std/oradata/’
STANDBY_FILE_MANAGEMENT=AUTO

10.配置TNS和监听
TNS:
tdb=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=dga)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=tdb))
)

std=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=dga)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=std))
)

监听:
[oracle@dga admin]$ cat listener.ora
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=dga)(PORT=1521))
(ADDRESS=(PROTOCOL=ipc)(KEY=extproc)))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=PROD)
(SID_NAME=PROD)
(ORACLE_HOME=/opt/oracle/product/10.2/db_1)
)
(SID_DESC=
(GLOBAL_DBNAME=EMREP)
(SID_NAME=EMREP)
(ORACLE_HOME=/opt/oracle/product/10.2/db_1)
)
(SID_DESC=
(SID_NAME=PLSExtProc)
(PROGRAM=extproc)
(ORACLE_HOME=/opt/oracle/product/10.2/db_1)
)
(SID_DESC=
(GLOBAL_DBNAME=tdb)
(SID_NAME=tdb)
(ORACLE_HOME=/opt/oracle/product/10.2/db_1)
)
(SID_DESC=
(GLOBAL_DBNAME=std)
(SID_NAME=std)
(ORACLE_HOME=/opt/oracle/product/10.2/db_1)
)
)

 

11.启动备库到mount
export ORACLE_SID=std
sqlplus / as sysdba
std>startup mount pfile=’/opt/oracrs/std/admin/pfile/initstd.ora’
std>create spfile from pfile=’/opt/oracrs/std/admin/pfile/initstd.ora’ ;
std>startup force mount

12.应用日志恢复
std>alter database recover managed standby database disconncet from session ;

13.查看日志是否即时被恢复
主库:select sequence#,status from v$log ;
备库:select process,status,thread#,sequence# from v$managed_standby ;
SELECT ARCHIVED_THREAD#, ARCHIVED_SEQ#, APPLIED_THREAD#, APPLIED_SEQ# FROM V$ARCHIVE_DEST_STATUS;

12.主备切换
先操作主库
alter database commit to switchover to physical standby with session shutdown ;
shutdown immediate
startup mount

再操作备库
alter database commit to switchover to primary;
shutdown immediate
startup

13.再切换回来

 

 

 

 

 

 

DataGuard日常维护2

日常维护:

正确的开关机顺序是:

启动的时候,先备库的listener,再启动备库,再启动主库的listener,再启动主库。

关闭的时候,先关闭主库,再关闭备库。

–为主数据库或备用数据库添加/删除日志组

SQL>alterdatabaseaddstandbylogfilegroup5’/oracle/oradata/orcl/standbyredo05.log’size100M;
SQL>alterdatabasedropstandbylogfilegroup5;

–查询DataGuard当前处于哪种日志传输方式:

SQL>selectprocess,client_process,sequence#,statusfromv$managed_standby;

PROCESS列显示进程信息

CLIENT_PROCESS列显示对应的主数据库中的进程

SEQUENCE#列显示归档redo的序列号

STATUS列显示的进程状态

–查询standby库中所有已被应用的归档文件信息(不论该归档文件是否还存在)

SQL>selectfirst_time,first_change#,next_change#,sequence#fromv$log_history;

–最后一个被应用的log

SQL>SELECTTHREAD#,MAX(SEQUENCE#)AS”LAST_APPLIED_LOG”FROMV$LOG_HISTORYGROUPBYTHREAD#;

–在primary server上查询有哪些日志没有被传输到Standby

SQL>SELECTLOCAL.THREAD#,LOCAL.SEQUENCE#FROM(SELECTTHREAD#,SEQUENCE#FROMV$ARCHIVED_LOGWHEREDEST_ID=1)LOCALWHERELOCAL.SEQUENCE#NOTIN
(SELECTSEQUENCE#FROMV$ARCHIVED_LOGWHEREDEST_ID=2ANDTHREAD#=LOCAL.THREAD#);

–对于troubleshooting有用

SQL>SELECT MESSAGE FROMV $DATAGUARD_STATUS;
m.监控恢复操作的进程

SELECTARCHIVED_THREAD#,ARCHIVED_SEQ#,APPLIED_THREAD#,APPLIED_SEQ#FROMV$ARCHIVE_DEST_STATUS;

–从正在恢复状态只读打开;

SQL>Alter DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>Alter DATABASE OPEN READ ONLY;

–切换回到恢复状态;

SQL>Alter DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

切换角色

注意:Swithover时只能先从Primary切到Standby,再从Standby切到Primary.

1、在主库端

selectdatabase_role,switchover_statusfromv$database;

如果是to standby 表可以正常切换.

直接执行 ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

否则执行: ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

SQL>shutdownimmediate;
SQL>startupnomount;
SQL>alterdatabasemountstandbydatabase;
SQL>selectdatabase_rolefromv$database;
SQL>alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;

2、在备库端

selectdatabase_role,switchover_statusfromv$database;

如果是to_primary 表可以正常切换.

执行:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

否则执行: ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

shutdownimmediate;
startup;
然后观察主备库日志,如果正常的话会看到备库会自动应用日志.

failover测试

1. 备库上检查是否存在归档中断

SQL>SELECTTHREAD#,LOW_SEQUENCE#,HIGH_SEQUENCE#FROMV$ARCHIVE_GAP;

2. 在主库上执行语句并找出归档文件

SQL>SELECTNAMEFROMV$ARCHIVED_LOGWHERETHREAD#=1ANDDEST_ID=1ANDSEQUENCE#BETWEENXXANDXX;

–如果存在拷贝相应的归档到STANDBY数据库,并注册.

SQL>ALTERDATABASEREGISTERPHYSICALLOGFILE’xxx’;

***其他情况(primary数据库无法打开):

–检查归档文件是否完整

分别在primary/standby执行下列语句:

SQL>selectdistinctthread#,max(sequence#)over(partitionbythread#)afromv$archived_log;

把相差的归档复制到待转换的standby服务器

3. 启动failover

SQL>alterdatabaserecovermanagedstandbydatabasefinishforce;

FORCE关键字将会停止当前活动的RFS进程,以便立刻执行failover。

SQL>alterdatabaserecovermanagedstandbydatabasefinishskipstandbylogfile;

4. 切换物理standby角色为primary

SQL>alterdatabasecommittoswitchovertoprimary;
SQL>shutdownimmediate
SQL>startup

 

DataGuard 日常维护

DataGuard 日常维护
数据库采用Oracle 10g版本.Dataguard采用最大性能模式.

第一部分 日常维护

一 正确打开主库和备库
1 主库:
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

2 备库:
SQL> STARTUP MOUNT;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

 
二 正确关闭顺序
1 备库:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>SHUTDOWN IMMEDIATE;

2 主库
SQL>SHUTDOWN IMMEDIATE;

三 备库Read-Only模式打开
当前主库正常OPEN状态
备库处于日志传送状态.

1 在备库停止日志传送
SQL> recover managed standby database cancel;

2 备库Read-only模式打开
SQL> alter database open read only;

3 备库回到日志传送模式
SQL> recover managed standby database disconnect from session;
Media recovery complete.
SQL> select status from v$instance;

STATUS
————
MOUNTED

四 日志传送状态监控

1 主库察看当前日志状况
SQL> select sequence#,status from v$log;

SEQUENCE# STATUS
———- —————-
51 ACTIVE
52 CURRENT
50 INACTIVE

2 备库察看RFS(Remote File Service)接收日志情况和MRP应用日志同步主库情况
SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS
2 FROM V$MANAGED_STANDBY;

PROCESS STATUS THREAD# SEQUENCE# BLOCK# BLOCKS
——— ———— ———- ———- ———- ———-
ARCH CONNECTED 0 0 0 0
ARCH CONNECTED 0 0 0 0
RFS RECEIVING 0 0 0 0
MRP0 WAIT_FOR_LOG 1 52 0 0
RFS RECEIVING 0 0 0 0
可以看到备库MPR0正等待SEQUENCE#为52的redo.

3 察看备库是否和主库同步
SQL> SELECT ARCHIVED_THREAD#, ARCHIVED_SEQ#, APPLIED_THREAD#, APPLIED_SEQ#
2 FROM V$ARCHIVE_DEST_STATUS;

ARCHIVED_THREAD# ARCHIVED_SEQ# APPLIED_THREAD# APPLIED_SEQ#
—————- ————- ————— ————
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 51 1 50

可以看到备库已经将SEQUENCE#51的日志归档,已经将SEQUENCE#50的redo应用到备库.
由于已经将SEQUENCE#51的日志归档,所以SEQUENCE#51以前的数据不会丢失.

4 察看备库已经归档的redo
SQL> SELECT REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#,
2 NEXT_CHANGE# FROM V$ARCHIVED_LOG;

REGISTR CREATOR THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
——- ——- ———- ———- ————- ————
SRMN SRMN 1 37 572907 573346
RFS ARCH 1 38 573346 573538
RFS ARCH 1 39 573538 573623
RFS ARCH 1 40 573623 573627
RFS ARCH 1 41 573627 574326
RFS ARCH 1 42 574326 574480
RFS ARCH 1 43 574480 590971
RFS ARCH 1 44 590971 593948
RFS FGRD 1 45 593948 595131
RFS FGRD 1 46 595131 595471
FGRD FGRD 1 46 595131 595471

REGISTR CREATOR THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
——- ——- ———- ———- ————- ————
RFS ARCH 1 47 595471 595731
RFS ARCH 1 48 595731 601476
RFS ARCH 1 49 601476 601532
RFS ARCH 1 50 601532 606932
RFS ARCH 1 51 606932 607256
5 察看备库已经应用的redo
SQL> SELECT THREAD#, SEQUENCE#, FIRST_CHANGE#, NEXT_CHANGE#
2 FROM V$LOG_HISTORY;

THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
———- ———- ————- ————
1 1 366852 368222
1 2 368222 369590
1 3 369590 371071
1 4 371071 372388
1 5 372388 376781
1 6 376781 397744
1 7 397744 407738
1 8 407738 413035
1 9 413035 413037
1 10 413037 413039
1 11 413039 413098

THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
———- ———- ————- ————
1 12 413098 428161
1 13 428161 444373
1 14 444373 457815
1 15 457815 463016
1 16 463016 476931
1 17 476931 492919
1 18 492919 505086
1 19 505086 520683
1 20 520683 530241
1 21 530241 545619
1 22 545619 549203

THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
———- ———- ————- ————
1 23 549203 552403
1 24 552403 553230
1 25 553230 553398
1 26 553398 553695
1 27 553695 554327
1 28 554327 557569
1 29 557569 561279
1 30 561279 561385
1 31 561385 566069
1 32 566069 566825
1 33 566825 570683

THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
———- ———- ————- ————
1 34 570683 571627
1 35 571627 571867
1 36 571867 572907
1 37 572907 573346
1 38 573346 573538
1 39 573538 573623
1 40 573623 573627
1 41 573627 574326
1 42 574326 574480
1 43 574480 590971
1 44 590971 593948

THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
———- ———- ————- ————
1 45 593948 595131
1 46 595131 595471
1 47 595471 595731
1 48 595731 601476
1 49 601476 601532
1 50 601532 606932
1 51 606932 607256

可以看到备库已经将SEQUENCE#为51的归档文件应用到备库.

6 察看备库接收,应用redo数据过程.
SQL> SELECT MESSAGE FROM V$DATAGUARD_STATUS;

MESSAGE
——————————————————————————–
ARC0: Archival started
ARC0: Becoming the ‘no FAL’ ARCH
ARC0: Becoming the ‘no SRL’ ARCH
ARC1: Archival started
ARC1: Becoming the heartbeat ARCH
Redo Shipping Client Connected as PUBLIC
— Connected User is Valid
RFS[1]: Assigned to RFS process 19740
RFS[1]: Identified database type as ‘physical standby’
Primary database is in MAXIMUM PERFORMANCE mode
Attempt to start background Managed Standby Recovery process

MESSAGE
——————————————————————————–
MRP0: Background Managed Standby Recovery process started
Managed Standby Recovery not using Real Time Apply
Clearing online redo logfile 7 /oraguard/redo1/redo_7_1.log
Clearing online redo logfile 7 complete
Media Recovery Waiting for thread 1 sequence 47
RFS[1]: No standby redo logfiles created
Redo Shipping Client Connected as PUBLIC
— Connected User is Valid
RFS[2]: Assigned to RFS process 19746
RFS[2]: Identified database type as ‘physical standby’
Primary database is in MAXIMUM PERFORMANCE mode

MESSAGE
——————————————————————————–
Committing creation of archivelog ‘/arch/1_47_552308270.arc’
Media Recovery Log /arch/1_47_552308270.arc
Media Recovery Waiting for thread 1 sequence 48
MRP0: Background Media Recovery cancelled with status 16037
MRP0: Background Media Recovery process shutdown
Managed Standby Recovery Canceled
Attempt to start background Managed Standby Recovery process
MRP0: Background Managed Standby Recovery process started
Managed Standby Recovery not using Real Time Apply
Media Recovery Waiting for thread 1 sequence 48
RFS[1]: No standby redo logfiles created

MESSAGE
——————————————————————————–
Committing creation of archivelog ‘/arch/1_48_552308270.arc’
Media Recovery Log /arch/1_48_552308270.arc
Media Recovery Waiting for thread 1 sequence 49
RFS[1]: No standby redo logfiles created
Committing creation of archivelog ‘/arch/1_49_552308270.arc’
Media Recovery Log /arch/1_49_552308270.arc
Media Recovery Waiting for thread 1 sequence 50
RFS[1]: No standby redo logfiles created
Committing creation of archivelog ‘/arch/1_50_552308270.arc’
Media Recovery Log /arch/1_50_552308270.arc
Media Recovery Waiting for thread 1 sequence 51

MESSAGE
——————————————————————————–
RFS[1]: No standby redo logfiles created
Committing creation of archivelog ‘/arch/1_51_552308270.arc’
Media Recovery Log /arch/1_51_552308270.arc
Media Recovery Waiting for thread 1 sequence 52
可以看到RFS接收到sequence#为51的归档文件并存至备库归档目录/arch/1_51_552308270.arc.
Oracle自动应用文件/arch/1_51_552308270.arc进行备库与主库同步
Oracle继续等待主库sequence 52的归档文件

五 备库归档目录维护
1 找到备库归档目录
SQL> show parameter log_archive_dest_1

NAME TYPE
———————————— ——————————–
VALUE
——————————
log_archive_dest_1 string
LOCATION=/arch
VALID_FOR=(ALL_LOGFILES,ALL_RO
LES)
DB_UNIQUE_NAME=ora2
log_archive_dest_10 string

2 维护策略
每周2,4,7删除已经应用的归档文件
具体参见附录二
第二部分 主库正常切换

一 人工干预主库正常切换

1 在主库端检验数据库可切换状态
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
—————–
TO STANDBY
1 row selected

SWITCHOVER_STATUS:TO STANDBY表示可以正常切换.
如果SWITCHOVER_STATUS的值为SESSIONS ACTIVE,表示当前有会话处于ACTIVE状态

2 开始主库正常切换
如果SWITCHOVER_STATUS的值为TO STANDBY 则:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
如果SWITCHOVER_STATUS的值为SESSIONS ACTIVE 则:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
成功运行这个命令后,主库被修改为备库

3 重启先前的主库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;

4 在备库验证可切换状态
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
—————–
TO_PRIMARY
1 row selected

5 将目标备库转换为主库
如果SWITCHOVER_STATUS的值为TO STANDBY 则:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
如果SWITCHOVER_STATUS的值为SESSIONS ACTIVE 则:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
成功运行这个命令后,备库被修改为主库

6 重启目标备库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

7 先前主库启动日志传送进程
SQL> alter database recover managed standby database disconnect;

总结: 这样主库的一次正常切换完成.切换后的状态,原先的主库变为备库,原先的备库变为主库.
二 通过运行脚本实现主库正常切换

1 主库切换为备库
在主库上运行脚本
/admin/dataGuard/switchover/primary_to_standby.sh
2 备库切换为主库
在备库上运行脚本
/admin/dataGuard/switchover/standby_to_primary.sh

脚本1成功运行后,再运行脚本2,不能同时运行两个脚本.
经过这次切换后原来的主库变为备库,原先的备库变为主数据并且OPEN对应用提供服务.

3 复原最初状态
在原备库上运行脚本
/admin/dataGuard/switchover/primary_to_standby.sh
成功完成后
在原主库上运行脚本
/admin/dataGuard/switchover/standby_to_primary.sh

第三部分 主库灾难切换
一 人工干预主库灾难切换
二 通过运行脚本实现主库灾难切换

SQL>alter database recover managed standby database cancel;
SQL>shutdown immediate
SQL>startup mount
SQL>ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
SQL>alter database recover managed standby database finish;
— switch
SQL>alter database commit to switchover to primary with session shutdown;
— open
SQL>shutdown immediate
SQL>startup

附:
一 有选择察看redo传送与应用情况
select message from v$dataguard_status
where message_num>&message_num;

二 备库归档目录维护脚本
在crontab 中定制每日执行removeCommand.sh即可。
流程:每日11:50PM执行removeCommand.sh
假设今日2005-04-05 则删除04-04和04-03两日已应用归档日志.保留今日已应用归档日志

[oracle@db_gurid admin]$ crontab -l
50 23 * * * sh /oraguard/admin/removeCommand.sh>>removeArch.log
##################

[oracle@db_gurid admin]$ cat removeCommand.sh
#!/bin/sh
export ORACLE_BASE=/ora10g/app
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
export ORACLE_SID=ora2

cd /oraguard/admin
$ORACLE_HOME/bin/sqlplus /nolog<<EOF
conn / as sysdba
@/oraguard/admin/removeArch.sql
EOF

chmod +x /oraguard/admin/removeArch.sh
/oraguard/admin/removeArch.sh>>removeArch2.log
##################

[oracle@db_gurid admin]$ cat removeArch.sql
set feed off
set heading off
set echo off
spool removeArch.sh
select ‘rm ‘||name from v$archived_log where applied=’YES’ and completion_time>trunc(sysdate-3) and completion_time<trunc(sysdate);
spool off

 

Data guard的逻辑与物理备份方式

Data guard是ORACLE 推出的一种高可用性(HIGH AVAILABLE)的数据库方案,在8i之前称之为standby database,从9i开始,正式更名为Data guard,它是在主节点与备用节点间通过日志同步来保证数据的同步,可以实现高速切换与灾难性还原。Data guard只是在软件上对数据库执行 配置,并不须要额外购买任何组件能在对主数据库影响很小的情况下,实现主备数据库的同步,而主备机的数据差别只在在线日志部分,所以被不少企业作为了数据容灾方案。

ORACLE 从7.3推出standby database,7.3.x-8.0.x 须要手工拷贝所有归档日志并手工同步,从ORACLE815 开始,开始支撑多节点复制,并实现了自动同步,但是这种同步是数据异步模式的,可能惹起数据丢失。从ORACLE9i开始,备用服务器已经换了一种新的称呼,叫数据保卫 (DATA GUARD),在这种模式中,开始支撑三种不同的数据保卫模式,并开始采用LGWR 对数据的传送而不是以往的ARCH,而且添加了一个新的后台进程叫DMON 监控数据的同步,支撑多达9个节点的同时复制。从920开始,还开始支撑逻辑备用服务器。

本文通过笔者对公司北京地区制造业客户Data Guard的运用成长情况来阐述oracle这一新技能在制造业数据库运用中的推广普及以及从单纯的max performance的physical data guard的数据库容灾保卫到逻辑 Data Guard等新特性的增值运用。

说到这边咱们不得不基本的描述下制造业系统数据库的运用特性,制造业生产用数据库前端运用 通常以各类ERP,MES 及shop floor系统为多,目前咱们维护客户中以MES,shop floor为多,这类生产类的系统通常是24×7不间断运行,运用以OLTP为主且会定期月结时或实时的run大量的report,在高可用性方面会要求低downtime最好无法超过半小时,资料丢失通常最多容忍也就15分钟。

纵观前几年苏州地区制造业的Oracle数据库系统几乎都是单机运行的数据库,最多加上Cluster的双机热备,但是双机热备其实无法真实意思上保证到数据库系统的安全,该HA只是保证了server故障及维护时的数据库的高可用性,对oracle database来说没有任何保证。

这就是运用 os cluster或某些第三方的软件也实现了集群功能,如ClusterWizard双机集群容错软件、AFS/2000高可用备援系统等。这些系统通常通过RS232联机或内部网络联机做心跳线,检测主机状态,一旦发觉主机宕机,则接管主机的IP,并且重新启动运用程序,达到降低宕机时间的目的。

后来随着oracle HA技能的成长,standby技能的完备以及oracle database委外服务的盛行,专业顾问服务公司专业技能及理念的注入,让制造业在database容灾方面有了很大的改善,硬件成本的降低各家公司开始在HA 的机制上局部参加 physical data guard的容灾功能,此阶段的制造业生产系统的数据库均为cluster + physical Data guard架构这样既保证了主机维护高可用性又保证了DB损毁对生产造成的影响。另standby db还可以代替主库备份以分担备份所消耗的性能。
Data Guard运行要求:
1.主机必需运行在归档模式下。
2.主备数据库的版本必须一样,操作系统必须一样,版本可不同,主备机可运用不同的目录结构。
3.主备机必须都要运行在32位或64位下。
4.主库防止 nologing的方式,这样会导致备机无法 与主机同步。

Physical standby database
物理备用机在物理上和主据库的结构完全一样。也就是说,物理备机除了control 文件和主机不一样以及在线日志是可选的以外,其他都和主数据库一样。物理备机是靠运用 主机所产生的归档文件来实现主备的一致。归档日志从主数据库通过网络传到备库上,并在备机上运用 传过来的归档文件,以实现两台机的同步。
物理备用机有两种模式:
Managed recovery mode
归档文件从主数据传到备用数据库,log apply services把这些日志运用到备用数据库中。
Read only mode
这种模式可供用户只读的操作数据库,归档日志仍然会从主数据库传到备用数据库,但Log apply services不可以把这些日志运用到备用数据库中。

Logical standby database
除了physical data guard,9i R2又推出logical data guard, 逻辑备用机在逻辑上和主库一样,也就是说,两台服务器的表、视图等对像须要保持一致,对物理结构上则不须要保持一致。逻辑备用机是靠把主机传过来的归档日志通过logminer分析成SQL语句,并运用 到备用机上来执行 更新的,与物理备用机不同的是它可以在更新的同时对数据库执行查询,这个可以执行近实时(差别一个current redo)数据库查询的功能对制造业生产系统的run report运用 与其他运用 分开以减轻主库的负担有很大帮助。就目前来看各企业数据库的性能瓶颈均在月结或实时的report查询未与生产运用分开导致阶段性的performance较差,logical standby的这种近实时的run report的功能对性能改善有很大的帮助。
但是很大程度上,而logical的方式则是须要把所有的归档转换成SQL语句再在logical standby database上执行它。这会占用一定的系统资源,如CPU,memory,I/O等,另外一点就是9i的logical standby相对来说bug限定等较多,还有就是不是很稳定,所以很少有企业在生产系统中运用,但是9i R2后多个 patch针对logical DG修正了不少的bug,加上生产系统相对基本的,较少特殊运用的特性,故logical的近实时查询功还是有很好的可以用性,再加上专业的筹划,制度化的维护相对来说这种技能还是值得推广运用的。

值得高兴的是在咱们的精心准备及筹划下苏州地区某大型制造业终于成为第一个吃螃蟹的,在正式的生产系统中运用了logical standby,正是这种近实时查询功能弥补了运用上的不足,处理了原系统I/O严重的疑问,所有的report均至logical standby 端实时查询,在功能未受影响的同时,因为不同运用在2个DB内完成所以I/O大大降低,性能得到很大的改善。加上logical standby设计合理,维护上的规范目前该系统上线以来运行稳定。此项目的成功对苏州地区制造业对此项新技能的广泛运用有很大推动作用。

10g Data Guard
无论是8i的standby还是9i的Data Guard, Physical Standby Database只可以处于两种状态:mount和read-only,在处于mount状态时,可以手动或自动还原 archived logs,但是处于read-only模式时,无法还原 archived logs. logical standby database 也必须是从已收到的archived logs中分析出SQL语句还原 ,也就是说,即使无数据丢失,在standby数据库上,用户取得的数据时落后实纪生产数据库的旧的资料.是近实时的数据 (差一个current redo).10g的data guard, logical standby database也支撑了standby redo logs的物理结构,准许一个实时还原的进程与MRP或者LSP进程一起工作,直接将standby redo logs中刚刚收到的primary数据库的redo日志内容还原到物理或逻辑standby数据库上面,使得用户在standby数据库运行报告的信息是primary database的实时信息. 另外新增的实时还原功能也可使数据库的switchover或者failover流程的时间大大缩短,系统的高可用性能大大的提高.Flashback Database standby数据库就可以还原到一个指定的时间点,防止因为人为的错误带来的数据丢失,加上10G的Data Guard 图形维护功能进一步完备 ,维护起来会更简单 ,EM维护 ,可使Switchover/failover功能,单击鼠标就可以完成.
结尾总结下data guard的优点
1.支撑所有的DDL和DML语句
2.不管是什么数据类型、表的类型,任何DDL和DML语句都可以运用 在物理备用数据库上。
3.可以减轻主数据库的备份压力
4.standby的中的数据文件可以用来高速还原主数据库的数据文件
5.逻辑standby可以减轻主数据库的工作压力
6.物理standby也可以用只读来打开,可以分担一部分非实时的查询的工作
7.逻辑standby数据是近实时更新的,而且也可以让用户执行 查询操作
8.逻辑standby可以在standby中建立索引和物化视图以方便用户的查询

人们的观念中,容灾所谓的火灾,地震之类的灾难是乎是很遥远的.但911后,人们开始对首要的系统制定紧急的计划.自动化的data guard开始被广泛的运用起来.加上data guard功能的不断改良使得这项实用的技能能个逐渐被接受且广泛的运用 起来,从制造业集中的北京各大企业的data guard的运用 演变来说这种经济实用的技能正越来越得到制造业的青睐。

 

 

© 2020 Init dba

Theme by Anders NorenUp ↑