数据仓库服务 GAUSSDB(DWS)-VACUUM FULL执行慢:场景一:存在锁等待导致VACUUM FULL执行慢

时间:2024-05-07 20:29:47

场景一:存在锁等待导致VACUUM FULL执行慢

  • 8.1.x及以上集群版本的处理方法:
  1. 通过查询pgxc_lock_conflicts视图查看锁冲突情况。

    1
    SELECT * FROM pgxc_lock_conflicts;
    

    • 在查询结果中查看granted字段为“f”,表示VACUUM FULL语句正在等待其他锁。granted字段为“t”,表示INSERT语句是持有锁。nodename,表示锁产生的位置,即CN或DN位置,例如cn_5001,继续执行2
    • 如果查询结果为0 rows,则表示不存在锁冲突。则需排查其它场景。

  2. 根据语句内容判断是终止持锁语句后继续执行VACUUM FULL还是在业务低峰期选择合适的时间执行VACUUM FULL。

    如果要终止持锁语句,则执行以下语句。pid从上述步骤1获取,cn_5001为所查询到的nodename。

    1
    execute direct on (cn_5001) 'SELECT PG_TERMINATE_BACKEND(pid)';
    

  3. 语句终止后,再重新执行VACUUM FULL。

    1
    VACUUM FULL table_name;
    

  • 8.0.x及以前版本的处理方法:
  1. 在数据库中执行语句,获取VACUUM FULL操作对应的query_id。

    1
    SELECT * FROM pgxc_stat_activity WHERE query LIKE '%vacuum%'AND waiting = 't'; 
    

  2. 根据1获取的query_id,执行以下语句查看是否存在锁等待。

    1
    SELECT * FROM pgxc_thread_wait_status WHERE query_id = {query_id};
    

    • 查询结果中“wait_status”存在“acquire lock”表示存在锁等待。同时查看“node_name”显示在对应的CN或DN上存在锁等待,记录相应的CN或DN名称,例如cn_5001或dn_600x_600y,继续执行3
    • 查询结果中“wait_status”不存在“acquire lock”,排除锁等待情况,继续排查其它场景。

  3. 执行以下语句,到等锁的对应CN或DN上从pg_locks中查看VACUUM FULL操作在等待哪个锁。以cn_5001为例,如果在DN上等锁,则改为相应的DN名称。pid为2获取的tid。

    回显中记录relation的值。

    1
    execute direct on (cn_5001) 'SELECT * FROM pg_locks WHERE pid = {tid} AND granted = ''f''';
    

  4. 根据获取的relation,从pg_locks中查看当前持有锁的pid。relation3获取。

    1
    execute direct on (cn_5001) 'SELECT * FROM pg_locks WHERE relation = {relation} AND granted = ''t'''; 
    

  5. 根据pid,执行以下语句查到对应的SQL语句。pid4获取。

    1
    execute direct on (cn_5001) 'SELECT query FROM pg_stat_activity WHERE pid ={pid}';
    

  6. 根据语句内容判断是终止持锁语句后继续执行VACUUM FULL还是在业务低峰期选择合适的时间执行VACUUM FULL。

    如果要终止持锁语句,则执行以下语句。pid从上述4获取,cn_5001为所查询到的nodename。

    1
    execute direct on (cn_5001) 'SELECT PG_TERMINATE_BACKEND(pid)';
    

  7. 语句终止后,再执行VACUUM FULL。

    1
    VACUUM FULL table_name;
    

support.huaweicloud.com/trouble-dws/dws_09_0124.html