Skip to content

Commit 8501002

Browse files
authored
Create pgsql-migrate-docker.md
1 parent 7c241f5 commit 8501002

1 file changed

Lines changed: 95 additions & 0 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
---
2+
title: "PgSQL数据库迁移记录"
3+
date: 2026-01-25T21:17:16+08:00
4+
description: "PGSQL在使用docker环境下面迁移出现的问题"
5+
featured_image: "https://w.wallhaven.cc/full/qr/wallhaven-qrjmgl.jpg"
6+
comment : true
7+
hidden: false
8+
draft: false
9+
tags: ["SQL","PGSQL"]
10+
Categories: "database"
11+
---
12+
13+
14+
15+
## PostgreSQL 跨环境迁移故障修复手册
16+
17+
### 1. 故障现象与原因
18+
19+
* **现象**:容器启动不断重启,日志显示 `FATAL: could not open directory "pg_notify"` 或 `pg_replslot`。
20+
* **根本原因**:
21+
1. **目录缺失**:从群晖 (Synology) 或通过某些 GUI 工具拷贝时,空文件夹(如 `pg_notify`)可能被过滤掉。
22+
2. **权限不匹配**:群晖 Docker 的 UID(通常是 1024)与标准 Postgres 镜像所需的 UID(999)不一致,导致容器无法读取数据。
23+
24+
25+
26+
---
27+
28+
### 2. 标准修复流程 (SSH 执行)
29+
30+
如果以后再次迁移,请在数据目录下执行以下“三步走”:
31+
32+
#### 第一步:补全系统子目录
33+
34+
PostgreSQL 启动时强制要求以下目录必须存在(即使是空的):
35+
36+
```bash
37+
mkdir -p pg_commit_ts pg_dynshmem pg_logical/mappings pg_logical/snapshots \
38+
pg_notify pg_replslot pg_serial pg_snapshots pg_stat pg_stat_tmp \
39+
pg_tblspc pg_twophase pg_wal/archive_status
40+
41+
```
42+
43+
#### 第二步:修正用户归属 (Owner)
44+
45+
PostgreSQL 官方镜像内部运行用户是 `postgres`,其 UID 固定为 `999`:
46+
47+
```bash
48+
# 将当前目录及其下所有文件交给 UID 999
49+
sudo chown -R 999:999 .
50+
51+
```
52+
53+
#### 第三步:修正访问权限 (Permission)
54+
55+
Postgres 对安全极其敏感,数据目录权限必须设为 `700`(仅允许所有者读写):
56+
57+
```bash
58+
sudo chmod -R 700 .
59+
60+
```
61+
62+
---
63+
64+
### 3. 推荐的 `compose.yaml` 配置
65+
66+
为了路径清晰,建议采用以下结构映射:
67+
68+
```yaml
69+
services:
70+
db:
71+
image: postgres:18
72+
container_name: pgsql
73+
restart: always
74+
environment:
75+
- POSTGRES_USER=pgsql
76+
- POSTGRES_PASSWORD=pgsql
77+
- POSTGRES_DB=pgsql
78+
- PGDATA=/var/lib/postgresql/data/pgdata # 指定数据子目录
79+
volumes:
80+
- ./docker:/var/lib/postgresql/data/pgdata # 宿主机目录 : 容器路径
81+
ports:
82+
- "6432:5432" # 仅映射 TCP 即可
83+
84+
```
85+
86+
---
87+
88+
### 4. 迁移小贴士
89+
90+
* **打包备份**:在原环境迁移前,建议使用 `tar -zcvf backup.tar.gz [目录名]` 打包,这样可以完整保留空目录和权限信息。
91+
* **版本匹配**:确保新旧环境的 `PG_VERSION` 一致。
92+
* **网络检查**:如果使用了自定义子网(如 `172.x.x.x`),确保不与 NAS 所在物理局域网段冲突。
93+
94+
---
95+

0 commit comments

Comments
 (0)