第十二章:DataGuard

点击数:1796发布日期:2020-04-19 15:11:02 来源:oracle实战与提高,清华大学出版社

第十二章:DataGuard

前言:

    DataGuard是Oracle数据库最常使用的容灾应急方式,它不像GoldenGate那样还需要单独的购买软件许可,10g DataGuard已包含在数据库企业版当中,不需要再购买license11g active DataGuard,目标端可以查询。

    如果说RAC的主要作用是防止主机故障,防止主机损坏;那么DataGuard的主要作用就是防止存储损坏。它可以轻易的实时的将数据库复制到另外一个地方,可以同机房,如果网络带宽允许,也可以同城或者异地复制。

    如果主库发生故障,备库可以实现快速的接管,接管的过程可以实现分钟级的接管,甚至更短的时间便可以实现接管主库。

     DataGuard可以实现一对多,一个主库,多个备库,最多可以9个备库,一般情况下,有一个或两个备库也就够用了。也可以级联容灾,从AB,然后再从BC。配置方式灵活。


DataGuard配置分类

    主库primary,即生产库,单机或多节点RAC都可以。

    备库standby,即容灾库,单机或多节点都可以,但接收应用日志的节点只有一个。

    逻辑standby,将日志解析成SQL语句,然后在备库上执行这些SQL语句。逻辑standby有些数据类型不支持,如bfile encrypted columnsrowid, urowidXMLType、对象类型、varrays、嵌套表、自定义类型;还有的DML语句不被支持或存储类型不被支持。优势就是在9i,10g的时候,可以将数据库打开,做为查询库来使用。11g,物理standby也可以打开查询了,所以逻辑standby到了11g,竞争力就小了。

     物理standby,将接收的归档日志恢复到备库上,备库和生产库完全一样,是主库的物理恢复,和RMAN备份恢复实质一样。是我们最常用的容灾模式。本书主要讨论物理standby.

    DataGuard三种保护模式:

    1、 最大保护模式maximum protection

    所有事务提交前不仅被写到本地的online redo log中,同时还要提交到standbyredo log中,并确认其中一个standby可用,最后才会在primary上提交。

    此种保护模式,因为备库的故障会影响主库的生产运营,所以几乎没人使用。

   

2、 最高性能maximum performance

事务可以随时提交,当前primaryredo也要至少写入一个standby数据库,但它可以是不同步的。这是默认的保护模式。

3、 最高可用性maximum availability

要求所有事务在提交前必须保障redo数据至少在一个standby数据库可用,不过与之不同的是,如果出现故障导入无法同时写入standby数据库redo logprimary数据库并不会shutdown,而是自动转为最高性能模式,等standby数据库恢复正常之后,它又会再自动转换成最高可用性模式


SQL> select database_role,protection_mode,protection_level from v$database;


DATABASE_ROLE                                    PROTECTION_MODE

------------------------------------------------ ------------------------------------------------------------

PROTECTION_LEVEL

------------------------------------------------------------

PRIMARY                                          MAXIMUM PERFORMANCE

MAXIMUM PERFORMANCE




12.1配置一个最常用的物理DataGuard

    在我们的样例里面,主库的名字叫:yingshudb1,备库的唯一名叫:yingshudg1

12.1.1将主库改为归档模式

[root@yingshu /]# su - oracle

[oracle@yingshu ~]$ ss


SQL*Plus: Release 11.2.0.4.0 Production on Wed Jan 14 08:59:08 2015


Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL>

SQL> alter system set log_archive_dest_1='location=/arch1' scope=spfile;


System altered.


SQL>

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.


Total System Global Area  810106880 bytes

Fixed Size                  2257472 bytes

Variable Size             381685184 bytes

Database Buffers          419430400 bytes

Redo Buffers                6733824 bytes

Database mounted.

SQL> alter database archivelog;


Database altered.


SQL> alter database open;


Database altered.


SQL> alter system archive log current;


System altered.


SQL>

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /arch1

Oldest online log sequence     15

Next log sequence to archive   17

Current log sequence           17

注释:[oracle@yingshu ~]$ ss

我们在环境变量里设置了别名。以后就省去了每次再去敲sqlplus "/as sysdba".

[oracle@yingshu ~]$ pwd

/home/oracle

[oracle@yingshu ~]$ cat .bash_profile

... ...

export ORACLE_BASE=/u01/app/oracle/

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

export ORACLE_SID=yingshudb1

alias ss="sqlplus '/as sysdba'"

经过上面的步聚,我们的归档模式就设置好了。


12.1.2将主库改为强制归档

SQL> alter database force logging;


Database altered.


SQL>

SQL> select force_logging from v$database;


FORCE_LOG

---------

YES


12.1.3配置主库的tnsnames.ora

[oracle@yingshu admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.


YINGSDG1 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.20)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = yingsdg1)

    )

  )


YINGSDB1 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = yingsdb1)

    )

  )



可以用netca配置,也可以手工把连接选项写进tnsnames.ora,我们要用YINGSDG1这个别名连接到远程数据库,将日志写到备库。

使用tnsping看看通不通。以下结果显示,我们的链路是通的。

[oracle@yingshu admin]$ tnsping yingsdg1


TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 14-JAN-2015 11:45:16


Copyright (c) 1997, 2013, Oracle.  All rights reserved.


Used parameter files:

/u01/app/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora



Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.20)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = yingsdg1)))

OK (40 msec)


12.1.4配置主库的参数。


SQL> alter system set log_archive_config='dg_config=(yingsdb1,yingsdg1)' scope=both sid='*';


System altered.


SQL>

SQL> alter system set log_archive_dest_2='service=yingsdg1 lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=yingsdg1' scope=both sid='*';


System altered.


SQL> alter system set standby_file_management=auto scope=both sid='*';

System altered.


SQL> alter system set fal_server='yingsdg1' scope=both sid='*';

System altered.


SQL> alter system set fal_client='yingsdb1' scope=both sid='*';

System altered.


SQL> select * from v$dataguard_config;

DB_UNIQUE_NAME

--------------------------------------------------------------------------------

yingsdb1

yingsdg1


SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/yingsdb1','/u01/app/oracle/oradata/yingsdb1' scope=spfile sid='*';


System altered.


SQL>

SQL> alter system set log_file_name_convert='/u01/app/oracle/oradata/yingsdb1','/u01/app/oracle/oradata/yingsdb1' scope=spfile sid='*';


System altered.



1log_archive_dest_2='service=yingsdg1 lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=yingsdg1' scope=both sid='*';

     这个参数非常重要,它是我们DataGuard实现最重要的参数。

     service表示写到远程,如果是location一定是写到本地,如果是service一定是写到远程。

      yingsdg1是连接字符串的别名,tnsnames.ora里面配置的别名,可以用tnsping测试是否通讯正常。

     lgwr表示用什么写到远程,一般来说,推荐用Log Writer Process(LGWR)来写远程,当然也可以用archiver processes (ARCn)写到远程。也就是可以把lgwr改成arch。

     sync,是否同步写。如果改成async就是非同步写。非同步写可以降低对主库的性能的影响,

     affirm 等待归档日志文件和standby日志文件同步完成之后,主库log write才能继续。noaffirm主库的写进程,不等归档和备库日志写完便继续写主库日志。默认是noaffirm

    valid_for=(online_logfiles,primary_role)。括号中,逗号前面是“写什么”,逗号后面是“在什么角色的时候写”。我们这里显示的就是,当此数据库为主库的时候,写在线日志文件。

    db_unique_name=yingsdg1 这里要用数据库唯一名,区别主备库,因为物理standby主库和备库的数据库名是一样的,需要用数据库唯一名区别主备库。


2:db_file_name_convert参数,成对出现,只在此数据库为备库时起作用,逗号前面表示主库的数据文件所在的位置;逗号后面表示,传到备库之后,数据文件所放的位置。由此参数可以改变数据文件的位置。


12.1.5备份主库、备份控制文件。

     注:如果CPU和存储允许,为加快备份速度,一定要多分几个通道。

[oracle@yingshu orabak]$ rman target /


Recovery Manager: Release 11.2.0.4.0 - Production on Mon Jan 19 10:06:15 2015


Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.


connected to target database: YINGSDB1 (DBID=4200332588)


RMAN> run {

2> allocate channel c1 type disk;

3> allocate channel c2 type disk;

4> allocate channel c3 type disk;

5> backup database

6> include current controlfile format '/orabak/orclfull_%d_%T_%s';

7> }


using target database control file instead of recovery catalog

allocated channel: c1

channel c1: SID=1157 device type=DISK


allocated channel: c2

channel c2: SID=24 device type=DISK


allocated channel: c3

channel c3: SID=1159 device type=DISK


Starting backup at 19-JAN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

... ...

piece handle=/orabak/orclfull_YINGSDB1_20150119_8 tag=TAG20150119T100656 comment=NONE

channel c2: backup set complete, elapsed time: 00:00:15

Finished backup at 19-JAN-15

released channel: c1

released channel: c2

released channel: c3



备份控制文件:

    控制文件一定是在全备之后备份,因为它里面要包含我们全备份时的信息。

RMAN> run {

2> allocate channel c1 type disk;

3> backup current controlfile for standby format '/orabak/control01.ctl.rman';

4> }



allocated channel: c1

channel c1: SID=1157 device type=DISK


Starting backup at 19-JAN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

including standby control file in backup set

channel c1: starting piece 1 at 19-JAN-15

channel c1: finished piece 1 at 19-JAN-15

piece handle=/orabak/control01.ctl.rman tag=TAG20150119T100832 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

Finished backup at 19-JAN-15

released channel: c1


RMAN>



12.1.6将我们刚才的数据库全备份;备份的控制文件;参数文件;密码文件拷贝至备库。


[oracle@yingshu orabak]$ scp * oracle@192.168.1.20:/orabak/

Warning: Permanently added '192.168.1.20' (RSA) to the list of known hosts.

oracle@192.168.1.20's password:

control01.ctl.rman                                                                                ... ...

[oracle@yingshu orabak]$




--建立对应的几个文件夹。使用oracle用户建立此文件夹

mkdir -p /u01/app/oracle/diag/rdbms/yingsdg1/yingsdg1/trace

mkdir -p /u01/app/oracle/diag/rdbms/yingsdg1/yingsdg1/cdump

mkdir -p /u01/app/oracle/oradata/yingsdb1

mkdir -p /u01/app/oracle/admin/yingsdg1/adump

mkdir -p /arch1


启动备库的listener

[oracle@yingshudg ~]$ lsnrctl

LSNRCTL> start

LSNRCTL> stat

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=yingshudg)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production

Start Date                19-JAN-2015 11:19:04

Uptime                    0 days 0 hr. 0 min. 6 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

Listener Log File         /u01/app/oracle/diag/tnslsnr/yingshudg/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=yingshudg)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "yingsdb1" has 1 instance(s).

  Instance "yingsdg1", status READY, has 1 handler(s) for this service...

The command completed successfully




修改备库的pfile

[oracle@yingshudg dbs]$ cat inityingsdg1.ora

yingsdb1.__oracle_base='/u01/app/oracle/'#ORACLE_BASE set from environment

*.audit_file_dest='/u01/app/oracle/admin/yingsdg1/adump'

*.audit_trail='db'

*.compatible='11.2.0.4.0'

*.control_files='/u01/app/oracle/oradata/yingsdb1/control01.ctl','/u01/app/oracle/oradata/yingsdb1/control02.ctl'

*.db_block_size=8192

*.db_cache_size=419430400

*.db_domain=''

*.db_file_name_convert='/u01/app/oracle/oradata/yingsdb1','/u01/app/oracle/oradata/yingsdb1'

*.db_name='yingsdb1'

*.diagnostic_dest='/u01/app/oracle'

*.fal_client='yingsdb1'

*.fal_server='yingsdg1'

*.java_pool_size=20971520

*.large_pool_size=52428800

*.log_archive_dest_1='location=/arch1'

*.log_file_name_convert='/u01/app/oracle/oradata/yingsdb1','/u01/app/oracle/oradata/yingsdb1'

*.open_cursors=300

*.pga_aggregate_target=268435456

*.processes=1500

*.remote_login_passwordfile='EXCLUSIVE'

*.shared_pool_size=304087040

*.standby_file_management='AUTO'

*.undo_tablespace='UNDOTBS1'

########################

*.fal_server='yingsdb1'

*.fal_client='yingsdg1'

*.log_archive_dest_2='service=yingsdb1 LGWR SYNC AFFIRM valid_for=(online_logfiles,primary_role) db_unique_name=yingsdb1'

*.log_archive_config='dg_config=(yingsdg1,yingsdb1)'

*.db_unique_name='yingsdg1'

*.service_names='yingsdg1'

1####号以下部分,为配置dg重要参数,在备库的pfile中添加或修改正确。

2:其中*.fal_server='yingsdb1'配置的是对方的别名。

*.fal_client='yingsdg1'中配置的是本机的别名。

这里配置的是数据库别名,也就是tnsnames.ora里面的连接字符串的别名。

3:初始化参数LOG_ARCHIVE_CONFIG用于控制发送归档日志到远程位置、接收远程归档日志。*.log_archive_config='dg_config=(yingsdg1,yingsdb1)'。这里配置的是数据库唯一名。

4*.db_unique_name='yingsdg1'这里的数据库唯一名是用来和主库做区分的。和主库一定不能一样。

5*.db_name='yingsdb1'备库的数据库名和主库的数据库名必须一样。


SQL> startup nomount ;

ORACLE instance started.


Total System Global Area  810106880 bytes

Fixed Size                  2257472 bytes

Variable Size             381685184 bytes

Database Buffers          419430400 bytes

Redo Buffers                6733824 bytes



恢复控制文件。

RMAN> restore controlfile  from '/orabak/control01.ctl.rman';

Starting restore at 19-JAN-15

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=10 device type=DISK

channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

output file name=/u01/app/oracle/oradata/yingsdb1/control01.ctl

output file name=/u01/app/oracle/oradata/yingsdb1/control02.ctl

Finished restore at 19-JAN-15



恢复备库。

RMAN> alter database mount; 


database mounted

RMAN> run {

2> allocate channel c1 type disk;

3> allocate channel c2 type disk;

4> allocate channel c3 type disk;

5> restore database;

6> }


allocated channel: c1

channel c1: SID=13 device type=DISK


allocated channel: c2

channel c2: SID=1146 device type=DISK


allocated channel: c3

channel c3: SID=14 device type=DISK


Starting restore at 19-JAN-15


channel c1: starting datafile backup set restore

channel c1: specifying datafile(s) to restore from backup set

channel c1: restoring datafile 00002 to /u01/app/oracle/oradata/yingsdb1/sysaux01.dbf

channel c1: restoring datafile 00004 to /u01/app/oracle/oradata/yingsdb1/users01.dbf

channel c1: reading from backup piece /orabak/orclfull_YINGSDB1_20150119_6

channel c2: starting datafile backup set restore

channel c2: specifying datafile(s) to restore from backup set

channel c2: restoring datafile 00001 to /u01/app/oracle/oradata/yingsdb1/system01.dbf

channel c2: restoring datafile 00003 to /u01/app/oracle/oradata/yingsdb1/undotbs01.dbf

channel c2: reading from backup piece /orabak/orclfull_YINGSDB1_20150119_5


channel c1: piece handle=/orabak/orclfull_YINGSDB1_20150119_6 tag=TAG20150119T100656

channel c1: restored backup piece 1

channel c1: restore complete, elapsed time: 00:00:58

channel c2: piece handle=/orabak/orclfull_YINGSDB1_20150119_5 tag=TAG20150119T100656

channel c2: restored backup piece 1

channel c2: restore complete, elapsed time: 00:01:29

Finished restore at 19-JAN-15

released channel: c1

released channel: c2

released channel: c3




启动数据库

startup;

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


Database altered.


验证DataGuard两边是否同步。

SQL> select max(sequence#) from v$archived_log;


MAX(SEQUENCE#)

--------------

            16


select max(sequence#) from v$log;


select max(sequence#) from v$log_history group by thread#;





DataGuard相关的几个重要视图。


select process,status,sequence# from v$managed_standby;

select sequence#,dest_id,archived,applied,deleted,status from v$archived_log order by sequence#
















12.2、主备切换switch over

12.2.1准备工作

首先查询主库状态,确认可以做切换:

SQL> select switchover_status from v$database;


     SWITCHOVER_STATUS

     ------------------

     TO STANDBY

12.2.2在备库上面确认所有的archive log 都已经apply:

select sequence#,first_time,next_time,applied from v$archived_log;


12.2.3在主库上switch  logfile:

Alter system switch logfile;或

alter system archive log current;

(4)观察备库上已经 apply所有archive log:

select sequence#,first_time,next_time,applied from v$archived_log;

SEQUENCE# FIRST_TIME      NEXT_TIME       APPLIED

---------- --------------- --------------- ---------------------------

       160 28-FEB-15       28-FEB-15       YES

       161 28-FEB-15       28-FEB-15       YES

       162 28-FEB-15       28-FEB-15       YES

       163 28-FEB-15       28-FEB-15       YES

--切换:

(1)将主库转变为可切换状态primary主库上执行:

alter database commit to switchover to physical standby with session shutdown;

(2)standby备库

 alter database commit to switchover to primary;

(3)primary主库

 shutdown immediate;

 (5)standby备库。

recover managed standby database cancel

shutdown immediate;

startup


(7)原来主库,新备库。

startup;

alter database recover managed standby database disconnect;


(8)新的primary

startup;

alter system switch logfile;多执行几次。


查看archive log是否自动传输

(9)原来的primary 新的standby

select sequence#,first_time,next_time,applied from v$archived_log;

select max(sequence#) from v$log;



12.3、FAILEOVER切换实验

   生产库一旦发生故障,我们可能就需要应急切换。或我们平时在日常演练中,也需要进行切换实验,一备紧急时刻,我们的datagurad是完全可用的。下面我们就模拟生产库忽然损坏,而且不可恢复,由我们备库应急立刻顶住。整个切换过程也就几分种的时间,把损失降到最低,把停机时间影响降到最低。

    在模拟生产down机之前,我们先看看两边日志的同步情况。

    确认两边都是215

SQL> select max(sequence#) from v$log_history group by thread#;


MAX(SEQUENCE#)

--------------

           215

  

停止standby数据库。

connect / as sysdba

SQL> alter database recover managed standby database finish;

Database altered.

standby数据库强制切换成主库。

SQL> alter database commit to switchover to primary;

Database altered.

关闭standby数据库。

SQL> shutdown immediate

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

启动切换后的数据库。

SQL> startup

ORACLE instance started.


Total System Global Area  810106880 bytes

Fixed Size                  2257472 bytes

Variable Size             381685184 bytes

Database Buffers          419430400 bytes

Redo Buffers                6733824 bytes

Database mounted.

Database opened.

这时,我们的应急库,就变成主库了。可以上生产了。


我们原来的主库,修好之后,可以得新配置成DataGuard备库。配置的过程参见DataGuard配置。



图文推荐