POSTGRESQL 如果系统文件丢失或者无法使用,怎么办, 那堆系统文件都在哪里,怎么检测, 此刻是不是心里有慌的一匹的感觉. pg_catcheck 会帮助PGER 们来好好的来管管此事.举例,我们当访问某个对象的时候无法访问的时候, 如 could not open file base / xxxxxx, 到底是怎么回事.
pg_catcheck 是检查在pg_namespace.oid中不存在的relnamespace,通过 pg_catcheck 来的检测来说明当前PG的系统文件中的文件和关系是否一一对应.
pg_catcheck 对于某一个数据库是可以进行相关的数据一致性的判断, 命令和psql 是类似的,如果是对于详细信息展示,也是有命令可以支持的,添加 -v 命令可以对于检查的数据库的内部信息进行一个全面的扫描.
下面的检测我特意从数据库(运行)删除了一些数据文件,然后通过pg_catcheck来进行检测, 通过检测可以发现有数据丢失的情况.
这个工具负责的区域,和原因,主要是PG 存储的metadata 中对于 SQL objects 类似表,function, 等这些信息被称作system catalog table, 用户是不能修改这些信息,必须通过 create alter , drop 等方式来进行,如果系统的catalog出现问题,那么访问数据的时候会出现问题,并且tongguo pg_dump来备份也是无法进行的.
pg_catcheck本身是不能告诉你,为什么system catlog出现什么问题,何时发生的,发生的原因是什么,pg_catcheck 能告诉你的就是系统的catalog出问题了,你需要注意了
上图告知了,两个文件,并且物理位置和实际的表,VIEW 名都给出那两个system object 出现问题了,文件丢失了(这边先删除做的实验)
另外检测这个问题还可以通过 initdb -k 的参数来进行, 这个在PG 12 中可以开始使用用来对数据库的数据进行校验并反馈的系统表里面. 在初始化的时候天剑 -k 或者 --data-checksums ,但用这个功能需要注意
1 对于大型的数据库操作可能需要比较长的时间, 系统需要在关闭的状态下进行
2 对于正在复制的系统,不要轻易启动或者关闭这个参数,如果要关闭,需要将所有的复制的机器全部关闭,否则会造成在切换的过程中,数据损坏导致整体数据库无法在使用.
pg_checksums -c -D /pgdata/data/ -e -v
通过上面的命令来开启数据文件的检测
https://www.postgresql.org/docs/12/app-pgchecksums.html
具体的命令可以查看上面的连接
所以相比较危险性和功能, pg_catcheck 可以满足系统文件缺失判断的基本功能,并且可以在数据库系统启动的状态下,工作,而其他的方式就需要关闭数据库来操作,这点也是值得考虑的问题.