Heroku超级用户查询阻止我获取AccessExclusiveLock。我怎么能掉桌子?

时间:2017-09-29 00:34:04

标签: postgresql heroku

我正在使用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小时。

1 个答案:

答案 0 :(得分:0)

我直接向Heroku伸出手来寻求帮助。确实问题是长期运行的Postgres自动真空。此过程由超级用户控制,Heroku用户无权访问。

Heroku代表我采取了以下行动: (1)截断表格 (2)杀死自动吸尘器

然后我才能放下桌子。