PostgreSQL 部署与数据库迁移方案,针对:
-
服务器:阿里云轻量应用服务器 Ubuntu 22.04
-
数据库:PostgreSQL
-
场景:
-
✅ 确保服务器正确安装 PostgreSQL
-
✅ 本地 → 服务器 数据迁移
-
✅ 服务器 → 本地 数据迁移
-
✅ 结构 + 数据完整迁移
-
一、在 Ubuntu 22.04 上安装 PostgreSQL
1️⃣ 安装官方版本(推荐方式)
Ubuntu 自带版本可能偏旧,建议使用 PostgreSQL 官方源。
sudo apt update
sudo apt install postgresql postgresql-contrib postgresql-client
安装完成后检查:
psql --version
查看服务状态:
sudo systemctl status postgresql
如果未运行:
sudo systemctl start postgresql
sudo systemctl enable postgresql
二、创建数据库与用户
进入 postgres 用户:
sudo -u postgres psql
创建数据库和用户:
CREATE DATABASE game;
CREATE USER gameuser WITH ENCRYPTED PASSWORD '强密码';
GRANT ALL PRIVILEGES ON DATABASE game TO gameuser;
退出:
\q
三、确保 PostgreSQL 只允许本机访问(生产建议)
编辑:
sudo nano /etc/postgresql/*/main/postgresql.conf
确认:
listen_addresses = 'localhost'
编辑:
sudo nano /etc/postgresql/*/main/pg_hba.conf
确认:
local all all peer
host all all 127.0.0.1/32 scram-sha-256
重启:
sudo systemctl restart postgresql
⚠️ 不要开放 0.0.0.0
四、数据库迁移原理
PostgreSQL 推荐使用:
| 工具 | 用途 |
|---|---|
| pg_dump | 导出数据库 |
| pg_restore | 恢复数据库 |
| psql | 执行 SQL |
| pg_dumpall | 导出全部数据库 |
五、本地 → 服务器 迁移
✅ 方法一(推荐):使用 pg_dump 自定义格式
1️⃣ 在本地导出
pg_dump -U postgres -h localhost -Fc game > game.dump
参数说明:
| 参数 | 说明 |
|---|---|
| -Fc | 自定义格式(推荐) |
| -U | 用户 |
| -h | 主机 |
2️⃣ 上传到服务器
scp game.dump user@服务器IP:/home/user/
3️⃣ 在服务器恢复
pg_restore -U gameuser -d game -c game.dump
如果提示权限问题,可以:
sudo -u postgres pg_restore -d game -c game.dump
✅ 方法二:导出为 SQL 文件
导出:
pg_dump -U postgres game > game.sql
上传后恢复:
psql -U gameuser -d game -f game.sql
六、服务器 → 本地 迁移
1️⃣ 在服务器导出
pg_dump -U gameuser -Fc game > game.dump
2️⃣ 下载到本地
scp user@服务器IP:/home/user/game.dump .
3️⃣ 本地恢复
pg_restore -U postgres -d game -c game.dump
七、直接远程导出(无需手动拷贝)
如果服务器允许远程连接(生产不建议长期开放):
从本地直接导出服务器数据库
pg_dump -U gameuser -h 服务器IP -Fc game > game.dump
或直接恢复到服务器
pg_restore -U gameuser -h 服务器IP -d game game.dump
⚠️ 必须开放 5432,并修改 postgresql.conf
生产环境不推荐。
八、推荐生产迁移方式(最安全)
使用 SSH 隧道:
ssh -L 5433:localhost:5432 user@服务器IP
然后本地执行:
pg_dump -U gameuser -h localhost -p 5433 -Fc game > game.dump
这样数据库仍然只监听 localhost。
九、ASP.NET Core 数据库迁移(EF Core 场景)
如果你使用 Entity Framework Core:
在服务器执行:
dotnet ef database update
或者在应用启动时自动迁移:
context.Database.Migrate();
但生产环境建议手动控制。
十、验证数据库是否正常
进入:
psql -U gameuser -d game
查看表:
\dt
查看数据:
SELECT * FROM YourTable LIMIT 5;
十一、自动化备份(生产必须)
建议写定时任务:
crontab -e
加入:
0 2 * * * pg_dump -U gameuser -Fc game > /var/backups/game_$(date +\%F).dump
每日凌晨 2 点备份。
十二、迁移策略建议(开发/生产分离)
| 环境 | 策略 |
|---|---|
| 本地开发 | 可随意重建数据库 |
| 测试服务器 | 使用 dump 迁移 |
| 生产服务器 | 严格版本化迁移(EF Migration) |
| 备份 | 每日 dump |
十三、推荐你的实际做法
建议:
-
服务器 PostgreSQL 只监听 localhost
-
使用 pg_dump -Fc 迁移
-
使用 systemd 定时备份
-
不开放 5432
-
使用 EF Core Migration 管理结构