我正在使用Heroku管理的psql数据库来提供生产流量。我想放下桌子" Foo":
DROP TABLE "Foo";
本声明当然需要表格上的AccessExclusiveLock" Foo"。由于持有AccessSharedLock的其他进程,我无法获得此锁。
通过查找持有锁的进程(使用查询here),我能够识别在表Foo上保存AccessSharedLocks的两个进程,并阻止我的查询。一个是:
WITH table_scans as (
SELECT relid,
tables.idx_scan + tables.seq_scan as all_scans,
( tables.n_tup_ins + tables.n_tup_upd + tables.n_tup_del ) as writes,
pg_relation_size(relid) as table_size
FROM pg_stat_user_tables as tables
),
all_writes as (
SELECT sum(writes) as total_writes
FROM table_scans
),
indexes as (
SELECT idx_stat.relid, idx_stat.indexrelid,
idx_stat.schemaname, idx_stat.relname as tablename,
idx_stat.indexrelname as indexname,
idx_stat.idx_scan,
pg_relation_size(idx_stat.indexrelid) as index_bytes,
indexdef ~* 'USING btree' AS idx_is_btree
FROM pg_stat_user_indexes as idx_stat
JOIN pg_index
USING (indexrelid)
JOIN pg_indexes as indexes
ON idx_stat.schemaname = indexes.schemaname
AND idx_stat.relname = indexes.tablename
AND idx_stat.indexrelname = indexes.indexname
WHERE pg_index.indisunique = FALSE
),
index_ratios AS (
由于track_activity_query_size的设置无法在Heroku psql实例上更改,因此查询的其余部分不可用。
第二个是用户postgres运行的这个神秘查询。我无法在pg_stat_activity中查看此查询。相反,我看到<insufficient privilege>
。我也无法从heroku pg:ps
找到有关此查询的任何信息。
我最好的猜测是,这是自动真空运行或Heroku的度量生成查询。
我能够使用pg_terminate_backend
来终止类型(1)的查询,但它们会不断重新出现。我无法终止类型(2)的查询。
我该怎么办?这些阻止查询阻止了我的DROP TABLES
请求。等待它们似乎不是一个可行的选择 - 我的请求现在已被阻止24小时。
答案 0 :(得分:0)
我直接向Heroku伸出手来寻求帮助。确实问题是长期运行的Postgres自动真空。此过程由超级用户控制,Heroku用户无权访问。
Heroku代表我采取了以下行动: (1)截断表格 (2)杀死自动吸尘器
然后我才能放下桌子。