docker(二):docker安装MySQL出现initialize specified but the data directory has files in it

docker安装MySQL出现initialize specified but the data directory has files in it

大家好,我是欧阳方超,可以扫描下方二维码关注我的公众号“欧阳方超”,后续内容将在公众号首发。在这里插入图片描述
在这里插入图片描述

1、概述

近期为了解决南方某省份的项目问题时,使用第三方的服务,对方提供了一个压缩包,包含一个shell脚本,通过它可以一键启动所有服务,服务都是通过docker容器的方式启动的,但是发现MySQL容器没有正常启动,本文将分析问题的根本原因,以及如何来解决这一问题。

2、问题描述

在启动MySQL容器时,日志显示以下错误信息:

2024-09-09T10:37:35.569530Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2024-09-09T10:37:35.571673Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.4.2) initializing of server in progress as process 80
2024-09-09T10:37:35.573444Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
2024-09-09T10:37:35.573503Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2024-09-09T10:37:35.573521Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
2024-09-09T10:37:35.573591Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-09-09T10:37:35.574042Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.

把日志单独拎出来看下:

2024-09-09T10:37:35.573503Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2024-09-09T10:37:35.573521Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.

这些错误表明,MySQL在尝试初始化数据目录时发现该目录并非空的,因此无法继续初始化并终止了启动过程。

3、问题分析

3.1、原因分析

数据目录已存在文件:MySQL在启动时使用–initialize选项进行初始化,但发现/var/lib/mysql/目录中已经存在文件。根据MySQL的要求,初始化时该目录必须是空的。
宿主机目录缺失:在宿主机上,/var/lib/mysql/目录并不存在,而Docker默认将数据卷存储在/var/lib/docker/volumes/目录中。之前可能有人在这台机器上使用Docker安装过MySQL,但未能清理旧数据。
删除数据卷:为了尝试解决问题,我删除了/var/lib/docker/volumes/目录。这样做的结果是,Docker会在下次启动MySQL容器时重新创建一个空的匿名数据卷,从而允许MySQL成功初始化。

3.2、采取的措施及其后果

虽然通过删除/var/lib/docker/volumes/目录解决了问题,但这种做法并不合理,因为这可能导致丢失之前的数据库数据。如果之前的MySQL实例中有重要数据,这种做法会造成不可逆的损失,但是由于机器经手的人比较多,也没法确认数据有没有用了,所以索性就删除了。

3.3、合理的做法

为了确保数据的持久性和安全性,建议在Dockerfile中使用VOLUME指令定义数据卷路径,并在构建镜像时将这些路径挂载到宿主机上的指定目录。这样可以确保数据在容器之间共享和持久化,即使容器被删除,数据仍然保留在宿主机上。

在Dockerfile中,可以使用以下方式定义数据卷:

FROM mysql:8.4.2

VOLUME /var/lib/mysql

在启动容器时,使用以下命令将数据目录挂载到宿主机上的指定路径:

docker run -d --name mysql-container -v /path/on/host:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:8.4.2

3、总结

在使用Docker管理MySQL等服务时,确保数据的持久化是至关重要的。通过合理的配置和管理,可以避免因数据目录问题导致的容器启动失败。同时,定期检查和清理不再使用的Docker卷,可以帮助维护系统的整洁和高效。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。

参考:
1、https://blog.youkuaiyun.com/q1106308976/article/details/124735069
2、http://docker.baoshu.red/data_management/volume.html
3、https://blog.youkuaiyun.com/qq_33801641/article/details/120756083

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值