`
java_beginner_liyun
  • 浏览: 73175 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

创建Oracle 的Data 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 2007
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 月 -07
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 月 -07
...
25 15-3 月 -07 15-3 月 -07
已选择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 月 -07 NO
。。。
24 15-3 月 -07 15-3 月 -07 YES
25 15-3 月 -07 15-3 月 -07 YES
26 15-3 月 -07 15-3 月 -07 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 的区别
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、然后就可以按切换步骤进行切换了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics