BetaThis is a live doc! Anyone with edit access can make updates in real time without having to publish.
1 min

本文为利用 SQL 进行恢复而非利用系统文件进行恢复

下面的 1.1.1.1 代表原数据库服务器,2.2.2.2 代表新数据库服务器

流程

  1. 首先备份并恢复所有角色信息

  2. 然后依次备份一个数据库、恢复一个数据库

注:

  1. 尽管有 pg_dumpall 可以备份+恢复所有信息,但是不推荐使用(如果遇到错误很难去解决)

  2. 所有的备份和恢复进程建议在 tmux 中完成,防止中途网络断开导致异常

角色信息

备份所有角色信息

1PGPASSWORD=数据库密码 pg_dumpall -h 1.1.1.1 -U postgres -g > roles.sql
  • 用户名请始终使用 postgres

  • 利用环境变量 PGPASSWORD 传递 postgres 用户的密码

  • 修改 1.1.1.1 为你的数据库服务器 IP

  • -g 用于只备份角色信息

修改备份的角色信息

这一步几乎是必要的,因为上一步备份产生的 roles.sql 包括了所有的原数据库的角色信息

这个「所有」意味着有一些是不应该被恢复的 —— 例如 PG 自己的 postgres 用户(包括权限与密码等),或是如果用了云服务厂商的 Managed Database 产品的一些系统用户等

roles.sql 文件内就是标准的 SQL 语句,可以根据自己的需要删除一定的内容

恢复所有角色信息

1psql -f roles.sql 'postgres://postgres:数据库密码@2.2.2.2:5432/postgres?sslmode=disable'
  • 利用 -f 指定刚才备份好的 SQL 文件

  • 后面传递 PG 连接串,注意使用 postgres 用户

数据库信息

查看拥有的数据库

连上服务器

1psql 'postgres://postgres:数据库密码@1.1.1.1:5432/postgres?sslmode=disable'

然后输入 \l 即可列出所有的数据库

备份指定数据库

1PGPASSWORD=数据库密码 pg_dump -h 1.1.1.1 -U postgres -Fc 数据库名称 > 数据库名称.dump
  • 用户名建议使用 postgres(也可以使用有权限访问这个数据库的用户)

  • 利用环境变量 PGPASSWORD 传递数据库用户的密码

  • 修改 1.1.1.1 为你的数据库服务器 IP

  • -Fc 用于生成供 pg_restore 使用的恢复文件

    • 如果不指定,默认是 SQL,可能会出现一些外键的问题

  • 数据库名称 修改为你的数据库名称

恢复指定数据库

先在新的数据库服务器上创建指定数据库(注意设置正确的数据库权限 —— 这个不在备份文件备份的范畴内)

1CREATE DATABASE 数据库名称 WITH OWNER 数据库所有者用户;

然后利用 pg_restore 进行恢复

1PGPASSWORD=数据库密码 pg_restore -h 2.2.2.2 -U postgres -d 数据库名称 < 数据库名称.dump