1. 开启一个repeatable read事务,
2. 然后需要从系统表以及传入的参数,生成备份集,u5b8bu4f53; font-size:16px">
3. 备份开始前,需要一次性把需要备份的所有对象都加上access share lock,这个锁与DML不冲突,只和DDL冲突,例如TRUNCATE表会和pg_dump发生冲突(当需要备份的表被执行DDL时,只要pg_dump未结束,DDL就会处于等待状态).
所以如果需要备份的数据集很大的话,备份程序pg_dump持有access share lock的时间就越长,这段时间如果程序需要对备份的表做出DDL操作(如drop,truncate),DDL sql就要进入等待.
这样的情况其实很容易发生,例如凌晨是比较空闲的时间,备份和统计作业可能都会放到凌晨来处理.
假设1点开始备份,备份到5点结束. 备份作业包含了以下truncate操作的表.
这种场景的备份需要排除需要truncate的表,那么就不会发生锁冲突.
pg_dump有一个参数来排除不需要备份的表.
-T,--exclude-table=TABLE do NOT dump the named table(s)
另外还有一个参数,指定锁等待时间,当pg_dump不能在这个时间内获得access share lock的话,就报错.
--lock-wait-timeout=timeout
Do not wait forever to acquire shared table locks at the beginning of the dump. Instead fail if unable
to lock a table within the specified timeout. The timeout may be specified in any of the formats
accepted by SET statement_timeout. (Allowed values vary depending on the server version you are dumping
from,but an integer number of milliseconds is accepted by all versions since 7.3. This option is
ignored when dumping from a pre-7.3 server.)