执行VACUUM FULL命令时报错:Lock wait timeout
问题现象
执行VACUUM FULL命令时报错:
1 2 3 |
[0]ERROR: dn_6009_6010: Lock wait timeout: thread 140158632457984 on node dn_6009_6010 waiting for AccessExclusiveLock on relation 2299036 of database 14522 after 1202001.968 ms Detail: blocked by hold lock thread 140150147380992, statement <<backend information not available>>, hold lockmode AccessShareLock. Line Number: 1 |
原因分析
日志中的“Lock wait timeout”说明锁等待超时。锁等待超时一般是因为有其他的SQL语句已经持有了锁,当前SQL语句需要等待持有锁的SQL语句执行完毕释放锁之后才能执行。当申请的锁等待时间超过GUC参数lockwait_timeout的设定值时,系统会报LOCK_WAIT_TIMEOUT的错误。
执行VACUUM FULL命令时出现报错的原因一般为执行命令超时,如果对整个数据库执行VACUUM FULL执行时间较长可能会超时。
处理方法
建议对单个表执行VACUUM FULL命令,命令格式为“VACUUM FULL 表名”,同时增加执行“VACUUM FULL”命令的频率。尤其是对于频繁增、删、改的表,建议定期做VACUUM FULL操作。