MySQL 数据目录迁移导致启动失败
问题出现背景
在项目运行过程中,MySQL 数据库由于 磁盘空间不足,需要将数据目录从 /data/docker/volumes/mysql-master 迁移至 /mnt/docker/volumes/volumes/mysql-master。在修改 docker-compose.yml 配置并重新启动 MySQL 容器后,发现 MySQL 无法正常启动,且一致尝试重启,日志中反复出现如下错误:该错误导致 MySQL 无法正常初始化 InnoDB 存储引擎,进而无法启动数据库服务。
[ERROR] [MY-012263] [InnoDB] The Auto-extending innodb_system data file './ibdata1' is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
[ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
[ERROR] [MY-010119] [Server] Aborting
原因
一般导致导致 MySQL 无法正常初始化 InnoDB 存储引擎的原因有三种:
(1)ibdata1 文件大小不匹配(与配置文件的大小)
(2)my.cnf 的 datadir 配置未修改(迁移文件导致的?)
(3)MySQL 数据目录权限
针对对一个原因:
查看my.cnf 中的配置,如下:
查看具体/data中的idb1文件大小:
所有可以排除第一个原因。
针对第二个原因:my.cnf 的 datadir 配置未修改(迁移文件导致的?)
发现不管改没改都不会影响,因为这里的配置指向的是与这两个目录无关的目录内。
针对第三个原因:
ls -lh /mnt/docker/volumes/volumes/mysql-master/data/ibdata1
输出结果如下:
-rwxrwxrwx 1 systemd-coredump root 10M Mar 7 09:17 /mnt/docker/volumes/volumes/mysql-master/data/ibdata1
发现其所有者不是 MySQL 用户,而是 systemd-coredump。由于 MySQL 运行的 UID/GID 为 999:999(mysql 用户),但 ibdata1 文件的所有者是 systemd-coredump,MySQL 可能无权限访问或修改该文件,导致 InnoDB 初始化失败。
此时修改对应的文件权限:
chown -R 999:999 /mnt/docker/volumes/volumes/mysql-master
chmod -R 755 /mnt/docker/volumes/volumes/mysql-master
然后重启mysql容器:
docker restart mysql-master
# 发现对应的容器不在重启!问题解决!!!
注:
在 Docker 容器内,MySQL 运行的用户是 999:999,但宿主机的 /mnt/docker/volumes/volumes/mysql-master/data 可能是 root:root。
Docker 不会自动调整挂载目录的权限,所以需要手动调整。