Bitnami Docker MariaDB启动失败[Exec Format error]求助
我用Bitnami Docker MariaDB实例很久了,之前一直正常,最近突然启动失败,容器频繁重启,数据库完全用不了。为了排查,我改了docker-compose文件覆盖entrypoint让容器保持运行,进去调试。执行/opt/bitnami/scripts/mariadb/下的run.sh和setup.sh脚本时,都因为mysqld启动失败报错。直接执行启动命令:
/opt/bitnami/mariadb/sbin/mysqld --defaults-file=/opt/bitnami/mariadb/conf/my.cnf --basedir=/opt/bitnami/mariadb --datadir=/bitnami/mariadb/data --socket=/opt/bitnami/mariadb/tmp/mysql.sock --bind-address=127.0.0.1 --user=mysql --skip-slave-start
出现错误:bash: /opt/bitnami/mariadb/sbin/mysqld: cannot execute binary file: Exec format error。我删了镜像重新拉,问题还是存在。后来在另一台电脑测试,全新安装能正常启动,但把故障机器的持久化数据迁过去后,问题又出现了。求怎么恢复MariaDB数据库。
附上docker-compose配置:
version: '2' services: mariadb: image: docker.io/bitnami/mariadb:10.6 user: root #entrypoint: tail -f /dev/null environment: # ALLOW_EMPTY_PASSWORD is recommended only for development. - MARIADB_ROOT_PASSWORD=xxxxxxxxxx - ALLOW_EMPTY_PASSWORD=no - MARIADB_USER=finquescrm - MARIADB_DATABASE=xxxxxxxx - MARIADB_PASSWORD=xxxxxxxx volumes: - 'mariadb_data:/bitnami/mariadb' - ./sharedfolder:/sharedfolder restart: always suitecrm: image: docker.io/bitnami/suitecrm:7.12.5-debian-10-r79 user: root ports: - '80:8080' - '443:8443' environment: - SUITECRM_DATABASE_HOST=mariadb - SUITECRM_DATABASE_PORT_NUMBER=3306 - SUITECRM_DATABASE_USER=xxxxxxxx - SUITECRM_DATABASE_NAME=xxxxxxxx - SUITECRM_DATABASE_PASSWORD=xxxxxxxxxx # ALLOW_EMPTY_PASSWORD is recommended only for development. - MARIADB_ROOT_PASSWORD=xxxxxxxxxxxxxx - ALLOW_EMPTY_PASSWORD=no volumes: - 'suitecrm_data:/bitnami/suitecrm' - ./sharedfolder:/sharedfolder depends_on: - mariadb restart: always volumes: mariadb_data: driver: local suitecrm_data: driver: local
确认架构兼容性:
Exec format error大多是二进制文件和主机CPU架构不匹配导致的。先执行uname -m查看故障机器的CPU架构,再用docker inspect docker.io/bitnami/mariadb:10.6 | grep Architecture检查镜像支持的架构,确保两者匹配(比如ARM架构机器不要拉取x86_64版本镜像)。备份并修复持久化数据:
- 先备份故障数据卷:执行
docker run --rm -v mariadb_data:/data -v $(pwd)/backup:/backup busybox cp -r /data /backup/mariadb_backup。 - 删除数据卷中损坏的InnoDB系统文件:进入调试容器,删除
/bitnami/mariadb/data下的ib_logfile0、ib_logfile1、ibdata1文件(不要删除业务数据库对应的文件夹),让MariaDB重启时重建这些系统文件。 - 修复数据目录权限:执行
chown -R mysql:mysql /bitnami/mariadb/data,确保数据目录所有者为mysql用户。
- 先备份故障数据卷:执行
迁移业务数据到全新容器:
- 在正常机器上启动一个全新的Bitnami MariaDB 10.6容器,不挂载故障数据卷。
- 将备份的故障数据中业务数据库的文件夹(比如
finquescrm文件夹)复制到新容器的数据目录下,执行chown -R mysql:mysql修改权限。 - 重启新容器,登录数据库执行
mysqlcheck -u root -p --all-databases --repair修复可能损坏的表。
排查配置文件问题:检查备份数据中的
/bitnami/mariadb/conf/my.cnf是否存在错误配置,比如指定了当前MariaDB版本不支持的参数。可以替换成全新容器的默认配置文件后再尝试启动。
内容的提问来源于stack exchange,提问作者osantos

