oracle 11g DataGaurd 完全解析实施手册

前天第一次现场实施,扑街。对DataGuard一知半解就敢上生产环境没出大事我也是命大。回来好好反思了一下。阅读官方文档了解了好多参数。网上好多DG教程都不讲参数,在这里详细码一遍。

第一步:网络互通

这个不用多讲了,主机之间通信必须会设置的。

第二步:备份主库

在生产环境中操作一定要谨慎,确保备份的完整性和可用性非常重要,这样一旦发生失误操作也可以使用rman还原。

RMAN> backup database plus archivelog;

查看备份信息:

RMAN> list backup of database;

List of Backup Sets
===================


BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
2       Full    1.14G      DISK        00:00:30     27-MAR-19      
        BP Key: 2   Status: AVAILABLE  Compressed: NO  Tag: TAG20190327T012737
        Piece Name: /u01/app/oracle/fast_recovery_area/EASSJ/backupset/2019_03_27/o1_mf_nnndf_TAG20190327T012737_g9pdzspr_.bkp
  List of Datafiles in backup set 2
  File LV Type Ckp SCN    Ckp Time  Name
  ---- -- ---- ---------- --------- ----
  1       Full 994759     27-MAR-19 /u01/app/oracle/oradata/eassj/system01.dbf
  2       Full 994759     27-MAR-19 /u01/app/oracle/oradata/eassj/sysaux01.dbf
  3       Full 994759     27-MAR-19 /u01/app/oracle/oradata/eassj/undotbs01.dbf
  4       Full 994759     27-MAR-19 /u01/app/oracle/oradata/eassj/users01.dbf
  5       Full 994759     27-MAR-19 /u01/app/oracle/oradata/eassj/example01.dbf

RMAN> 

第三步:创建静态监听
为什么需要静态监听呢?动态监听不行吗?在ocm考试的时候,老师要求必须掌握手动配置DataGuard。因为有传言说用GC搭建DG会失败。其实只要操作规范化是不会出现问题的。但没有GC手动命令行搭建也是很有必要的。百度了一下答案,原因是11g的体系中不支持未mount的数据库通过监听被其他数据库连接。但是也有蹊径,就是在服务名里加入(UR=A)这个选项。我上次搭建异构平台的dataguard这样是可以解决的。但在同平台版本下可以用rman连接成功,却会在执行过程中报错。所以老老实实的配置吧。

主库:eassj 192.168.220.22 主机名:c1

备库:eassj 192.168.220.24 主机名:c2

首先在主库上创建:
(有条件直接netmgr就完事了,因为格式的一点点不规范oracle有时候就不会识别)我是在别的库netmgr然后复制了listener.ora文件里的结构。

c1:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = eassj)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = eassj)
    )
  )

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

ADR_BASE_LISTENER = /u01/app/oracle

c2:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = eassj)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = eassj)
    )
  )

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

ADR_BASE_LISTENER = /u01/app/oracle

创完以后记得开启

第四步:创建服务名

c1:

EASSJ_C1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = c1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = eassj)
    )
  )

EASSJ_C2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = c2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = eassj)
    )
  )

c2:

EASSJ_C1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = c1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = eassj)
    )
  )

EASSJ_C2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = c2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = eassj)
    )
  )

第五步:传送密钥文件

c1:

[oracle@localhost ~]$ cd $ORACLE_HOME/dbs
[oracle@localhost dbs]$ ll
total 9540
-rw-rw----. 1 oracle oinstall    1544 Mar 27 01:17 hc_eassj.dat
-rw-r--r--. 1 oracle oinstall    2851 May 15  2009 init.ora
-rw-r-----. 1 oracle oinstall      24 Mar 27 01:15 lkEASSJ
-rw-r-----. 1 oracle oinstall    1536 Mar 27 01:17 orapweassj
-rw-r-----. 1 oracle oinstall 9748480 Mar 27 01:28 snapcf_eassj.f
-rw-r-----. 1 oracle oinstall    2560 Mar 27 01:18 spfileeassj.ora
[oracle@localhost dbs]$ scp -p orapweassj  c2:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/
The authenticity of host 'c2 (192.168.220.24)' can't be established.
RSA key fingerprint is 0d:da:6b:97:dc:73:76:60:29:6d:55:f6:fe:72:dc:b7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'c2,192.168.220.24' (RSA) to the list of known hosts.
oracle@c2's password: 
orapweassj                                    100% 1536     1.5KB/s   00:00    
[oracle@localhost dbs]$ 

c2:

[oracle@localhost ~]$ cd $ORACLE_HOME/dbs
[oracle@localhost dbs]$ ll
total 8
-rw-r--r--. 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-r-----. 1 oracle oinstall 1536 Mar 27 01:17 orapweassj
[oracle@localhost dbs]$ 

第六步:创建临时init初始化参数文件

[oracle@localhost dbs]$ vi initeassj.ora
[oracle@localhost dbs]$ cat initeassj.ora 
DB_NAME=eassj
[oracle@localhost dbs]$ 

第七步:创建辅助日志

关于辅助日志的理解可以参考这篇文章:理解standby redo log

非常重要的是,这一步创建的辅助日志数量应遵循以下两点:
1.个数遵循 nx+1(n为日志组数,x为节点数)

2文件大小遵循和主库日志大小一致。

在第二点上我曾吃过很深的教训。刚到公司第二天老大就让我搭建一个异构平台的DG。搭建是搭建出来了,但是却一直无法实现实时同步。在每次开启的时候都提示 "不兼容的介质” 由于问题提示不是显式的,找了很久答案,最后才发现是辅助日志的大小和主库日志大小不一致导致的。浪费时间!头疼。而且很多教学资源都未提到这一点。今天在看官方文档的时候发现在官方文档里是有的。所以以后还是要多啃官方文档。(坑爹,有日语都没汉语,英文看的头大)。

SQL> alter database add standby logfile group 7('/u01/app/oracle/oradata/eassj/sredo07.log') size 50m;

Database altered.

SQL> alter database add standby logfile group 8('/u01/app/oracle/oradata/eassj/sredo08.log') size 50m;

Database altered.

SQL>  alter database add standby logfile group 9('/u01/app/oracle/oradata/eassj/sredo09.log') size 50m;

Database altered.

SQL> alter database add standby logfile group 10('/u01/app/oracle/oradata/eassj/sredo10.log') size 50m;

Database altered.

SQL> select group#,thread#,sequence#,archived,status from v$standby_log;

    GROUP#    THREAD#  SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
	 7	    0	       0 YES UNASSIGNED
	 8	    0	       0 YES UNASSIGNED
	 9	    0	       0 YES UNASSIGNED
	10	    0	       0 YES UNASSIGNED

第八步:修改主库参数

注意有关shared_server、dispatcher的参数需要清空。local_listener参数如果存在,需要清除。

SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(eassj,eassj_st)';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=eassj_c2  lgwr SYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=eassj_st';
  • LOG_ARCHIVE_CONFIG

该参数定义了DG配置中可用的DB_UNIQUE_NAME参数值列表。与目标参数DB_UNIQUE_NAME的值结合使用时,DG以它们来实现两个数据库之间连接的安全性检查工作。只要不指定SEND和RECEIVE属性,这个参数就是动态的,这两个属性是旧参数REMOTE_ARCHIVE_ENABLE遗留下来的,已经不再需要,因此就不要再使用了。

在实际使用时,你只需要将其他数据库的唯一名称添加到配置就可以了,当前数据库的唯一名会根据场景自动添加;不过为了清晰期间,并且在所有的数据库中保持该参数的一致性,还是会将当前数据库的唯一名称明确的添加上去。对于名称的配置顺序没有要求,该参数在有RAC的环境中是必须要配置的,应该始终使用该参数。

在本例当中,我们主库的db_unique_name为eassj,准备创建的备库db_unique_name为eassj_st。

  • LOG_ARCHIVE_DEST_2

官方文档中的解释:

LOG_ARCHIVE_DEST_2 is valid only for the primary role. This destination transmits redo data to the remote physical standby destination boston.

可以看到,该参数只有当数据库角色为主库时才会有作用。在备库上也设置此参数的目的是为今后的故障切换做准备。此目标将重做数据传输到远程物理备用目标。需要注意的是:

  1. SERVICE=eassj_c2中的eassj_c2应是tnsnames文件中存在的、指向备库的服务名。

  2. SYNC\ASYNC 指定日志是同步传输还是异步传输。这个参数的设置参考的是备库的高可用模式。一般的,有:

  • 最大保护:同步
  • 最大性能:异步
  • 最高可用:能同步就不异步,不能同步时才会异步。

本例当中需要开启最大可用模式,所以这里设置为:SYNC

  1. VALID_FOR

VALID_FOR属性由2部分组成:archive_source(online_logfile,standby_logfile,all_logfiles)和database_role(primary_role,standby_role,all_role).
online_logfile: 表示归档联机重做日志
standby_logfile:表示归档备用数据库的重做日志/接受来自主库的重做日志
all_logfiles: online_logfile && standby_logfile

primary_role: 仅当数据库角色为主库时候生效
standby_role: 仅当数据库角色为备库时候生效
all_role: 任意角色均生效

*.log_archive_dest_1='location=/u01/app/oracle/archive_log'
*.log_archive_dest_2='service=DG lgwr async VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DG'

比如主备库都设置如上
主库就会使用位置1来进行归档(而且默认 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=主库的DB_UNIQUE_NAME),
使用位置2来进行归档(其实就是通过lgwr async传输到tns中别名为DG,DB_UNIQUE_NAME=DG的备库的/u01/app/oracle/archive_log)

备库只是被动的使用位置1来接受来自主库的归档日志,如alert中会出现的一句话Using STANDBY_ARCHIVE_DEST parameter default value as /u01/app/oracle/archive_log
位置2由于设置为PRIMARY_ROLE而自己是standby则不会生效

一旦发生切换
原来的主库的位置2就不起作用了,原来的备库的位置2就起作用了

如果主备都把位置2设置为ALL_LOGFILES,ALL_ROLES,备库还要给主库发归档日志,那就矛盾了。

  1. DB_UNIQUE_NAME

官方文档的解释:

Specify a unique name for each database. This name stays with the database and does not change, even if the primary and standby databases reverse roles.

为每个数据库指定唯一的名称。即使主数据库和备用数据库反向角色,此名称仍保留在数据库中,并且不会更改。

该参数的作用在于,假如创建了同db_name的主备库(如本例),db_unique_name能够帮助你识别实例。此参数不可重复,否则会报出:已存在此hash值 的错误。

c1:

SQL> alter database force logging;

关于这一步的说明参考文章:实验说明为什么DataGuard需要设置force logging

本文不再赘述。

设置参数后需要重启实例。

第九步:检查主库是否archive mode

SQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
Archive destination	       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     7
Next log sequence to archive   9
Current log sequence	       9

第十步:为备库创建相应的文件夹

[oracle@localhost oracle]$ mkdir -p /u01/app/oracle/oradata/eassj

[oracle@localhost oracle]$ mkdir -p /u01/app/oracle/admin/eassj/{a,dp}dump

[oracle@localhost oracle]$ mkdir -p /u01/app/oracle/fast_recovery_area

第十一步:备库启动到startup nomount状态

不启怎么rman连。

c2:

[oracle@localhost ~]$ . .bash_profile 
[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Mar 27 19:07:11 2019

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

Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area  229683200 bytes
Fixed Size		    2251936 bytes
Variable Size		  171967328 bytes
Database Buffers	   50331648 bytes
Redo Buffers		    5132288 bytes
SQL> 

第十二步:主库服务器连接到rman

[oracle@localhost ~]$ rman target sys/oracle@eassj_c1 auxiliary sys/oracle@eassj_c2

Recovery Manager: Release 11.2.0.4.0 - Production on Wed Mar 27 19:09:15 2019

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

connected to target database: EASSJ (DBID=3630113189)
connected to auxiliary database: EASSJ (not mounted)

第十三步:编辑脚本

RUN {
 ALLOCATE CHANNEL D1 TYPE DISK;
 ALLOCATE CHANNEL D2 TYPE DISK;
 ALLOCATE AUXILIARY CHANNEL AUX1 TYPE DISK;
 DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE nofilenamecheck
 SPFILE
 PARAMETER_VALUE_CONVERT 'eassj','eassj'
SET DB_RECOVERY_FILE_DEST='/u01/app/oracle/fast_recovery_area'
 SET DB_UNIQUE_NAME='eassj_st'
 SET
 CONTROL_FILES='/u01/app/oracle/oradata/eassj/control01.ctl'
 SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(eassj,eassj_st)'
 SET LOG_ARCHIVE_DEST_2='SERVICE=eassj_c1 lgwr SYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=eassj'
SET FAL_SERVER='eassj_c1'
 SET
 DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/eassj/','/u01/app/oracle/oradata/eassj'
 SET
 LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/eassj','/u01/app/oracle/oradata/eassj'
 SET STANDBY_FILE_MANAGEMENT='AUTO';
 }
 DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE nofilenamecheck

在这一行语句中,nofilenamecheck这个参数的作用是不检查文件名。
如果副本数据库与目标库不在同一台机器上,并且副本数据库的在线日志文件路径与目标库相同,则运行duplicate命令时必须指定NOFILENAMECHECK参数以避免冲突提示。晕了吧,异机操作路径相同还必需指定NOFILENAMECHECK。此处oracle表现的很傻,它不知道你要恢复的路径是在另一台机器上,它只是认为要恢复到的路径怎么跟目标数据库表现的一样呢?会不会是要覆盖目标数据库啊,为了避免这种情形,于是它就报错。所以一旦异机恢复,并且路径相同,那么你必须通过指定NOFILENAMECHECK来避免oracle的自动识别。

此处在官方文档中也有提及:

If you have a standby database on the same system as the primary database, you must use a different directory structure. Otherwise, the standby database attempts to overwrite the primary database files.

  • PARAMETER_VALUE_CONVERT
 PARAMETER_VALUE_CONVERT 'eassj','eassj'

参数转换。

  • DB_UNIQUE_NAME
SET DB_UNIQUE_NAME='eassj_st'

指定数据库唯一名,必须和主库名还有其他备库名不一致。

  • FAL_SERVER
SET FAL_SERVER='eassj_c1'

引用官方文档:

Specify the Oracle Net service name of the FAL server (typically this is the database running in the primary role). When the Chicago database is running in the standby role, it uses the Boston database as the FAL server from which to fetch (request) missing archived redo log files if Boston is unable to automatically send the missing log files. See Section 5.8.

FAL_SERVER FAL(Fetch Archive Log)功能相比9iR1时的DG已经有了很大的进步。它只用于物理备库,配置它能够使得物理备库在发现问题时,从DG配置中的一个数据库(主库或备库)中获取缺失的归档日志文件,有时我们又成它为被动间隔处理(reactive gap resolution),不过FAL技术在之前的三个版本中得到了极大的增强以至于现在几乎不需要再定义FAL参数了。伴随着9iR2版本引入的主动间隔处理(proactive gap resolution)技术的使用,几乎物理或逻辑备库上任何类型的间隔请求都可以由主库上的ping进程来处理了。

RMAN> RUN {
 ALLOCATE CHANNEL D1 TYPE DISK;
 ALLOCATE CHANNEL D2 TYPE DISK;
 ALLOCATE AUXILIARY CHANNEL AUX1 TYPE DISK;
 DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE nofilenamecheck
 SPFILE
 PARAMETER_VALUE_CONVERT 'eassj','eassj'
SET DB_RECOVERY_FILE_DEST='/u01/app/oracle/fast_recovery_area'
 SET DB_UNIQUE_NAME='eassj_st'
 SET
 CONTROL_FILES='/u01/app/oracle/oradata/eassj/control01.ctl'
 SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(eassj,eassj_st)'
 SET LOG_ARCHIVE_DEST_2='SERVICE=eassj_c1 lgwr SYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=eassj'
SET FAL_SERVER='eassj_c1'
 SET
 DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/eassj/','/u01/app/oracle/oradata/eassj'
 SET
 LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/eassj','/u01/app/oracle/oradata/eassj'
 SET STANDBY_FILE_MANAGEMENT='AUTO';
 }2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> 

using target database control file instead of recovery catalog
allocated channel: D1
channel D1: SID=24 device type=DISK

allocated channel: D2
channel D2: SID=18 device type=DISK

allocated channel: AUX1
channel AUX1: SID=10 device type=DISK

Starting Duplicate Db at 27-MAR-19

contents of Memory Script:
{
   backup as copy reuse
   targetfile  '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapweassj' auxiliary format 
 '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapweassj'   targetfile 
 '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfileeassj.ora' auxiliary format 
 '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfileeassj.ora'   ;
   sql clone "alter system set spfile= ''/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfileeassj.ora''";
}
executing Memory Script

Starting backup at 27-MAR-19
Finished backup at 27-MAR-19

sql statement: alter system set spfile= ''/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfileeassj.ora''

contents of Memory Script:
{
   sql clone "alter system set  audit_file_dest = 
 ''/u01/app/oracle/admin/eassj/adump'' comment=
 '''' scope=spfile";
   sql clone "alter system set  dispatchers = 
 ''(PROTOCOL=TCP) (SERVICE=eassjXDB)'' comment=
 '''' scope=spfile";
   sql clone "alter system set  db_recovery_file_dest = 
 ''/u01/app/oracle/fast_recovery_area'' comment=
 '''' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''eassj_st'' comment=
 '''' scope=spfile";
   sql clone "alter system set  CONTROL_FILES = 
 ''/u01/app/oracle/oradata/eassj/control01.ctl'' comment=
 '''' scope=spfile";
   sql clone "alter system set  LOG_ARCHIVE_CONFIG = 
 ''DG_CONFIG=(eassj,eassj_st)'' comment=
 '''' scope=spfile";
   sql clone "alter system set  LOG_ARCHIVE_DEST_2 = 
 ''SERVICE=eassj_c1 lgwr SYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=eassj'' comment=
 '''' scope=spfile";
   sql clone "alter system set  FAL_SERVER = 
 ''eassj_c1'' comment=
 '''' scope=spfile";
   sql clone "alter system set  db_file_name_convert = 
 ''/u01/app/oracle/oradata/eassj/'', ''/u01/app/oracle/oradata/eassj'' comment=
 '''' scope=spfile";
   sql clone "alter system set  LOG_FILE_NAME_CONVERT = 
 ''/u01/app/oracle/oradata/eassj'', ''/u01/app/oracle/oradata/eassj'' comment=
 '''' scope=spfile";
   sql clone "alter system set  STANDBY_FILE_MANAGEMENT = 
 ''AUTO'' comment=
 '''' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

sql statement: alter system set  audit_file_dest =  ''/u01/app/oracle/admin/eassj/adump'' comment= '''' scope=spfile

sql statement: alter system set  dispatchers =  ''(PROTOCOL=TCP) (SERVICE=eassjXDB)'' comment= '''' scope=spfile

sql statement: alter system set  db_recovery_file_dest =  ''/u01/app/oracle/fast_recovery_area'' comment= '''' scope=spfile

sql statement: alter system set  db_unique_name =  ''eassj_st'' comment= '''' scope=spfile

sql statement: alter system set  CONTROL_FILES =  ''/u01/app/oracle/oradata/eassj/control01.ctl'' comment= '''' scope=spfile

sql statement: alter system set  LOG_ARCHIVE_CONFIG =  ''DG_CONFIG=(eassj,eassj_st)'' comment= '''' scope=spfile

sql statement: alter system set  LOG_ARCHIVE_DEST_2 =  ''SERVICE=eassj_c1 lgwr SYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=eassj'' comment= '''' scope=spfile

sql statement: alter system set  FAL_SERVER =  ''eassj_c1'' comment= '''' scope=spfile

sql statement: alter system set  db_file_name_convert =  ''/u01/app/oracle/oradata/eassj/'', ''/u01/app/oracle/oradata/eassj'' comment= '''' scope=spfile

sql statement: alter system set  LOG_FILE_NAME_CONVERT =  ''/u01/app/oracle/oradata/eassj'', ''/u01/app/oracle/oradata/eassj'' comment= '''' scope=spfile

sql statement: alter system set  STANDBY_FILE_MANAGEMENT =  ''AUTO'' comment= '''' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    1169149952 bytes

Fixed Size                     2252624 bytes
Variable Size                738197680 bytes
Database Buffers             419430400 bytes
Redo Buffers                   9269248 bytes
allocated channel: AUX1
channel AUX1: SID=133 device type=DISK

contents of Memory Script:
{
   backup as copy current controlfile for standby auxiliary format  '/u01/app/oracle/oradata/eassj/control01.ctl';
}
executing Memory Script

Starting backup at 27-MAR-19
channel D1: starting datafile copy
copying standby control file
output file name=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_eassj.f tag=TAG20190327T234822 RECID=2 STAMP=1004053702
channel D1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 27-MAR-19

contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/u01/app/oracle/oradata/eassjtemp01.dbf";
   switch clone tempfile all;
   set newname for datafile  1 to 
 "/u01/app/oracle/oradata/eassjsystem01.dbf";
   set newname for datafile  2 to 
 "/u01/app/oracle/oradata/eassjsysaux01.dbf";
   set newname for datafile  3 to 
 "/u01/app/oracle/oradata/eassjundotbs01.dbf";
   set newname for datafile  4 to 
 "/u01/app/oracle/oradata/eassjusers01.dbf";
   set newname for datafile  5 to 
 "/u01/app/oracle/oradata/eassjexample01.dbf";
   backup as copy reuse
   datafile  1 auxiliary format 
 "/u01/app/oracle/oradata/eassjsystem01.dbf"   datafile 
 2 auxiliary format 
 "/u01/app/oracle/oradata/eassjsysaux01.dbf"   datafile 
 3 auxiliary format 
 "/u01/app/oracle/oradata/eassjundotbs01.dbf"   datafile 
 4 auxiliary format 
 "/u01/app/oracle/oradata/eassjusers01.dbf"   datafile 
 5 auxiliary format 
 "/u01/app/oracle/oradata/eassjexample01.dbf"   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/eassjtemp01.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 27-MAR-19
channel D1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/eassj/system01.dbf
channel D2: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/eassj/sysaux01.dbf
output file name=/u01/app/oracle/oradata/eassjsysaux01.dbf tag=TAG20190327T234831
channel D2: datafile copy complete, elapsed time: 00:02:26
channel D2: starting datafile copy
input datafile file number=00005 name=/u01/app/oracle/oradata/eassj/example01.dbf
output file name=/u01/app/oracle/oradata/eassjsystem01.dbf tag=TAG20190327T234831
channel D1: datafile copy complete, elapsed time: 00:03:31
channel D1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/eassj/undotbs01.dbf
output file name=/u01/app/oracle/oradata/eassjexample01.dbf tag=TAG20190327T234831
channel D2: datafile copy complete, elapsed time: 00:01:30
channel D2: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/eassj/users01.dbf
output file name=/u01/app/oracle/oradata/eassjusers01.dbf tag=TAG20190327T234831
channel D2: datafile copy complete, elapsed time: 00:00:03
output file name=/u01/app/oracle/oradata/eassjundotbs01.dbf tag=TAG20190327T234831
channel D1: datafile copy complete, elapsed time: 00:00:51
Finished backup at 27-MAR-19

sql statement: alter system archive log current

contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=2 STAMP=1004053973 file name=/u01/app/oracle/oradata/eassjsystem01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=3 STAMP=1004053973 file name=/u01/app/oracle/oradata/eassjsysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=4 STAMP=1004053973 file name=/u01/app/oracle/oradata/eassjundotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=5 STAMP=1004053973 file name=/u01/app/oracle/oradata/eassjusers01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=6 STAMP=1004053973 file name=/u01/app/oracle/oradata/eassjexample01.dbf
Finished Duplicate Db at 27-MAR-19
released channel: D1
released channel: D2
released channel: AUX1


执行完成。

第十四步:验证

c2:

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@localhost dbs]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu Mar 28 00:10:08 2019

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> show parameter name

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
cell_offloadgroup_name		     string
db_file_name_convert		     string	 /u01/app/oracle/oradata/eassj/
						 , /u01/app/oracle/oradata/eass
						 j
db_name 			     string	 eassj
db_unique_name			     string	 eassj_st
global_names			     boolean	 FALSE
instance_name			     string	 eassj
lock_name_space 		     string
log_file_name_convert		     string	 /u01/app/oracle/oradata/eassj,
						  /u01/app/oracle/oradata/eassj

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
processor_group_name		     string
service_names			     string	 eassj_st

SQL> alter database open;

Database altered.

SQL>  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;  

Database altered.

c1:

SQL> create table zmx (i int);

Table created.

c2:

SQL> desc zmx;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 I						    NUMBER(38)

可以看到不用切换日志,数据也是实时同步的。

c2:

NAME				 VALUE				DATUM_TIME
-------------------------------- ------------------------------ ------------------------------
transport lag			 +00 00:00:00			03/28/2019 00:29:04
apply lag			 +00 00:00:00			03/28/2019 00:29:04
apply finish time		 +00 00:00:00.000
estimated startup time		 10

延时为0,主备库已实现实时同步。

第十五步:数据库的主备切换

c1:

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PRIMARY	   MAXIMUM PERFORMANCE	TO STANDBY

c2:

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PHYSICAL STANDBY MAXIMUM PERFORMANCE	NOT ALLOWED

可以看到,主库的状态是可以转换为备库,而备库状态则是NOT ALLOWED,这是因为主库没有发起转换的请求。

c1:

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

Database altered.

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PHYSICAL STANDBY MAXIMUM PERFORMANCE	TO PRIMARY

c2:
这台机器需要mount,因为它即将转换为主库。

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount       
ORACLE instance started.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; 
//如果你没有开启应用日志模式,那你的状态将持续为NOT ALLOWED。
Database altered.

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PHYSICAL STANDBY MAXIMUM PERFORMANCE	TO PRIMARY

现在,两台主机都处于TO PRIMARY的状态,此时需要在c2上运行这条语句。

c2:

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

Database altered.

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PRIMARY	   MAXIMUM PERFORMANCE	NOT ALLOWED

c1:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

Database altered.

新的备库上开启应用日志模式。

c2:
开启数据库

SQL> alter database open;

Database altered.

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PRIMARY	   MAXIMUM PERFORMANCE	RESOLVABLE GAP

SQL> /

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PRIMARY	   MAXIMUM PERFORMANCE	SESSIONS ACTIVE

SQL> create table lay (i int);

Table created.

看到状态从RESOLVABLE GAP到SESSIONS ACTIVE,这说明切换已经完成。建表验证

c1:

SQL> desc lay
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 I						    NUMBER(38)
 
SQL> select name,value,datum_time from v$dataguard_stats;

NAME				 VALUE		      DATUM_TIME
-------------------------------- -------------------- ------------------------------
transport lag			 +00 00:00:00	      03/28/2019 01:00:56
apply lag			 +00 00:00:00	      03/28/2019 01:00:56
apply finish time		 +00 00:00:00.000
estimated startup time		 46

同步更新!

第十六步:切换至最大可用模式

c2:(现为主库)

SQL> alter database set standby database to maximize availability;

Database altered.

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PRIMARY	   MAXIMUM AVAILABILITY TO STANDBY

c1:

SQL> alter database set standby database to maximize availability;

Database altered.

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

NAME	  DATABASE_ROLE    PROTECTION_MODE	SWITCHOVER_STATUS
--------- ---------------- -------------------- --------------------
EASSJ	  PHYSICAL STANDBY MAXIMUM AVAILABILITY NOT ALLOWED
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第ⅰ部分 关键的数据库概念  第1章 oracle database 11g 体系结构  第2章 安装oracle database 11g 和创建数据库  第3章 升级到oracle database 11g  第4章 规划oracle 应用程序——方法、风险和标准 第ⅱ部分 sql 和sql*plus  第5章 sql 中的基本语法  第6章 基本的sql*plus 报表和命令  第7章 文本信息的收集与更改  第8章 正则表达式搜索  第9章 数值处理  第10章 日期:过去、现在及日期的差  第11章 转换函数与变换函数  第12章 分组函数  第13章 当一个查询依赖于另一个查询时  第14章 一些复杂的技术  第15章 更改数据:插入﹑更新﹑合并和删除  第16章 decode 和case:sql中的if-then-else  第17章 创建和管理表、视图、索引、群集和序列  第18章 分区 . 第19章 oracle 基本安全 第ⅲ部分 高 级 主 题  第20章 高级安全性——虚拟专用数据库  第21章 高级安全性:透明数据加密  第22章 使用表空间  第23章 用sql*loader 加载数据  第24章 使用data pump export 和data pump import  第25章 访问远程数据  第26章 使用物化视图  第27章 使用oracle text 进行文本搜索  第28章 使用外部表  第29章 使用闪回查询  第30章 闪回:表和数据库  第31章 sql 重放 第ⅳ部分 pl/sql  第32章 pl/sql 简介  第33章 应用程序在线升级  第34章 触发器  第35章 过程、函数与程序包  第36章 使用本地动态sql 和dbms_sql  第37章 pl/sql 调整 第ⅴ部分 对象关系数据库  第38章 实现对象类型、对象视图和方法  第39章 收集器(嵌套表和可变数组)  第40章 使用大对象  第41章 面向对象的高级概念 第ⅵ部分 oracle 中的java  第42章 java 简介  第43章 jdbc 程序设计  第44章 java 存储过程 第ⅶ部分 指 南  第45章 oracle 数据字典指南  第46章 应用程序和sql 调整指南  第47章 sql 结果缓存和客户端查询缓存  第48章 关于调整的示例分析  第49章 高级体系结构选项—— db保险库、内容db 和记录db  第50章 oracle 实时应用群集  第51章 数据库管理指南  第52章 oracle 中的xml 指南 第ⅷ部分 附 录 附录a 命令和术语参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值