You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中指定平台:
    docker pull --platform linux/arm64 postgis/postgis:13-3.4
    
    修改Compose配置:
    image: 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:55:55