Postgres 长时间自动清理停止数据库

And*_*nic 8 postgresql aws postgresql-9.5 autovacuum

我有一个相当大的表(100 万行),我的数据库卡在这个表上的自动清理(> 30 分钟)上,导致整个数据库阻塞。应用程序现在甚至不会加载。

-00:37:31.137859 autovacuum: VACUUM public.users
Run Code Online (Sandbox Code Playgroud)
SELECT n_tup_del, n_tup_upd FROM pg_stat_all_tables WHERE relname = 'users';
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这些是我的用户表上的 autovacuum 设置:

-00:37:31.137859 autovacuum: VACUUM public.users
Run Code Online (Sandbox Code Playgroud)

我从慢 PostgreSQL 性能中使用的这些建议设置?不要忘记清空你的数据库

我只需要等待吗?我有哪些选择?

更新

我已升级到 Postgres 9.5,并将我的 RDS IOPS 增加到 900,并且真空过程仍然使 IOPS 达到最大值并且无法对数据库执行任何其他操作。该过程在升级前 1 天的某个时间点运行。

我还删除了我拥有的自定义 autovacuum 设置,现在只使用默认设置。

以下是这些查询结果的附件;

SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_database;
SELECT * FROM pg_stat_user_tables;
SELECT * FROM pg_stat_user_indexes;
SELECT * FROM pg_locks;
Run Code Online (Sandbox Code Playgroud)

http://www.filedropper.com/output_5

fil*_*rem 6

VACUUM 可以通过以下方式安全地终止由 autovacuum 启动的进程:

SELECT pg_terminate_backend(PID_of_backend);
Run Code Online (Sandbox Code Playgroud)

实际上,Postgresql 中的任何客户端进程都可以通过这种方式终止。此后端未提交的工作将被简单地丢弃。

然后,您可以VACUUM在低流量时间手动重新运行:

VACUUM VERBOSE users;
Run Code Online (Sandbox Code Playgroud)

检查基于成本的真空延迟是否可以帮助您。这将限制您的 autovacuum 进程使用的 I/O 数量。

也许您只是达到了 IOPS 限制。您应该能够在 AWS 界面上看到这些数字。在独立的 Linux 上用于iostat -dtkxy 10测量 I/O。(iostat通常包装在sysstat包中)。

也许VACUUM由于您的配置中的激进设置,它经常再次出现。

  • 在 RDS 实例上安装和使用这两个工具是不可能的。 (4认同)