1. 在主数据库(primary database)上启用强制生成日志
SQL>shutdown immediate;
SQL>startup mount;
--修改为归档模式
SQL>alter database archivelog;
SQL>alter database open;
--设置强制归档模式
SQL> alter database force logging;
注:查看命令:select log_mode,force_logging from v$database
查看是否归档命令:Archive log list
2. 在主数据库上设置本地的归档路径、设置归档进程自动启动
SQL> alter system set log_archive_dest_1='LOCATION=c:/oracle/oradata/GORACLE/archive MANDATORY'
scope=spfile;
SQL> alter system set log_archive_start=true scope=both;
SQL> alter system set remote_archive_enable=’SEND’ scope=spfile; --切换时,要修改成RECEIVE
SQL> alter system set fal_server=’STANDBYDB’ scope=both;
SQL> alter system set fal_client=’PRIMARYDB’ scope=both;
SQL> alter system set standby_archive_dest='c:\oracle\oradata\GORACLE\rmarc' scope=both;
SQL> alter system set standby_file_management=’AUTO’ scope=both;
注:后几个参数,主备切换后会用到。
3. 获取主数据库数据文件信息
SQL> select name from v$datafile;
4. 拷贝主数据库数据文件
1)停止主数据库
SQL> shutdown immediate;
2)拷贝数据文件到临时位置
3)重启主数据库
SQL> startup;
5. 在主数据库为备用数据库创建控制文件(standby专用的控制文件)
SQL> alter database create standby controlfile as 'c:/standbycontrol01.ctl';
6. 在主数据库为备用数据库准备初始化参数文件
SQL> create pfile='c:/initGORACLE.ora' from spfile;
7. 从主数据库拷贝文件到备用服务器(包含:数据文件拷贝、备用控制文件、初始化参数文件和口令文件)
注:standbycontrol01.ctl文件放置到c:/oracle/oradata/GORACLE目录中,并复制一份为standbycontrol02.ctl,与下面的参数文件修改对应。
8. 在备用服务器上修改初始化参数文件(从主库上拷过来的initGORACLE.ora)
*.control_files='c:/oracle/oradata/GORACLE/standbycontrol.ctl01',’c:/oracle/oradata/GORACLE/standbycontrol02.ctl'
*.standby_archive_dest=' c:/oracle/oradata/GORACLE/rmarc'
*.standby_file_management=AUTO
*.remote_archive_enable=TRUE
*.fal_server=’PRIMARYDB’
*.fal_client=’STANDBYDB’
*.remote_archive_enable=’RECEIVE’
*.log_archive_dest_2='SERVICE=PRIMAYDB LGWR SYNC AFFIRM'
注:修改控制文件名称,设置备库专用的归档路径以及一些相关的参数,注意主备切换时需要使用Alter Database 将参数remote_archive_enable修改为’SEND’;最后一个参数主备切换后才会用到。
9. 在备用服务器上仅安装数据库软件,不创建数据库,然后手动创建Oracle服务(for windows)
c:\> oradim -NEW -SID GORACLE -STARTMODE a
注:需要配置环境变量ORACLE_SID=GORACLE
10. 在主、备服务器上创建监听
使用Oracle Net Manager或直接修改listener.ora文件
11. 在备用服务器上允许连接死锁检测
修改SQLNET.ORA文件,增加如下行:
SQLNET.EXPIRE_TIME=2
12. 在主、备服务器上创建Oracle Net服务名
使用Oracle Net Manager或直接修改tnsname.ora文件,两个服务器上都定义两个别名:PRIMARYDB、STANDBYDB,分别指向主库和备库。设置好后,可以使用tnsping命令检查一下。防火墙有时会影响数据库的连通。
13. 在备用服务器上创建SPFILE
SQL> create spfile from pfile='c:\initGORACLE.ora';
注:使用修改过的pfile创建spfile。此时数据库还没有启动,若已启动请关闭shutdown immediate,这样就不用每次启动的时候指定pfile参数了。
14. 启动备用数据库为挂载备库模式
SQL> startup nomount;
SQL> alter database mount standby database;
15. 在备用服务器上启动日志传送服务
SQL> alter database recover managed standby database disconnect from session;
16. 在主数据库上启动归档到备用数据库
1)设置归档初始化参数
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=STANDBYDB LGWR ASYNC ' scope=both;
-- STANDBYDB为前面配置的别名
--可增加配置属性:VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE),在主备切换的时候有用,其格式为:
VALID_FOR(redo_log_type,database_role)
--redo_log_type: online_logfile, standby_logfile, all_logfiles
--database_role:primary_role, standby_role, all_roles
--一句话总结:当配置有VALID_FOR的数据库处于指定的database_role时,允许归档redo_log_type到log_archive_dest_n所配置的路径。
SQL> alter system set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both;
2)归档当前日志
SQL> alter system archive log current;
17. 检验物理备用数据库
1)在备用服务器上查看已有归档日志
SQL> select sequence#,first_time,next_time from v$archived_log order by sequence#;
注:可使用alter session set nls_date_format=’yyyy-mm-dd hh:mi:ss’命令,修改日期显示格式,便于观察
2)在主服务器上归档当前日志
SQL> alter system archive log current;
3)在备用数据库上验证新归档日志已收到
SQL> select sequence#,first_time,next_time from v$archived_log order by sequence#;
4)在备用数据库上验证新归档日志已应用
SQL> select sequence#,first_time,next_time,applied from v$archived_log order by sequence#;
注:也可以直接检查硬盘上眼归档目录中的归档文件。
如果备库中归档日志生成,则证明配置成功。
二、切换管理角色(正常切换)
--切换的时候,先主后备
将原standby数据库改为MAXIMIZE PERFORMANCE (这个是默认值,先检查一下,如果是就不用切换了)
alter database set standby database to maximize performance;
1) 检查切换是否可行
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
TO STANDBY
1 row selected
--据说TO STANDBY、SESSION ACTIVE都可以
2) 切换原主库为备库
SQL> alter database commit to switchover to physical standby ;
若是SESSION ACTIVE状态,带上with session shutdown
SQL> alter database commit to switchover to physical standby with session shutdown ;
3)关闭原主库数据库,启动为standby模式
--如果设置了remote_archive_enable=’SEND’,要修改成’RECEIVE’
SQL> alter database set remote_archive_enable=’SEND’ scope=both;
SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter database mount standby database;
4 )检查原主库的切换结果
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
SWITCHOVER PENDING
1 row selected
5)将原备库切换成主库
SQL>alter database recover managed standby database cancel;
SQL>alter database recover managed standby datbase finish;
SQL>alter database commit to switchover to primary;
修改remote_archive_enable参数
SQL>alter database set remote_archive_enable=’SEND’ scope=both;
6)关闭原备库、重启
SQL> shutdown immediate;
SQL> startup;
若出错
ORA-16072: a minimum of one standby database destination is required
设置远程归档路径
log_archive_dest_2='SERVICE=PRIMARYDB LGWR MANDATORY REOPEN=60'
7)启动日志恢复服务
SQL> alter database recover managed standby database disconnect from session;
8)检查日志接收情况
SQL> alter system archive log current;
三、失败接管步骤
1)检查有无归档裂隙,若有须先去除
SQL> select thread#, low_sequence#, high_sequence# from v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
1 90 92
上面的例子中,线程1的日志为90至92,补全缺失的日志(从主库或其它备库),然后注册这些日志。若有多个线程,其它线程缺失的日志也要补全、注册。
SQL> alter database register physical logfile ’filespec1’;
2)补全缺失的归档日志
SQL> SELECT distinct thread# as thread, max(sequence#) over (partition by thread#) as last FROM v$archived_log;
THREAD LAST
1 147
把大于最大日志号(例子中是147)的归档日志也补全、注册,同样每个线程的都要进行。
SQL> select name from v$archived_log where thread#=1 and sequence#=147;
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE ’filespec1’;
3)执行失败接管
若有standby redo日志,执行
SQL> alter database recover managed standby database finish;
否则执行
SQL> alter database recover managed standby database finish skip standby logfile;
4)切换原备库为主库
SQL> alter database commit to switchover to primary;
SQL>alter database set remote_archive_enable=’SEND’ scope=both;
根据需要,修改log_archive_dest_2等归档参数
若执行该命令出错,按下面方式处理
SQL> alter database commit to switchover to primary;
alter database commit to switchover to primary error at line 1:
ORA-16139: media recovery required
可以把数据库置于managed recovery 的状态
SQL> alter database recover managed standby database disconnect from session;
SQL> alter database recover managed standby database finish skip standby logfile;
SQL> alter database commit to switchover to primary;
5)准备新的备库,接收日志
6)重启新的主库(也就是刚切换成的)
7)备份新的主库
实践中发现:
如果把一个正常运行的数据库(或者没有备库的主库),直接切换成从库:
Alter database commit to switchover to physical standby with session shutdown;
会收到:ORA-16014、00312两个错误。
应该是切换之后,之日志没有地方写,报的错??(可能是这样,这个不知具体原因)
四、其它常用的命令
1. 创建Standby Redo Logs
1)检验Standby redo logs的方法
SQL> select * from v$standby_log;
SQL> select * from v$logfile where type='STANDBY';
2)在主、备数据库分别创建比联机日志多至少一组的Standby redo log(在主机作standby redo log 是为了作switchover时候用,不是必须的);
standby redo log的大小应该跟online redo log的大小相等(使用select GROUP#,BYTES,MEMBERS,STATUS from v$log命令查看);
SQL> alter database recover managed standby database cancel;
SQL> alter database add standby logfile ('c:\oracle\oradata\GORACLE\stdlog01.tdo') size 100M;
SQL> alter database add standby logfile ('c:\oracle\oradata\GORACLE\stdlog02.tdo') size 100M;
SQL> alter database add standby logfile ('c:\oracle\oradata\GORACLE\stdlog03.tdo') size 100M;
SQL> alter database add standby logfile ('c:\oracle\oradata\GORACLE\stdlog04.tdo') size 100M;
查看加入的standby数据库是否开始使用的方法(在maximize PERFORMANCE下不用该日志,也可以反过来理解,maximize PERFORMANCE模式下,不要求使用该日志):
在primary库上调用log switch(ALTER SYSTEM SWITCH LOGFILE),然后在备用库上查看V$STANDBY_LOG视图。
SELECT group#,thread#,sequence#,archived,status FROM v$standby_log;
3)如果控制文件中的MAXLOGFILES参数值太小,无法增加足够的日志组的话,需要重建数据库或控制文件。 SQL> alter database backup controlfile to trace;
将在admin/orcl/udump目录下生成新的trace文件,打开该文件可获得在主/备数据库上分别重建控制文件的脚本。按照其指示执行即可。
2. 在主数据库修改数据保护模式的方法
1)设置初始化参数
SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=STANDBYDB LGWR ASYNC' scope=spfile;
2)数据库重新打开为排他模式装载
SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter database mount exclusive;
3)修改保护模式(任选一种模式)
SQL>alter database set standby database to maximize {PROTECTION | AVAILABILITY | PERFORMANCE}
--最大保护模式、最大可用性模式、最大性能模式
4)打开数据库
SQL> alter database open;
5)检查保护模式的方法
SQL> select database_role,protection_mode,protection_level from v$database;
3. 监视重作日志归档情况
1)确定当前重作日志顺序号
SQL> select thread#,sequence#,archived,status from v$log;
2)确定最近的归档重作日志
SQL> select max(sequence#) from v$archived_log;
3)确定每个目的地的最近归档日志
SQL> select destination,status,archived_thread#,archived_seq# from v$archive_dest_status
where status <> 'DEFERRED' and status<>'INACTIVE';
4)查看某特殊位置日志是否收到
SQL> select dest_id from v$archive_dest;
SQL> select local.thread#,local.sequence# from
(select thread#,sequence# from v$archived_log where dest_id=1)
local where
local.sequence# not in
(select sequence# from v$archived_log where dest_id=2 and thread#=local.thread#);
5)跟踪备用站点的归档日志进程
在主、备数据库设置初始化参数log_archive_trace
4. 监视恢复进程
SQL> SELECT process, status, thread#, sequence#, block#, blocks
FROM v$managed_standby;
5. 日志应用服务
1)启动/停止日志应用服务
SQL> alter database start logical standby apply;
SQL> alter database stop logical standby apply;
2)确认重做日志已应用V$LOGSTDBY、DBA_LOGSTDBY_PROGRESS
SQL> column status format A50
SQL> column type format A12
SQL> select type,high_scn,status from v$logstdby;
SQL> select applied_scn,newest_scn from dba_logstdby_progress;
3)修补归档间隙
SQL> select * from v$archive_gap;
SQL> select name from v$archived_log where thread#=1 dest_id=1 and sequence# between 7 and 10;
SQL> alter database register logfile '/physical_standby1/thread1_dest/arcr_1_7.arc';
然后重启管理恢复操作(见前面的命令)
6. 监视物理备用数据库日志应用服务
SQL> select process,status,thread#,sequence#,block#,blocks from v$managed_standby;
SQL> select archived_thread#,archived_seq#,applied_thread#,applied_seq# from v$archive_dest_status;
SQL> select registrar,creator,thread#,sequence#,first_change#,next_change# from v$archived_log;
SQL> select thread#,sequence#,first_change#,next_change# from v$log_history;
SQL> select message from v$dataguard_status;
SQL> select file_name,sequence#,first_change#,next_change#,timestamp,dict_begin,dict_end,thread#
from dba_logstdby_log order by sequence#;
SQL> select applied_scn,newest_scn from dba_logstdby_progress;
SQL> alter session set NLS_DATA_FORMAT='DD-MON-YY HH24:MI:SS';
SQL> select l.sequence#,l.first_time,(case when l.next_change# < p.read_scn then 'yes'
when l.first_change# < p.applied_scn then 'current'
else 'no' end) applied
from dba_logstdby_log l, dba_logstdby_progress p
order by sequence#;
SQL> column status format a50
SQL> column type format a12
SQL> select type,high_scn,status from v$logstdby;
SQL> column name format a35
SQL> column value format a35
SQL> select name,value from v$logstdby_status where name like 'coordinatior%' or name like 'transactions%';