Postgresql 创建新表时Postgres客户端锁定

Postgresql 创建新表时Postgres客户端锁定,postgresql,Postgresql,我正试图在postgres中创建一个新表,但在调用create table之后,它就挂起了 $ sudo usermod -s /bin/bash postgres $ sudo su - postgres postgres@host:~$ psql ranking_analytics psql (8.4.8) Type "help" for help. ranking_analytics=# BEGIN; BEGIN ranking_analytics=# CREATE TABLE "abo

我正试图在postgres中创建一个新表,但在调用
create table
之后,它就挂起了

$ sudo usermod -s /bin/bash postgres
$ sudo su - postgres
postgres@host:~$ psql ranking_analytics
psql (8.4.8)
Type "help" for help.

ranking_analytics=# BEGIN;
BEGIN
ranking_analytics=# CREATE TABLE "about_contactmessage" (
ranking_analytics(#     "id" serial NOT NULL PRIMARY KEY,
ranking_analytics(#     "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED,
ranking_analytics(#     "subject" text NOT NULL,
ranking_analytics(#     "message" text NOT NULL,
ranking_analytics(#     "recorded_time" timestamp with time zone NOT NULL
ranking_analytics(# )
ranking_analytics-# ;
NOTICE:  CREATE TABLE will create implicit sequence "about_contactmessage_id_seq" for serial column "about_contactmessage.id"
然后它将不确定地坐在这里,直到I
CTRL-C
It

数据库中还有其他表,但此表不存在:

ranking_analytics=# \d about_contactmessage
Did not find any relation named "about_contactmessage".
我能够毫无问题地对数据库中的其他表执行插入和删除查询:

ranking_analytics=# insert into locations_continent (continent_name) VALUES ('testing');
INSERT 0 1
ranking_analytics=# delete from locations_continent where continent_name = 'testing';
DELETE 1
机器上有足够的驱动器空间:

$ df -H
Filesystem             Size   Used  Avail Use% Mounted on
/dev/xvda               21G   2.3G    18G  12% /
devtmpfs               255M   132k   255M   1% /dev
none                   257M   476k   256M   1% /dev/shm
none                   257M    54k   257M   1% /var/run
none                   257M      0   257M   0% /var/lock

有什么想法可能是错误的吗?

如果重新启动postgres是一种选择,那么这将很可能解决问题,并将节省您阅读以下答案的时间:-)

检查
pg_stat_activity
视图,可能有其他事务阻止架构更改

select * from pg_stat_activity 
where 
wait_event_type is NULL and xact_start is not NULL order by xact_start;
(pg_stat_活动在每个主要的pg版本中都会有一些变化,对于较老的版本,可以尝试此操作):

出现的第一行可能是导致问题的那一行。它通常是一个“空闲事务”-这很可能持有锁,如果它是一个旧事务,那么它也可能会破坏性能。可能程序员忘记了确保以“提交”或“回滚”结束事务,或者可能由于网络问题某些db会话被卡住

要使用pid 1234终止事务,请使用
选择pg_cancel_backend(1234)
,如果失败,
选择pg\u terminate\u backend(1234)
。对于shell访问,等效的命令是
kill-int1234
kill 1234
。(请记住,
kill-91234
是一个非常糟糕的主意)

还有一个视图
pg_locks
,可以提供一些见解,尽管从中获取有用的信息可能不是那么容易。如果
grated
为true,则锁定被保持;如果
grated
为false,则表示查询正在等待锁定。以下是有关如何从pg_锁中提取有用信息的更多提示:


如果其他一切都失败了,那么可能是时候采用简单的解决方案了,重新启动数据库服务器。

本线程对此进行了解释

据汤姆·莱恩说

此创建操作引用auth_user表,PostgreSQL应向这两个表添加触发器。因此,如果有一个长时间运行的(可能是空闲的)开放事务在auth_用户Postgres上持有AccessShare锁,那么它将被阻止,等待xact完成并释放其锁。其他所有的东西都在Create后面排队


PostgreSQL邮件线程读得很好。

我发现刚刚挂在
ALTER TABLE“about\u contactmessage”ADD CONSTRAINT“user\u id\u refs\u id\u 2a9a546ebb1d6a8b”外键(“user\u id”)引用“auth\u user”(“id”)的查询最初可延迟,我用
选择pg\u cancel\u后端(30969)杀死了它
并再次运行createtable命令,但它仍然挂起。ALTER TABLE语句是当时数据库上唯一运行的语句。我刚刚查看了
pg_locks
,它充满了整数。我将重新启动postgres并尝试再次创建表。终止挂起的进程、重新启动postgres然后重试的组合修复了它。非常感谢你!我会在答案中加上“重启postgres”。我想了想,但觉得太傻了;-)“等待”列的“等待事件类型”和“等待事件”介于9.5和9.6之间。您可能可以在查询中将其替换为
wait\u event\u type为NULL
sudo-u postgres psql
更容易,顺便说一句。
select * from pg_stat_activity 
where 
not waiting and xact_start is not NULL order by xact_start;