oracle database guard

简介:
Maximum protection:零数据丢失。发生事务时需要同时向主数据库和备用数据写重做日志。 
为了保证数据不丢失,如果有一个事务发现不能向备用数据写重做日志,那么主数据库会自 
动关闭。 
Maximum availability:在保证主数据库可用的情况下最大程度上保证数据的不丢失。同 
Maximum protection 一样也是同时向主和备用数据库写重做日志。与 Maximum protection 不 
同的时当发现不能向备用数据库写重做日志时不会关闭数据库,而是采用 Maximum 
performance 的模式管理直到修复故障。 
当发生第二次错误时至少要能够将重做日志写入到一个备用数据库中才能保证零数据丢失。 
(多备用库的情况下。如果是一个备用库发生一次错误就会丢失数据)

Maximum performance:Oracle 默认采用这种方式。在不影响主库的性能的情况下最大程度 
上保证数据不丢失。由于前两种方式要同时向主和备库写重做日志这就会给系统的性能带来 
负面影响。当事务提交时会立即将数据写入到本地的联机日志中。主库的重做数据流 
至少要写入到一个从库中,但是这个并不是与主库同时发生的。 
如果采用了足够的带宽的话,这种模式提供的数据保护保证最大的可用性,同时对主库的性 
能影响最小。

检查数据库是否支持 Data Guard,企业版才支持 Data Guard
SQL> select * from v$option where parameter = 'Managed Standby';

PARAMETER                        VALUE
-------------------- ----------
Managed Standby                TRUE

SQL> 
创建物理备用数据库的步骤: 
一、强制主库产生日志,由于备库是采用归档日志恢复的,如果没有归档日志恢复无从谈 
起。
SQL> ALTER DATABASE FORCE LOGGING; 
二、创建备库的密码文件
D:>orapwd           file=D:\oracle\product\10.2.0\db_1\database\PWDauxdb.ora   password=oracle
entries=5; 
创建实例
D:> oradim -NEW -SID auxdb -INTPWD D:\oracle\product\10.2.0\db_1\database\PWDauxdb.ora
-STARTMODE manual 
三、修改主库的参数文件,并同步到 spfile
orcl.__db_cache_size=88080384
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=67108864 

orcl.__streams_pool_size=0
*.audit_file_dest='D:\oracle\product\10.2.0\admin\orcl\adump'
*.background_dump_dest='D:\oracle\product\10.2.0\admin\orcl\bdump'
*.compatible='10.2.0.1.0'
*.control_files='D:\oracle\product\10.2.0\oradata\orcl\CONTROL01.CTL','D:\oracle\product\10.2.
0\oradata\orcl\CONTROL02.CTL','D:\oracle\product\10.2.0\oradata\orcl\CONTROL03.CTL'
*.core_dump_dest='D:\oracle\product\10.2.0\admin\orcl\cdump'
*.db_block_size=8192
*.db_domain='
*.db_file_multiblock_read_count=16
*.db_name='orcl'
*.db_recovery_file_dest_size=2147483648
*.db_recovery_file_dest='d:\oracle\product\10.2.0\flash_recovery_area'
*.db_unique_name='orcl'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.log_archive_config='dg_config=(orcl,auxdb)'
*.log_archive_dest_1='location=D:\oracle\product\10.2.0\oradata\orcl\archive
VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl'
*.log_archive_dest_2='service=AUX                VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=auxdb'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.log_archive_max_processes=1
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=167772160
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='D:\oracle\product\10.2.0\admin\orcl\udump'
*.fal_service='aux'
*.fal_client='orcl'
*.standby_archive_dest='D:\oracle\product\10.2.0\oradata\orcl\standbyarchive'
*.standby_file_management=auto 
四、创建备库的数据文件 
查看主库数据文件列表
SQL> select file#,name from v$datafile;

FILE# NAME
----- ----------------------------------------------------
      1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
      2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF 

      3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
      4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
      5 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
      6 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF

已选择 6 行。 
1)、将主库的数据文件 copy 到从库的路径下
SQL>ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'd:\bak\standby.ctl'; 
然后关闭数据库将 file 1、2、3、4、5、6 copy 到 d:\bak 下。 
或采用如下方法: 
2)、采用 rman 将数据文件 copy 到备库中
C:\Documents and Settings\Administrator.XY>rman target/

恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3 月 15 14:42:25 2009

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

已连接到目标数据库: ORCL(DBID=1140649303, 未打开)

RMAN> copy datafile 1 to 'd:\bak\system01.dbf',datafile 2 to 'd:\bak\undotbs01.d
bf',datafile 3 to 'd:\bak\sysaux01.dbf',datafile 4 to 'd:\bak\users01.dbf',dataf
ile 5 to 'd:\bak\example01.dbf',datafile 6 to 'd:\bak\test01.dbf', current contr
olfile for standby to 'd:\bak\standby.ctl';
2> 
启动 backup 于 15-3 月 -07 
使用目标数据库控制文件替代恢复目录 
分配的通道: ORA_DISK_1 
通道 ORA_DISK_1: sid=155 devtype=DISK 
通道 ORA_DISK_1: 启动数据文件副本 
。。。 
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:01 
通道 ORA_DISK_1: 启动数据文件副本 
复制备用控制文件 
输出文件名 = D:\BAK\STANDBY.CTL 标记 = TAG20070315T144240 recid = 40 时间戳 =
61
7294620 
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:01 
完成 backup 于 15-3 月 -09
RMAN> 
打开数据库
SQL> ALTER DATABASE OPEN; 
五、在备库中创建备库的重做日志 
1)、maximum protection 和 maximum availability 模式必须要求有备库的重做日志。数据传 
输模式建议采用 LGWR SYNC。 

Data Guard 可以更多地采用备库的重做日志恢复,而不仅仅是采用归档日志恢复。 
2)、确保从库的重做日志大小与主库的重做日志大小完全一致。 
3)、创建合适的重做日志组数量。 
      从库的重做日志组至少要比主库多一组。 
      通常情况下一个实例对应一个 thread。 
      推荐采用如下公式来计算重做日志组的个数。
 (maximum number of logfiles for each thread + 1) * maximum number of threads 
 采用这中方式可以减少由于备库重做日志不能被分配从而导致主库的日志读写进程 
(LGWR)的阻塞。 
 例如:主库每个 thread 有两个日志组,那么备库应该有 6 个重做日志组。 
 添加从库的日志组。
SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo04.log'
size 50m;
SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo05.log'
size 50m;
SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo06.log'
size 50m;
SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo07.log'
size 50m; 
4)、检查备用重做日志是否创建成功 
      在主库上执行
      SQL>alter system switch logfile; 
      然后从库查询
      SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM
V$STANDBY_LOG;

      GROUP#             THREAD#           SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
             4                 1                 0 NO   ACTIVE
             5                 1                 0 YES UNASSIGNED
             6                 1                 0 YES UNASSIGNED
             7                 1                 0 YES UNASSIGNED

六、配置 listener.ora 和 tnsnames.ora。
listener.ora
SID_LIST_LISTENER =
   (SID_LIST =
      (SID_DESC =
         (SID_NAME = PLSExtProc)
         (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
         (PROGRAM = extproc)
      )
      (SID_DESC =
          (GLOBAL_DBNAME = auxdb) 

       (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
       (SID_NAME = auxdb)
      )
    (SID_DESC =
       (GLOBAL_DBNAME = orcl)
       (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
       (SID_NAME = orcl)
      )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.199)(PORT = 1521))
    )
  )

tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.199)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

aux =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.199)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED) 

       (SID = auxdb)
     )
  )

七、修改从库的 pfile,并将其同步到 spfile 
从库:auxdb
initauxdb.ora
*.db_name=orcl
*.db_unique_name=auxdb
*.DB_FILE_NAME_CONVERT=('d:\oracle\product\10.2.0\oradata\orcl','d:\bak')
*.LOG_FILE_NAME_CONVERT=('d:\oracle\product\10.2.0\oradata\orcl','d:\bak')
*.control_files='D:\bak\standby.CTL'
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.compatible='10.2.0.1.0'
*.db_block_size=8192
*.sga_target=250000000
*.background_dump_dest=d:\bak\bdump
*.core_dump_dest=d:\bak\cdump
*.user_dump_dest=d:\bak\udump
*.standby_archive_dest='d:\bak\standbyarchive'
 *.fal_server='orcl'
 *.fal_client='aux'
 *.standby_file_management='AUTO'
*.log_archive_config='dg_config=(orcl,auxdb)'
*.log_archive_dest_1='location=D:\bak\archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=auxdb'
*.LOG_ARCHIVE_DEST_2='SERVICE=orcl LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'

SQL> create spfile from pfile; 
文件已创建。

SQL> startup mount; 
ORACLE 例程已经启动。
Total System Global Area     251658240 bytes
Fixed Size                       1248380 bytes
Variable Size                  83886980 bytes
Database Buffers              163577856 bytes
Redo Buffers                     2945024 bytes 
数据库装载完毕。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT
FROM SESSION; 
数据库已更改。 

验证是否成功: 
主库:
SQL> ALTER SYSTEM SWITCH LOGFILE; 
系统已更改。
SQL> 
从库:
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG
ORDER BY SEQUENCE#;
 SEQUENCE# FIRST_TIME                        NEXT_TIME
---------- -------------- -------------- 
             1 15-3 月 -07             15-3 月 -09
                        ... 
            25 15-3 月 -07             15-3 月 -09

已选择 17 行。 
主库:
SQL> ALTER SYSTEM SWITCH LOGFILE; 
系统已更改。 
从库:
SQL> SELECT SEQUENCE#, FIRST_TIME,                               NEXT_TIME,APPLIED          FROM
V$ARCHIVED_LOG ORDER BY SEQUENCE#
 SEQUENCE# FIRST_TIME                        NEXT_TIME       APP
---------- -------------- -------------- --- 
             1 15-3 月 -07             15-3 月 -09    NO 
                              。。。 
            24 15-3 月 -07             15-3 月 -09    YES 
            25 15-3 月 -07             15-3 月 -09     YES 
            26 15-3 月 -07             15-3 月 -09    YES

已选择 18 行。

至此创建成功

八、下面进行主备数据库的切换测试。

1、查看主库上有没有设置 standby_archive_dest/standby_file_management 如果没有的话就需 
要设置
SQL> alter system set
standby_archive_dest='D:\oracle\product\10.2.0\oradata\orcl\standbyarchive' scope=both;
SQL> alter system set standby_file_management='auto' scope=both; 
系统已更改。
SQL> show parameter standby

NAME                                                 TYPE        VALUE 

------------------------------------ ----------- ------------------------------
standby_archive_dest string                                          D:\oracle\product\10.2.0\orada
                                                                          ta\orcl\standbyarchive
standby_file_management                               string           AUTO 
2、查看切换状态,正常应该是 TO STANDBY
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE

SQL> 
此时需要进行一些处理 
查看都有那些 session 处于 active
SQL> SELECT SID, PROCESS, PROGRAM FROM V$SESSION WHERE TYPE = 'USER'
AND SID <>
(SELECT DISTINCT SID FROM V$MYSTAT);

 SID PROCESS               PROGRAM
---- ---------- ---------------
 148 2660:2244          plsqldev.exe
 154 2660:2244          plsqldev.exe
 158 2660:2244          plsqldev.exe

SQL> 
1)、由于是 plsql 连接的,我们可以将其关闭
SQL> SELECT SID, PROCESS, PROGRAM FROM V$SESSION WHERE TYPE = 'USER'
AND SID <>
(SELECT DISTINCT SID FROM V$MYSTAT);

未选定行

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
TO STANDBY

SQL> 
此时就可以进行切换了。
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 
2)、其它方法 
更改 job_queue_processes 为 0
SQL> show parameter job_queue_processes 

NAME                                                       TYPE                 VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 10

SQL> alter system set job_queue_processes=0;

SQL> SELECT SID, PROCESS, PROGRAM FROM V$SESSION WHERE TYPE = 'USER'
AND SID <>
(SELECT DISTINCT SID FROM V$MYSTAT);

 SID PROCESS               PROGRAM
---- ---------- ---------------
 148 2660:2244          plsqldev.exe
 154 2660:2244          plsqldev.exe
 158 2660:2244          plsqldev.exe

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE

通常会影响切换的进程有
进程名             描述                                解决方法
CJQ0               job 队列进程                        将 JOB_QUEUE_PROCESSES 动态改为 0, 
                                                     但是不要改 spfile
QMN0               高级队列时间管理器                  将 AQ_TM_PROCESSES 动态改为 0,但是 
                                                     不要改 spfile
DBSNMP             oem 的代理                          执行 emctl stop agent 停止代理

此时必须执行以下语句切换。
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH
SESSION SHUTDOWN; 
3、将主数据切换为备用数据库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH
SESSION SHUTDOWN;

数据库已更改。 
4、关闭数据库并以 mount 模式启动数据库
SQL> shutdown immediate 
ORA-01507: 未装载数据库 
ORACLE 例程已经关闭。
SQL> startup mount; 

ORACLE 例程已经启动。
Total System Global Area           167772160 bytes
Fixed Size                              1247900 bytes
Variable Size                         75498852 bytes
Database Buffers                      88080384 bytes
Redo Buffers                            2945024 bytes 
数据库装载完毕。 
5、查看数据库切换后的状态
SQL> select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;
PROTECTION_MODE                        DATABASE_ROLE
-------------------- ----------------
MAXIMUM PERFORMANCE PHYSICAL STANDBY

6、将备用数据切换到主数据库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 
数据库已更改。

SQL> ALTER DATABASE OPEN;

数据库已更改。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO STANDBY

SQL>       select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;
PROTECTION_MODE                        DATABASE_ROLE
-------------------- ----------------
MAXIMUM PERFORMANCE PRIMARY
SQL> 
至此主备数据库的切换已经成功。

九、从 MAXIMUM PERFORMANCE 到 MAXIMUM PROTECTION 的切换。
SQL>select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PERFORMANCE
SQL>shutdown immediate;
SQL>startup mount
SQL> alter system set log_archive_dest_2='SERVICE=aux LGWR SYNC                       AFFIRM
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=auxdb'
scope=both;
SQL>alter database set standby database to maximize protection;
SQL>alter database open; 

SQL> select protection_mode from v$database;
PROTECTION_MODE
--------------------
MAXIMUM PROTECTION 
模式切换的完全的语法如下:
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION |
AVAILABILITY | PERFORMANCE}

在切换测试中经常遇到问题:
ARC0 started with pid=15, OS id=2596
LGWR: Primary database is in MAXIMUM PROTECTION mode
LGWR: Destination LOG_ARCHIVE_DEST_2 is using asynchronous network I/O
LGWR: Destination LOG_ARCHIVE_DEST_1 is not standby database serviced by LGWR
LGWR: Minimum of 1 synchronous standby database required
Thu Mar 22 15:01:48 2007
Errors in file d:\oracle\product\10.2.0\admin\orcl\bdump\orcl_lgwr_2392.trc:
ORA-16072: a minimum of one standby database destination is required

ORA-16086: standby database does not contain available standby log files

出现该错误原因是: 
1、primary database 的模式是 MAXIMUM PROTECTION 
将其改为 maximum performance 即可 
2、standby 缺少 standby redo 
3、LOG_ARCHIVE_DEST_2 参数设置不正确
*.log_archive_dest_2='service=aux OPTIONAL LGWR                              SYNC   AFFIRM
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=auxdb' 
尤其要注意是 SYNC 还是 ASYNC,这两个完全不同,一个是同步一个是不同步。

MAXIMUM PROTECTION 模式下 primary、standby 库的相互切换

1、查看 orcl 库的相关信息 
orcl 库:
SQL> startup 
ORACLE 例程已经启动。

Total System Global Area      167772160 bytes
Fixed Size                         1247900 bytes
Variable Size                    75498852 bytes
Database Buffers                 88080384 bytes
Redo Buffers                       2945024 bytes 
数据库装载完毕。 
数据库已经打开。
SQL> select protection_mode from v$database; 

PROTECTION_MODE
--------------------
MAXIMUM PROTECTION

SQL> alter database commit to switchover to physical standby;
alter database commit to switchover to physical standby

第 1 行出现错误: 
ORA-01093: ALTER DATABASE CLOSE 仅允许在没有连接会话时使用 
错误原因:此时 orcl 库有连接的会话,将其关闭即可。

SQL> alter database commit to switchover to physical standby;

数据库已更改。

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SELECT SWITCHOVER_STATUS FROM V$DATABASE
                                          * 
第 1 行出现错误: 
ORA-01507: 未装载数据库

SQL> shutdown immediate 
ORA-01507: 未装载数据库

ORACLE 例程已经关闭。
SQL> startup mount; 
ORACLE 例程已经启动。

Total System Global Area           167772160 bytes
Fixed Size                             1247900 bytes
Variable Size                         79693156 bytes
Database Buffers                      83886080 bytes
Redo Buffers                            2945024 bytes 
数据库装载完毕。 
查看 orcl 库的状态,已经成功的切换到备库。
SQL> select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;

PROTECTION_MODE                       DATABASE_ROLE
-------------------- ----------------
MAXIMUM PROTECTION                     PHYSICAL STANDBY

SQL> 

2、查看 auxdb 库的相关信息 
auxdb 库: 
准备将其切换到主库状态。
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY

第 1 行出现错误: 
ORA-16139: 需要介质恢复

SQL> alter database recover managed standby database;

数据库已更改。

SQL>       ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

数据库已更改。

成功切换到主库状态。
SQL> select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;

PROTECTION_MODE                       DATABASE_ROLE
-------------------- ----------------
MAXIMUM PROTECTION                     PRIMARY 
打开数据库出错
SQL> alter database open;
alter database open

第 1 行出现错误: 
ORA-03113: 通信通道的文件结束 
修改参数 log_archive_dest_2
*.log_archive_dest_2='SERVICE=orcl                OPTIONAL   LGWR   SYNC   AFFIRM
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'
SQL> conn /as sysdba 
已连接到空闲例程。
SQL> conn /as sysdba 
已连接到空闲例程。
SQL> create spfile from pfile; 
文件已创建。
SQL> startup 
ORACLE 例程已经启动。

Total System Global Area           251658240 bytes
Fixed Size                             1248380 bytes
Variable Size                         83886980 bytes 

Database Buffers              163577856 bytes
Redo Buffers                     2945024 bytes 
数据库装载完毕。 
ORA-03113: 通信通道的文件结束 
仍然出错,错误如下:
alert_auxdb.log
Errors in file d:\bak\bdump\auxdb_lgwr_2040.trc:
ORA-16086: standby database does not contain available standby log files

Thu Mar 22 16:37:37 2007
LGWR: Error 16086 verifying archivelog destination LOG_ARCHIVE_DEST_2
Thu Mar 22 16:37:37 2007
Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED
LGWR: Error 16086 disconnecting from destination LOG_ARCHIVE_DEST_2 standby host
'orcl'
LGWR: Continuing...
LGWR: Minimum of 1 applicable standby database required
Thu Mar 22 16:37:41 2007
Errors in file d:\bak\bdump\auxdb_lgwr_2040.trc:
ORA-16072: a minimum of one standby database destination is required

由于以上的经验可以确定是从库没有 standby redo

3、在 orcl 库中创建 standby redo 
orcl 库:
SQL> alter database add standby logfile 'd:\oracle\product\10.2.0\oradata\orcl\r
edo04.log' size 50m; 
数据库已更改。
SQL> alter database add standby logfile 'd:\oracle\product\10.2.0\oradata\orcl\r
edo05.log' size 50m; 
数据库已更改。
SQL> alter database add standby logfile 'd:\oracle\product\10.2.0\oradata\orcl\r
edo06.log' size 50m; 
数据库已更改。
SQL> alter database add standby logfile 'd:\oracle\product\10.2.0\oradata\orcl\r
edo07.log' size 50m; 
数据库已更改。
SQL>

4、打开 auxdb 库 
auxdb 库:
SQL> conn /as sysdba 
已连接到空闲例程。
SQL> create spfile from pfile; 

文件已创建。
SQL> startup 
ORACLE 例程已经启动。
Total System Global Area           251658240 bytes
Fixed Size                             1248380 bytes
Variable Size                         83886980 bytes
Database Buffers                    163577856 bytes
Redo Buffers                            2945024 bytes 
数据库装载完毕。 
数据库已经打开。

SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
auxdb
SQL> select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;

PROTECTION_MODE                       DATABASE_ROLE
-------------------- ----------------
MAXIMUM PROTECTION                     PRIMARY
SQL> 
至此切换已经成功。

十、参数说明: 
COMPATIBLE='10.2.0.1.0':数据库版本号,主库与从库要统一,否则有可能 redo 的数据不能 
从主库传送到从库。 
DB_FILE_NAME_CONVERT=主库数据文件地址,从库数据文件地址:用于主从库在同一台 
机器上或主从库数据文件的路径不一致的情况下 
DB_UNIQUE_NAME=: 数 据 库 的 唯 一 名 称 。 推 荐 使 用 , 如 果 使 用 了 
LOG_ARCHIVE_CONFIG,那么就必须有改参数。 
FAL_CLIENT=,指向从库的服务名,本例为 aux 
FAL_SERVER 指向主库的服务名,本例为 orcl 
LOG_ARCHIVE_CONFIG='DG_CONFIG=(主库的 db_unique_name,从库的 db_unique_name)' 
LOG_ARCHIVE_DEST_n:日志归档的地址,最少需要两个,一个指向主库,另一个指向从 
库 
LOG_ARCHIVE_DEST_STATE_n ={ENABLE|DEFER|ALTERNATE|RESET} 指定:enable or 
disable 来决定是否传输 redo 的数据到从库中。 
LOG_FILE_NAME_CONVERT:同 DB_FILE_NAME_CONVERT 
STANDBY_ARCHIVE_DEST:指定路径存放接收从主库传输过来的归档日志。 
STANDBY_FILE_MANAGEMENT={AUTO|MANUAL} :AUTO 当主库添加或减少数据文件 
时会自动同步从库而不需要手动干预。

十一、经常遇到错误: 
错误 1: 

ORA-16057: DGID from server not in Data Guard configuration 
原因:主库没有设置参数 log_archive_config 
解决方法*.log_archive_config='dg_config=(orcl,auxdb)'
 alter system set log_archive_config='dg_config=(orcl,auxdb)' scope=both;

错误 2:
PING[ARC0]: Heartbeat failed to connect to standby 'aux'. Error is 1031.
ORA-01031: insufficient privileges 
解决问题思路:1、检查 sys 密码是否正确,大部分是这个原因。 
 2、Oracle 用户有写 standby_archive_dest 的权限 
错误 3:
ORA-16025: parameter LOG_ARCHIVE_DEST_2 contains repeated or conflicting attributes 
出 现 该 错 误 的 原 因 是 LOG_ARCHIVE_DEST_2='SERVICE=orcl LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' 
db_unique_name 前少了一个空格导致的

十二、维护故障解决: 
故障 1 
由于网络等原因导致归档日志没有全部传输到从库中,这些需要我们手动干预。 
常见因素:从库关闭、网络故障、从库空间不足等。 
维护的通常步骤;关闭:先关主库后关从库,启动:先启动从库然后启动主库。 
关于日志传输的控制可以通过 MANDATORY、REOPEN、MAX_FAILURE 来控制 
MANDATORY REOPEN=5 MAX_FAILURE=3 每 5 秒重试一次,最大允许错误次数为 3 次, 
如果重试 3 次仍然不能成功,那么主库的日志传输服务就会停止。
*.log_archive_dest_2='service=AUX VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
MANDATORY REOPEN=5 MAX_FAILURE=3 DB_UNIQUE_NAME=auxdb'

1、查找不在 standby 的日志。
SQL> SELECT MAX(R.SEQUENCE#) LAST_SEQ_RECD, MAX(L.SEQUENCE#)
LAST_SEQ_SENT FROM
2> V$ARCHIVED_LOG R, V$LOG L WHERE
3> R.DEST_ID=2 AND L.ARCHIVED='YES';
LAST_SEQ_RECD LAST_SEQ_SENT
------------- -------------
7 10 
2、查找 primary 的所在路径
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1
AND
2> SEQUENCE# BETWEEN 7 AND 10;
NAME
--------------------------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc
/primary/thread1_dest/arcr_1_8.arc
/primary/thread1_dest/arcr_1_9.arc 

3 、 将 日 志               copy      到 standby 的 STANDBY_ARCHIVE_DEST 下 , 将 
STANDBY_ARCHIVE_DEST 的日志 copy 到 LOG_ARCHIVE_DEST 下 
4、
SQL> STARTUP MOUNT
SQL> ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT
FROM SESSION; 
至此恢复成功。

故障 2: 
归档日志之间经常产生 gap,还没有理解与故障 1 的区别,如有谁知道请告知。Mail:
jxwpx@163.com 
1、确认归档日志之间有无遗漏
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE#                            FROM
V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
1 90 92 
2、将遗漏的归档日志 copy 到备库的 standby_archive_dest 下 
然后对其分别注册
ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 
3、恢复归档日志
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 
4、然后就可以按切换步骤进行切换了。









本文转自 jxwpx 51CTO博客,原文链接:http://blog.51cto.com/jxwpx/196961,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Oracle 关系型数据库 Linux
服务器Centos7 静默安装Oracle Database 12.2
服务器Centos7 静默安装Oracle Database 12.2
86 0
|
4月前
|
Oracle 关系型数据库 数据库
windows Oracle Database 19c 卸载教程
打开任务管理器 ctrl+Shift+Esc可以快速打开任务管理器,找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前,确保数据库服务已经停止。你可以使用以下命令停止数据库服务: net stop OracleServiceORCL Universal Installer 卸载Oracle数据库程序 一般情况运行Oracle自带的卸载程序,如使用Universal Installer 工具卸载。 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击Universal Installer。 点击之后稍等一会然后会进入进入下图界面,点击卸载产品。 选中要删除的Orac
118 1
|
5月前
|
存储 Oracle 关系型数据库
windows 使用 Oracle Database 19c
Oracle数据库是由美国Oracle Corporation(甲骨文公司)开发和提供的一种关系型数据库管理系统,它是一种强大的关系型数据库管理系统(RDBMS)。它使用表格(表)组织和存储数据,通过SQL语言进行数据管理。数据以表格形式存储,表之间可以建立关系。支持事务处理、多版本并发控制、安全性和权限控制。具有高可用性、容错性,支持分布式数据库和可扩展性。Oracle Corporation提供全面的支持和服务,使其成为企业级应用的首选数据库系统。
60 0
|
10月前
|
Oracle 关系型数据库 Linux
服务器Centos7 静默安装Oracle Database 12.2(下)
服务器Centos7 静默安装Oracle Database 12.2(下)
238 0
|
10月前
|
Oracle 安全 关系型数据库
服务器Centos7 静默安装Oracle Database 12.2(上)
服务器Centos7 静默安装Oracle Database 12.2(上)
93 0
|
10月前
|
存储 Oracle 关系型数据库

推荐镜像

更多