适用场景:跨版本/跨平台迁移、部分数据库迁移、需要灵活选择迁移内容的场景。
这是PostgreSQL官方推荐的逻辑备份工具,通过生成自定义格式的备份文件,支持压缩、并行恢复等特性。
在源服务器上执行以下命令,生成自定义格式(-Fc)的备份文件(包含大对象-b,详细模式-v):
sudo -u postgres pg_dump -U postgres -d source_db_name -Fc -b -v -f /path/to/backup/source_db.dump
-U postgres:指定源数据库管理员账号(根据实际情况替换);-d source_db_name:源数据库名称;-f /path/to/backup/source_db.dump:备份文件输出路径。使用scp等工具将备份文件复制到目标Debian服务器:
scp /path/to/backup/source_db.dump user@target_server:/path/to/target/backup/
在目标服务器上,先创建目标数据库(若不存在):
sudo -u postgres createdb -U postgres target_db_name
再使用pg_restore恢复数据(详细模式-v):
sudo -u postgres pg_restore -U postgres -d target_db_name -v /path/to/target/backup/source_db.dump
登录目标数据库,执行简单查询确认数据完整性:
sudo -u postgres psql -d target_db_name -c "SELECT COUNT(*) FROM key_table;"
适用场景:从MySQL、Oracle等其他数据库迁移到PostgreSQL,或需要自动处理数据类型转换的场景。
pgloader是开源工具,支持自动映射不同数据库的数据类型,简化迁移流程。
在Debian上通过APT安装:
sudo apt update && sudo apt install pgloader
创建配置文件(如mysql_to_pg.load),定义源数据库与目标数据库的连接信息和迁移规则:
LOAD DATABASE
FROM mysql://mysql_user:mysql_password@source_host/source_db
INTO postgresql://postgres:postgres_password@target_host/target_db
WITH include drop, create tables, create indexes, reset sequences
SET maintenance_work_mem to '128MB', work_mem to '16MB';
include drop:迁移前删除目标数据库中的同名对象(谨慎使用);reset sequences:重置序列值以匹配源数据。运行pgloader命令,加载配置文件:
pgloader mysql_to_pg.load
工具会自动处理数据类型转换、索引创建等操作,并输出详细的迁移日志。
适用场景:超大型数据库迁移(TB级)、需要最小化停机时间的场景。
物理复制通过直接复制数据库数据目录实现,速度快于逻辑备份,但要求源与目标服务器的PostgreSQL版本完全一致。
编辑源服务器的postgresql.conf文件(路径:/etc/postgresql/<version>/main/postgresql.conf):
wal_level = replica
max_wal_senders = 10
wal_keep_segments = 64
重启PostgreSQL服务使配置生效:
sudo systemctl restart postgresql
在源数据库中创建用于复制的用户,并授予权限:
CREATE USER replicator WITH REPLICATION PASSWORD 'strong_password' LOGIN;
GRANT ALL PRIVILEGES ON DATABASE source_db_name TO replicator;
编辑目标服务器的postgresql.conf文件,启用热备:
hot_standby = on
重启PostgreSQL服务:
sudo systemctl restart postgresql
在目标服务器上执行pg_basebackup,从源服务器拉取数据目录:
sudo -u postgres pg_basebackup -h source_host -U replicator -D /var/lib/postgresql/<version>/main -P -R
-h source_host:源服务器IP或主机名;-D:目标数据目录路径;-R:自动生成recovery.conf文件(PostgreSQL 12+版本无需此参数,改用postgresql.auto.conf)。sudo systemctl stop postgresql
scp -r /var/lib/postgresql/<version>/main/ user@target_server:/var/lib/postgresql/<version>/main/
sudo systemctl start postgresql
适用场景:迁移结构化文本数据(如CSV文件)、小批量数据导入的场景。
若数据已存在于CSV或TSV文件中,可直接使用PostgreSQL的COPY命令导入。
确保CSV文件格式正确(如包含表头,字段分隔符为逗号):
id,name,age
1,John Doe,30
2,Jane Smith,25
在目标数据库中创建与CSV结构匹配的表:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INTEGER
);
使用psql命令的\copy(本地文件,无需超级用户权限)或COPY(服务器端文件,需超级用户权限)导入:
-- 本地文件导入(推荐)
\copy employees(name, age) FROM '/path/to/employees.csv' WITH CSV HEADER;
-- 服务器端文件导入(需sudo -u postgres权限)
COPY employees(name, age) FROM '/var/lib/postgresql/employees.csv' WITH CSV HEADER;
pg_dump/pg_basebackup),防止数据丢失;SELECT COUNT(*))、关键字段值(如主键、外键),确保无遗漏或错误。