Oracle11G DataGard学习以及线上修复standby库的经历总结

知识准备储备工作

1·准备工作
1.1 检查

打开Forced Logging模式通过 SELECT FORCE_LOGGING FROM V$DATABASE;查看yes就已经打开了

SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
FOR
---
YES
SQL> ALTER DATABASE no force logging;
Database altered.
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
FOR
---
NO
1.2创建密码文件
1.3配置Standby Redo Log

添加Standby redo log的操作方式与online redo log几乎一模一样,
(1) alter database add standby logfile group 4(’/data/…/standbyrd01.log’) size 20M;
删除也同样简单

(2) alter database drop standby logfile group 4;
另外,从可靠性方面考虑,建议primary数据库也创建standby redologs,这样一旦切换,不会影响primary做为standby的正常工作。
验证standby redo log文件组是否成功创建
select group#, thread#, sequence#, archived, status from v$stanby_log;

1.4、设置初始化参数
1.5、确保数据库处于归档模式archive log list;

如果当前primary数据库未处于归档模式,通过如下命令将db设置成归档模式

start mount;
alter database archivelog;
alter database open;

2·创建物理standby
2.1 创建备份手工复制或者通过rman操作 – primary库操作
2.2 创建控制文件 – primary库操作
  alter database create standby controlfile as '/data/jsspdg01.ctl';
2.3 创建初始化参数文件

创建客户端初始化参数文件

 create pfile='/tmp/imdb.ora' from spfile;

修改初始化参数文件中的参数

2.4 复制文件到standby服务器

至少 3部分:数据文件,控制文件,修改过的初始化参数文件,注意路径。

2.5 配置standby数据库

简单步骤
1创建新的OracleService(windows环境下需要)
2创建密码文件,注意保持与primary一致
3配置监听并启动
4修改primary和standby的tnsnames.ora,各自增加对应的Net Service Name。

2.6 启动standby

注意:物理standby极少情况下可以以read-write模式打开,某些情况可以以read-only模式打开,默认情况下加载到mount状态即可。

 startup mount;

启动redo应用

  alter database recover managed standby database disconnect from session;

启动实时应用

  alter database recover managed standby database using current logfile disconnect from session;

disconnect session字句并非必须,该字句用于指定启动完应用后自动退出到命令操作符前,不指定的话,当前session就会一直停留处理redo应用,如果想做其他操作,就只能新建一个连接。

2.7停止standby

正常情况下,先停止redo应用,

alter database recover managed standby database calcel;

然后再停止standby数据库

shutdown immediate;


测试开始实际操作

[1] 查看同步情况:
 show parameter instance_name;
 -- primary 以及standby上执行查看
 select max(sequence#) from V$archived_log;
[2] 查看dg是否逻辑备份还是物理备份
 select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;

1 scp rman备份文件到standby库
su -l oracle -c "$BIN/rman target / msglog=$BACKUP_PATH/backlog/bakl$LEVEL.log cmdfile=/DATABASE/oracle/rmanbak/script/bak_level_$LEVEL"

/DATABASE/oracle/rmanbak/backlog/
/DATABASE/oracle/rmanbak/script/
2 备份控制文件
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby.ctl';
3 备份参数文件
create pfile='/tmp/imdb.ora' from spfile;
4检查并配置环境
#目录在 /DATABASE/oracle/rmantest/DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/

> mkdir -p /DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/
> cp /DATABASE/oracle/rmantest/DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/*
   /DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/

先查看/DATABASE/oracle/rmanbak/archlog是否存在,不存在则添加目录

> mkdir -p /DATABASE/oracle/rmanbak/archlog
> cp logl0_IMDB_1304_1_8onqlg57_20121119.bak /DATABASE/oracle/rmanbak/archlog

> mkdir -p /DATABASE/oracle/rmanbak/data
> cp level0_IMDB_1302_1_8mnqlfiu_20121119.bak /DATABASE/oracle/rmanbak/data
5 控制文件
# 目录在/DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/o1_mf_s_799719582_8bl2nzh6_.bkp
6 先取消同步
alter database recover management cancel #(命令我忘记了,大概就是这个)
RESTORE CONTROLFILE FROM AUTOBACKUP;
restore controlfile from backupset #(备份集的编号)

restore controlfile from backupset(/DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/o1_mf_s_799719637_8bl2popt_.bkp)
RESTORE CONTROLFILE FROM '/xx/xx.bak';
7 在主库上跑
rman
restore archivelog from time 'sysdate-15';

然后修改备库的参数,重启同步

cp /DATABASE/oracle/ORACLE11G/oradata/IMDB/control01.ctl /DATABASE/control01.ctl.20121123
cp /DATABASE/oracle/ORACLE11G/flash_recovery_area/IMDB/control02.ctl /DATABASE/control02.ctl.20121123



线上恢复standby从库

=============开始恢复standby数据库 begin ====

1. 关闭,重启db
rman> SHUTDOWN IMMEDIATE;

RMAN> startup nomount;
sql> #-- 查看db状态 select open_mode from v$database
 select status from v$instance;
2.先恢复初始化参数文件
RMAN> restore spfile to pfile '/DATABASE/oracle/ORACLE11G/11g/dbs/spfileIMDB.ora' from '/DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/o1_mf_s_799719637_8bl2popt_.bkp';

然后使用刚刚创建的参数文件重新启动到未加载状态(注意,你最好打开该参数文件,看一下路径是否都确实存在,或者是否正确。)

3.恢复控制文件并进入到加载状态
RMAN> restore controlfile from  '/DATABASE/oracle/ORACLE11G/flash_recovery_area/DG01/autobackup/2012_11_19/o1_mf_s_799719637_8bl2popt_.bkp';

RMAN> alter database mount;
4.修复数据库,我这里是源路径修复,如果你要恢复的文件地址与源库地址不同的话,需要通过SET NEWNAME FOR DATAFILE命令来为数据文件重新设定路径。
RMAN> restore database;

/DATABASE/oracle/ORACLE11G/arch
archived log file name=/DATABASE/oracle/ORACLE11G/arch/

5.恢复数据库
RMAN> recover database;
archived log file name=/DATABASE/oracle/ORACLE11G/arch/1_18174_771119325.dbf thread=1 sequence=18174
unable to find archived log
archived log thread=1 sequence=18175
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 11/25/2012 22:36:41
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 18175 and starting SCN of 61579926652

在sqlplus窗口执行:

alter database register or replace logfile '/DATABASE/oracle/ORACLE11G/arch/1_18175_771119325.dbf';
sql  'alter database register or replace logfile '/DATABASE/oracle/ORACLE11G/arch/1_18175_771119325.dbf/'';

Sun Nov 25 23:14:12 2012
RFS[12]: Assigned to RFS process 16280
RFS[12]: Database mount ID mismatch [0x5857d13d:0x58730296] (1482150205:1483932310)
RFS[12]: Not using real application clusters
Errors in file /DATABASE/oracle/ORACLE11G/diag/rdbms/dg02/IMDB/trace/IMDB_rfs_16280.trc:
ORA-16009: 重做传输目标无效

#-- 1482150205和主库从库的dbid不一致,所以导致归档传输报错。开始诊断

rman> SHUTDOWN IMMEDIATE;
RMAN> startup mount;

alter database open;
# 报错,启动不起来
Sun Nov 25 23:44:25 2012
RFS[4]: Assigned to RFS process 18805
RFS[4]: Identified database type as 'physical standby': Client is LGWR SYNC pid 3137
Primary database is in MAXIMUM PERFORMANCE mode
SRL log 4 needs clearing because log has not been created
Errors in file /DATABASE/oracle/ORACLE11G/diag/rdbms/dg02/IMDB/trace/IMDB_rfs_18805.trc:
ORA-00367: 日志文件标头中的校验和错误
ORA-00315: 日志 4 (用于线程 0)标头中的线程 # 1 错误
ORA-00312: 联机日志 4线程 0: '/DATABASE/oracle/ORACLE11G/oradata/IMDB/standbyrd01.log'
SRL log 5 needs clearing because log has not been created
Errors in file /DATABASE/oracle/ORACLE11G/diag/rdbms/dg02/IMDB/trace/IMDB_rfs_18805.trc:
ORA-00367: 日志文件标头中的校验和错误
ORA-00315: 日志 5 (用于线程 0)标头中的线程 # 1 错误
ORA-00312: 联机日志 5线程 0: '/DATABASE/oracle/ORACLE11G/oradata/IMDB/standbyrd02.log'
RFS[4]: Selected log 6 for thread 1 sequence 18180 dbid 1454788955 branch 771119325
SRL log 4 needs clearing because log has not been created
Errors in file /DATABASE/oracle/ORACLE11G/diag/rdbms/dg02/IMDB/trace/IMDB_rfs_18798.trc:
ORA-00367: 日志文件标头中的校验和错误
ORA-00315: 日志 4 (用于线程 0)标头中的线程 # 1 错误
ORA-00312: 联机日志 4线程 0: '/DATABASE/oracle/ORACLE11G/oradata/IMDB/standbyrd01.log'
SRL log 5 needs clearing because log has not been created
Errors in file /DATABASE/oracle/ORACLE11G/diag/rdbms/dg02/IMDB/trace/IMDB_rfs_18798.trc:
ORA-00367: 日志文件标头中的校验和错误
ORA-00315: 日志 5 (用于线程 0)标头中的线程 # 1 错误
ORA-00312: 联机日志 5线程 0: '/DATABASE/oracle/ORACLE11G/oradata/IMDB/standbyrd02.log'
RFS[3]: Selected log 7 for thread 1 sequence 18179 dbid 1454788955 branch 771119325
Archived Log entry 5 added for thread 1 sequence 18179 ID 0x56b64d5b dest 1:

继续

#关闭数据库
sql> SHUTDOWN IMMEDIATE;

# 从备份集上面创建新的控制文件
sql> alter database create standby controlfile as '/DATABASE/oracle/ORACLE11G/oradata/IMDB/control03.ctl';


# 备份当前的控制文件
[root@im_17_2 DATABASE]# cp /DATABASE/oracle/ORACLE11G/oradata/IMDB/control01.ctl /home/
[root@im_17_2 DATABASE]# cp /DATABASE/oracle/ORACLE11G/flash_recovery_area/IMDB/control02.ctl /home

# 覆盖旧的控制文件
cp /DATABASE/oracle/ORACLE11G/oradata/IMDB/control03.ctl /DATABASE/oracle/ORACLE11G/flash_recovery_area/IMDB/control02.ctl
cp /DATABASE/oracle/ORACLE11G/oradata/IMDB/control03.ctl /DATABASE/oracle/ORACLE11G/oradata/IMDB/control01.ctl
至此基本搞定,问题原因是控制文件故障导致,所以重新覆盖控制文件。

-- 启动standby库
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1.3495E+10 bytes
Fixed Size                  2218032 bytes
Variable Size            6845106128 bytes
Database Buffers         6576668672 bytes
Redo Buffers               71471104 bytes
Database mounted.
SQL> select database_role from v$database
  2  ;

DATABASE_ROLE
--------------------------------
PHYSICAL STANDBY

SQL> alter database open;

Database altered.

SQL> select open_mode from v$database;

OPEN_MODE
----------------------------------------
READ ONLY

SQL> recover managed standby database using current logfile disconnect;
Media recovery complete.


-- check检查,主从上面执行下面sql语句。
select count(*) from openfire.fpsession;

【】在此过程中,请密切关注从库的alert报警日志:

(1) 报警日志:
    tail -f /DATABASE/oracle/ORACLE11G/diag/rdbms/dg02/IMDB/trace/alert_IMDB.log
(2) 查看是primary还是standby库:
    select database_role from v$database
    SQL> select database_role from v$database;
    DATABASE_ROLE
    --------------------------------
    PHYSICAL STANDBY
(3) 查看数据库启动状态:
    select open_mode from v$database;
(4) 查看数据库dbid
    select dbid from v$database;
(5) 查看报警日志路径:
    select value from v$diag_info where name ='Diag Alert';

找到value值中的上一级目录的trace目录下alert_$ORACLE_SID.log



6 将备库置于自动恢复状态
SQL〉
recover managed standby database disconnect from session;(这里就开始自动修复了)
7.然后通过open resetlogs方式打开数据库
RMAN> alter database open resetlogs;

操作记录,不足之处,欢迎大家指正,谢谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值