DataGuard环境搭建 (一主一备一级联)


DG搭建(一主一备一级联)

         先说明一下dataguard一主一备一级联,意思是主库将日志传输给备库,然后备库在将日志传输给级联库,主库和级联库其实没有任何关系。另外,关于数据同步问题,后面也做了验证,主库上的操作一般情况下是可以实时同步到备库的,但是级联库必须等备库归档时,才能同步。如果主库切换日志,那么这时级联库也能及时同步。

 

 

节点

网络ip地址

数据库名

unique name

数据库实例名

数据文件位置

zyx.test.com(主库)

192.168.11.111

orcl

orcl

test

/u01/app/oracle/oradata/orcl/

orcl.test.com(备库)

192.168.11.22

orcl

orclps

orclps

/u01/app/oracle/oradata/orcl/

dg2.orcl.com(级联库)

192.168.11.23

orcl

orclstd

orclstd

/u01/app/oracle/oradata/orcl/

 

1.主库设置

1.1 开归档

sys@ORCL> shutdown immediate

sys@ORCL> startup mount

sys@ORCL> alter database archivelog;

sys@ORCL> alter database open;

sys@ORCL> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     4

Next log sequence to archive   6

Current log sequence           6

 

sys@ORCL> alter database force logging;

Database altered.

1.2 参数设置

sys@ORCL>alter system set log_archive_config='dg_config=(orcl,orclps)';

sys@ORCL>alter system set log_archive_dest_2='service=orclps sync affirm net_timeout=10 valid_for=(online_logfile,primary_role) db_unique_name=orclps';

 

#####下面参数是当主库切换为备库时需要的,这里先不设置

alter system set fal_server=orclps;

alter system set fal_client=orcl;

alter system set standby_file_management=auto;

 

sys@ORCL> create pfile='/home/oracle/pfile.ora' from spfile;           

1.3 配置TNS

[oracle@zyx ~]$ vim /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

ORCL =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.test.com)

    )

  )

 

ORCLPS =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ORCLPS)

    )

  )

 

2.备库orclps配置

----数据库软件安装好,数据库不用创建

2.1 环境变量

[oracle@orcl ~]$ vim .bash_profile

export ORACLE_SID=orclps

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export TNS_ADMIN=$ORACLE_HOME/network/admin

export ORACLE_UNQNAME=orclps

export ORACLE_HOSTNAME=orcl.test.com

export PATH=$PATH:$ORACLE_HOME/bin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

export NLS_LANG=american_america.ZHS16GBK

export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'

export EDITOR=vi

export LANG=C

umask 022

[oracle@orcl ~]$ . .bash_profile 

2.2 创建必要目录

mkdir -p $ORACLE_BASE/fast_recovery_area/orcl

mkdir -p $ORACLE_BASE/admin/orcl/adump

mkdir -p $ORACLE_BASE/admin/orcl/dpdump

mkdir -p $ORACLE_BASE/admin/orcl/pfile

mkdir -p $ORACLE_BASE/oradata/orcl

2.3 静态监听

[oracle@orcl ~]$ vim /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

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

    )

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

SID_LIST_listener=

  (SID_LIST=

    (SID_DESC=

      (GLOBAL_DBNAME=orclps)

      (SID_NAME=orclps)

   (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)))

 

[oracle@orcl ~]$ lsnrctl start

2.4 配置TNS

[oracle@orcl ~]$ vim /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

ORCL =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.test.com)

    )

  )

 

ORCLPS =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ORCLPS)

    )

  )

 

2.5 参数文件设置

[oracle@zyx ~]$ scp pfile.ora 192.168.11.22:/home/oracle

idle>ho vim /home/oracle/pfile.ora

----可以删除的参数,或修改为下面格式(该参数是指当前数据库为主库时,传输在线日志给orcl)

*.log_archive_dest_2='service=orcl sync affirm net_timeout=10 valid_for=(online_logfile,primary_role) db_unique_name=orcl'

 

----追加参数

*.db_unique_name='orclps'

*.fal_client='orclps'

*.fal_server='orcl'

*.standby_file_management=auto

 

 

----创建spfile,启动到nomount

idle>create spfile from pfile='/home/oracle/pfile.ora';

idle>startup nomount

2.6 密钥文件创建

[oracle@orcl ~]$ cd $ORACLE_HOME/dbs

[oracle@orcl dbs]$ orapwd file=orapworclps password=sys

3.duplicate到备库

3.1 登录测试

[oracle@dg2 ~]$ tnsping orclps

[oracle@dg2 ~]$ tnsping orcl

[oracle@dg2 ~]$ sqlplus sys/sys@orclps as sysdba

[oracle@dg2 dbs]$ sqlplus sys/sys@orcl as sysdba

 

3.2 duplicate复制数据库到orclps

[oracle@orcl ~]$ rman target sys/sys@orcl auxiliary sys/sys@orclps

Recovery Manager: Release 11.2.0.4.0 - Production on Mon Apr 25 18:30:21 2016

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

connected to target database: ORCL (DBID=1437652505)

connected to auxiliary database: ORCL (not mounted)

RMAN>

RMAN> duplicate target database for standby from active database dorecover nofilenamecheck;

--------如果复制数据库时,备库的路径和原库一致,就需要加nofilenamecheck,不然会报错

3.3 备库orclps配置

----查看当前状态

idle>select instance_name,status from v$instance;

INSTANCE_NAME    STATUS

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

orclps          MOUNTED

 

----如果需要手动启动备用数据库:

---- startup nomount

---- alter database mount standby database;

 

----创建srl日志(比主库redo多一组,大小一样

idle>alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl01.log' size 50m;

idle>alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl02.log' size 50m;

idle>alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl03.log' size 50m;

idle>alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl04.log' size 50m;

 

----应用日志,开启redoapply

idle> alter database recover managed standby database using current logfile disconnect;

---------取消日志应用 recover managed standby database cancel;

 

#       主库添加srl日志,转为备库时需要

#       alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl01.log' size 50m;

#       alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl02.log' size 50m;

#       alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl03.log' size 50m;

#       alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl04.log' size 50m;

4.查看主/备应用日志情况

4.1主库切换日志

sys@ORCL>alter system switch logfile;

4.2备库出现新归档

----备库orclps出现新的归档

idle>select sequence#, applied from v$archived_log;

 SEQUENCE# APPLIED

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

         7 YES

         8 YES

         9 IN-MEMORY

 

----备库orclps传输模式

idle> select protection_mode, protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

 

----主库上最大性能改为最大可用

sys@ORCL>alter database set standby database to maximize availability;

sys@ORCL>show parameter log_archive_dest_2

NAME                                 TYPE        VALUE

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

log_archive_dest_2                   string      service=orclps sync affirm net

                                                 _timeout=10 valid_for=(online_

                                                 logfile,primary_role) db_uniqu

                                                 e_name=orclps

sys@ORCL>select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

4.3主库上查看备库应用情况(可以把name字段也加上)

sys@ORCL>select sequence#, applied from v$archived_log;

 SEQUENCE# APPLIED

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

         6 NO

         7 NO

         8 NO

         8 YES

         9 YES

         9 NO

        10 YES

        10 NO

        11 YES

        11 NO

        12 YES

        12 NO

        13 YES

        13 NO

        14 NO

        14 NO

16 rows selected.

------上面applied应用:NO的代表本地归档,是不需要应用的,YES的代表备库传输后已经应用。orclps备库是从8号归档开始应用

 

4.4 查看备库数据文件存放位置

idle>select name from v$controlfile;

idle>select name from v$datafile;

idle>select name from v$tempfile;

idle>select group#,member,type from v$logfile;

  GROUP#         MEMBER              TYPE

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

3  /u01/app/oracle/fast_recovery_area/ORCLPS/onlinelog/o1_mf_3_ckvxlzto_.log  ONLINE

2  /u01/app/oracle/fast_recovery_area/ORCLPS/onlinelog/o1_mf_2_ckvxlydr_.log  ONLINE

1  /u01/app/oracle/fast_recovery_area/ORCLPS/onlinelog/o1_mf_1_ckvxlwvd_.log  ONLINE

4  /u01/app/oracle/oradata/orcl/srl01.log                                                                             STANDBY

5  /u01/app/oracle/oradata/orcl/srl02.log                                                                             STANDBY

6  /u01/app/oracle/oradata/orcl/srl03.log                                                                             STANDBY

7  /u01/app/oracle/oradata/orcl/srl04.log                                                                        STANDBY

7 rows selected.

 

------后续转为主库后,redo log可以自己调整一下,上面是duplicate主库到备库时,自动生成的redo log

 

5.级联配置之备库设置

5.1 备库开启ADG模式

------备库不是一定要开启ADG,备库在mount下也是可以的完成级联库搭建的

idle>alter database recover managed standby database cancel;

idle>alter database open;

sys@ORCL>alter database recover managed standby database using current logfile disconnect;

sys@ORCL>select sequence#, applied from v$archived_log;

 SEQUENCE# APPLIED

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

        12 YES

        13 YES

        14 YES

8 rows selected.

 

sys@ORCL>select database_role,switchover_status,db_unique_name  from v$database;

DATABASE_ROLE    SWITCHOVER_STATUS    DB_UNIQUE_NAME

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

PHYSICAL STANDBY NOT ALLOWED          orclps

5.2 备库参数设置

sys@ORCL>select log_mode,force_logging from v$database;

LOG_MODE     FOR

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

ARCHIVELOG   YES

 

sys@ORCL>alter system set log_archive_config='dg_config=(orcl,orclps,orclstd)';

sys@ORCL>alter system set log_archive_dest_3='service=orclstd sync affirm net_timeout=10 valid_for=(standby_logfile,standby_role) db_unique_name=orclstd';

 

--------- primary_role / standby_role/ all_roles    online_logfile/ standby_logfile/ all_logfiles

--------- 这几个参数的含义注意理解

 

sys@ORCL>create pfile='/home/oracle/orclstd.ora' from spfile;

 

5.3 备库TNS配置追加

[oracle@orcl ~]$ vim /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

ORCLSTD =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orclstd)

    )

  )

 

6.级联库orclstd配置

6.1 环境变量

[oracle@dg2 ~]$ vim .bash_profile

export ORACLE_SID=orclstd

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export TNS_ADMIN=$ORACLE_HOME/network/admin

export ORACLE_UNQNAME=orclstd

export ORACLE_HOSTNAME=dg2.orcl.com

export PATH=$PATH:$ORACLE_HOME/bin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

export NLS_LANG=american_america.ZHS16GBK

export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'

export EDITOR=vi

export LANG=C

umask 022

[oracle@orcl ~]$ . .bash_profile 

6.2 创建必要目录

mkdir -p $ORACLE_BASE/fast_recovery_area/orcl

mkdir -p $ORACLE_BASE/admin/orcl/adump

mkdir -p $ORACLE_BASE/admin/orcl/dpdump

mkdir -p $ORACLE_BASE/admin/orcl/pfile

mkdir -p $ORACLE_BASE/oradata/orcl

6.3 静态监听

[oracle@dg2 ~]$ vim /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

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

    )

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

SID_LIST_listener=

  (SID_LIST=

    (SID_DESC=

      (GLOBAL_DBNAME=orclstd)

      (SID_NAME=orclstd)

   (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)))

 

[oracle@dg2 ~]$ lsnrctl start

6.4 配置TNS

[oracle@dg2 ~]$ vim /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

ORCLPS =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ORCLPS)

    )

  )

 

ORCLSTD =

  (DESCRIPTION =

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

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orclstd)

    )

  )

 

6.5 参数文件设置

[oracle@orcl ~]$ scp orclstd.ora 192.168.11.23:/home/oracle/

----修改参数

SQL> !vim /home/oracle/orclstd.ora

*.db_name='orcl'

*.db_unique_name='orclstd'

*.fal_client='orclstd'

*.fal_server='orclps'

 

----暂时删除参数

*.log_archive_dest_3='service=orclstd sync affirm net_timeout=10 valid_for=(standby_logfile,standby_role) db_unique_name=orclstd'

 

 

----创建spfile,启动到nomount

idle>create spfile from pfile='/home/oracle/orclstd.ora';

idle>startup nomount

6.6 密钥文件创建

[oracle@dg2 ~]$cd $ORACLE_HOME/dbs

[oracle@dg2 dbs]$ orapwd file=orapworclstd password=sys

 

7.duplicate到级联库

7.1 登录测试

[oracle@dg2 ~]$ tnsping orclps

[oracle@dg2 ~]$ tnsping orclstd

[oracle@dg2 ~]$ sqlplus sys/sys@orclps as sysdba

[oracle@dg2 dbs]$ sqlplus sys/sys@orclstd as sysdba

 

7.2 duplicate复制数据库到orclstd

[oracle@orcl ~]$ rman target sys/sys@orclps auxiliary sys/sys@orclstd

Recovery Manager: Release 11.2.0.4.0 - Production on Mon Apr 25 19:37:45 2016

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

connected to target database: ORCL (DBID=1437652505)

connected to auxiliary database: ORCL (not mounted)

RMAN>

RMAN> duplicate target database for standby from active database dorecover nofilenamecheck;

--------如果复制数据库时,备库的路径和原库一致,就需要加nofilenamecheck,不然会报错

7.3 级联库orclstd调整srl日志

----查看当前状态

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS

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

orclstd          MOUNTED

 

----如果需要手动启动备用数据库:

---- startup nomount

---- alter database mount standby database;

 

----查看是否有srl日志

set linesize 200

set pagesize 999

col member for a80

select group#,type,member from v$logfile;

    GROUP# TYPE    MEMBER

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

 3  ONLINE  /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_3_cl7h802v_.log

 2  ONLINE  /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_2_cl7h7z1l_.log

 1  ONLINE  /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_1_cl7h7y17_.log

 4  STANDBY /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_4_cl7h8102_.log

 5  STANDBY /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_5_cl7h8291_.log

 6  STANDBY /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_6_cl7h83dn_.log

 7  STANDBY /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_7_cl7h84r2_.log

7 rows selected.

------redosrl日志,不用再添加,当然这些日志都可以自己再手动调整位置

------redo日志需要转为主库才能调整,现在先调整srl日志

SQL> alter database drop standby logfile group 4;

SQL> alter database drop standby logfile group 5;

SQL> alter database drop standby logfile group 6;

SQL> alter database drop standby logfile group 7;

 

SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl01.log' size 50m;

SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl02.log' size 50m;

SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl03.log' size 50m;

SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/srl04.log' size 50m;

 

 

SQL> select group#,type,member from v$logfile;

    GROUP#     TYPE    MEMBER

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

3      ONLINE  /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_3_cl7hf6kq_.log

2   ONLINE  /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_2_cl7hf4mo_.log

1   ONLINE  /u01/app/oracle/fast_recovery_area/ORCLSTD/onlinelog/o1_mf_1_cl7hf33q_.log

4 STANDBY /u01/app/oracle/oradata/orcl/srl01.log

5 STANDBY /u01/app/oracle/oradata/orcl/srl02.log

6 STANDBY /u01/app/oracle/oradata/orcl/srl03.log

7 STANDBY /u01/app/oracle/oradata/orcl/srl04.log

7 rows selected.

7.4开启级联库redoapply

SQL> alter database recover managed standby database using current logfile disconnect;

---------取消日志应用 recover managed standby database cancel;

 

8.查看备库/级联库应用日志情况

8.1 级联库日志应用情况

----主库切换日志

sys@ORCL>alter system switch logfile;

 

----级联库出现新日志

SQL> select sequence#, applied from v$archived_log;

 SEQUENCE# APPLIED

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

        15 IN-MEMORY

 

SQL> select protection_mode, protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

 

----备库orclps日志应用情况

sys@ORCL>select sequence#, applied from v$archived_log;

 SEQUENCE# APPLIED

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

        12 YES

        13 YES

        14 YES

        15 YES

        15 YES

10 rows selected.

 

8.2 主库上创建表,级联库查看

----先开启级联库ADG

SQL> alter database recover managed standby database cancel;

SQL> alter database open;

SQL> alter database recover managed standby database using current logfile disconnect;

 

----主库orcl上创建表,并插入数据

sys@ORCL>create table shall(shall int);

begin

for i in 1..100000 loop

insert into shall values(i);

end loop;

commit;

end;

/

PL/SQL procedure successfully completed.

 

----备库orclps能实时查询到数据

sys@ORCL>select count(*) from shall;

  COUNT(*)

----------

    100000

 

----级联库orclstd不能查询到数据

SQL> select count(*) from shall;

select count(*) from shall

                     *

ERROR at line 1:

ORA-00942: table or view does not exist

 

----主库orcl切换日志

sys@ORCL>alter system switch logfile;

----此时级联库orclstd可以查询到数据

SQL> select count(*) from shall;

  COUNT(*)

----------

         0

SQL> select count(*) from shall;

  COUNT(*)

----------

    100000

 

----------备库是实时数据,而级联库需要等备库归档后才能同步

 

 

请使用浏览器的分享功能分享到微信等