- 论坛徽章:
- 0
|
数据库崩溃了!让它恢复正常!
这是截取自McGraw-Hill 出版社子公司Oracle Press出版社出版的April Wells编写的《Everyday Oracle DBA》copyright 2006第五章的部分内容。\r\n\r\n 每当我听到“数据库当掉了”的话时,我都会想起1978年的电影《Gray Lady Down》中的情节,核潜艇海王星号在击中了一艘货船之后沉没了,人们只有48小时营救船员。每当这些时候,我的脑袋里面都会听到与核潜艇有关的声音,就好像是背景音乐一样,一种恐惧感油然而生。好吧,我应该去救人,而不是自己一个人跑开远离炸弹。但是类似的感觉仍然包围着我。\r\n\r\n 然而,当营救的是你的数据库的时候,你很少会有48小时这么奢侈。通常的情况是,一打穿着套装的经理们早上6点就会站在你的格子外面,在想数据库恢复正常继续运行之前还需要多少时间。更令人头疼。所以在这章内容中,我们将会看看有哪些最好的办法可以尽快地让这些讨厌的经理们离开你的格子。\r\n\r\n 数据库崩溃了\r\n\r\n 虽然这样的情况也不是经常发生,但是有时候会出现你的数据库崩溃,然后你发现SQL弹出一条提示说共享内存不存在,或者是Oracle不可达。当然,如果你能在你的用户发现这种情况之前发现它,那你无疑是非常幸运的。当他们先发现的时候,你就会发现你自己正在拼命地回答问题,飞快地打字,把那些你本来知道怎么拼写的单词拼错(例如:sqlplus,或者sysdba)。每次我发现自己在压力之下,例如努力尽快让事态得到控制,或者是一打经理站在我的格子外面用目光在我后脑勺上钻孔的时候,我都会把\"select\"拼错。\r\n\r\n 当你面对一个崩溃的数据库的时候,最重要的一件事情就是让它恢复正常继续运行。然后,你需要找到方法,如果可能的话,防止这种情况的再次发生。\r\n\r\n 重启\r\n\r\n 第一件事情就是检查警报日志。看看是否可以找到数据库崩溃的原因。例如,你们公司的一个数据库管理员昨天晚上作了维护,忘了把数据库启动?这样的情况不太可能发生,就是先检查一下,然后看看警报日志的末尾是否显示了这样的情况。当然,如果有人进行了错误的访问,并且杀死了一系列的后台进程,可能是因为它们看起来占用了很多的机器资源,那么用这样的情况半夜去打扰数据库管理员就太晚了,警报日志中什么都不会有,最多,也不会有很多。\r\n\r\n 如果警报日志中没什么可看的,那么就说明发生了可怕的事情(例如,有人删除了一些数据文件,或者可能是所有的控制文件都不见了)试试重新启动数据库。你可能会惊奇。无论是什么原因引起了数据库的崩溃,都会变成一个简单的和暂时的事情,你的数据库可以只需要启动命令就恢复活力。\r\n\r\n 对于用户和经理们来说,最重要的事情就是让数据库重新启动。然而,有时候,重新启动也会掩盖重要信息,包括发生情况的证据,那么你就无法找出到底发生了什么。至少也要取出一些有关v$视图的内容,如果可能的话,它可以帮助你在重新启动之前进行分析。一旦数据库可以访问了,你就继续找出问题的根源 (有时候是暴躁的经理要求你分析问题的根源,或者是RCA)。\r\n\r\n 如果它无法启动\r\n\r\n 那么,你就药厂是最简单的最直接的解决方案——重新启动数据库——但是它起不来。现在怎么办?\r\n\r\n 噢,那么你将开始面临作为一个数据库管理员最有意思的一部份工作内容了(如果你是个真正的有怪癖的人,就好像我,或者你喜欢真正的挑战)。你需要想办法寻找它无法启动的原因(希望尽快找到),然后启动它。\r\n\r\n 如果它无法停止\r\n\r\n 是的,有时候数据库会无法……启动。不仅是在起来的位置,还有“起来”意味着你首先要关闭数据库,没有人可以连接到数据库,因为它正在关闭过程中。\r\n\r\n 有时候正常关闭的过程中也会出现问题,这是假设的。因为“正常”就意味着你期望等待所有的连接都断开,等所有连接都断开之后还要有人来做些什么。解决方案是什么?杀掉所有的会话连接,立即关闭,或者是执行关闭放弃。\r\n\r\n 好了,这也不是什么大事情,对不对?当然,但是立即关闭的时候会出现什么问题吗?emn0后台进程有时候会忘了它正在运行,休眠了,没有醒过来。有时候Oracle很古怪,出于某些原因而拒绝合作。\r\n\r\n 如果立即关闭不管用,那么就只有两种方式可以关闭数据库。一个就是在Unix上面使用kill –9,或者在Windows上使用任务管理器。这只在最后的时候才使用,或者是过于急躁的没有很多常识的操作员会使用。另一个就是关闭放弃。是的,这是关闭数据库的一个有效的方式。当然,拔掉电源或者按重启按钮也行,但是Oracle假设你会使用一中有效的关闭方式。这仍然会让我胃里打结,但是我确实这样做了。当然,数据库一关闭,我就把它重启了,然后再次立即执行关闭,这样关闭就是尽可能以一种稳定的状态进行。\r\n找出原因\r\n\r\n 好的,我们还是无法让它启动,那么我们需要找出的,不仅是它为什么不能启动,还有是什么原因导致它开始崩溃。机会就这这里,当你尝试启动数据库的时候,如果有问题导致无法启动,这个问题会发送到屏幕上,或者警报日志上,你会对情况有个了解,也许就是导致无法工作的原因。这是开始工作的一个非常有利的地点。你可以看看手册找出这些错误是什么意思,或者你可以利用一些Oracle的有价值的资源来帮助你找出发生了什么,并由此会走向何方。\r\n\r\n Oerr工具\r\n\r\n Oracle 的错误(Oracle Error ,oerr)工具是为你提供的,在Unix和Linux上是免费的,是你快速寻找你在数据库中看到的错误含义的方式,而不需要利用你喜欢的搜索引擎,或者去查手册寻找这些错误消息的确切含义。通过在系统提示符下面使用如下的命令,你可以快速看到Oracle想要告诉你的内容。\r\n\r\n oerr\r\n\r\n 前缀通常是三个字母,后面用连字号连接显示的错误(可能是ORA, MSG, PLS,或者其它什么),命令的数字部分就是连字号右边的部分。例如,你的警报日志中出现了令人恐惧的ORA-00600?是的话,你可以通过运行如下命令来获得更多信息:\r\n\r\n oerr ORA 00600\r\n\r\n 在这种情况下,你可以看到下一个,但是返回的信息对你可能不是很有用,例如ORA-00600覆盖了很多不同种类的错误,但是你仍然可以对错误的执行方式和输出的格式有一点了解,尽管它满足了书中的范围,我仍然需要随意对待几个断行。\r\n\r\n $ oerr ora 00600\r\n\r\n 00600, 00000, \"internal error code, arguments:\r\n\r\n [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]\"\r\n\r\n // *原因: 这是常见的Oracle异常程序的内部错误号. 这显示进程遇到了意外情况。\r\n\r\n // *动作: 作为bug报告 – 第一个参数是内部错误号\r\n\r\n 最初Oracle提供的这个工具是工作在Unix上的,而不是Windows(因为它用到了AWK命令,不是每个Oracle安装都要求你安装 MKS工具包,或者CYGWIN在Windows上模拟Unix),在Windows环境中也有类似的工具可用。如果你恰巧是在Windows环境中,没有访问Unix输入这些命令的机会的话,那么这一点就非常好。\r\n\r\n 我想要告诉那些想要调试错误的系统管理员如何使用oerr。然后他们就可以自己寻找错误了,如果他们可以解决一些用户的问题的话,这对他们来说可是个大忙了。 |
|