Docker 安装MySQL出现:The designated data directory /var/lib/mysql/ is unusable.错误解决办法

这篇具有很好参考价值的文章主要介绍了Docker 安装MySQL出现:The designated data directory /var/lib/mysql/ is unusable.错误解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


熟悉的两个错误:
[ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
[ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files
docker start 容器也启动不了
最终原因–initialize --lower-case-table-names=1 惹的祸
解决办法
–initialize --lower-case-table-names=1 不要写在容器创建语句中,把lower-case-table-names=1 加入到挂载目录/conf/my.cnf文件中,替换镜像的配置文件/etc/mysql/my.cnf
-v /home/data/mysqlyx/conf/my.cnf:/etc/mysql/my.cnf  

以上为干货,直接解决问题,以下为原因分析及解决过程,希望对大家理解问题及解决问题有帮助。

Docker安装MySqL初始化错误解决办法

#以mysqlyx为容器名示例进行说明
docker logs --tail 50 --follow --timestamps mysqlyx
#后面出现类似如下的错误:
 2022-09-14T07:09:39.806206263Z 2022-09-14 07:09:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
2022-09-14T07:09:39.942722466Z 2022-09-14 07:09:39+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-09-14T07:09:39.956643812Z 2022-09-14 07:09:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
2022-09-14T07:09:40.100100257Z 2022-09-14 07:09:40+00:00 [Note] [Entrypoint]: Initializing database files
2022-09-14T07:09:40.125093527Z 2022-09-14T07:09:40.118405Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.27) initializing of server in progress as process 43
2022-09-14T07:09:40.129628141Z 2022-09-14T07:09:40.129522Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-09-14T07:09:41.114997148Z 2022-09-14T07:09:41.114854Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-09-14T07:09:43.132741452Z 2022-09-14T07:09:43.132579Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2022-09-14T07:09:43.132774092Z 2022-09-14T07:09:43.132604Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2022-09-14T07:09:43.352238721Z 2022-09-14T07:09:43.352109Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2022-09-14T07:09:47.267751506Z 2022-09-14 07:09:47+00:00 [Note] [Entrypoint]: Database files initialized
2022-09-14T07:09:47.271081676Z 2022-09-14 07:09:47+00:00 [Note] [Entrypoint]: Starting temporary server
2022-09-14T07:09:47.300216889Z 2022-09-14T07:09:47.297151Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.27) initializing of server in progress as process 92
2022-09-14T07:09:47.300230820Z 2022-09-14T07:09:47.300062Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2022-09-14T07:09:47.300238120Z 2022-09-14T07:09:47.300080Z 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.
2022-09-14T07:09:47.305642452Z 2022-09-14 07:09:47+00:00 [ERROR] [Entrypoint]: Unable to start server.
2022-09-14T07:12:30.351300702Z 2022-09-14 07:12:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
2022-09-14T07:12:30.377699965Z 2022-09-14 07:12:30+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2022-09-14T07:12:30.377731662Z  command was: mysqld --initialize --lower-case-table-names=1 --verbose --help --log-bin-index=/tmp/tmp.Aeh6i8SECV
2022-09-14T07:12:30.377738666Z  2022-09-14T07:12:30.368865Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.27) initializing of server in progress as process 10
2022-09-14T07:12:30.377744704Z 2022-09-14T07:12:30.370835Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2022-09-14T07:12:30.377750404Z 2022-09-14T07:12:30.370847Z 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.
2022-09-14T07:12:30.377770391Z 2022-09-14T07:12:30.372871Z 0 [ERROR] [MY-010119] [Server] Aborting

错误出现创建语句分析

#/home/data/为本地卷,非容器的
docker run --name mysqlyx -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootmysql \
-v /home/data/mysqlyx/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/data/mysqlyx/data:/var/lib/mysql \
-v /home/data/mysqlyx/log:/var/log/mysql \
 mysqlyx --initialize --lower-case-table-names=1

网上查了很多办法,给出如下1-5的方法都没法解决本人的问题。

  1. 开通宿主机挂载目录权限 chmod 777 /home/data/mysqlyx;
  2. 换新的挂载目录等
  3. 增加**–privileged=true** ;
  4. 还有进入容器进行初始化的,但都没有启动容器,也不行;

查找问题

尝试一些创建语句进行,通过逐步加载容器创建参数来查找和定位问题,究竟哪个窗口创建参数的加入会出现问题,步骤如下:

#先运行基本的创建容器语句,下面语句成功运行,
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysqlyx
#删除容器,然后再加挂载目录的参数(-v 的后面:左为主机目录或文件,右边为容器目录或文件)
docker run --name mysqlyx -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootmysql \
-v /home/data/mysqlyx/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/data/mysqlyx/data:/var/lib/mysql \
-v /home/data/mysqlyx/log:/var/log/mysql \
 mysqlyx
 #上面依然成功,然后再加参数:--initialize --lower-case-table-names=1
 docker run --name mysqlyx -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootmysql \
-v /home/data/mysqlyx/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/data/mysqlyx/data:/var/lib/mysql \
-v /home/data/mysqlyx/log:/var/log/mysql \
 mysqlyx --initialize --lower-case-table-names=1
 #发现只要加入 --initialize --lower-case-table-names=1出现上述错误

分析问题 --initialize --lower-case-table-names=1 惹的祸

  • –initialize --lower-case-table-names=1 参数加上就出错。为什么要加这个参数呢?
    注意由于docker、MySQL8.0的限制,必须在初始化数据库的时候就要指定该参数。
    阿里巴巴Java开发手册,在MySql建表规约里:【强制】表名、字段名必须使用小写字母或数字 , 禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
    说明: MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、 表名、字段名,都不允许出现任何大写字母,避免节外生枝。
    一句话:为了让部署在Linux系统的MySQL不区分大小写,默认的区分大小写的。

不同系统,参数lower-case-table-names的默认值是不同的

lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=0 表名存储为给定的大小写和比较是区分大小写的
lower_case_table_names=2, 表名存储为给定的大小写但是比较的时候是小写的

  • 1:windows环境默认,不区分,如果想大小写区分则在my.ini 里面的mysqld部分 ,加入 lower_case_table_names=0
  • 0:linux环境默认 ,区分;改变表名的大小写区分规则的方法,修改/etc/my.cnf,在[mysqld]后添加添加lower_case_table_names=1,重启MySQL服务,若设置成功,则不再区分表名的大小写。
  • 2:macos环境默认
    上面说到linux系统的lower_case_table_names = 0 默认为0,但是通常开发测试过程中习惯性的sql语句是不区分大小写的,需要修改该参数。但是在/etc/mysql/my.cnf中直接修改lower_case_table_names = 1 是不可以的,重启mysql直接导致docker无法启动。

官方给出了回答
翻看Mysql官网,https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names
有这个一段说明:
lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.

也就是说如果想修改这个属性,必须在初始化数据库的时候就要指定该参数。
通常我们下载的docker mysql 镜像启动时会默认初始化,因此想要修改该参数就要重新初始化docker中的数据库。
只有在初始化的时候设置 lower_case_table_names=1才有效,比如:
–initialize --lower-case-table-names=1文章来源地址https://www.toymoban.com/news/detail-529609.html

解决问题

  • –initialize --lower-case-table-names=1 加入到/home/data/mysqlyx/conf/my.cnf文件中:
vi /home/data/mysqlyx/conf/my.cnf
# Custom config should go here
!includedir /etc/mysql/conf.d/
lower_case_table_names  = 1 
#my.cnf这个文件怎么来的?有以下3种方式:
1之前运行好的数据库里拷贝过来
2 默认启动好的容器里直拷贝过来:
	docker cp mysql:/etc/mysql/my.cnf /home/data/mysqlyx/conf/
3直接写一下

总结

  • Docker中MySQL初始化,不一定非要创建容器中使用 --initialize --lower-case-table-names=1 ,可以放到加载的my.cnf文件中去,用挂载的方式
# 前面为本地目录文件路径,后面为容器文件及路径
-v /home/data/mysqlyx/conf/my.cnf:/etc/mysql/my.cnf  
  • 结论:同时也会发现,挂载的时候已经对默认的数据目录进行初始化了,–initialize --lower-case-table-names=1再执行初始化肯定会出错。

到了这里,关于Docker 安装MySQL出现:The designated data directory /var/lib/mysql/ is unusable.错误解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【报错】open /var/lib/docker/tmp/docker-import-863402796/bin/json: no such file or directory

    1背景: docker load -i 20230109.tar 2 报错: open /var/lib/docker/tmp/docker-import-863402796/bin/json: no such file or directory 3 解决方法: 方法一: cat 20230109.tar | docker import - 20230109 然后,通过docker images可以看到镜像已经加载进来了。 方法二: docker import 20230109.tar 然后,通过docker images可以看到

    2024年02月11日
    浏览(46)
  • docker设置rootdir:设置/var/lib/docker的默认数据存储位置(data-root或graph)

    Docker 使用 union 文件系统(UnionFS)来创建容器镜像,其中包含了一个读写层(write layer)和一个只读层(read-only layer)。 默认情况下,Docker 的写层存储在 /var/lib/docker 目录下,包括容器的文件系统、日志和元数据等。但是,如果你的主机上的 /var/lib/docker 目录空间有限,你可

    2024年02月12日
    浏览(50)
  • Vivado编译出现错误[Place 30-494] The design is empty

    Vivado编译出现以下错误: 原因:顶层模块没有输出端口 (下面是我一开始写的错误顶层) 解决方法 :在顶层模块中增加一个output端口,再在I/O Ports分配一个无关紧要的管脚。

    2024年02月12日
    浏览(59)
  • 安装docker-compose出现错误html: No such file or directory syntax error near unexpected token `<‘ <head><t

    安装docker-compose出现 /usr/local/bin/docker-compose: line 1: html: No such file or directory /usr/local/bin/docker-compose: line 2: syntax error near unexpected token \\\' \\\'usr/local/bin/docker-compose: line 2: 502 Bad Gateway 错误 解决 重新安装docker-compose,国内的有些快捷方式有些是有问题的,可能短期内能够使用,时间长

    2024年02月12日
    浏览(45)
  • 安装MYSQL8.0出现的The service already exists!The current server installed:

    这是我在安装MySQL的时候出现的一个服务冲突问题: 问题描述: 在现在之前的MySQL的时候没有卸载干净(服务未关闭) 所以在出现添加服务的时候会提示如下: 解析: 该服务已存在! 当前安装的服务器:D:MySQLmysql-5.7.24-winx64binmysqld MySQL 原因: 因为我之前安装mysql-5.7.24

    2024年02月08日
    浏览(41)
  • 【文献分享】Big data and benchmarking initiatives to bridge the gap from AlphaFold to drug design

    今天来精读一篇发在《Nature Chemical Biology》上的最新评论,题目为: Big data and benchmarking initiatives to bridge the gap from AlphaFold to drug design  原文链接如下: Big data and benchmarking initiatives to bridge the gap from AlphaFold to drug design | Nature Chemical Biology https://www.nature.com/articles/s41589-024-01570

    2024年03月28日
    浏览(47)
  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the dock

    记录一下初使用docker时,报错 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the dock er daemon running? 的解决思路。 服务器使用阿里云的,经常重启,一直没有管理之前安装的docker,现在想学习spark,遍跟着官网开始下载spark,执行了 docker pull apachecn0/spark-doc-zh 就报了下面

    2024年02月16日
    浏览(62)
  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running

    当docker  ps出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running以下报错时,首先 查看docker服务的状态如果处于关闭状态则需要启动docker服务 如果服务是启动状态docker   ps还是报这个错 如果路径ok,那就是docker.socket进程没有关掉 重新启动服务即可

    2024年02月08日
    浏览(55)
  • Mac:运行docker遇到Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker ...

    由于公司禁用了桌面版的Docker,急需要一个mac下依然能够运行的Docker环境,先后做了以下尝试,最终终于搞定。 首先,在执行brew install --cask docker时,遇到的一下错误: 然后,就尝试直接安装docker试试, 执行命令: brew install docker 顺利安装成功,但是执行任何docker命令都会

    2024年02月08日
    浏览(47)
  • 【Docker:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.Is the docker daemon run】

    在后台一直出现xxljob环境的报错,然后查看服务器执行关于docker命令,docker images,docker ps,会一直出现如下问题: 此时已确定Docker本身已经安装正常。 问题原因是因为docker服务没有启动,所以在相应的/var/run/ 路径下找不到docker的进程。 如果未安装docker,则会出现: 1、执行

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包