TANKENQI.cn

May 28, 2024

PostgreSQL数据恢复方案

database2.5 min to read

1 问题

存在docker或者服务器上(无论是windows还是linux)的PostgreSQL无法启动,需要对数据进行恢复

2 解决

2.1 参考

云数据库 PostgreSQL 在云服务器上恢复 PostgreSQL 数据-操作指南

2.2 导出数据目录

找到.../data目录下所有的数据文件,如下图所示(注意并不是所有数据文件都长这样,因版本、软件和操作系统不同而异,但是绝大多数文件相同,故只列出了以下这些)。一般这些文件位于PostgreSQL的../data/目录,可以自行查找(网络,或者find命令查找postgresql.conf,在里面的data_directory会告诉你真的物理存储在哪),记得删除多余的临时文件。

image-20231027224423789

2.3 搭建PostgreSQL

在一个没有任何PostgreSQL的服务器上搭建跟原先版本一模一样的PostgreSQL(有postgis也得安装到位),这步也可以使用虚拟机来搭建,但是千万别用docker这类软件。

2.4 使用postgres用户创建恢复目录

mkdir /var/lib/pgsql/10/recovery

2.5 修改配置文件

shared_preload_librarieslocal_preload_librariespg_stat_statements.maxpg_stat_statements.trackarchive_modearchive_commandsynchronous_commitsynchronous_standby_names
port = '5432'    # 将port参数的值修改为5432unix_socket_directories = '/var/run/PostgreSQL/'  # 将unix_socket_directories的值修改为/var/run/PostgreSQL/,    # 如未设置此值,可跳过此项
synchronous_commit = localsynchronous_standby_names = ''

image-20231027230057946

2.6 使用root用户更改文件夹权限

chmod 0700 /var/lib/pgsql/10(版本号)/recoverychown postgres:postgres /var/lib/pgsql/10(版本号)/recovery -R

2.7 使用postgres用户启动数据库

/usr/pgsql-10/bin/pg_ctl start -D /var/lib/pgsql/10/recovery

image-20231027230220463

2.8 登陆数据库验证

export PGDATA=/var/lib/pgsql/10(版本号)/recoverypsql

image-20231027230400659

/usr/pgsql-10(自定义)/bin/pg_ctl status -D /var/lib/pgsql/10(版本号)/recovery

2.9 通过手动导出数据进行恢复

您也可以手动导出备份数据,然后在服务器上进行恢复操作,该方案在 WindowsLinux 下同样适用,与物理文件所在的文件系统无关

# 命令格式为:pg_dump -h <访问IP> -U <访问用户> -f <备份文件全路径> -c -C <导出的数据库名># Example:/usr/pgsql-10/bin/pg_dump -h 192.168.0.16(可不要) -U testroot -f backup.sql -c -C postgres

进入PostgreSQL安装目录的bin文件夹下(例如,/usr/pgsql-14/bin/),使用psql工具进行数据恢复。

./psql -p 端口号 -U 用户名 -W -f ../backup.sql

其中这里端口号自定义,用户名建议都换成旧数据库一样的名称(如果没有,记得先创建被赋予超级权限)

说明:因为有 pg_stat_error 等插件,可能会导致报错,但不影响数据导入。只要能运行下去不报错停止就行