📜  PostgreSQL – 复制数据库(1)

📅  最后修改于: 2023-12-03 15:18:38.749000             🧑  作者: Mango

PostgreSQL – 复制数据库

在开发和生产环境中,我们通常需要在不同的服务器之间复制 PostgreSQL 数据库。这可以通过多种方式实现,本文将介绍两种主要的方法。

1. 使用 pg_dumppg_restore

pg_dump 是 PostgreSQL 自带的数据库备份工具,它能够以文本格式备份整个数据库。我们可以使用 pg_dump 将原始数据库备份到文件中,然后将备份文件移动到目标服务器并使用 pg_restore 还原到目标数据库中。

以下是备份和还原操作的详细步骤:

备份原始数据库

pg_dump dbname > backup.sql

此命令将以文本格式备份 dbname 数据库,将备份文件保存为 backup.sql

在目标服务器上还原数据库

在目标服务器上运行以下命令:

createdb dbname
psql dbname < backup.sql

这些命令将在目标服务器上创建一个名为 dbname 的新数据库,并将备份文件中的数据还原到该数据库中。

2. 使用 pg_basebackup

另一种复制 PostgreSQL 数据库的方法是使用 pg_basebackup 工具。该工具可用于从活动数据库生成基本备份,并将其传输到另一个服务器上,以创建新的从服务器副本。

以下是使用 pg_basebackup 复制数据库的简要步骤:

在主服务器上设置

  • postgresql.conf 文件中设置 wal_levelreplica
  • 确保主数据库服务器上的 pg_hba.conf 文件允许从服务器使用 streaming replication,并具有正确的证书。

在从服务器上设置

  • recovery.conf 文件中设置 primary_conninfo

以下是在主服务器上设置的详细步骤:

  1. 编辑 postgresql.conf 文件并将 wal_level 设置为 replica
wal_level = replica
  1. 重启 PostgreSQL 服务器以使更改生效。
sudo systemctl restart postgresql
  1. 编辑 pg_hba.conf 文件以授权从服务器使用流复制。例如,以下行将允许来自 IP 地址 10.0.0.2 的从服务器使用流复制:
host    replication     replication_user     10.0.0.2/32        md5
  1. 为从服务器创建复制用户。在主服务器上运行以下 SQL 语句:
CREATE ROLE replication_user REPLICATION LOGIN PASSWORD 'password';
  1. 刷新主服务器:
SELECT pg_reload_conf();

以下是在从服务器上设置的详细步骤:

  1. 编辑 postgresql.conf 文件,设置 hot_standbyon
hot_standby = on
  1. 在主服务器上创建基本备份并将其传输到从服务器。
mkdir /var/lib/pgsql/12/backups
pg_basebackup -U replication_user \
-P -R -X stream -c fast \
-D /var/lib/pgsql/12/data \
-Fp -z -Z 9 \
--label="Base backup from ${HOSTNAME}" \
--progress \
--write-recovery-conf \
--backup-dir=/var/lib/pgsql/12/backups \
-h primary.example.com

此命令将在从服务器的 /var/lib/pgsql/12/data 目录中创建一个基本备份,并在 recovery.conf 文件中设置 primary_conninfo,以便从服务器可以使用基本备份恢复并接收来自主服务器的流复制数据。

  1. 启动从服务器以从主服务器复制数据。
sudo systemctl start postgresql-12.service
结论

以上是两种用于复制 PostgreSQL 数据库的主要方法。在开始任何复制操作之前,请务必备份您的数据库,并在测试环境中进行测试以确保正常运行。