【KingbaseES】ERROR: database “xxx“ is being accessed by other users 内置三种解决方案

问题

在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;

 权限的选项有如下:

  1. CONNECT:控制用户是否能够连接到数据库。
  2. CREATE:控制用户是否能够创建新的数据库对象,如表、视图、索引等。
  3. SELECT:控制用户是否能够查询(读取)表的数据。
  4. INSERT:控制用户是否能够向表中插入新的数据。
  5. UPDATE:控制用户是否能够更新表中现有数据。
  6. DELETE:控制用户是否能够删除表中的数据。
  7. USAGE:控制用户是否能够使用某个模式下的对象,如函数、序列等。
  8. REFERENCES:控制用户是否能够创建外键关系。
  9. EXECUTE:控制用户是否能够执行函数、存储过程等。
  10. 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的命令行,执行数据库的删除命令就成功啦。

猜你喜欢

转载自blog.csdn.net/m0_52985087/article/details/132491881