问题
在Linux系统下,通过命令的方式(drop database hltest;)删除人大金仓数据库的时候出现了如下报错信息
ERROR: database "hltest" is being accessed by other users
DETAIL: There is 1 other session using the database.
这个错误通常表示由于其他用户或会话正在使用目标数据库,因此无法执行所需的操作.
解决方法一
在删除某个数据库之前需要先,断开这个数据库的所有连接。可以直接一次性执行如下两个命令,其中:drop database 数据库名 是删除的数据库命令
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname='hltest' AND pid<>pg_backend_pid();
drop database hltest;
上面的hltest数据库名称换成你对应的要删除的数据库即可。
pg_terminate_backend:用来终止与数据库的连接的进程id的函数。
pg_stat_activity:是一个系统表,用于存储服务进程的属性和状态。
pg_backend_pid():是一个系统函数,获取附加到当前会话的服务器进程的ID。
解决方法二:
如果上述方法并不能解决这个问题的话,我们可以考虑先断开数据库对某个用户的连接,这个是指后续的连接关于“hl”连接不上这个数据库,当前数据库的连接还未断掉。
语法:REVOKE [权限] ON DATABASE [数据库名] FROM [用户名];
举例:如果我想断开“hltest”数据库对用户“hl”的连接命令如下:
REVOKE CONNECT ON DATABASE "hltest" FROM hl;
权限的选项有如下:
- CONNECT:控制用户是否能够连接到数据库。
- CREATE:控制用户是否能够创建新的数据库对象,如表、视图、索引等。
- SELECT:控制用户是否能够查询(读取)表的数据。
- INSERT:控制用户是否能够向表中插入新的数据。
- UPDATE:控制用户是否能够更新表中现有数据。
- DELETE:控制用户是否能够删除表中的数据。
- USAGE:控制用户是否能够使用某个模式下的对象,如函数、序列等。
- REFERENCES:控制用户是否能够创建外键关系。
- EXECUTE:控制用户是否能够执行函数、存储过程等。
- ALL PRIVILEGES:授予用户全部权限。
执行了上述命令之后,然后你再执行解决方法一的命令,断开所有与hltest数据库的连接。
解决方法三:
重启Kingbase数据库,再手动杀死Kingbase的进程,再删除数据库就OK啦。
先找到Kingbase的启动位置,一般是在安装Kingbase的路径上有个Server/bin下执行命令:
比如我的位置:cd /app/kingbase/ES/V8/Server/bin/
再执行如下重启命令:如果你想停止也可以将restart 换成stop 或者启动start
./sys_ctl restart -D /app/kingbase/ES/V8/data
上述命令执行一般会报错继续往后面看
或 选择一个用户直接执行这个命令
su -u kingbase ./sys_ctl restart -D /app/kingbase/ES/V8/data
-D 参数用于指定应用程序存放数据的位置或数据目录。
如果出现如下报错:就是不要使用root用户来执行这个命令,你可以切换一个用户来执行上述命令
sys_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.
可以通过 getent passwd 来查看当前系统有哪些用户
这是之前就创建好了的用户,如果不会可以查看创建系统用户的相关博客,应该需要根据你的系统版本来确定。创建好了之后我们就切换用户
su kingbase
出现了如下问题,找到不到对应命令,因此我们可以使用 /usr/bin/su kingbase 切换成功
切换成功之后,再执行重启Kingbase的命令就成功啦。
查看Kingbase的进程 ps -ef|grep kingbase
一个一个杀死进程,再进入Kingbase的命令行,执行数据库的删除命令就成功啦。