su - oracle报错su: cannot set user id: Resource temporarily unavailable

简介: 今天上线服务器连接数较多,我们知道ORACLE是多进程数据库,那么一个session 往往对应了一个OS的process,今天使用root进行切换的时候居然报错。 在测试上模拟再现 [root@testmy proc]# su - oracle su: can...
今天上线服务器连接数较多,我们知道ORACLE是多进程数据库,那么一个session
往往对应了一个OS的process,今天使用root进行切换的时候居然报错。

在测试上模拟再现
[root@testmy proc]# su - oracle
su: cannot set user id: Resource temporarily unavailable
出现这个这个错误当然第一反应是查看ulimit -a,如果真是资源不够了卧槽就悲剧

我使用开始连接好的进行查看:
[oracle@testmy ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31501
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 16384
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


一般我们需要关注
max user processes              (-u) 16384
open files                      (-n) 65535

用户可以打开的最大进程数和每个进程可以打开的最大文件数量,当然这个限制是hard限制。
不管怎么样明显没有超出,因为我的进程总数才1000多个,而且数据库日志没有任何报错,如
果资源不够那么就会出现比如fork进程失败的报错,或者超过最大文件数的报错,但是这里
没有,松了一口气。那么为什么出现这样的情况。查了一会资料发现没什么鸟用,那么我只
有自己找原因了。
首先明确问题:
1、ORACLE用户进程的总数没有超过hard限制,ORACLE没有任何问题
2、su - oracle报资源错误 Resource temporarily unavailable

那么我们只能从su - oracle做了什么入手了,首先要明确su - oracle到底做了什么实际上就是
bash(23799)───su(23819)───bash(23820)

bash fork 一个进程进行 su命名执行然后 su fork 一个进程出来 跑bash进程。好那么我们进行
strace:
strace -o strace.log -f -ff   su - oracle
-f表示trace fork出来的子进程 -ff表示在strace.log后面加上进程的pid
出来如下:
-rw-r--r--  1 root root      3330 Jan  4 08:52 strace.log.4804
-rw-r--r--  1 root root     40230 Jan  4 08:52 strace.log.4803
首先看一下strace.log.4804
找到重点:
setgroups(2, [501, 502])                = 0
setgid(501)                             = 0
setuid(502)                             = -1 EAGAIN (Resource temporarily unavailable)
setuid(502)的时候返回-1 报错并且设置errno为EAGAIN并且报错了Resource temporarily unavailable
( #define    EWOULDBLOCK    EAGAIN    /* Operation would block */)
setuid系统调用就是用于改变其有效userid的,那么我们看看setuid的返回值
RETURN VALUE
       On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

ERRORS
       EAGAIN The uid does not match the current uid and uid brings process over its RLIMIT_NPROC resource limit.

       EPERM  The user is not privileged (Linux: does not have the CAP_SETUID capability) and uid does not match the real UID or saved  set-user-ID  of
              the calling process.

显然这里我们可能的原因就是over its RLIMIT_NPROC resource limit,RLIMIT_NPROC位用户允许的最大进程数,
       RLIMIT_NPROC
              The  maximum  number of processes (or, more precisely on Linux, threads) that can be created for the real user ID of the calling process.
              Upon encountering this limit, fork(2) fails with the error EAGAIN.

那么ORACLE允许的进程数hard限制为16384明显没有超出,那么只可能是超过了其soft限制看看另外一个文件找到关键

setrlimit(RLIMIT_NPROC, {rlim_cur=1024, rlim_max=16*1024}) = 0

这里的rlim_cur为soft限制,为1024个,结构体如下:
          struct rlimit {
               rlim_t rlim_cur;  /* Soft limit */
               rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
           };

卧槽原因找到了,然后就要找到为什么是1024查看/etc/security/limits.conf
设置为:
* soft nproc 16384
* hard nproc 16384
* soft nofile 65535
* hard nofile 65535

也不是1024啊,然后查看/etc/security/limits.d/90-nproc.conf 
*          soft    nproc     1024
root       soft    nproc     unlimited

这里出现了1024,应该就是使用的这里的1024,然后修改后
*          soft    nproc     16384


切换成功再次查看
setrlimit(RLIMIT_NPROC, {rlim_cur=16*1024, rlim_max=16*1024}) = 0 
看到这里rlim_cur设置为了16*1024也就是16384.看来su 的时候确实是使用
的nproc的soft限制,那么这里涉及2个文件
/etc/security/limits.d/90-nproc.conf 
/etc/security/limits.conf
我们在上面的案例中看到当设置为
*          soft    nproc     1024这种的时候
90-nproc.conf 的优先级大于limits.conf,
但是经过我测试如果limits.conf 中如果指定用户
如:
oracle        soft    nproc     16384
会高于90-nproc.conf 。
同时要注意一下 90-nproc.conf这个文件生效的范围:
The issue starts only after upgrading the kernel later to 2.6.32-431.el6.x86_64

最后总结一下:
1、su -的时候使用的是soft限制
2、为了保证没有问题请这样设置
/etc/security/limits.conf
* soft nproc 16384
* hard nproc 16384
* soft nofile 65535
* hard nofile 65535
同时设置/etc/security/limits.d/90-nproc.conf 

*          soft    nproc     16384
设置profile也是:
if [ $USER = "oracle" ] || [ $USER = "grid" ]; then
        if [ $SHELL = "/bin/ksh" ]; then
              ulimit -u 16384
              ulimit -n 65535
        else
              ulimit -u 16384 -n 65535
        fi
        umask 022
fi

当然这里的设置为你实际的大小比如你的数据库最大会话数都超过了16384当然 nproc要设置得更大
相关文章
|
1月前
|
Oracle 关系型数据库 分布式数据库
PolarDB常见问题之PolarDB(Oracle兼容版) 执行命令报错如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
3月前
|
Linux iOS开发 MacOS
pnpm全局安装报错:Run “pnpm setup“ to create it automatically, or set the global-bin-dir setting, or the PN
pnpm全局安装报错:Run “pnpm setup“ to create it automatically, or set the global-bin-dir setting, or the PN
495 0
|
1月前
|
Oracle 关系型数据库 MySQL
Flink CDC产品常见问题之使用cdc-Oracle连接器报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
Flink CDC产品常见问题之使用cdc-Oracle连接器报错如何解决
|
2月前
|
Oracle 关系型数据库 Apache
Flink cdc报错问题之同步oracle报错如何解决
Flink CDC报错指的是使用Apache Flink的Change Data Capture(CDC)组件时遇到的错误和异常;本合集将汇总Flink CDC常见的报错情况,并提供相应的诊断和解决方法,帮助用户快速恢复数据处理任务的正常运行。
|
4月前
|
Oracle 关系型数据库 数据库
oracle数据恢复—服务器断电导致Oracle数据库报错的数据恢复案例
一台Windows server操作系统的服务器上部署Oracle数据库。 服务器意外断电导致oracle数据库报错,报错信息:“system01.dbf需要更多的恢复来保持一致性”。由于该oracle数据库并没有备份,仅有一些断断续续的归档日志,无法通过备份文件恢复oracle数据库的数据。管理员联系北亚企安数据恢复中心要求修复Oracle数据库。
oracle数据恢复—服务器断电导致Oracle数据库报错的数据恢复案例
|
3月前
|
Oracle 关系型数据库
【Oracle报错】[INS-13001] 环境不满足最低要求。
【Oracle报错】[INS-13001] 环境不满足最低要求。
|
4月前
|
分布式计算 Hadoop 大数据
|
5月前
|
Oracle 关系型数据库 数据库
Navicat连接Oracle报错:Oracle library is not loaded
Navicat连接Oracle报错:Oracle library is not loaded
106 0
|
5月前
|
Java Spring
Spring Boot 启动报错解决:No active profile set, falling back to default profiles: default
Spring Boot 启动报错解决:No active profile set, falling back to default profiles: default
116 0
|
5月前
|
SQL Oracle 关系型数据库
Oracle 插入时间时 ,报错:ORA-01861: 文字与格式字符串不匹配
Oracle 插入时间时 ,报错:ORA-01861: 文字与格式字符串不匹配

推荐镜像

更多