zoukankan      html  css  js  c++  java
  • Oracle data guard学习

    Oracle data guard学习:三思笔记

    Data guard

    1data guard结构:

    data guard是一个集合,由一个primary数据库(生产数据库)和一个或多个standby数据库(最多9个组成),组成data guard之间的数据库由oracle的net service来连接,

     1主库:单实例,rac

     2standby:物理standby:物理结构相同,接收到redo后,以介质恢复的形式到standby库

               逻辑standby:数据相同,结构可能有差异,将接受到的redo转换成sql来操作standby的数据

    1.1  data guard服务:

     1 Redo传输服务:RTS:从主库发送redo到其他的的standby,

     2 LOG应用服务:LAS:保证primary与standby的事务一致

      物理standby:data guard使用redo apply技术,通过recover的方式应用redo数据

      逻辑standby:使用sql apply,先将接收到的redo数据转换成sql,以执行该sql来应用redo数据

      3 角色转换:一套dg只有2中角色:primary,standby

      角色转换也就是切换,切换分2中:switchover跟failover

    Switchover:将primary跟standby(一个)进行切换,不会丢失数据

    Failoverprimary出现故障并不能及时恢复,通过failover将一个standby转换为新的primary,在最大保护模式跟高可用模式下,不会丢失数据,(高性能可能会?)

    1.2  3种保护模式:

      最大保护maximum protection,这种模式确保无数据丢失,要求事务在提前前,redo不仅写入到本地的online redologs中,还要同时写入到standby 的standby的redologs中,并确认至少在一个standby中可以使用了,才会在primary库中提交,如果standby导致redo问题,primary会shutdown

      最高性能(默认)maximum performance,这种模式在不影响primary下,提供最高级别的数据保护策略,事务可以随时提交,当前primary的redo数据至少写入到一个standby中,可以是同步与异步

      最高可用maximum availability,在不影响primary的前提下,提供最大模式的保护数据的策略,要求本地事务在提交前把redo写入到一个standby中,如果standby出现故障primary并不会shutdown,而是自动转换为最高性能模式,等standby恢复正常,会自动转换为最高可能

      3种模式都需要指定log_archive_dest_n参数

     1.3  data guard特定总结:

    容灾恢复及高可用特性,全面的保护数据,有效利用系统资源,故障自动检测及解决方案,集中的易用管理模式,自动化切换角色,

    2.1 standby数据库类型

     1物理standby:

    物理standby跟primary一模一样,通过redo来应用standby,在物理standby没有执行redo应用时,可以以read only模式打开,如果数据库中指定了flashback area,可以设置成read write,操作完成后可以flashback database恢复到read write前的状态,然后开启接收primary的redo并应用

     Redo应用:物理standby用过redo 应用来保持跟primary 的一致,(通过oracle的恢复机制,利用归档跟redo来恢复对应的块的操作),如果正在执行redo的应用,db不能被open,redo应用时物理standby 的核心,

     Read only模式打开:打开后,可以在standby执行查询跟备份操作,此时standby任然会接收redo,只不过不会进行redo 应用,知道standby恢复应用(oracle11g,改进了物理standby,可以在standby打开是应用redo,这样可以实现读写分离)

    Read write打开db:此时不能接收primary发送的redo数据,失去了保护数据的策略,此时已该模式打开数据库,可以进行一些数据调试(不方便在生产上做的),操作完成在闪回,

    物理standby 的特点:灾难恢复及高可用,数据保护,分担primary的压力,提升性能

     2 逻辑standby:

    逻辑standby也是通过primary的复制创建的,不过由于逻辑的使用sql应用来改变数据,所以可能数据结构不一样,

    逻辑standby正常情况下是read write打开,用户可以在任何时候访问db,由于sql自身的特点,逻辑standby对有些数据类型及一些dml/ddl操作的不支持,

    逻辑standby数据库可以额外的创建index,物化视图等提高查询性能并满足业务需要,如创建新的schema(primary不存在的),分担主库压力,可以将查询报表分离出来,平滑升级(实现跨版本的升级,为数据库打补丁,)

    Data guard的操作界面

     Oem,sqlplus,dgmgrl(data guard broker命令方式)

    3 Data guard的软件要求:

      同一个data guard的环境所有的oracle必须运行在相同的系统构架上,不同的服务器上可以配置不同,

    Primary数据库跟standby数据库必须运行在相同的系统平台上

    Data guard是oracle 企业版的特性

    同一个data guard配置中的所有初始化参数:compatible值必须相同

    Primary数据库必须处于归档模式,并且force logging模式

    Primary,standby均可以用于单实例和rac结构,并且可以在多个standby中,可以有逻辑standby跟物理standby

    PrimaRy跟standby可以放在同一台服务器上,但是控制文件,参数文件,日志文件,数据文件,归档文件的目录不同,以免被覆盖

    Primary和standby数据库必须有sysdba权限

    建议采用相同的数据存储结构,服务器的时间设置,

    3物理standby

    3.1物理standby创建前的准备

    1启用force logging模式

    SQL> conn /as sysdba

    Connected.

    SQL> select force_logging from v$database;

    FOR

    ---

    NO

    SQL> alter database force logging;

    Database altered.

    SQL> select force_logging from v$database;

    FOR

    ---

    YES

    alter database no force  logging

    2创建密钥文件(不存在的话)

    在所有的dg数据库配置中,都必须有自己独立的密钥文件,并且保证,同dg中,sys的密码必须一样,以保证redo顺利的传输(通过tns,会验证sys密码)

    使用dbca创建数据库,会自动创建密钥文件

      [oracle@localhost ~]$ cd /u01/app/oracle/product/10.2.0/db_1/dbs/

    [oracle@localhost dbs]$ ll

    -rw-r----- 1 oracle oinstall    1536 03-24 15:55 orapwgrs

    不存在就创建

    orapwd file=orapwgrs password="987064" entries=10 force=y;

    3配置standby redologs,用于存储接收主库的redo log

      对应最大保护和最高可用模式,建议为standby 创建redologs(不配置可以,oracle将在standby端自动创建归档文件,并虚拟为一组standby redologs,并使用lgwr sync模式传输redo

      关于standby redologs建议:1 standby redologs跟primar的redo文件大小相同,2 创建适当的日志数目,一般而言,standby的redolog要比primary的redo文件多一个,(每线程的日志组数+1)*线程数,防止主库的lgwr进程锁住,备库的RFS进程接收到primary的redo,保存在本地(就是standby log)

     ARCH模式的话不写standby log,直接读取归档文件

      管理standby redologs:standby redologs的大小最好跟redo log的一样

    v$log v$logfile

    SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 100m;

    Database altered.

    --删除该日志组

    SQL> alter database drop standby logfile group 4;

    Database altered.

    SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 50m;

    alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 50m

    *

    ERROR at line 1:

    ORA-00301: error in adding log file '/u01/app/oracle/oradata/grs/redo04.log' -

    file cannot be created

    ORA-27038: created file already exists

    Additional information: 1

    --需要物理删除

    ----保证主库与备库的日志大小一样,

    SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 50m;

    Database altered.

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

        GROUP#    THREAD#  SEQUENCE# ARC STATUS

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

             4          0          0 YES UNASSIGNED

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

        GROUP# TYPE

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

    MEMBER

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

             3 ONLINE

    /u01/app/oracle/oradata/grs/redo03.log

             2 ONLINE

    /u01/app/oracle/oradata/grs/redo02.log

             1 ONLINE

    /u01/app/oracle/oradata/grs/redo01.log

        GROUP# TYPE

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

    MEMBER

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

             4 STANDBY

    /u01/app/oracle/oradata/grs/redo04.log

    4设置初始化参数

    SQL> create pfile ='/u01/oracle/backup/pfile' from spfile;

    File created.

    [oracle@localhost backup]$ vi pfile

    grs.__db_cache_size=180355072

    grs.__java_pool_size=4194304

    grs.__large_pool_size=4194304

    grs.__shared_pool_size=88080384

    grs.__streams_pool_size=4194304

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

    *.background_dump_dest='/u01/app/oracle/admin/grs/bdump'

    *.compatible='10.2.0.1.0'

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

    *.core_dump_dest='/u01/app/oracle/admin/grs/cdump'

    *.db_block_size=8192

    *.db_domain=''

    *.db_file_multiblock_read_count=16

    *.db_name='grs'

    *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

    *.db_recovery_file_dest_size=2147483648

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=grsXDB)'

    *.job_queue_processes=10

    #*.log_archive_dest_1='location=/u01/app/oracle/archivelog/archivelog/'

    *.open_cursors=300

    *.pga_aggregate_target=94371840

    *.processes=150

    *.remote_login_passwordfile='EXCLUSIVE'

    *.sga_target=285212672

    *.undo_management='AUTO'

    *.undo_tablespace='UNDOTBS1'

    *.user_dump_dest='/u01/app/oracle/admin/grs/udump'

    # DB_NAME=grs

       *.DB_UNIQUE_NAME=grs

       *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs,grs2)'

       *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'

       *.LOG_ARCHIVE_DEST_2='SERVICE=grs2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grs2'

        *.LOG_ARCHIVE_DEST_STATE_1=ENABLE

        *.LOG_ARCHIVE_DEST_STATE_2=ENABLE

       # *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

        *.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc

        *.LOG_ARCHIVE_MAX_PROCESSES=30

     

        # 以下部分为主机切换为备库使用

     

        *.FAL_SERVER=grs_192.168.2.185

        *.FAL_CLIENT=grs2_192.168.2.185

        *.DB_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'

        *.LOG_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'

        *.STANDBY_FILE_MANAGEMENT=AUTO

    SQL> shutdown immediate;

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> create spfile from pfile='/u01/oracle/backup/pfile';

    File created.

    SQL> startup;

    5将主库设置为归档模式

    SQL> archive log list;

    Database log mode              Archive Mode

    Automatic archival             Enabled

    Archive destination            /u01/app/oracle/archivelog/archivelog/

    Oldest online log sequence     3

    Next log sequence to archive   5

    Current log sequence           5

    如果是disable,需要启动到mount,然后SQL> alter database archivelog;

    3物理standby创建的实际过程演示

      源数据库primary

    Ip:192.168.2.185

    Oracle sid=grs

    Db_unique_name=grs

    安装路径:/u01/app/oracle/product/10.2.0/db_1/dbs

    数据文件:/u01/app/oracle/oradata/grs

    归档路径:/u01/oracle/backup

      目标数据库standby

    Ip:192.168.2.188

    Oracle sid=grs2

    Db_unique_name=grs2

    安装路径:/u02/app/oracle/product/10.2.0/db_1/dbs

    数据文件:/u02/app/oracle/oradata/grs2

    归档路径:/u02/oracle/backup

    1 primary主库的配置及相关

    1 检查主库的归档

    oracle@localhost backup]$ export ORACLE_SID=grs

    SQL> archive log list;

    如果不是归档状态,重新启动到mount,alter database archivelog

    2 将主库设置为force loggin状态

    SQL> conn /as sysdba

    Connected.

    SQL> select force_logging from v$database;

    FOR

    ---

    NO

    SQL> alter database force logging;

    Database altered.

    SQL> select force_logging from v$database;

    FOR

    ---

    YES

    alter database no force  logging

    3 配置主库的初始化参数

    SQL> create pfile ='/u01/oracle/backup/pfile' from spfile;

    File created.

    [oracle@localhost backup]$ vi pfile

    # DB_NAME=grs

       *.DB_UNIQUE_NAME=grs

       *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs,grs2)'

       *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'

       *.LOG_ARCHIVE_DEST_2='SERVICE=grs2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grs2'

        *.LOG_ARCHIVE_DEST_STATE_1=ENABLE

        *.LOG_ARCHIVE_DEST_STATE_2=ENABLE

       # *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

        *.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc

        *.LOG_ARCHIVE_MAX_PROCESSES=30

     

        # 以下部分为主机切换为备库使用

        *.FAL_SERVER=grs_192.168.2.185

        *.FAL_CLIENT=grs2_192.168.2.188

        *.DB_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'

        *.LOG_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'

        *.STANDBY_FILE_MANAGEMENT=AUTO

    SQL> shutdown immediate;

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> create spfile from pfile='/u01/oracle/backup/pfile';

    File created.

    SQL> startup;

    4 创建standby库的控制文件

    SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/oracle/backup/control01.ctl';

    5 复制相关文件到standby数据库

    可以采用rman,expdp,cp等命令,复制相关数据文件到standby

    6 配置监听跟网络服务名

    [oracle@localhost admin]$ cp -p /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora /u02/app/oracle/product/10.2.0/db_1/network/admin/

    [oracle@localhost admin]$ cp -p /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora /u02/app/oracle/product/10.2.0/db_1/network/admin/

    修改监听文件

    [oracle@localhost admin]$ vi listener.ora

    # listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora

    # Generated by Oracle configuration tools.

    SID_LIST_LISTENER =

      (SID_LIST =

        (SID_DESC =

          (SID_NAME = PLSExtProc)

          (ORACLE_HOME = /u02/app/oracle/product/10.2.0/db_1)

          (PROGRAM = extproc)

        )

        (SID_DESC =

          (GLOBAL_DBNAME = Oracle8)

          (ORACLE_HOME = /u02/app/oracle/product/10.2.0/db_1)

          (SID_NAME = grs2)

        )

     )

    LISTENER =

      (DESCRIPTION_LIST =

        (DESCRIPTION =

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

        )

        (DESCRIPTION =

          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

        )

    )

    [oracle@localhost admin]$ vi tnsnames.ora

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

    # Generated by Oracle configuration tools.

    GRS2 =

      (DESCRIPTION =

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

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = grs2)

        )

      )

    EXTPROC_CONNECTION_DATA =

      (DESCRIPTION =

        (ADDRESS_LIST =

          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

        )

        (CONNECT_DATA =

          (SID = PLSExtProc)

          (PRESENTATION = RO)

        )

      )

    7 创建密钥文件(并复制到standby对应路径)

    [root@localhost ~]# cd /u01/app/oracle/product/10.2.0/db_1/dbs/

    [root@localhost dbs]# ll

    -rw-r----- 1 oracle oinstall    1536 03-24 15:55 orapwgrs

    不存在就创建

    orapwd file=orapwgrs password="987064" entries=10 force=y;

    2物理standby端的配置

    [oracle@localhost backup]$ export ORACLE_SID=grs2

    1 创建日志文件,后台进程的相关目录

    [oracle@localhost oracle]$ mkdir -p archivelog/archivelog

    [oracle@localhost oracle]$ mkdir -p /u02/app/oracle/flash_recovery_area/grs/onlinelog

    [oracle@localhost oracle]$ 

    [oracle@localhost oracle]$ pwd

    /u02/app/oracle

    [oracle@localhost oracle]$ mkdir admin

    [oracle@localhost oracle]$ cd admin/

    [oracle@localhost admin]$ mkdir grs2

    [oracle@localhost admin]$ cd grs2/

    [oracle@localhost grs2]$ mkdir adump bdump cdump udump

    2配置监听跟网络服务名

    配置好后,可以tnsping

    3修改standby的参数文件

    [oracle@localhost dbs]$ vi initgrs2.ora 

    *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'

    grs.__db_cache_size=192937984

    grs.__java_pool_size=4194304

    grs.__large_pool_size=4194304

    grs.__shared_pool_size=75497472

    grs.__streams_pool_size=4194304

    *.audit_file_dest='/u02/app/oracle/admin/grs/adump'

    *.background_dump_dest='/u02/app/oracle/admin/grs/bdump'

    *.compatible='10.2.0.1.0'

    *.control_files='/u02/app/oracle/oradata/grs/control01.ctl','/u02/app/oracle/oradata/grs/control02.ctl','/u02/app/oracle/oradata/grs/control03.ctl'

    *.core_dump_dest='/u02/app/oracle/admin/grs/cdump'

    *.db_block_size=8192

    *.db_domain=''

    *.db_file_multiblock_read_count=16

    *.DB_FILE_NAME_CONVERT='/u02/app/oradata/grs2','/u01/app/oradata/grs'

    *.db_name='grs'

    *.db_recovery_file_dest='/u02/app/oracle/flash_recovery_area'

    *.db_recovery_file_dest_size=2147483648

    *.DB_UNIQUE_NAME='grs2'

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=grsXDB)'

    *.FAL_CLIENT='grs_192.168.2.185'

    *.FAL_SERVER='grs2_192.168.2.185'

    *.job_queue_processes=10

    *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs2,grs)'

    *.LOG_ARCHIVE_DEST_1='LOCATION=/u02/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs2'

    *.LOG_ARCHIVE_DEST_2='SERVICE=grs LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grs'

    *.LOG_ARCHIVE_DEST_STATE_1='ENABLE'

    *.LOG_ARCHIVE_DEST_STATE_2='ENABLE'

    *.LOG_ARCHIVE_FORMAT='%t_%s_%r.arc'

    *.LOG_ARCHIVE_MAX_PROCESSES=30

    *.LOG_FILE_NAME_CONVERT='/u02/app/oradata/grs2','/u01/app/oradata/grs'

    *.open_cursors=300

    *.pga_aggregate_target=94371840

    *.processes=150

    *.remote_login_passwordfile='EXCLUSIVE'

    *.sga_target=285212672

    *.STANDBY_FILE_MANAGEMENT='AUTO'

    *.undo_management='AUTO'

    *.undo_tablespace='UNDOTBS1'

    *.user_dump_dest='/u02/app/oracle/admin/grs2/udump'

    4启动物理standby到mount状态

    5接收归档文件

      物理standby启动到mount状态后,就能够接收来自primary端的redo日志,需要切换到主库

    Primary sql>alter system set log_arhive_dest_state_2=ENABLE;

     然后primary库就会发送redo到standby,查看接收到的归档文件,V$ARCHIVED_Log

    Primary修改的数据能否在standby看到,受几个方面的影响

     1同步模式:默认情况下primary发送归档日志通过ARCH方式,只有当日志切换时,才会把产生的归档日志发送到standby,如果standby端配置了standby redologs,就支持lgwr传输redo到standby,这样产生的redo就能及时发送到standby端

    2 是否启动了应用:将redo发送到了standby端,并不意味着standby就有数据,必须手动执行应用命令,才能将修改的应用到standby,在默认的情况下,物理standby数据库是执行的恢复过程,只有当主库产生日志切换时才会应用归档到standby,

    3是否实时应用:在standby端配置了standby redologs,并且在传输redo数据时采用lgwr同步传输的方式,在这种情况下,redo是实时的,

      Oracle10g,物理的standby是不能实时看到数据的(逻辑standby或者11g物理standby才可以)

    6启动redo应用:即使当前standby处于open状态,也不需要重启,直接执行后,Oracle会切换到mount状态

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

    暂停redo应用(并不是停止,standby任然会接收,但不会应用)

    SQL> alter database recover managed standby database cancel;

    停止redo传输应用,standby数据库

    主库:SQL> ALTER SYSTEM SET log_archive_dest_state_2='DEFER';

    System altered.

    备库:SQL> alter database recover managed standby database cancel;

    alter database recover managed standby database cancel

    *

    ERROR at line 1:

    ORA-16136: Managed Standby Recovery not active

    4 物理standby的角色切换

    Switchover跟failover

    Switchover:切换不会丢失数据,手动触发或者定时计划触发,

    Failover:不可预知的原因导致不能恢复或者恢复时间较长,这就需要failover,

    1 物理的switchover切换

    1转换前的准备工作

    检查各数据库的初始化参数,确认转换的primary跟standby,以及确认是否正确的初始化参数的配置

    检查即将成为primary库是否为归档

    检查物理standby的临时文件是否存在

    确保standby数据库的rac实例只有一个实例在启动,

    选择一个最适合转换的转换成primary

    2物理执行standbyswitchover

    1检查初始化参数

    2检查是否支持switchover(主库)

    SQL> select switchover_status from v$database;

    SWITCHOVER_STATUS

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

    SESSIONS ACTIVE:当前任然有人连接primary数据库,(通过as sysdba连接,就会产生这样的状态)

    primary>select switchover_status from v$database;

    SWITCHOVER_STATUS

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

    TO STANDBY

    standby >select switchover_status from v$database;

    SWITCHOVER_STATUS

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

    NOT ALLOWED

    SQL> select switchover_status from v$database;

    SWITCHOVER_STATUS

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

    TO STANDBY

    如果该值为to standby,表示支持切换

    SQL> select switchover_status from v$database;

    SWITCHOVER_STATUS

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

    RECOVERY NEEDED

    3启动switchover

    首先将primary库切换到standby状态

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

    并将该primary重新启动到mount状态

    SQL> shutdown immediate

    ORA-01109: database not open

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup nomount;

    ORACLE instance started.

    SQL> alter database mount standby database;

    4 在standby上检查是否支持switchover

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

    standby >select switchover_status from v$database;

    SWITCHOVER_STATUS

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

    NOT ALLOWED

    显示的状态:SWITCHOVER_STATUS,TO PRIMARY,SWITCHOVER PENDING(当前standby数据没有启动redo应用,重新执行alter database recover managed standby database disconnect from session;

    5转换角色到primary

    SQL> alter database commit to switchover to primary;

    待转换的standby可以是mount或者open read only状态, 不能是read write

    6重新打开primary(新)

    SQL> shutdown immediate

    ORA-01507: database not mounted

    ORACLE instance shut down.

    SQL> startup

    2物理的failover切换

    Note:

    1 failover后,原primary不再是dg的一部分

    2 在多数情况下,其他物理/逻辑standby不直接参与failover过程,不需要做操作

    3 某些情况下,新的primary数据库配置后,需要重新创建dg配置中其他的所有的standby

    4 在执行failover之前,尽量把primary的redo跟归档都复制到standby

    如果待转换的模式是最大保护模式,需要切换到最高可用模式

    alter database set standby database to maximize performance;

    1 检查归档日志是否连续

    查询待转换的standby,

    select thread#,low_sequence#,high_sequence# from v$archive_gap

    如果有返回的记录,按照列出的记录号复制对应的归档到standby的服务器,文件复制过来,通过加入数据字典

    alter database register physical logfile 'filespec1';

    2 检查归档文件是否完整

    主库跟备库分别执行

    select distinct  thread#,max(sequence#)over(partition by thread#) from v$archived_Log

    必须保证2个max相同,不然就需要拷贝归档到standby

    3启动failover

    alter database recover managed standby database finish force;

    force会停止当前活动的rfs进程

    4 切换物理standby为primary

    alter database commit to switchover to primary;

    5启动新的primary数据库

    处于mount,则直接open,open read only,则shutdown 然后重启,

    5 read only模式打开物理standby

    1物理standby直接从shutdown状态启动到read only

    直接startup,就是read only状态

    2 物理standby从redo应用到read only状态

    首先需要取消redo应用

    alter database recover managed standby database cancel;

    然后在打开db

    Alter database open

    3read only切换到redo应用

    alter database recover managed standby database disconnect from session;

    备库,read only模式打开后,可进行查询,备份等操作

    Ready wirte模式打开数据库,standby将暂停redo应用。此时可以在备库上进行恢复,调试数据,操作完成之后,将数据库闪回到操作前的状态(闪回之后,dg会自动同步standby)

    6 管理影响物理standby的事件

    1 创建表空间或数据文件

      初始化参数standby_file_management用来控制是否自动将primary数据库增加表空间或数据文件的改动,传播到standby服务器AUTO/MANUAL

    AUTO:自动传播到standby

    MANUAL:需要手动复制文件到standby,并更新控制文件

    1 standby_file_management 设置为auto(主库)

    SQL> set sqlprompt "primary>"

    primary>show parameter standby_file

    NAME                                 TYPE                   VALUE

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

    standby_file_management              string                 AUTO

    SQL> create tablespace new_dg datafile'/u01/app/oracle/oradata/grs/new_dg.dbf' size 10m;

    Tablespace created.

    SQL> col tsname for a20

    SQL> col dfname for a50

    SQL> select ts.name tsname,df.name dfname from v$tablespace ts,v$datafile df

      2  where ts.ts#=df.ts#;

    TSNAME               DFNAME

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

    SYSTEM               /u01/app/oracle/oradata/grs/system01.dbf

    UNDOTBS1             /u01/app/oracle/oradata/grs/undotbs01.dbf

    SYSAUX               /u01/app/oracle/oradata/grs/sysaux01.dbf

    21 rows selected.

    备库查看

    SQL> col tsname for a20

    SQL> col dfname for a50

    SQL> select ts.name tsname,df.name dfname from v$tablespace ts,v$datafile df

      2  where ts.ts#=df.ts#;

    TSNAME               DFNAME

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

    SYSTEM               /u01/app/oracle/oradata/grs/system01.dbf

    UNDOTBS1             /u01/app/oracle/oradata/grs/undotbs01.dbf

    SYSAUX               /u01/app/oracle/oradata/grs/sysaux01.dbf

    USERS                /u01/app/oracle/oradata/grs/users01.dbf

    20 rows selected.

    报错日志:

    Errors in file /u01/app/oracle/admin/grsdg/bdump/grsdg_dbw0_10650.trc:

    ORA-01157: cannot identify/lock data file 20 - see DBWR trace file

    ORA-01110: data file 20: '/u01/app/oracle/oradata/grs/SPICEI2I02.dbf'

    ORA-27037: unable to obtain file status

    Linux Error: 2: No such file or directory

    Additional information: 3

    Mon May  5 10:41:18 2014

    RFS[5]: Archived Log: '/u01/app/oracle/archivelog/1_258_827453919.arc'

    Primary database is in MAXIMUM PERFORMANCE mode

    RFS[5]: No standby redo logfiles created

    待解决::::???

    12c dg

    SQL> show parameter standby_file

    NAME                                 TYPE

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

    VALUE

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

    standby_file_management              string

    auto

    SQL> create tablespace new_dg2 datafile'/u01/app/oracle/oradata/hongquan/hongquantest/new_dg2.dbf' size 10m;

    Tablespace created.

    2 将standby_file_management 设置为manual(主库)

    ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=MANUAL;

    在重复上述操作

    记录多了一条,需要重命名

    ALTER DATABASE CREATE DATAFILE ‘/u01/app/oracle/oradata/grs/XXXX’AS

       /u01/app/oracle/oradata/grs/new_dg.dbf

    然后重新启动redo应用

    alter database recover managed standby database disconnect from session;

    disconnect from session---启动应用,自动退到命令操作符

    2 删除表空间

    --对于表空间和数据文件的操作,STANDBY_FILE_MANAGEMENT=AUTO,无须手工干预,

    3 重命名数据文件

    --需要手工干预,STANDBY_FILE_MANAGEMENT=AUTO/MANUAL

    在主库rename datafile文件,从库需要手动操作

    备库:cancel redo logshutdown,重命名数据文件,在startup mount,重启redo 应用

      alter tablespace new_dg2  offline;

      mv /u01/app/oracle/oradata/hongquan/hongquantest/new_dg2.dbf  /u01/app/oracle/oradata/hongquan/hongquantest/new_dg2_test.dbf

      alter tablespace new_dg2 rename datafile 

      '/u01/app/oracle/oradata/hongquan/hongquantest/new_dg2.dbf' to 

      '/u01/app/oracle/oradata/hongquan/hongquantest/new_dg2_test.dbf';

      alter tablespace new_dg2  online;

      alter system switch logfile;

      

      select name from v$datafile;

      alter database recover managed standby database cancel;

       mv /u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2.dbf  /u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2_test.dbf

    ----12c,备库ready only模式,不能改

      alter tablespace new_dg2 rename datafile 

      '/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2.dbf' to 

      '/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2_test.dbf';

      alter database recover managed standby database disconnect from session;

      select name from v$datafile;

    ---12c 在线重命名数据文件

       ALTER DATABASE MOVE DATAFILE '/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2.dbf' 

       to 

      '/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2_test.dbf';

    4 添加或删除redologs文件

    --需要手工干预改文件的删除和创建

    无论主库端对日志组或日志文件的操作是否传播到了standby端,也不会影响到standby的运行。

    在主库增加或删除redo logs时,一定记得手工同步相关物理standby中的相关设置,保证standby logprimary redolog多一组操作要将STANDBY_FILE_MANAGEMENT=MANUAL

    5垮open_resetlogs的应用

    1 监控primarystandby库的事件

     

    2 动态性能视图

    1v$managed_standby 显示物理standby数据库相关进程的当前状态

    standby>select process,client_process,sequence#,status from v$managed_standby;

    ARCH               ARCH                      0 CONNECTED

    MRP0               N/A                      37 APPLYING_LOG

    RFS                ARCH                      0 IDLE

    2 v$archive_dest_status 显示归档文件路径配置信息及redo的应用情况

    standby>select dest_name,archived_thread#,archived_seq#,applied_thread#,applied_seq#,db_unique_name from v$archive_dest_status where status='VALID';

    3v$archived_log 检查归档文件路径和创建信息

    standby>select name,creator,sequence#,applied,completion_time from v$archived_log;

    4 v$log_history 查询归档历史

    select first_time,first_change#,next_change#,sequence# from v$log_history;

    standby>select thread#,max(sequence#) as "last_applied_log" from v$log_history group by thread#;

    5 查看物理standby未接受的日志文件

    standby>select local.thread#,local.sequence# from  

      2  (select thread#,sequence# from v$archived_log where dest_id=1) local

      3  where local.sequence# not in

      4  (select sequence# from v$archived_log where dest_id=2 and thread#=local.thread#);

    3 管理归档中断gap

    4 standby的选择数据保护模式

    Primary的修改能否在standby端看到,受几个方面的影响:

     1:同步模式:默认情况primary端发送归档日志通过ARCH的方式,只有当primary切换日志时,产生的归档日志才会发送到standby端。如果standby端配置了standby redologs文件,dg支持以lgwr方式传输redo数据,这样primary产生的redo就能及时发送到standby端。

     2:是否启动了应用:将redo发送到standby端,并不代表standby端应用了改redo,必须手动执行命令。默认情况下,物理standby的应用执行是恢复过程,只有当主库primary库执行切换操作后,才会对切换产生的归档文件进行应用,在时效上比primary有延后

     3:是否实时应用:standby端配置了standby redologs,并且prim传输redo日志时采用了lgwr同步传输的方式,这是redo传输实时(asyncsync

    1 Dataguard 服务

    1 redo传输服务rts

    1 认识LOG_ARCHIVE_DEST_N参数

    LOG_ARCHIVE_DEST_N1-10)定义redo 发送的目的地,通过location或者service 来指定本地还是远程serviceLOG_ARCHIVE_DEST_N都有对应的LOG_ARCHIVE_DEST_STATE_N用来指定LOG_ARCHIVE_DEST_N的属性是否生效,有4种属性

    Enable:默认,表示允许传输

    Defer:属性有效,但暂不使用该归档路径

    Alternate:禁止传输,其他的失败,会自动enable

    Reset:与defer相似,

    LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

    LOG_ARCHIVE_DEST_STATE_1='ENABLE'

      用过service关键字指定redo的传输

     LOG_ARCHIVE_DEST_2='SERVICE=‘’

    log_archive_dest_state_2='DEFER'

      可以通过alter system set来修改2个参数,修改会在下次日志切换时生效

    Alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'

    SQL> col name for a15

    SQL> col value for a20

    SQL> set pageline 1000

    SP2-0158: unknown SET option "pageline"

    SQL> set pagesize 1000

    SQL> set linesize 1000

    SQL> show parameter log_archive_dest

    NAME                                 TYPE                   VALUE

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

    log_archive_dest                     string

    log_archive_dest_1                   string                 LOCATION=/u01/app/oracle/archi

                                                                velog/ VALID_FOR=(ALL_LOGFILES

                                                                ,ALL_ROLES) DB_UNIQUE_NAME=grs

    log_archive_dest_10                  string

    log_archive_dest_2                   string                 SERVICE=grsdg LGWR ASYNC VALID

                                                                _FOR=(ONLINE_LOGFILES,PRIMARY_

                                                                ROLE) DB_UNIQUE_NAME=grsdg

    2 使用ARCn进程发送redo数据

      默认情况下,使用ARCn进程发送redo数据,(只支持最高性能保护模式),在其他模式下需要lgwr传输,可以增加arcn进程

    Alter system set log_archive_max_process=n;(0-30)

     ARCHn归档过程,

     Primary发生日志切换时,就会产生归档,:分别在primary跟standby

     一旦arc0完成在线日志的归档,arc1就开始传输归档中的redo到standby(假设有2个进程)

    本地归档与远程归档并无联系,

    lgwr进程传输redo

    Lgwr进程不需要等日志完成切换或归档才传输,standby数据库的lgwr进程会选择一个standby redologs文件映射primary数据库当前活动的联机重做日志文件,一旦primary有redo产生,根据参数中的sync或async来确定同步或非同步方式发送redo

    1 lgwr同步redo流程

    *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'

    *.LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR SYNC new_timeout=30

    *.LOG_ARCHIVE_DEST_STATE_1='ENABLE'

    *.log_archive_dest_state_2='DEFER'

    ---- new_timeout 连接超时,会返回错误

     

    lgwr不同步归档流程

    *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'

    *.LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR ASYNC

    *.LOG_ARCHIVE_DEST_STATE_1='ENABLE'

    *.log_archive_dest_state_2='DEFER'

    4安全传输redo

     Redo传输的过程中使用密码验证的方式,保证primary跟standby的sys密码一样

    什么时候发送

     1 VALID_FOR属性指定传输及接受对象

    VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

    VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

     2 通过db_unique_name指定数据库

    DB_UNIQUE_NAME='grs'

    LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs,grsdg)'

    3 出错了怎么办

    LOG_ARCHIVE_DEST_1有几个属性来控制出现错误时采取的措施

    1 reopen 指定时间后再次尝试归档

    Reopen=seconds(300)默认

    LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grsdg reopen=100'

     2 alternate指定替补归档路径

    LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/  alternate=LOG_ARCHIVE_DEST_2'

    LOG_ARCHIVE_DEST_STATE_1='ENABLE'

    LOG_ARCHIVE_DEST_2='LOCATION=/u01/app/oracle/archivelog2/'

    LOG_ARCHIVE_DEST_STATE_2='ALTERNATE'

    3 max_failure控制最大失败次数

     LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR ASYNC reopen=100 max_failure=3'

    4 管理日志文件

    默认情况下,本地的归档都是放在LOG_ARCHIVE_DEST_2='location的路径下

    设置是否可以被重用

    设置控制文件中记录重用及增长规则

    多个standby间共享文件路径

    Dependency属性

    2 log应用服务(log apply service)

    Data guard用过redo来维持primary跟standby之间的一致性

    Redo:物理standby专用,通过介质恢复的方式保持一致

    Sql:逻辑standby专用,通过logminer分析sql语句,在standby端执行

    因此物理的standby必须是mount状态(10g),逻辑可以是read only

    1 redo实时应用

    Redo不需要等归档完成了,接收到即可应用,standby端配置了standby redologs,物理实时启动,

    alter database recover managed standby database using current logfile

    2 redo延迟应用

    LOG_ARCHIVE_DEST_2='SERVICE=grsdg ARCH VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grsdg DELAY=15'

      DELAY 默认30分钟

    alter database recover managed standby database nodelay disconnect;

    3应用redo到standby数据库

    启动redo应用

    alter database recover managed standby database disconnect;

    停止redo应用

    alter database recover managed standby database cancel;

    4选择数据库保护模式

    1 查看当前数据库的保护模式

    select db_unique_name,open_mode,database_role,switchover_status,

    dataguard_broker,protection_mode,remote_archive,guard_status from 

    v$database;

    2 修改初始化参数

    Alter system set

    3设置新的保护模式,并重启db

    alter database set standby database to maximize availability

  • 相关阅读:
    【bzoj2079】[Poi2010]Guilds 构造结论题
    【bzoj1899】[Zjoi2004]Lunch 午餐 dp
    【bzoj1345】[Baltic2007]序列问题Sequence 单调栈
    【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
    【bzoj1044】[HAOI2008]木棍分割 二分+dp
    【bzoj5037】[Jsoi2014]电信网络 最大权闭合图
    【bzoj5018】[Snoi2017]英雄联盟 背包dp
    【bzoj5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT
    【bzoj2213】[Poi2011]Difference dp
    【bzoj2161】布娃娃 权值线段树
  • 原文地址:https://www.cnblogs.com/yhq1314/p/9922690.html
Copyright © 2011-2022 走看看