前天,在客户现场,客户很无奈的过来和我们说:哎,那天为了方便,直接给业务操作人员一个superuser的权限,谁知道今天就出了事,他们直接把postgres库给删除了。不过,目前业务还是可以正常使用。这里面存了那么多元数据、统计信息,虽然业务可以正常使用,但是不知道后面怎么样。
客户说完,我第一反应:是呀,那么多元数据,统计信息数据,数据字典都在里面,估计用到后面就会出问题了。
后来,我一直在纠结,这个postgres库如何重建,在没有备份的情况下,如何能把元数据获取到呢?
于是尝试在自己的环境上进行模拟尝试:
1.尝试访问pg_class、pg_database等表和视图;
2.为了防止无法恢复,首先自己tar一个完整的包;
3.进入客户端重新创建postgres数据库
在访问pg_class、pg_database等元数据视图的时候,发现可以正常访问。那么也就是说,这些元数据都存放在当前的数据库的Public、pg_catalog的schema下,而不是放在postgres数据库下的。
进一步验证:
我重新创建了postgres数据库后,在另外的路径下解压了之前的包并对解压前的postgres库和重新创建的postgres库中的relfilenode号进行比对:
原来的postgres库:

重建的postgres库:

可以发现,其中的文件除了重建的多了两个外,其他都一样。
且postgres库可以再次正常登录。
那么这可以说明,这两个postgres库完全一样(重建多出来两个25519、25522是之前测试在template1中,创建的两个数据库对象)
这时,才想起,postgres数据库只是在初始化后,数据库给用户创建的一个可操作数据库,这个数据库是随时可以删除的,其中不会存储其他数据库的元数据信息等。
其实,我们就可以理解为Oracle中,数据库在安装好后,就给我们创建了一个pdb,这个pdb我们可以选择不进行使用(通常不会让业务使用)。那么当我们删除这个pdb后,对其他pdb其实是没有任何影响的。
而postgresql的每个数据库的元数据,都是存储在这个数据库的public、pg_catalog等schema下的,而不会同一存储在哪个数据库下。
所以,当误删除PostgreSQL的postgres库后,首先确认业务有没有使用这个库,如果没有,那么我们则可以放心大胆的重建即可。如果有使用,那么我们只能通过备份来恢复了。
最后,需要说明的是:
1.在postgresql数据库中一定要规范权限,业务用户只允许操作自己的数据库;
2.备份!备份!备份!




