数据库突然宕机的问题及分析

昨天晚上,某个环境的数据库在做一个压力测试的时候突然宕机了。这个问题比较急。马上查看日志文件。
看到了如下的一段,报了os级的linux错误。提示没有空间了。

Fri Mar 14 19:16:47 2014
Archived Log entry 192 added for thread 1 sequence 192 ID 0x1ed7a02c dest 1:
Fri Mar 14 19:39:24 2014
Incremental checkpoint up to RBA [0xc0.2aa5fb.0], current log tail at RBA [0xc1.5d29f.0]
Fri Mar 14 19:46:37 2014
Completed checkpoint up to RBA [0xc1.2.10], SCN: 252702724
Fri Mar 14 20:09:32 2014
Incremental checkpoint up to RBA [0xc1.5d36a.0], current log tail at RBA [0xc1.b8498.0]
Fri Mar 14 20:13:15 2014
KCF: read, write or open error, block=0xa6b82 online=1
        file=1 '/TEST1/db05/oradata/PRDTEST1/TEMP_1.dbf'
        error=27061 txt: 'Linux-x86_64 Error: 28: No space left on device
Additional information: -1
Additional information: 8192'
Errors in file /test01/oracle/adm/PRDTEST1/diag/rdbms/prdTEST1/PRDTEST1/trace/PRDTEST1_dbw7_19235.trc:
Errors in file /test01/oracle/adm/PRDTEST1/diag/rdbms/prdTEST1/PRDTEST1/trace/PRDTEST1_dbw7_19235.trc:
ORA-63999: data file suffered media failure
ORA-01114: IO error writing block to file 5001 (block # 682882)
ORA-01110: data file 5001: '/TEST1/db05/oradata/PRDTEST1/TEMP_1.dbf'
ORA-27061: waiting for async I/Os failed
Linux-x86_64 Error: 28: No space left on device
Additional information: -1
Additional information: 8192
DBW7 (ospid: 19235): terminating the instance due to error 63999
Fri Mar 14 20:13:16 2014
System state dump requested by (instance=1, osid=19235 (DBW7)), summary=[abnormal instance termination].
System State dumped to trace file /test01/oracle/adm/PRDTEST1/diag/rdbms/prdTEST1/PRDTEST1/trace/PRDTEST1_diag_19213.trc
Termination issued to instance processes. Waiting for the processes to exit
Fri Mar 14 20:13:31 2014
Instance termination failed to kill one or more processes
Instance terminated by DBW7, pid = 19235
Fri Mar 14 22:55:44 2014
Starting ORACLE instance (normal)

马上开始查看文件系统的空间,确实是不够了。紧急resize了下文件,把库先起来,然后再协调系统的资源了。
问题虽然马上解决了。但是对于文件写入(报错异步io)的情况,数据库实例会同然down掉。确实是一件很敏感的事情。
在metalink上查找有一个类似的错误,但是是基于NAS环境的,那个Unix环境做了一些系统变更导致了这个错误和这个问题还是有一些不同。(文档 ID 1557694.1)
我在想对于如果数据文件写入失败,有没有一些措施来控制,保证不会把库给down掉。发现在11.2.0.2版本之后,发现了一个隐含参数(_datafile_write_errors_crash_instance)
查看隐含参数的脚本如下。

set linesize 132 column name format a30 column value format a25 
select
x.ksppinm name,
y.ksppstvl value,
y.ksppstdf isdefault, 
decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod, 
decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj 
from sys.x$ksppi x, sys.x$ksppcv y 
where x.inst_id = userenv('Instance') 
and y.inst_id = userenv('Instance') 
and x.indx = y.indx 
and x.ksppinm like '%_%' 
order by translate(x.ksppinm, ' _', ' ') 
/

默认这个参数_datafile_write_errors_crash_instance的值是true的。
oracle给出的解释如下,还有一个相关的bug(文档 ID 7691270.8)已经在11.2.0.2做了修复。
If _datafile_write_errors_crash_instance = TRUE (default) then
  any write to a datafile which fails due to an IO error causes 
  an instance crash. 

 If _datafile_write_errors_crash_instance = FALSE then the behaviour
  reverts to the previous behaviour (before this fix) such that
  a write error to a datafile offlines the file (provided the DB is
  in archivelog mode and the file is not in SYSTEM tablespace in 
  which case the instance is aborted)
简单的测试
大家可能想如果表空间不够了,数据文件空间不够了,数据库是不是也会down掉。我简单在本地做了测试来看在并行插入的时候如果文件空间不够会不会把库down掉。但是要模拟数据文件的错误,可能需要借助bbed等工具来模拟了。
step 1.首先为了先把隐含参数设置为默认值true
alter system set "_datafile_write_errors_crash_instance"=TRUE;
step 2.然后创建了一个dummy文件,保证文件系统中的空间只剩下很少的一部分。
dd if=/dev/zero of=/u02/ora11g/hello.txt bs=1000M count=1
-rw-r--r--  1 ora11g dba    1048576000 Mar 15 04:09 hello.txt

/dev/sdb2             7.6G  7.2G   45M 100% /u02
只剩下很小的一部分空间了,45M的样子。
step 3.创建两个个表空间。让数据文件自动增长。
SQL> create tablespace test_data1 datafile '/u02/ora11g/testdata1.dbf' size 2M autoextend on;
Tablespace created.

SQL> create tablespace test_data2 datafile '/u02/ora11g/testdata2.dbf' size 2M autoextend on;
Tablespace created.

step 4:创建两个表属于不同的表空间
SQL> create table test1 tablespace test_data1 as select *from cat;
Table created.

SQL> create table test2 tablespace test_data2 as select *from user_objects;
Table created.

step 5:简单核查一下表里的数据。保证数据量在可控范围内。
SQL> select count(*)from test1;
  COUNT(*)
----------
         4
SQL> select count(*)from test2;
  COUNT(*)
----------
         5

step 6:然后写了如下的3个脚本来往两个表里分别不断的插入和commit
脚本1 a.sh
sqlplus test/test
begin
for i in 1..10000 loop
insert into test1 select *from test1 where rownum
commit;
end loop;
end;
/
EOF
exit

脚本2 b.sh
sqlplus test/test
begin
for i in 1..10000 loop
insert into test2 select *from test2 where rownum
commit;
end loop;
end;
/
EOF
exit

脚本3 c.sh ,可以基本保证两个执行是并行的。
ksh a.sh &
ksh b.sh &

step 7,执行脚本3以后查看日志内容
马上看到alert里面马上又了如下的信息
Sat Mar 15 07:40:22 2014
ORA-1653: unable to extend table TEST.TEST2 by 128 in                 tablespace TEST_DATA2 
ORA-1653: unable to extend table TEST.TEST2 by 128 in                 tablespace TEST_DATA2 
由以上的简单测试可以看出表空间不够的时候,实例还是能够保证open的。

时间: 2024-09-20 20:37:49

数据库突然宕机的问题及分析的相关文章

数据库突然宕机无法open的问题及解决

测试的数据库有一天突然宕机,然后无法正常open了,这个问题虽然过去了一段时间,也在这儿总结一把. 从alert日志中的信息如下. Fri Jan 10 16:09:42 2014 Archived Log entry 6837 added for thread 1 sequence 6863 ID 0x19db56aa dest 1: Fri Jan 10 16:12:59 2014 Errors in file /oravl01/oracle/adm/FETABP2/diag/rdbms/f

一次数据库宕机问题的分析

今天来到办公室,发现有一台服务器中的数据库实例停掉了.这种情况真是意料之外,尤其是我还不是很熟悉这台机器的服务. 赶紧查看数据库日志,可以看到数据库在昨晚停掉了,从日志来看没有人为的痕迹. 在宕机之前,有下面的日志.在此截取一部分.TNS-12560: TNS:protocol adapter error opiodr aborting process unknown ospid (33498) as a result of ORA-609     ns secondary err code:

容灾切换中的数据库宕机问题简单分析(一)

最近对一个统计库做了计划内的容灾切换,即主备切换.操作的过程其实还是蛮顺利的.但是灾难切换中如果出现在问题,那就是灾难中的灾难了. 按照计划对配置信息做了同步,然后使用DG Broker做了SwitchOver操作. 这一次切换速度还是蛮快,我开了几个窗口看到日志都在不断输出,角色已经替换过来了.DG Broker切换的日志如下: DGMGRL> switchover to test29; Performing switchover NOW, please wait... New primary

一条sql语句导致的数据库宕机问题及分析

之前分享过一篇博文,是一条sql语句"导致"的数据库宕机,上次是另有原因,这次真碰到一个案例,而且是在重要的环境上,希望大家引以为戒. 数据库是基于Linux64的版本,版本是11.2.0.2.0,已经打了最新的psu. 数据库的访问用户数大约在1000左右,当时查看服务器的cpu已经是100%了,有大约10个进程都是cpu 100%,数据库逻辑读也是超高,一秒钟大约是接近百兆的情况,sga是12G,已用了sga的自动管理(sga_target=0), 查看内存组件时发现buffer_

一条sql语句“导致”的数据库宕机问题及分析

最近测试环境需要做一些变更,把测试环境切分成两套环境,存储空间也需要压缩压缩和整理. unix组的人已经开始做空间划分了,然后我们需要在此基础上重建一套环境. 有些数据文件使用空间不大,所以准备压缩一下. 用了下面的sql语句,结果跑了十几秒中就抛了下面的错误. SQL> set linesize 200 SQL> col name for a40 SQL> col resizecmd for a80 SQL> select a.file#,a.name,a.bytes/1024/

ORA-04031错误导致宕机案例分析

今天遇到一起ORACLE数据库宕机案例,下面是对这起数据库宕机案例的原因进行分析.解读.分析过程中顺便记录一下这个案例的前因后果,攒点经验值,培养一下分析.解决问题的能力.   案例环境:      操作系统 :Oracle Linux Server release 5.7 64 bit    数据库版本:Oracle Database 10g Release 10.2.0.4.0 - 64bit Production   案例分析: 收到告警去检查数据库时,发现实例已经宕机.检查告警日志,发现

MySQL集群节点宕机,数据库脑裂!如何排障?

作者介绍 王晶,中国移动DBA,负责"移动云"业务系统的数据库集成架构设计.运维.优化等工作:擅长技术领域MySQL,获Oracle颁发的"MySQL DBA"官方认证,熟悉MySQL复制结构.MHA.cluster等多种架构及运维优化.   发现故障的时间正值大年初二,在各种铺天盖地的拜年信息和微信红包之中,我发现了手机上的这条告警通知:   PROBLEM:Disaster: Galera cluster has node down.我生产环境的Galera集群

由重启引起的Oracle RAC节点宕机分析及追根溯源

作者介绍 裴征峰,现就职于北京海天起点,二线专家成员,南京办事处负责人,OCP 10g.OCP 11g.OCM11g.超八年Oracle服务经验,擅长数据库故障诊断和性能调优.目前主要从事客户的现场维护.重大问题的解决.数据库性能分析.二线服务质量保证等工作.     1 背景说明  某省份的电信业务系统由于业务量较大,按地市划分部署在4套配置相同的RAC上,相同主机版本,相同的CRS和数据库版本.该系统已正常运行3年多,其间也有重启主机等正常维护操作.从4月24日 开始,这个系统的4套RAC的

【深度分析】不安全的IOT设备是如何导致Twitter、PayPal等网站宕机的?

日前,一场大规模的互联网瘫痪席卷了美国,2016年10月21日 11:10 UTC(北京时间19:10左右)恶意软件Mirai控制的僵尸网络对美国域名服务器管理服务供应商Dyn发起DDOS攻击,从而导致许多网站在美国东海岸地区宕机.以下是来自青莲云对感染IOT设备的恶意软件Mirai的分析. 本文您将看到: 1.攻击事件回顾 2.恶意软件Mirai是什么 3.Mirai如何感染IOT设备的 4.Mirai如何控制IOT设备发起攻击 5.Mirai的另一种攻击思路 6.如何防止智能设备被恶意利用