一条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/1024 CurrentMB,
  2         ceil(HWM * a.block_size)/1024/1024 ResizeTo,
  3         (a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB,
  4         'alter database datafile '''||a.name||''' resize '||
  5         ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD
  6  from v$datafile a,
  7       (select file_id,max(block_id+blocks-1) HWM
  8         from dba_extents
  9         group by file_id) b
 1 0  where a.file# = b.file_id(+)
 11  and (a.bytes - HWM *block_size)>0
order by 5     12  ;
order by 5
             *
ERROR at line 12:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/testPT1/oracle/TEST01/oratmp01/temp/ggs_data01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

再一查看数据库进程,都没有了,看来数据库是宕了。
我还想这条sql语句真是厉害,看看日志里面怎么说。

Tue Mar 25 22:04:19 2014
End automatic SQL Tuning Advisor run for special tuning task  "SYS_AUTO_SQL_TUNING_TASK"
Wed Mar 26 02:00:00 2014
Closing scheduler window
Closing Resource Manager plan via scheduler window
Clearing Resource Manager plan via parameter
Mon Mar 31 10:14:55 2014
USER (ospid: 21846): terminating the instance due to error 472
Instance terminated by USER, pid = 21846

先把库重启了,看有没有什么问题。
SQL> startup nomount
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area 1.2827E+10 bytes
Fixed Size                  2253880 bytes
Variable Size            4211084232 bytes
Database Buffers         8589934592 bytes
Redo Buffers               24096768 bytes
SQL> alter database mount;
Database altered.

当准备Open的时候,报了下面的错误。说有个数据文件丢失了。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4:
'/testPT1/oracle/TEST01/oratmp01/temp/ggs_data01.dbf'

查看备份情况,是否有热备份之类的操作遗留。可以看到这个文件确实是损坏了或者被认为删除了。
SQL> select *from v$backup;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 NOT ACTIVE         1.0583E+13 22-JAN-13
         2 NOT ACTIVE         1.0583E+13 22-JAN-13
         3 NOT ACTIVE         1.0583E+13 22-JAN-13
         4 FILE NOT FOUND              0
         ...
        40 NOT ACTIVE         1.0583E+13 22-JAN-13

查看文件的路径。
  1* select file#,name from v$datafile
         4
/testPT1/oracle/TEST01/oratmp01/temp/ggs_data01.dbf

确认了下这个数据文件goldengate用,现在测试环境上还没有goldengate,可以删除,于是头脑一发热,就准备马上删了,结果报了错。
SQL> drop tablespace GGS_DATA including contents and datafiles cascade constraint;
drop tablespace GGS_DATA including contents and datafiles cascade constraint
*
ERROR at line 1:
ORA-01109: database not open

才反应过来数据库还在mount状态

先把数据文件offline了
SQL> alter database datafile '/testPT1/oracle/TEST01/oratmp01/temp/ggs_data01.dbf' offline;
Database altered.

这时候再查看v$backup,那条记录就不复存在了。
     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 NOT ACTIVE         1.0583E+13 22-JAN-13
         2 NOT ACTIVE         1.0583E+13 22-JAN-13
         3 NOT ACTIVE         1.0583E+13 22-JAN-13
         5 NOT ACTIVE         1.0583E+13 22-JAN-13
         6 NOT ACTIVE         1.0583E+13 22-JAN-13
         7 NOT ACTIVE         1.0583E+13 22-JAN-13
         8 NOT ACTIVE         1.0583E+13 22-JAN-13
         9 NOT ACTIVE         1.0583E+13 22-JAN-13
        10 NOT ACTIVE         1.0583E+13 22-JAN-13
        11 NOT ACTIVE         1.0583E+13 22-JAN-13
        12 NOT ACTIVE         1.0583E+13 22-JAN-13
....
39 rows selected.

把数据库open起来。
SQL> alter database open;
Database altered.

然后再删除,其实这个阶段也只是释放了句柄和更新了数据字典。
SQL> drop tablespace ggs_data including contents and datafiles cascade constraint;
Tablespace dropped.

再次查看数据库进程是否正常。可以看到数据库已经正常了。
test01@ccbdbpt4:/opt/app/oracle/TEST01> ps -ef|grep smon
test018420  5954  0 10:39 pts/2    00:00:00 grep smon
test0110295     1  0 10:18 ?        00:00:01 ora_smon_TEST01
test01@ccbdbpt4:/opt/app/oracle/TEST01> sqlplus / as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 31 10:40:08 2014
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show user
USER is "SYS"
SQL> select status from v$instance;
STATUS
------------
OPEN

我在另一个环境上碰到了类似的问题。
test01@ccbdbpt4:/opt/app/oracle/TEST01/test> sqlplus / as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Thu Apr 3 17:26:43 2014
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL> select dbms_metadata.get_ddl('USER',u.username) from dba_users u WHERE USER     NAME in('TEST');

ERROR:
ORA-03113: end-of-file on communication channel
Process ID: 4056
Session ID: 4159 Serial number: 15

no rows selected

查看日志,错误还是类似。
Mon Mar 31 11:47:47 2014
USER (ospid: 26945): terminating the instance due to error 472
Instance terminated by USER, pid = 26945

这个问题的总结如下

导致数据库宕机的原因不是因为sql语句,而是因为unix组做文件的操作中,导致数据库进程问题,数据库其实已经停了,但是我们仍然可以进行简单的操作。因为操作系统中句柄还在。
那个数据文件的丢失和unix组的人确认是认为的失误,他们在做空间切分的时候,没有停库。

时间: 2024-10-01 13:38:35

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

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

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

通过一条sql语句访问不同数据库服务器中的数据库对象的方法

对象|访问|服务器|数据|数据库|语句 在我们做数据库程序开发的时候,经常会遇到这种情况:需要将一个数据库服务器中的数据导入到另一个数据库服务器的表中.通常我们会使用这种方法:先把一个数据库中的数据取出来放到某出,然后再把这些数据一条条插入到目的数据库中,这种方法效率较低,写起程序来也很繁琐,容易出错.另外一种方法是使用bcp或BULK INSERT语句,将数据导入到一个文件中,再从此文件中导出到目的数据库,这种方法虽然效率稍高,但也有很多不如意的地方,单是在导入时怎样找到另外一台机器上的数据导

由一条sql语句导致的系统IO问题

早上来到公司,照例进行了简单的检查,发现系统负载不高,就开始计划一些sql tuning的工作,但是过了一会,在通过shell命令查找一些sql信息的时候,发现系统的反应有些慢,当时也没在意,当我查看v$session都开始慢的时候,感觉哪里出了什么问题了,最直观的感受就是一些命令的运行都很缓慢了. 首先查看了一下数据库的负载,发现在最近的一个多小时内负载高了很多.几乎是几十倍的速度. BEGIN_TIME------------------------- END_TIME-----------

一条sql 语句搞定数据库分页

antshome(原作)首发:CSDN 一条语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 10 = 每页记录数 20 = (当前页 + 1) * 每页记录数 以上语句即可以实现分页,但是最后取出的结果排序是升序,如果需要结果集为降序(例如时间),则有两种方法可以处理 1.使用以下语句

一条 sql 语句搞定数据库分页

分页|数据|数据库|语句 一条语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 10 = 每页记录数 20 = (当前页 + 1) * 每页记录数 以上语句即可以实现分页,但是最后取出的结果排序是升序,如果需要结果集为降序(例如时间),则有两种方法可以处理 1.使用以下语句,但效率可能要

MySQL的一条慢SQL查询导致整个网站宕机的解决方法_Mysql

直接切入正题吧: 通常来说,我们看到的慢查询一般还不致于导致挂站,顶多就是应用响应变慢 不过这个恰好今天被我撞见了,一个慢查询把整个网站搞挂了先看看这个SQL张撒样子: # Query_time: 70.472013 Lock_time: 0.000078 Rows_sent: 7915203 Rows_examined: 15984089 Rows_affected: 0 # Bytes_sent: 1258414478 use js_sku; SET timestamp=1465850117

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

今天来到办公室,发现有一台服务器中的数据库实例停掉了.这种情况真是意料之外,尤其是我还不是很熟悉这台机器的服务. 赶紧查看数据库日志,可以看到数据库在昨晚停掉了,从日志来看没有人为的痕迹. 在宕机之前,有下面的日志.在此截取一部分.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

Mssql,Access的sql经典SQL语句大全_数据库其它

下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL-数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建 数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份