由于VACUUM查询,Amazon Redshift磁盘使用率为100%

时间:2014-07-16 12:37:12

标签: amazon-web-services amazon-redshift vacuum

阅读Amazon Redshift documentatoin我在某个400GB的桌面上运行了一个VACUUM,之前从未进行过清理,以提高查询性能。 不幸的是,VACUUM导致该表增长到1.7TB(!!)并使Redshift的磁盘使用率达到100%。 然后,我尝试通过在超级用户队列中运行CANCEL查询来停止VACUUM(通过运行“set query_group ='superuser';”输入它)但是虽然查询没有引发错误,但这对于不断运行的真空查询。

我该怎么办?

4 个答案:

答案 0 :(得分:9)

显然,目前你无能为力。 我打电话给亚马逊支持了一个小时,他们没有工具来阻止真空操作。 他们以静默方式打开了关于CANCEL查询的故障单,而不是在VACUUM查询上工作。

他们建议我拍摄群集的快照(如果你以前拍过快照,通常需要几分钟),然后重新启动群集。 它有点工作,意味着真空停止,一些磁盘空间被清除(600GB),但表仍然是原始大小的两倍多。因为再次吸尘会造成风险太大,我会使用它创建一个深层副本,它应该创建一个真空的表副本。 (你可以在这里阅读有关深层复制的内容 - http://docs.aws.amazon.com/redshift/latest/dg/performing-a-deep-copy.html)。

答案 1 :(得分:4)

我已多次停止真空操作。也许那个时候没有这个功能。
运行以下查询,该查询为您提供真空查询的进程ID。

select * from stv_recents where status='Running';

一旦有了进程ID,就可以运行以下查询来终止进程。

select pg_terminate_backend( pid );

答案 2 :(得分:4)

提示:运行此查询:(取自here)以查看应该吸尘的表格。

注意:这只会在您想知道哪些表很大,以及vacuum每个表可以获得什么的情况下有所帮助。

select trim(pgdb.datname) as Database,
    trim(a.name) as Table,  ((b.mbytes/part.total::decimal)*100)::decimal(5,2) as pct_of_total, b.mbytes, b.unsorted_mbytes
    from stv_tbl_perm a
    join pg_database as pgdb on pgdb.oid = a.db_id
    join (select tbl, sum(decode(unsorted, 1, 1, 0)) as unsorted_mbytes, count(*) as mbytes
    from stv_blocklist group by tbl) b on a.id=b.tbl
    join ( select sum(capacity) as  total
      from stv_partitions where part_begin=0 ) as part on 1=1
    where a.slice=0
    order by 3 desc, db_id, name;

然后使用高unsorted_mbytesVACUUM your_table;

的真空吸尘器表

答案 3 :(得分:1)

  1. 应定期安排真空,如果每天在桌子上抽真空,应该非常快,不会产生明显的副作用;
  2. 在您描述的情况下,将群集扩展到更大的配置,然后执行真空,然后您可以缩小到原始配置会更安全。请记住,可用磁盘空间对于RedShift群集上的计算至关重要,当可用磁盘空间不足时,群集上的所有读/写操作都将变得非常慢。