我试图在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"
然后它将无限期地坐在这里,直到我CTRL-C
。
数据库中还有其他表,而且这个表还不存在:
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
任何想法可能出错?
答案 0 :(得分:18)
如果重新启动postgres是一个选项,那么这很可能会解决问题,并且可以节省您花时间阅读其余答案: - )
检查pg_stat_activity
视图,可能还有一些其他事务阻止了架构更改。
select * from pg_stat_activity
where
not waiting and xact_start is not NULL order by xact_start;
显示的第一行可能是导致问题的那一行。它通常是“在交易中闲置” - 这可能很好地持有锁,如果它是一个旧的交易,它也可能会扼杀性能。程序员可能忘记确保以“提交”或“回滚”结束事务,或者可能由于网络问题导致某些数据库会话陷入困境。
要使用pid 1234终止交易,请使用select pg_cancel_backend(1234);
,如果失败,请使用select pg_terminate_backend(1234)
。通过shell访问,等效命令为kill -INT 1234
和kill 1234
。 (请记住,kill -9 1234
是一个非常糟糕的主意。)
还有一个视图pg_locks
可能会提供一些见解,尽管从中获取任何有用的信息可能并不容易。如果granted
为真,则保持锁定,当granted
为假时,表示查询正在等待锁定。以下是有关如何从pg_locks中提取有用信息的更多提示:http://wiki.postgresql.org/wiki/Lock_Monitoring
如果其他一切都失败了,那么可能是时候去寻找简单的解决方案,重启那个数据库服务器。
答案 1 :(得分:6)
这个在这个帖子中解释; http://www.postgresql.org/message-id/75218696-61be-4730-89f6-dd6058fa9eda@a28g2000prb.googlegroups.com
据汤姆莱恩说,
此create操作引用auth_user表,PostgreSQL应向两个表添加触发器。因此,如果存在长时间运行(可能是空闲的)打开事务,那么在auth_user上保持AccessShare锁定Postgres将被阻止等待该xact完成并释放其锁定。其他一切在Create。后面排队。
PostgreSQL Mail帖子是一个很好的阅读。