备份处理和锁

备份处理和锁

在备份时,gpcrondump工具会锁住pg_class系统表和正在备份的表。用一个EXCLUSIVE锁锁住pg_class表确保没有表会被增加、删除或者修改,直到gpcrondumpACCESS SHARE锁锁住要被备份的表为止。

这些步骤描述了gpcrondump转储数据库所遵循的过程,包括在锁被放置前、锁持有期间以及锁被移除后会发生什么。

如果指定了多于一个数据库,会按顺序为每一个数据库执行这一过程。

  • gpcrondump解析命令行参数并且验证选项和参数是否被正确地指定。
  • 如果指定了下列任一过滤器选项,gpcrondump会准备过滤器来决定要备份的表集合。否则,所有的表都会被包括在备份中。
    • -s schema_name – 包括由指定方案限定的所有表。
    • -S schema_name – 排除由指定方案限定的所有表。
    • --schema-file=filename – 将filename中列出的方案限定的所有的表包括在内。
    • --exclude-schema-file=filename – 将filename中列出的方案限定的表排除在外。
    • -t schema.table_name – 转储指定的表。
    • -T schema.table_name – 排除指定的表。
    • --table-file=filename – 转储filename中指定的表。
    • --exclude-table-file=filename – 转储除filename中指定的表之外的所有表。
  • gpcrondump验证备份目标:
    • 验证数据库存在。
    • 验证要转储的指定表或方案存在。
    • 验证每个Segment的主Segment已启动。
    • 验证备份目录存在且对于Master和每个Segment可写。
    • 验证有足够的磁盘空间可用于备份每个Segment。注意有多于一个Segment会被备份在同一个磁盘卷上,这种磁盘空间检查不能确保对所有的Segment都有可用的空间。
  • 放一个EXCLUSIVE锁在目录表pg_class上。这个锁只允许在一个表删共有并发的读操作。当这个锁被加在该目录表上时,数据库中不能创建、修改或者删除表、索引和视图这类关系。

    gpcrondump开启一个线程来观察一个锁文件(dump_dir/gp_lockfile_timestamp)出现,它标志着Segment上的并行备份完成。

  • gpcrondump用一个ACCESS SHARE锁锁住要被备份的表。
    ACCESS SHARE锁只与ACCESS EXCLUSIVE锁冲突。下面的SQL语句要求一个ACCESS EXCLUSIVE锁:
    • ALTER TABLE
    • CLUSTER
    • DROP TABLE
    • REINDEX
    • TRUNCATE
    • VACUUM FULL
  • 为Master和Segment创建和分派线程来执行数据库转储。
  • 当这些线程在所有需要的表上得到了所要求的ACCESS SHARED锁后,dump_dir/gp_lockfile_timestamp锁文件会被创建,它标志gpcrondump可以释放pg_class系统表上的EXCLUSIVE锁,这时表还在被备份中。
  • gpcrondump对每个主Segment检查状态文件来发现任何需要报告的错误。如果一次转储失败并且指定了-r标志,备份会被回滚。
  • 目标表上的ACCESS SHARE锁会被释放。
  • 如果备份成功且用-R选项指定了一个转储后脚本,gpcrondump现在会运行该脚本。
  • gpcrondump报告备份状态、发送email(如果配置)并且将备份状态保存在数据库中的public.gpcrondump_history表中。