温馨提示×

centos怎样迁移postgresql数据

小樊
48
2026-09-12 07:54:28
栏目: 云计算

在 CentOS 上迁移 PostgreSQL 数据,常见有几种方式,下面按最常用、最安全的顺序给你说明。


一、使用 pg_dump / pg_restore(推荐,跨版本也可用)

适合:

  • 不同服务器
  • 不同 PostgreSQL 版本
  • 数据量不是特别巨大(几十 GB 以内)

1️⃣ 源服务器导出数据

# 导出整个数据库
pg_dump -U postgres -h 127.0.0.1 -F c -b -v -f /tmp/dbname.dump dbname

参数说明:

  • -F c:自定义格式(压缩,支持恢复)
  • -b:包含大对象
  • -v:显示过程

2️⃣ 拷贝到目标服务器

scp /tmp/dbname.dump root@目标IP:/tmp/

3️⃣ 目标服务器恢复

pg_restore -U postgres -d dbname -v /tmp/dbname.dump

如果数据库不存在,先创建:

createdb -U postgres dbname

二、物理迁移(同版本推荐,速度快)

适合:

  • 同 PostgreSQL 大版本(如 12 → 12)
  • 数据量大(100GB+)

1️⃣ 停止 PostgreSQL

systemctl stop postgresql

2️⃣ 拷贝数据目录

默认数据目录(视版本):

/var/lib/pgsql/12/data
rsync -av /var/lib/pgsql/12/data/ root@目标:/var/lib/pgsql/12/data/

3️⃣ 目标服务器配置

确保:

  • PostgreSQL 版本一致
  • 目录权限正确
chown -R postgres:postgres /var/lib/pgsql/12/data

4️⃣ 启动

systemctl start postgresql

三、使用 pg_basebackup(主从/整机迁移)

适合:

  • 整机迁移
  • 做从库
pg_basebackup -h 源IP -U repl -D /var/lib/pgsql/12/data -P -X stream

四、注意事项(很重要)

✅ PostgreSQL 大版本不兼容物理文件
例如:

  • 12 → 13 ❌ 不能直接拷贝
  • 12 → 12 ✅ 可以

✅ 迁移前:

SELECT version();

✅ 防火墙 / SELinux:

setenforce 0
firewall-cmd --add-service=postgresql

✅ 用户和权限要一致


五、常见错误

❌ permission denied

chown -R postgres:postgres /var/lib/pgsql

❌ database is being accessed by other users

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'dbname';

六、我可以进一步帮你

你可以告诉我:

  1. PostgreSQL 版本(源 / 目标)
  2. 是否同服务器 or 跨服务器
  3. 数据量大小
  4. 是否允许停机

我可以直接给你一条可执行的迁移方案。

0 踩