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日
    浏览(5)
  • docker设置rootdir:设置/var/lib/docker的默认数据存储位置(data-root或graph)

    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日
    浏览(18)
  • Vivado编译出现错误[Place 30-494] The design is empty

    Vivado编译出现错误[Place 30-494] The design is empty

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

    2024年02月12日
    浏览(15)
  • 安装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日
    浏览(5)
  • 安装MYSQL8.0出现的The service already exists!The current server installed:

    安装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日
    浏览(7)
  • 【文献分享】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》上的最新评论,题目为: 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日
    浏览(7)
  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the dock

    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日
    浏览(32)
  • 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日
    浏览(7)
  • 【Docker:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.Is the docker daemon run】

    【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日
    浏览(17)
  • Mac:运行docker遇到Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker ...

    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日
    浏览(7)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包