一则数据库无法启动的奇怪案例分析

简介: 关于数据库的启停,以前一直认为是最简单,最没有技术含量的任务,但是接手的环境越多,越来越证明我最初的想法是错误的。数据库的启停是一个敏感操作,重启一定是有着特定的原因和需求。

关于数据库的启停,以前一直认为是最简单,最没有技术含量的任务,但是接手的环境越多,越来越证明我最初的想法是错误的。数据库的启停是一个敏感操作,重启一定是有着特定的原因和需求。而且这个过程中存在这太多的可能性,很可能在同一会话窗口中,停掉数据库再次启动就会报错;很可能硬件扩容,也会导致数据库实例无法启动;这个时候重启前的准备和分析就尤为重要。

在此大体把启停中的问题归为三类,数据库无法启动,数据库无法登录,数据库宕机。我们在此主要讨论数据库无法启动的场景。

看起来很简单的一件事情,重启的过程中总是可能节外生枝,总是感觉数据库实例有时候不是那么配合,总是在启动过程中会发牢骚。从我的经历来看,我碰到的绝大多数问题都发生在open阶段。

对于数据库无法启动的原因大体有以下几个方面需要考虑。

1)      系统内核参数设置不当,比如当前的内核参数设置在需要增加数据库级的配置的情况下是否能够满足,或者在硬件扩容的情况下,现有的内核参数是否需要做相应的调整。举个例子,之前看到一个数据库环境中的内存为16G,但是实际上process只设置了150,很明显可以充分利用这部分资源, 在申请维护窗口重启的过程中,发现调整了process大小之后,数据库实例无法启动,根本原因就是内核参数shmmax设置过低导致。

2)      数据库参数变量设置不当,数据库参数或者变量的一些设置可能会和现有的资源使用情况冲突,在这种情况下,数据库参数的设置很可能过高或者过低,导致硬件资源的使用无法满足。比如数据库层面的process大小还是需要和系统内核参数有一个映射,设置不能太高。

我们以一个真实的案例来说明,这是我接手的一套测试环境。这是一套11gR2的环境。

当我准备连接到环境的时候,首先查看数据库的进程情况。

可以看到目前的环境存在两个数据库实例newtesttest04,在此我们需要连接newtest.

$ ps -ef|grep smon

oracle    1451     1  0 Feb02 ?        00:00:30 ora_smon_newtest

oracle    9133     1  0 Feb03 ?        00:00:58 ora_smon_test04

oracle   24734 24596  0 17:36 pts/0    00:00:00 grep smon

但是使用sqlplus登录的时候却碰到了一个非常奇怪的问题。

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Feb 17 17:36:08 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.

SQL>

按理说应该直接使用sys用户连接到了数据库实例,但是在此却显示是一个空实例。这到底是哪里出了问题呢。首先排除了ORACLE_SID大小写,乱码的问题。

查看数据库日志也没有发现任何异常信息,实例还是active的。

在此我们先卖个关子,继续往下看。

因为是测试环境,所以也可以做一些简单的尝试,于是我就尝试启动数据库实例。

Nomount阶段竟然没有报出任何的错误。

SQL> startup nomount

ORACLE instance started.

Total System Global Area 4993982464 bytes

Fixed Size                  2261808 bytes

Variable Size            1006636240 bytes

Database Buffers         3976200192 bytes

Redo Buffers                8884224 bytes

这个时候都有些怀疑是否之前的分析是正确的。

继续把实例置为mount阶段,这个时候就抛出了下面的问题。

SQL> alter database mount;

alter database mount

*

ERROR at line 1:

ORA-00205: error in identifying control file, check alert log for more info

这个时候,查看日志就是一个很好的办法,在11g中可以使用adr的方式来查看,或者使用下面的方式来直接找到日志所在目录。

SQL> show parameter background_dump_dest

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

background_dump_dest                 string      /U01/app/oracle/diag/rdbms/new

                                                 test/newtest/trace

得到的日志如下:                                                 

MMNL started with pid=16, OS id=24683

starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...

starting up 1 shared server(s) ...

ORACLE_BASE from environment = /DATA/app/oracle

Wed Feb 17 17:36:21 2016

alter database mount

ORA-00210: cannot open the specified control file

ORA-00202: control file: '/U01/app/oracle/fast_recovery_area/newtest/control02.ctl'

ORA-27086: unable to lock file - already in use

Linux-x86_64 Error: 11: Resource temporarily unavailable

Additional information: 8

Additional information: 1449

ORA-00210: cannot open the specified control file

ORA-00202: control file: '/U01/app/oracle/oradata/newtest/control01.ctl'

ORA-27086: unable to lock file - already in use

Linux-x86_64 Error: 11: Resource temporarily unavailable

Additional information: 8

Additional information: 1449

ORA-205 signalled during: alter database mount...

通过上面的错误信息可以很清晰看到控制文件已经被占用了。

这个时候查看数据库实例的情况,发现结果让人大跌眼镜,竟然有两个实例为newtest.

[oracle@BX_133_45 trace]$ ps -ef|grep smon

oracle    1451     1  0 Feb02 ?        00:00:30 ora_smon_newtest

oracle    9133     1  0 Feb03 ?        00:00:58 ora_smon_test04

oracle   24677     1  0 17:36 ?        00:00:00 ora_smon_newtest

oracle   24734 24596  0 17:36 pts/0    00:00:00 grep smon

那么这个问题该怎么解释呢,Unix,Linux系统中,SIDORACLE_HOME在一起哈希后会得到一个唯一的值作为SGAkey

oracle实例启动时,在操作系统上的fork进程会根据Oracle_SID来创建相关后台进程。

Oracle 11g 支持Oracle_SID的长度为12位,db_name的长度为8位。而在很早的版本中ORACLE_SID只支持4位,这也就是我们经常看到ORCL,PROD这样的数据库的一个原因吧。

在这个场景中,ORACLE_SID没有任何问题,那么仔细来品味上面的话,另外一个可能就是ORACLE_HOME了。 

我们首先把刚刚没有启动的实例先停掉,避免有更多的干扰。

查看共享内存段的情况如下,可见数据库实例还是没有受到影响。                                           

$ ipcs -m

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status     

0x00000000 1114113    oracle     640        33554432   23                     

0x00000000 1146882    oracle     640        4982833152 23                     

0x849f1498 1179651    oracle     640        2097152    23                     

0x00000000 3211268    oracle     640        33554432   23                     

0x00000000 3244037    oracle     640        4982833152 23                     

0x9d2300b0 3276806    oracle     640        2097152    23                     

这个时候再次观察实例的smon进程,发现原来的进程依然存在。

$ ps -ef|grep smon

oracle    1451     1  0 Feb02 ?        00:00:30 ora_smon_newtest

oracle    9133     1  0 Feb03 ?        00:00:58 ora_smon_test04

oracle   24779 24596  0 17:37 pts/0    00:00:00 grep smon

再次确认ORACLE_SID

$ echo $ORACLE_SID

newtest

确认ORACLE_HOME

$ echo $ORACLE_HOME

/DATA/app/oracle/11.2.0.4

好了,我们来开始分析,

找到系统级所在的句柄,根据smon进程对应的进程号1451/proc/1451下面,查看environ的设置情况,可以使用下面的方式来查看这个进程对应的环境变量ORACLE_HOME

$ cat /proc/1451/environ|xargs -0 -n1 |grep ORACLE_HOME

ORACLE_HOME=/U01/app/oracle/product/11.2.0.2/db_1

这个时候真相浮出水面,原来是ORACLE_HOME设置不同。

手工指定ORACLE_HOME,然后再次尝试

$ export ORACLE_HOME=/U01/app/oracle/product/11.2.0.2/db_1

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Feb 17 17:49:00 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

这个时候就达到了预期的效果

SQL> select database_role from v$database;

DATABASE_ROLE

----------------

PRIMARY

通过这个案例可以发现,在环境维护中需要遵循一定的规范,如果不严谨不规范,就会出现一些看似奇怪的问题;对于数据库实例的启动过程需要有深刻的理解,需要不断的反问自己为什么,怎么求证,能够说服自己才能让别人信服。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
26天前
|
Cloud Native OLAP OLTP
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
123 4
|
25天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
95 0
|
3月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(下)
后端接口性能优化分析-数据库优化
70 1
|
1天前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
25天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
30 0
|
1月前
|
存储 NoSQL 大数据
新型数据库技术在大数据分析中的应用与优势探究
随着大数据时代的到来,传统数据库技术已经无法满足海量数据处理的需求。本文将探讨新型数据库技术在大数据分析中的应用情况及其所带来的优势,为读者解析数据库领域的最新发展趋势。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
|
1月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库误truncate table的数据恢复案例
北京某国企客户Oracle 11g R2数据库误truncate table CM_CHECK_ITEM_HIS,表数据丢失,业务查询到该表时报错,数据库的备份不可用,无法查询表数据。 Oracle数据库执行Truncate命令的原理:在执行Truncate命令后ORACLE会在数据字典和Segment Header中更新表的Data Object ID,但不会修改实际数据部分的块。由于数据字典与段头的DATA_OBJECT_ID与后续的数据块中的并不一致,所以ORACLE服务进程在读取全表数据时不会读取到已经被TRUNCATE的记录,但是实际数据未被覆盖。
Oracle数据恢复—Oracle数据库误truncate table的数据恢复案例
|
2月前
|
存储 SQL 数据库连接
连接并操作数据库:Python 数据库案例
数据库是一种用于存储和管理数据的工具,它以一种有组织的方式将数据存储在文件或内存中,以便于检索和处理。数据库系统通常使用 SQL(Structured Query Language)语言来进行数据的操作,包括数据的插入、查询、更新和删除等。

热门文章

最新文章