Mac迁移后Docker部署PostgreSQL 13启动失败:invalid record length错误
问题:M1迁移Docker数据到M3 Pro后PostGIS容器启动失败
迁移旧MacBook M1上的Docker数据到MacBook M3 Pro后,使用Docker Compose部署的postgis/postgis:13-3.4容器启动失败,报错invalid record length at 0/15CF478: wanted 24, got 0,容器日志还出现qemu段错误。已尝试pg_resetwal、删除镜像、更换PostgreSQL镜像,问题仍未解决。
Docker Compose配置
version: "3" services: database: image: postgis/postgis:13-3.4 environment: POSTGRES_USER: ${DB_USERNAME} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_DATABASE} ports: - ${DB_PORT}:5432 volumes: - test:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro
容器日志(翻译后)
2024-02-05 18:40:36 此数据库系统的文件将归用户"postgres"所有。 2024-02-05 18:40:36 该用户也必须拥有服务器进程。 2024-02-05 18:40:36 2024-02-05 18:40:36 数据库集群将使用区域设置"en_US.utf8"初始化。 2024-02-05 18:40:36 默认数据库编码已相应设置为"UTF8"。 2024-02-05 18:40:36 默认文本搜索配置将设置为"english"。 2024-02-05 18:40:36 2024-02-05 18:40:36 数据页校验和已禁用。 2024-02-05 18:40:36 2024-02-05 18:40:36 修复现有目录/var/lib/postgresql/data的权限... 完成 2024-02-05 18:40:36 创建子目录... 完成 2024-02-05 18:40:36 选择动态共享内存实现... posix 2024-02-05 18:40:37 选择默认最大连接数... 100 2024-02-05 18:40:37 选择默认共享缓冲区... 128MB 2024-02-05 18:40:37 选择默认时区... Etc/UTC 2024-02-05 18:40:37 创建配置文件... 完成 2024-02-05 18:40:37 运行引导脚本... 完成 2024-02-05 18:40:39 执行引导后初始化... 完成 2024-02-05 18:40:39 将数据同步到磁盘... 完成 2024-02-05 18:40:39 2024-02-05 18:40:39 2024-02-05 18:40:39 成功。你现在可以使用以下命令启动数据库服务器: 2024-02-05 18:40:39 2024-02-05 18:40:39 pg_ctl -D /var/lib/postgresql/data -l logfile start 2024-02-05 18:40:39 2024-02-05 18:40:39 等待服务器启动....2024-02-05 18:40:39.393 EET [122] 日志: 启动PostgreSQL 13.13 (Debian 13.13-1.pgdg110+1),运行于x86_64-pc-linux-gnu,由gcc (Debian 10.2.1-6) 10.2.1 20210110编译,64位 2024-02-05 18:40:39 2024-02-05 18:40:39.396 EET [122] 日志: 监听Unix套接字"/var/run/postgresql/.s.PGSQL.5432" 2024-02-05 18:40:39 2024-02-05 18:40:39.410 EET [126] 日志: 数据库系统已于2024-02-05 18:40:39 EET关闭 2024-02-05 18:40:39 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:40:39 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:40:39 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:40:39 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:40:39 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:40:39 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:40:39 停止等待 2024-02-05 18:43:03 2024-02-05 18:43:03 PostgreSQL数据库目录似乎包含数据库;跳过初始化 2024-02-05 18:43:03 2024-02-05 18:40:39 initdb: 警告:为本地连接启用"trust"认证 2024-02-05 18:40:39 你可以通过编辑pg_hba.conf或使用选项-A,或 2024-02-05 18:40:39 下次运行initdb时使用--auth-local和--auth-host来更改此设置。 2024-02-05 18:40:39 pg_ctl: 无法启动服务器 2024-02-05 18:40:39 检查日志输出。 2024-02-05 18:43:03 2024-02-05 18:43:03.259 EET [1] 日志: 启动PostgreSQL 13.13 (Debian 13.13-1.pgdg110+1),运行于x86_64-pc-linux-gnu,由gcc (Debian 10.2.1-6) 10.2.1 20210110编译,64位 2024-02-05 18:43:03 2024-02-05 18:43:03.262 EET [1] 日志: 监听IPv4地址"0.0.0.0",端口5432 2024-02-05 18:43:03 2024-02-05 18:43:03.262 EET [1] 日志: 监听IPv6地址"::",端口5432 2024-02-05 18:43:03 2024-02-05 18:43:03.264 EET [1] 日志: 监听Unix套接字"/var/run/postgresql/.s.PGSQL.5432" 2024-02-05 18:43:03 2024-02-05 18:43:03.279 EET [63] 日志: 数据库系统被中断;最后已知正常运行时间为2024-02-05 18:40:39 EET 2024-02-05 18:43:03 2024-02-05 18:43:03.319 EET [63] 日志: 数据库系统未正常关闭;正在进行自动恢复 2024-02-05 18:43:03 2024-02-05 18:43:03.322 EET [63] 日志: 0/15CF478处记录长度无效:需要24,得到0 2024-02-05 18:43:03 2024-02-05 18:43:03.322 EET [63] 日志: 无需重做 2024-02-05 18:43:03 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:43:03 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:43:03 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:43:03 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:43:03 qemu: 未捕获目标信号11 (段错误) - 核心已转储 2024-02-05 18:43:03 qemu: 未捕获目标信号11 (段错误) - 核心已转储
解决方案
1. 解决架构兼容问题(qemu段错误根源)
日志显示容器运行的是x86_64架构镜像,Docker在ARM芯片(M1/M3)上运行x86镜像会通过qemu模拟,极易引发段错误。
- 改用ARM架构的PostGIS镜像:直接拉取ARM版本镜像,或在Compose中指定平台:
修改Compose配置:docker pull --platform linux/arm64 postgis/postgis:13-3.4image: postgis/postgis:13-3.4 platform: linux/arm64
2. 修复损坏的数据卷
迁移过程中数据卷可能已损坏,pg_resetwal无效时需重新初始化:
- 备份当前数据卷(如需保留数据):
docker run --rm -v test:/data -v $(pwd)/backup:/backup alpine tar czf /backup/postgres-backup.tar.gz /data - 删除损坏的数据卷:
docker volume rm test - 重启容器,PostgreSQL会自动初始化新的数据库集群。
3. 逻辑迁移保留原有数据
若要保留旧M1上的数据库数据,不要直接迁移Docker数据卷,改用逻辑备份:
- 在旧M1容器中导出数据:
docker exec <旧容器名称> pg_dump -U ${DB_USERNAME} ${DB_DATABASE} > backup.sql - 将
backup.sql复制到M3 Pro,新容器启动后导入:docker exec -i <新容器名称> psql -U ${DB_USERNAME} ${DB_DATABASE} < backup.sql
内容的提问来源于stack exchange,提问作者Yevhenii Bondarenko
相关产品推荐
相关产品推荐

