我有一个 PostgreSQL 8.3 数据目录备份。我需要将数据库从此备份复制到新的 PostgreSQL 实例中。由于旧服务器存在问题,我无法对数据库执行 pg_dump。
我已经弄清楚了哪个目录是用于相关数据库的。例如,在 MySQL 中,您通常要做的就是关闭服务器,复制目录并重新启动它,数据库就可以使用了。现在这不适用于 PostgreSQL,我怀疑这是因为数据库未列在 global/pg_database 文件中。该文件似乎是在 PostgreSQL 启动时自动生成的,那么我该如何告诉系统数据库在那里呢?
答案1
请注意,在 PostgreSQL 中,你的集群数据目录是一个独立的单元,无法可靠地分部分恢复,如文档所述这里。
您最好的希望是使用旧服务器的完整数据目录并在其上启动服务器,然后从那里获得的数据库转储中恢复:
- 获取适合新主机配置的 postgresql.conf(通过旧文件(您在此处更改)和新数据目录进行定位)
- 找出旧安装的 PostgreSQL 超级用户的用户名 - 最有可能是 postgres。
- 在新主机上创建此用户名(UNIX 用户),除非它已经存在。
- 将旧数据目录给予(chown)给该用户,除非 uid 与旧服务器上的 uid 匹配。
- 在旧数据目录中配置 pg_hba.conf 以允许本地用户连接到相同的 postgres 用户名(这通常是默认的,但请检查)。
- 以与旧数据目录的超级用户同名的 UNIX 用户身份运行旧数据库集群,例如用户 postgres:
sudo -u postgres postgres -D old_data_directory # or with su: su postgres postgres -D old_data_directory
- 转储旧数据库,再次使用通常的用户名 postgres:
sudo -u postgres pg_dump -p /path/to/socket/for/old/directory database_name > dump_file.sql # becoming postgres with su analogous to above
- 使 dump_file.sql 适应新服务器的用户名等;在那里创建具有适当所有权的空数据库
- 将数据库扫描到新服务器:
sudo -u postgres psql -p /path/to/socket/for/new/directory new_database_name # once again, getting postgres privileges using su analogous to above
这应该可以帮你做好准备,或者至少可以为你指明一条到达目的地的正确道路。