Shell Limits设置问题导致用户不能登录

2023-05-16


| 故障现象

前几天,突然间某数据库主机不能su切换到grid用户。

发生故障的环境为:RHEL 6.7,ORACLE 11gR2 RAC,其中集群节点1发生此故障,而节点2状态正常。

故障现象如下:

点击(此处)折叠或打开

  1. 本地节点从oracle用户su到grid用户,错误如下:
  2. [oracle@node1 /home/oracle]$su - grid
  3. su: cannot set user id: Resource temporarily unavailable
  4. 通过集群中的另外一个节点错误提示如下:
  5. [grid@node2:/home/grid]$ssh node1
  6. Write failed: Broken pipe
  7. [oracle@node2:/home/oracle]$ssh node1
  8. Last login: Thu May 10 12:28:22 CST 2018
  9. 而oracle用户正常
  10. 通过远程连接工具使用grid用户登录错误提示如下:
  11. Connection closed by foreign host.
  12. /var/log/secure报错如下:
  13. su: pam_keyinit(su-l:session): Unable to change UID to 500 temporarily
  14. su: pam_keyinit(su-l:session): Unable to change UID to 500 temporarily

| 故障分析

参考MOS文档号:1174073.1,可能是limits设置不合理导致的,而Shell Limits会限制用户资源的使用。

同时根据文档788064.1,进行如下步骤诊断:

1. 查看集群状态,数据库状态以及相关日志信息。

检查结果:除了上述现象外,集群状态正常,数据库告警日志此段时间内没有任何错误,数据库中也没有发现异常的等待,客户的业务也正常。

2. 查看用户的进程数。

点击(此处)折叠或打开

  1. [oracle@node1 /home/oracle]#ps -u grid -L |wc -l
  2. 1560
  3. 查看用户打开文件数。

点击(此处)折叠或打开

  1. [oracle@node1 /home/oracle]$ lsof -u grid | wc -l
  2. 4000


上述结果表明:当前环境中打开文件数较多,而通过检查用户的进程,并没有发现有异常的程序。那极有可能就是设置的limits过小导致。

4. 检查/etc/security/limits.conf,查看grid用户的nproc和nofile设置。

点击(此处)折叠或打开

  1. [grid@node1 /home/oracle]$cat /etc/security/limits.conf
  2. # /etc/security/limits.conf
  3. #
  4. #Each line describes a limit for a user in the form:
  5. #
  6. #<domain> <type> <item> <value>
  7. #
  8. #Where:
  9. #<domain> can be:
  10. # - an user name
  11. # - a group name, with @group syntax
  12. # - the wildcard *, for default entry
  13. # - the wildcard %, can be also used with %group syntax,
  14. # for maxlogin limit
  15. #
  16. #<type> can have the two values:
  17. # - "soft" for enforcing the soft limits
  18. # - "hard" for enforcing hard limits
  19. #
  20. #<item> can be one of the following:
  21. # - core - limits the core file size (KB)
  22. # - data - max data size (KB)
  23. # - fsize - maximum filesize (KB)
  24. # - memlock - max locked-in-memory address space (KB)
  25. # - nofile - max number of open files
  26. # - rss - max resident set size (KB)
  27. # - stack - max stack size (KB)
  28. # - cpu - max CPU time (MIN)
  29. # - nproc - max number of processes
  30. # - as - address space limit (KB)
  31. # - maxlogins - max number of logins for this user
  32. # - maxsyslogins - max number of logins on the system
  33. # - priority - the priority to run user process with
  34. # - locks - max number of file locks the user can hold
  35. # - sigpending - max number of pending signals
  36. # - msgqueue - max memory used by POSIX message queues (bytes)
  37. # - nice - max nice priority allowed to raise to values: [-20, 19]
  38. # - rtprio - max realtime priority
  39. #
  40. #<domain> <type> <item> <value>
  41. grid soft nproc 2048
  42. grid hard nproc 4096
  43. grid soft nofile 2048
  44. grid hard nofile 4096
  45. ……

    /etc/security/limits.conf文件为每个用户设置系统资源的限制。从以上输出:从该设置和结合之前查询结果来看,当前  
   nproc和nofile这两个值设置得太小。这两个参数设置除需参照Oracle建议值外还需考虑是否符合实际环境。


  | 解决方案


   根据上述分析中得出:由于设置的nproc和nofile值太小而导致,因此需要修改这两个值。

1.手动修改/etc/security/limits.conf中的设置。

这两个值设置参考系统本身的资源情况以及业务情况。因此暂定该环境修改值如下:

点击(此处)折叠或打开

  1. [grid@node1 /home/oracle]$cat /etc/security/limits.conf
  2. grid soft nproc 16384
  3. grid hard nproc 16384
  4. grid soft nofile 16384
  5. grid hard nofile 16384

注:可以使用官方提供的oracle-validated包来修改/etc/security/limits.conf,这个包提供修改内核参数,用户limits等。该RPM包可以从http://oss.oracle.com网站获取。如果是运行在OL6/RHEL6中的Oracle database 11gR2该包名被替换为 oracle-rdbms-server-11gR2-preinstall。

2.检查故障是否存在。

点击(此处)折叠或打开

  1. [oreacl@node1 /home/oracle]#su – grid
  2. Password:
  3. Last login: Thu May 10 13:28:22 CST 2018

通过oracle用户再次切换到grid用户时恢复正常。

3.查看用户limits。

点击(此处)折叠或打开

  1. [grid@node1:/home/grid] $ ulimit -Su
  2. 16384
  3. [grid@node1:/home/grid] $ ulimit -Hu
  4. 16384
  5. [grid@node1:/home/grid] $ ulimit –Sn
  6. 16384
  7. [grid@node1:/home/grid] $ ulimit -Hn
  8. 16384

修改之后grid用户的nproc和nofile为最新值。

4.附录:当达到其他limits设置时出现的不同错误。

 A. 当达到’open files’限制时错误。


     B.当达到’max user processes’限制时错误。




| 作者简介

杨波,沃趣科技数据库技术专家
主要参与公司产品实施、测试、维护以及优化。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28218939/viewspace-2155099/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28218939/viewspace-2155099/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell Limits设置问题导致用户不能登录 的相关文章

  • 在powershell中检查文件是否可读且正常

    我是 powershell 新手 我想检查文件是否可读且正常 在 unix 中 我们可以使用 f 和 r 在一行中完成此操作 例如 以下 shell 脚本函数接受文件名作为参数并检查文件的可读性和规律性 与此等效的 powershell 是
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 如何在 Xcode 4.2 中创建 Shell 脚本目标?

    我想知道是否有人知道 XCode 4 1 如何创建 shell 脚本 该选项不存在 但在最新版本中可能会被称为其他名称 塔 在导航器中选择您的项目 单击 添加目标 为空目标选择 聚合 添加构建阶段 gt 添加运行脚本 单击构建阶段并编辑运行
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装
  • Mongodb shell mongo:通常只允许每个套接字地址(协议/网络地址/端口)使用一次。对于套接字:0.0.0.0:27017

    前两天还好好的 现在mongod不起作用 甚至echo ps A grep mongo没有打印任何内容 但它警告错误 每个套接字地址只有一种用途 怎么杀掉它 我也尝试过不同的随机端口 他们怎么可能也失败呢 D mongodb win32 x
  • shell脚本中的\r字符

    我在尝试执行 shell 脚本时收到以下错误 r command not found line 2 请提出同样的解决方案 以下是脚本中使用的初始行 bin sh if lt 1 then echo ERROR Environment arg
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 从 shell 命令调用 SOAP 请求

    我使用curl 向Web 服务发送SOAP 请求 并使用shell 脚本获取响应 请在下面找到我正在使用的命令 curl H Content Type text xml charset utf 8 H SOAPAction d sample
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • shell-out 值到 md5(加密)函数

    我正在寻找一种解决方案 我正在构建 JSON 记录 并需要在 JQ 中生成一些文本 但将此文本通过管道传输到 MD5 求和函数并将其用作键的值 echo first John last Big jq id first last md5 通过
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢

随机推荐