solaris10设置project错误,导致srvctl无法启动rac节点

今天遇到一个问题,同事在做完change之后,尝试用srvctl start database -d ,发现节点1能正常启动,但是节点2无法启动。观察其在节点2上的crsd的log,发现:

检查crs_stat -t 发现node2确实是offline。

在node2上的alertlog中,我们看到:

我们尝试用srvctl指定instance来启动,运行srvctl start instance -d -i 也是同样的报错。

那么为什么在node2上会报错:WARNING: EINVAL creating segment of size 0x0000000380008000和fix shm parameters in /etc/system or equivalent, 难道是内核参数设置的问题?

从报错信息,我们看到0x0000000380008000,转换成十进制是14G,也就是我们sga的大小,也就是sga的大小设置超过了操作系统中类似像shmmax之类的参数设置,操作系统层面无法给oracle配置超过14G的内存,所以oracle就报错了。

我们尝试用sqlplus登录后,启动node2,却能正常启动了。奇怪,srvctl无法正常启动,报错设置的操作系统内存太小,但是sqlplus却能正常启动?

如果说是sqlplus也不能正常启动,那确实是因为操作系统层面设置的问题了,但是目前的情况是sqlplus能正常启动,但是srvctl却不行,难道是bug?

在搜索metalink中,我找到了一篇文章:Bug 5340239: SRVCTL IS NOT ABLE TO GET THE RIGHT SHM RELATED SETTINGS(该bug全文见最后)。上面说,srcvtl在启动时会通过prctl命令读取/etc/system中的信息,似乎srvctl在读取该信息的时候,无法正确的读取,造成该报错。而sqlplus去读取/etc/system则是没有问题的。临时的解决方法是手工的在/etc/system中加入shmmax参数的设置。

检查了2个节点的/etc/system,发现2边的文件都是一样的,都没有在里面设置shmmax参数。那么,为什么在node1上能起来,node2上无法起来呢?

检查oracle用户的shm-memory,发现privileged是22G,也确实超过了sga需要的14G。

那既然oracle设置的没有问题,为什么node1上会启动成功,node2上会失败?接着继续找原因,我们发现另外一个文档:SRVCTL FAILS TO START DATABASE WHILE SQLPLUS WORKS (Doc ID 603051.1 该文档全文见最后),该文档说,project for oracle是没有问题的,问题是出在system的project上,因为srvctl启动数据库的时候,会继承system的project。

因为srvctl调用crsd.bin,而crsd.bin的owner是root:

而在crsd.bin以root身份调用racgwrap 的时候,虽然会setid,setgid来更改自身的user id和group id,但是无法更改其project id,所以,如果root的project,设置的使用内存小于sga的大小,那么由于srvctl在启动的时候,调用以root身份的crsd.bin,并且继承了root(system)的project设置,那么就会出现上述的报错。

我们来检查一下root的project设置:
node1上:

node2上:

我们看到node1的project文件中,比node2多了关于system的设置:

这就是问题所在。

如果用prctl命令来看,会看的更清楚:
node1

node2:

看,在node2上,system的内存限制在了7.74G(注:在没有指定project.max-shm-memory的情况下,默认大小为系统物理内存的是四分之一,因此,32G物理内存的主机,四分之一即为8G。),小于了sga的14G。

解决方法为以root用户运行一下命令,使得system的内存设置大小为22G,超过sga的14G:

另外,需要给/etc/user_attr中root的用户加上project=system:

























附:Bug 5340239和Doc ID 603051.1

相关文章

5条评论

  1. 这个问题我印象深刻,因为我在11gR2也有一个类似的bug,在Soalris上。
    project的设置有问题会srvctl启动db有问题。不过现在这个问题已经修复了。

  2. 能具体的解释下这个project在solaris系统里具体的功能和作用是什么吗?

  3. 楼主很爱捉摸,总能把问题搞得很清楚,很是佩服。

    我之前遇到一个问题到现在还没有头绪。
    9.2的库
    1、使用sqlplus “user/pass”执行语句没问题。
    2、使用sqlplus “user/pass@tns”执行语句就报错。说是LARGE POOL设置太小。

  4. re wangliang :project是solaris对系统资源的一种管理方式,solaris 10开始配置的文件有所不同,这里有个文章可以参考。http://www.princeton.edu/~unix/Solaris/troubleshoot/resmgmt.html

  5. 解决了我的一个疑惑,我以前遇到这个问题没搞明白,就修改了root的project解决了,没搞明白怎么解决的这个问题。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据