查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

Posted luffy5459

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法相关的知识,希望对你有一定的参考价值。

如题所示,这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。

bin\\pg_dump --dbname=postgresql://dbuser:123456@localhost:5432/test --table public.xx_user --table test.xx_test -f d:\\tools\\pgsql\\dump.sql
pg_dump: 错误: 查询失败: 閿欒:  瀵规ā寮?test 鏉冮檺涓嶅
pg_dump: 错误: 查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE

产生这个问题的原因是,pg_dump需要使用超级用户。

经过如下命令,更改dbuser为超级用户:

postgres=# alter user dbuser with superuser;
ALTER ROLE

接着,执行备份,不会报错。

备份出来的sql:

可以看到, 备份数据来自不同的schema。

===============================================

最后给出用户管理相关的几个操作,首先是通过postgresql自带的createuser命令可以创建用户:

如下示例,该命令可以创建一个能创建数据库,但是不是超级用户的用户test,并给该用户设置口令也就是密码:

D:\\tools\\pgsql>bin\\createuser.exe -d -P -S test
为新角色输入的口令:
再输入一遍:

数据库中,可以使用\\du命令,看到的用户信息:

这种创建用户,是使用bin目录下的createuser命令,还可以进入psql命令行,使用create user命令来创建用户:

test=# create user dbuser with password '123456';
CREATE ROLE

我们要注意这两种方式的区别,一个是在cmd命令行下通过postgresql数据库bin目录下的可执行程序createuser运行,一个是在psql命令行下通过create命令来创建用户。

如果我们创建的用户不满足要求,我们可以通过alter user xxx with [ ]来修改用户,修改与创建,参数类似:

最后,觉着用户没有存在的必要,可以删除用户 drop user dbuser。如果删除用户失败,可能是有权限关联用户,需要先收回权限。

revoke all on database test from dbuser

以上是关于查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL for update 到底是 row lock / table lock

MySQL Waiting for table metadata lock的解决方法

如何解决 sql 中的 lck_m_x Lock

Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock

sql server中怎样查询引起死锁的sql语句

怎样查看lock table的阻塞信息