人为删除控制文件故障模拟

对于linux和unix环境,当前数据处于run的时候,某个controlfile人为删除是不影响数据库运行的,如下:

#### 删除controlfile

$ rm control01.ctl

删除后,alert日志并没有报错,数据库正常运行

在数据库执行以下操作:

SQL> alter system checkpoint;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;

alert日志对应的内容,数据库仍然能正常运行:

Sat May 14 07:52:39 2016
Thread 1 advanced to log sequence 64 (LGWR switch)
  Current log# 1 seq# 64 mem# 0: /u01/app/oracle/oradata/db11/redo01.log
Thread 1 advanced to log sequence 65 (LGWR switch)
  Current log# 2 seq# 65 mem# 0: /u01/app/oracle/oradata/db11/redo02.log
Thread 1 advanced to log sequence 66 (LGWR switch)
  Current log# 3 seq# 66 mem# 0: /u01/app/oracle/oradata/db11/redo03.log

因为其进程持有的句柄并有释放,如下:

$ ps -ef|grep ckpt|grep -v grep
ora11     4616     1  0 07:51 ?        00:00:00 ora_ckpt_db11
$ cd /proc/4616/fd
$ ls -ltr |grep control
lrwx------ 1 ora11 oinstall 64 May 14 07:55 257 -> /u01/app/oracle/oradata/db11/control02.ctl
lrwx------ 1 ora11 oinstall 64 May 14 07:55 256 -> /u01/app/oracle/oradata/db11/control01.ctl (deleted)

#### session 1 trace跟踪

$ strace -fr -o /tmp/4616.log -p 4616
Process 4616 attached - interrupt to quit
进程会一直hang在这个状态

#### session 2 进行redo切换

SQL> alter system switch logfile;
SQL> alter system switch logfile;

日志切换正常完成
Sat May 14 07:58:33 2016
Thread 1 advanced to log sequence 67 (LGWR switch)
  Current log# 1 seq# 67 mem# 0: /u01/app/oracle/oradata/db11/redo01.log
Thread 1 advanced to log sequence 68 (LGWR switch)
  Current log# 2 seq# 68 mem# 0: /u01/app/oracle/oradata/db11/redo02.log

#### 终止session 1 trace跟踪(crtl+c)

$ strace -fr -o /tmp/4616.log -p 4616
Process 4616 attached - interrupt to quit

Process 4616 detached

#### 下面观察session 1产生的日志/tmp/4616.log

...
4616       0.000036 gettimeofday({1463183881, 895560}, NULL) = 0
4616       0.000035 pwrite(256, "\25\302\0\0\3\0\0\0\0\0\0\0\0\0\1\4\214C\0\0\2\0\0\0\0\0\0\0\32\0\0\0"..., 16384, 49152) = 16384
4616       0.040894 gettimeofday({1463183881, 936492}, NULL) = 0
4616       0.000044 gettimeofday({1463183881, 936533}, NULL) = 0
4616       0.000079 pwrite(257, "\25\302\0\0\3\0\0\0\0\0\0\0\0\0\1\4\214C\0\0\2\0\0\0\0\0\0\0\32\0\0\0"..., 16384, 49152) = 16384
4616       0.003029 gettimeofday({1463183881, 939643}, NULL) = 0
4616       0.000042 gettimeofday({1463183881, 939697}, NULL) = 0
4616       0.000057 gettimeofday({1463183881, 939740}, NULL) = 0
4616       0.000071 gettimeofday({1463183881, 939815}, NULL) = 0
4616       0.000076 gettimeofday({1463183881, 939888}, NULL) = 0
4616       0.000035 gettimeofday({1463183881, 939922}, NULL) = 0
4616       0.000038 pread(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\212\343\0\0\0\0\0\0\0\4 \v~\227\300U"..., 16384, 16384) = 16384
...

其中:

4616是对应的进程号

第二列是时间,如0.000036

在看下面这行:

pread(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\212\343\0\0\0\0\0\0\0\4 \v~\227\300U"..., 16384, 16384) = 16384

256表示文件描述符

$ ls -ltr |grep control
lrwx------ 1 ora11 oinstall 64 May 14 07:55 257 -> /u01/app/oracle/oradata/db11/control02.ctl
lrwx------ 1 ora11 oinstall 64 May 14 07:55 256 -> /u01/app/oracle/oradata/db11/control01.ctl (deleted)

第一个16384表示块大小 第二个16384表示偏移量 第三个16384表示写入数据的大小

通过上面的进程跟踪,我们可以得到什么:

1. 进程信息可以在/proc下看到,例如: /proc/4616/stat

2. 对于linux,对于文件的读写,是通过调用函数read,pwrite64 来实现的。

3. 对于pwrite64的操作,是通过写fd (256,257)2个文件来完成的

时间: 2024-07-28 15:38:52

人为删除控制文件故障模拟的相关文章

RMAN 备份恢复 删除表空间后控制文件丢失

先备份一个控制文件 RMAN> backup current controlfile tag='bak_ctlfile' format='/home/oracle/backup/bak_ctl_%U_%T'; drop一个表空间 SQL> drop tablespace xds including contents and datafiles; Tablespace dropped. 删除控制文件 rm /u01/app/oracle/oradata/orcl/control01.ctl rm

[网络课摘抄]8.1模拟控制文件丢失后的数据库恢复(完全恢复)

1.环境准备 1.1确认数据库版本 1.2确认数据库归档 1.3备份数据库文件 2模拟控制文件丢失后的数据库恢复(完全恢复). 2.1查看控制文件位置 2.2执行操作后删除控制文件 2.3启动数据库 启动数据库的时候发现数据库发生了报错,提示无法确认控制文件,检查告警文件,我们现在检查一下告警文件里的信息: 2.4重建控制文件 对于日志和数据文件都完整的情况下,如果只是控制文件丢失,那么重建控制文件是最好的一种解决方式,一般重建控制文件能够解决99%的问题,现在我们就重建控制文件. 2.5尝试打

RMAN数据库恢复之控制文件和参数文件恢复

一.控制文件的恢复1.查询控制文件的路径 SQL> SELECT * FROM V$CONTROLFILE; STATUS NAME IS_RECOVERY_DEST_FILE BLOCK_SIZE FILE_SIZE_BLKS ------- -------------------------------------------------------------- --------------------- ---------- -------------- D:\APP\ADMINISTR

Oracle 学习之RMAN(十二)恢复实战--控制文件丢失

首先我们进行一次全库备份 RMAN> run {   backup database    format '/backup/full_%d_%T_%s'   plus archivelog    format '/backup/arch_%d_%T_%s'   delete all input;  }  Starting backup at 2015/07/09 09:35:03 current log archived using channel ORA_DISK_1 channel ORA_

【oracle11g,9】控制文件

一.控制文件作用: 1.记录了数据库的物理状态. 2.维护数据库的一致性.控制文件中记录了数据库系统scn号.数据文件scn号与数据文件头里的开始scn号,如果这三个scn号一致说明数据库可以启动.如果不一致就要恢复. 3.在参数文件中定义控制文件的位置和个数. 控制文件最少1个,最多8个,多个文件是镜像的关系. 定义控制文件 *.control_files='/opt/oracle/oradata/orcl/control01.ctl','/opt/oracle/oradata/orcl/co

oracle 控制文件误删除手动恢复小测试

测试系统 OLinux 5.9 oracle版本 11.2.0.4 备份控制文件 1.备份到trace文件 SQL> alter database backup controlfile to trace; Database altered. 查看告警日志,确定备份控制文件trace的位置信息 alter database backup controlfile to trace Backup controlfile written to trace file /u01/app/oracle/dia

RMAN备份与恢复之参数文件与控制文件

0   说明 本例是基于备份数据库全库的基础上,还原参数据文件(spfile),控制文件. 1   准备 [[email protected] /]$ sqlplus /nolog SQL*Plus: Release 11.2.0.3.0 Production on Mon Oct 12 11:58:35 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. SQL> conn sys/Sina.2015@study as sys

oracle 11G R2控制文件的管理

控制文件 每一个数据库都有一个控制文件,它是一个二进制数据文件,它记录了数据库的物理结构.控制文件数据库一个重要参数文件,在写数据时,控制文件必须是可用的状态.控制文件包括如下信息: 1. 记录数据库名称 2. 数据文件与重做日志文件的名称与存储位置 3. 数据库创建时间 4. 当前log的SN 5. 检查点信息 控制文件管理 如下信息介绍控制文件,了解控制文件. 控制文件名称 你使用初始化参数文件中的参数control_files命名控制文件名称.可以使用show parameter cont

RMAN备份恢复 控制文件和归档日志丢失情况

RMAN> backup current controlfile tag='bak_ctlfile' format='/home/oracle/backup/bak_ctl_%U_%T'; alter system switch logfile; alter system switch logfile; alter system switch logfile; 多切换几次,切出几个archivelog文件,删除其中的一个 rm o1_mf_1_3_cpk5wloy_.arc 然后删除控制文件 r