三、 管理影响standby的primary数据库事件

  为预防可能的错误,你必须知道primary数据库的某些事件可能影响standby数据库,并且了解如何处理。

  某些情况下,primary数据库的某些改动会自动通过redo数据传播到standby数据库,因此不需要在standby数据库做额外的操作,而某些情况,则需要你手工调整。

  下列事件会由redo传输服务及redo应用自动处理,不需要dba的干预,分别是:

  • ALTER DATABASE ENABLE|DISABLE THREAD  语句(主要针对rac环境,目前基本已废弃,因为ENABLE|DISABLE INSTANCE子句完全能够实现类似功能)
  • 修改表空间状态(例如read-write到read-only,online到offline)
  • 创建修改删除表空间或数据文件(如果初始化参数STANDBY_FILE_MANAGEMENT被设置为AUTO的话,这点在前面第一章的时候提到过)

  下列事情则需要dba手工干预:

  1、 添加修改删除数据文件或表空间

前面提到了,初始化参数STANDBY_FILE_MANAGEMENT可以控制是否自动将primary数据库增加删除表空间、数据文件的改动继承到standby。

  • 如果该参数值设置为auto,则自动创建。
  • 如果设置为manual,则需要手工复制新创建的数据文件到standby服务器。

不过需要注意一点,如果数据文件是从其它数据库复制而来(比如通过tts),则不管STANDBY_FILE_MANAGEMENT参数值如何设置,都必须同时复制到standby数据库,并注意要修改standby数据库的控制文件。

下面分别通过示例演示STANDBY_FILE_MANAGEMENT参数值为AUTO/MANUAL值时增加及删除数据文件时的情形:

1) .STANDBY_FILE_MANAGEMENT 设置为AUTO,增加及删除表空间和数据文件

我们先来看看初始化参数的设置:  ----standby数据库操作

    SQL> show parameter standby_file

    NAME                                 TYPE        VALUE

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

    standby_file_management              string      AUTO

A) . 增加新的表空间    --primary数据库操作

    SQL> create tablespace mytmp datafile ¨e:\ora10g\oradata\jssweb\mytmp01.dbf¨ size 20m;

    表空间已创建。

  检查刚添加的数据文件

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSWEB\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSWEB\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSWEB\USERS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\WEBTBS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\MYTMP01.DBF

    已选择6行。

  切换日志

    SQL> alter system switch logfile;

    系统已更改。

B) . 验证standby库    --standby数据库操作

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSPDG\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSPDG\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSPDG\USERS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\WEBTBS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\MYTMP01.DBF

    已选择6行。

    SQL> select name from v$tablespace;

    NAME

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

    SYSTEM

    UNDOTBS1

    SYSAUX

    TEMP

    USERS

    WEBTBS

    MYTMP

    已选择7行。

  可以看到,表空间和数据文件已经自动创建,你是不是奇怪为什么数据文件路径自动变成了jsspdg,赫赫,因为我们设置了db_file_name_convert嘛。

C) . 删除表空间   --primary数据库操作

    SQL> drop tablespace mytmp including contents and datafiles;

    表空间已删除。

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSWEB\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSWEB\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSWEB\USERS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\WEBTBS01.DBF

    SQL> alter system switch logfile;

    系统已更改。

  提示:使用including子句删除表空间时, 会自动删除相关数据文件。

D) . 验证standby数据库    --standby数据库操作

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSPDG\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSPDG\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSPDG\USERS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\WEBTBS01.DBF

    SQL> select name from v$tablespace;

    NAME

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

    SYSTEM

    UNDOTBS1

    SYSAUX

    TEMP

    USERS

    WEBTBS

    已选择6行。

  得出结论,对于初始化参数STANDBY_FILE_MANAGMENT设置为auto的话,对于表空间和数据文件的操作完全无须dba手工干预,primary和standby都能很好的处理。

2) .STANDBY_FILE_MANAGEMENT 设置为MANUAL,增加及删除表空间和数据文件

A) . 增加新的表空间    --primary数据库操作

    SQL> create tablespace mytmp datafile ¨e:\ora10g\oradata\jssweb\mytmp01.dbf¨ size 20m;

    表空间已创建。

  检查刚添加的数据文件

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSWEB\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSWEB\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSWEB\USERS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\WEBTBS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\MYTMP01.DBF

    已选择6行。

  切换日志

    SQL> alter system switch logfile;

    系统已更改。

B) . 验证standby库    --standby数据库操作

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSPDG\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSPDG\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSPDG\USERS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\WEBTBS01.DBF

    E:\ORA10G\PRODUCT\10.2.0\DB_1\DATABASE\UNNAMED00006

    已选择6行。

    SQL> select name from v$tablespace;

    NAME

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

    SYSTEM

    UNDOTBS1

    SYSAUX

    TEMP

    USERS

    WEBTBS

    MYTMP

    已选择7行。

  可以看到,表空间已经自动创建,但是,数据文件却被起了个怪名字,手工修改其与primary数据库保持一致,如下(注意执行命令之后手工复制数据文件到standby):

    SQL> alter database create datafile ¨E:\ORA10G\PRODUCT\10.2.0\DB_1\DATABASE\UNNAMED00006¨

     2  as ¨E:\ora10g\oradata\jsspdg\mytmp01.dbf¨ ;

    数据库已更改。

C) . 删除表空间   --primary数据库操作

    SQL> drop tablespace mytmp including contents and datafiles;

    表空间已删除。

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSWEB\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSWEB\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSWEB\USERS01.DBF

    E:\ORA10G\ORADATA\JSSWEB\WEBTBS01.DBF

    SQL> alter system switch logfile;

    系统已更改。

D) . 验证standby数据库    --standby数据库操作

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSPDG\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSPDG\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSPDG\USERS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\WEBTBS01.DBF

    E:\ORA10G\PRODUCT\10.2.0\DB_1\DATABASE\UNNAMED00006

    已选择6行。

    SQL> select name from v$tablespace;

    NAME

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

    SYSTEM

    UNDOTBS1

    SYSAUX

    TEMP

    USERS

    WEBTBS

    MYTMP

    已选择7行。

  呀,数据还在啊。赶紧分析分析,查看alert_jsspdg.log文件,发现如下(特别注意粗体):

    File #6 added to control file as ¨UNNAMED00006¨ because

    the parameter STANDBY_FILE_MANAGEMENT is set to MANUAL

    The file should be manually created to continue.

    Errors with log E:\ORA10G\ORADATA\JSSPDG\LOG1_753_641301252.ARC

    MRP0: Background Media Recovery terminated with error 1274

    Fri Jan 18 09:48:45 2008

  这下明白了,为什么有个UNNAMED00006的数据文件,也晓得为啥standby数据库没能删除新加的表空间了吧,原来是后台的redo应用被停掉了,重启redo应用再来看看:

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

    数据库已更改。

    SQL> select name from v$datafile;

    NAME

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

    E:\ORA10G\ORADATA\JSSPDG\SYSTEM01.DBF

    E:\ORA10G\ORADATA\JSSPDG\UNDOTBS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\SYSAUX01.DBF

    E:\ORA10G\ORADATA\JSSPDG\USERS01.DBF

    E:\ORA10G\ORADATA\JSSPDG\WEBTBS01.DBF

  注意,既使你在primary数据库执行删除时加上了including子句,在standby数据库仍然只会将表空间和数据文件从数据字典中删除,你还需要手工删除表空间涉及的数据文件。

  再次得出结论,初始化参数STANDBY_FILE_MANAGMENT设置为manual的话,对于表空间和数据文件的操作必须有dba手工介入,你肯定会问,这太麻烦了,那我干脆配置dg的时候直接把初始化参数设置为auto不就好了嘛,en,你想的很好,不过三思需要提醒你地是,如果你的存储采用文件系统,那当然没有问题,但是如果采用了裸设备,你就必须将该参数设置为manual。

2、 重命名数据文件

如果primary数据库重命令了一个或多个数据文件,该项修改并不会自动传播到standby数据库。因为此,如果你想让standby和数据文件与primary保持一致,那你也只能自己手工操作了。这会儿就算STANDBY_FILE_MANAGEMENT也帮不上忙啦,不管它是auto还是manual。

下面通过示例做个演示:

A) . 将重命名的数据文件所在表空间offline  --primary数据库操作

    SQL> alter tablespace webtbs offline;

    表空间已更改。

B) . 手工将数据文件改名(操作系统) --primary数据库操作

  方式多样,不详述。

C) . 通过命令修改数据字典中的数据文件路径,并online表空间 --primary数据库操作

    SQL> alter tablespace webtbs rename datafile

      2  ¨E:\ORA10G\ORADATA\JSSWEB\WEBTBS01.DBF¨ to

      3  ¨E:\ORA10G\ORADATA\JSSWEB\TBSWEB01.DBF¨;

    表空间已更改。

    SQL> alter tablespace webtbs online;

    表空间已更改。

D) . 暂停redo应用,并shutdown   --standby数据库操作

    SQL> alter database recover managed standby database cancel;

    数据库已更改。

    SQL> shutdown immediate

    ORA-01109:  数据库未打开

    ......

E) . 手工将数据文件改名(操作系统)   --standby数据库操作

  方式多样,不详述。

F) . 重启standby,修改数据文件路径(数据字典)   --standby数据库操作

    SQL> startup mount

    ORACLE  例程已经启动。

    Total System Global Area  167772160 bytes

    Fixed Size                  1289484 bytes

    Variable Size             150995700 bytes

    Database Buffers            8388608 bytes

    Redo Buffers                7098368 bytes

    数据库装载完毕。

    SQL> alter database rename file

      2  ¨E:\ORA10G\ORADATA\JSSPDG\WEBTBS01.DBF¨ to

      3  ¨E:\ORA10G\ORADATA\JSSPDG\TBSWEB01.DBF¨;

    数据库已更改。

G) . 重新启动redo应用。

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

    数据库已更改。

H) . 切换日志   --primary数据库操作

    SQL> alter system switch logfile;

    系统已更改。

  峻工~~~~

3、 添加或删除Online redo logs

  数据库调优时极有可能会涉及到重置日志文件大小或增加删除日志组等操作,基本上这种操作不会传播到standby数据库,也不会影响到standby数据库的运行,但是如果你不注意其中的关系,造成的影响可能会很深远,

  比如,我们假设我们的一台primary数据库拥有5组online redo文件,standby数据库拥有2组,当你执行switch over之后,新的primary执行归档的频率会比standby高的多,因此,当你在primary数据库增加或移除online redologs时,一定记的手工同步一相standby数据库中相关的设置。

  这就是我们前面提到的standby redologs与online redologs之间的关系,即保证standby redologs比online redologs要至少多一组。

  操作的过程很简单(总不会复杂过添加删除数据文件),这里就不演示了,需要你注意的就是在standby做操作前务必将STANDBY_FILE_MANAGEMENT设置为MANUAL。