1 故障现象
dminit 创建达梦实例时报如下错误:
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2024-01-03
Fail to create semaphore.
The instance /data/dmdata/cndba is running or check instance active failed.
fail to init db.
2 故障分析
这里报错是信号量的问题,信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。
信号量是linux系统中的一种资源,达梦在初始化实例的过程中也是需要申请信号量。
使用命令ipcs -l可以查看信号量相关的资源限制:
[dave@www.cndba.cn log]# ipcs -l
------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509481983
max total shared memory (kbytes) = 18014398509480960
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767
通过命令ipcs -u可以看到当前系统中已经使用的信号量集和信号量总数:
[dave@www.cndba.cn log]# ipcs -u
------ Messages Status --------
allocated queues = 0
used headers = 0
used space = 0 bytes
------ Shared Memory Status --------
segments allocated 20
pages allocated 1738996
pages resident 723437
pages swapped 0
Swap performance: 0 attempts 0 successes
------ Semaphore Status --------
used arrays = 405
allocated semaphores = 7351
可以看到,我们这里已经使用405,而限制的才128。 所以报错。
3 解决方法
修改/etc/sysctl.conf 文件:
修改kernel.sem =250 32000 32 256
到
kernel.sem =250 32000 32 1024
执行sysctl -p 加载生效。 再次执行dminit,不再报错。
注意
这里有个背景,我们这台测试主机是复用了,上面还装了其他的几个数据库。 如果是新环境,只跑达梦,应该不会报这个错误。
版权声明:本文为博主原创文章,未经博主允许不得转载。