Ubuntu环境下PostgreSQL数据库迁移的常见方法
逻辑备份是最常用的迁移方式,通过pg_dump导出数据库结构和数据,再用pg_restore或psql导入目标服务器,支持跨PostgreSQL版本、跨操作系统迁移。
pg_dump生成逻辑备份文件(支持自定义格式.dump或SQL格式.sql)。
pg_dump -U postgres -h 源服务器IP -Fc 数据库名 > 数据库名.dump
pg_dump -U postgres -h 源服务器IP -t 表名 数据库名 > 表名.sql
pg_dump -U postgres -h 源服务器IP -Fc 数据库名 | gzip > 数据库名.dump.gz
scp等工具将备份文件复制到目标Ubuntu服务器。scp 数据库名.dump.gz 目标服务器IP:/home/用户名/
gunzip 数据库名.dump.gz
createdb -U postgres 数据库名
pg_restore,SQL格式用psql):pg_restore -U postgres -d 数据库名 数据库名.dump # 自定义格式
psql -U postgres -d 数据库名 -f 数据库名.sql # SQL格式
psql -U postgres -d 数据库名 -c "SELECT COUNT(*) FROM 表名;"
若源服务器与目标服务器的PostgreSQL版本、操作系统架构一致(如均为Ubuntu 22.04 + PostgreSQL 14),可直接迁移数据目录(默认路径为/var/lib/postgresql/<版本>/main),步骤更快捷。
sudo systemctl status postgresql
sudo -u postgres psql -c "SHOW data_directory;"
sudo systemctl stop postgresql
rsync保留文件权限(避免权限问题):sudo rsync -av /var/lib/postgresql/ 源数据目录路径/ /目标数据目录路径/
sudo mv /var/lib/postgresql /var/lib/postgresql.bak
/etc/postgresql/<版本>/main/postgresql.conf,更新data_directory参数指向新路径:data_directory = '/目标数据目录路径/postgresql/<版本>/main'
sudo systemctl start postgresql
sudo -u postgres psql -c "SHOW data_directory;" # 确认路径已变更
若需实现几乎零停机的迁移(停机时间通常在几秒内),可使用PostgreSQL的热备功能(基于WAL日志同步),适合大型数据库或对可用性要求高的场景。
postgresql.conf,开启WAL日志:wal_level = hot_standby
max_wal_senders = 3
max_replication_slots = 3
pg_hba.conf,允许目标服务器连接:host replication replicator 源服务器IP/32 md5
sudo systemctl restart postgresql
postgresql.conf,设置为热备模式:hot_standby = on
pg_basebackup从源服务器同步数据:pg_basebackup -h 源服务器IP -U replicator -D /var/lib/postgresql/<版本>/main -P -R
# 在源服务器上执行
pg_ctl stop -D /var/lib/postgresql/<版本>/main
# 在目标服务器上执行(提升为主节点)
pg_ctl promote -D /var/lib/postgresql/<版本>/main
若需从MySQL、Oracle等其他数据库迁移到PostgreSQL,可使用pgloader工具,支持自动转换数据类型、处理约束和索引。
sudo apt update
sudo apt install pgloader
migration.load):LOAD DATABASE
FROM mysql://用户名:密码@源服务器IP/数据库名
INTO postgresql://用户名:密码@目标服务器IP/数据库名
WITH include no drop, create tables, create indexes, reset sequences
pgloader migration.load
pgloader会自动处理表结构转换、数据同步及约束迁移。