File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments