专栏首页码农UP2UDocker 使用 MySQL

Docker 使用 MySQL

使用 Docker 来管理 MySQL、Redis 等各种中间件是十分方便的,无论是生产环境,还是开发环境都非常方便。今天来说一下我用 Docker 来管理 MySQL 时遇到的一个小坑。

在 Docker 下部署 MySQL

在 Docker 下部署 MySQL 是很方便的,通过几条命令就可以轻轻松松的下载镜像并完成安装部署。

首先,拉取MySQL镜像:

% docker pull mysql:latest
latest: Pulling from library/mysql
a076a628af6f: Already exists 
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

上面的命令是拉取最新的MySQL镜像。然后查看下载的镜像。

% docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        latest    c8562eaf9d81   2 months ago   546MB

从结果可以看到,已经有了 mysql 的 image,然后我们启动运行容器,命令如下。

% docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
19949fb03dd9700bb9e57524317fca477c0407d82ae1ff0cbdd4669b0af6c778

我们来查看容器的状态。

% docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
19949fb03dd9   mysql     "docker-entrypoint.s…"   53 seconds ago   Up 52 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-test

此时就可使用 Navicat 等客户端工具来连接 MySQL 了。当然也可以进入 Docker 中进行管理。

% docker exec -it mysql-test /bin/bash                                      
root@19949fb03dd9:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42726
Server version: 8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

使用 docker exec 命令进入 Docker 后,然后直接使用 mysql 的命令来操作 MySQL。

无论是创建库,还是创建表,包括写一些 SQL 命令看起来一切安好。

小坑

上面看起来还都不错,但是在运行本地的程序时竟然出现了一个报错,报错如下:

bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'test.SYS_CONFIG' doesn't exist

上面的报错是提示表不存在,但是经过确认后该表是存在的,可能是表名大小写的问题?查看一下。

mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)

配置中 lower_case_table_names 的值为 0,该参数被指定为 0 的时候,那么存储时是按照指定的大小写进行存储的,且在读取时是区分大小写的。该参数如果为 1 时,那么在存储时是使用小写进行存储的,且在读取时是不区分大小的。该值的配置还有 2,这里就不讨论了,而且文档中介绍,只要使用 InnoDB,无论在哪个平台(Linux、MacOS、Windows)下,该参数都要给 1。

那么我们就需要将 lower_case_table_name 的值设置为 1 才可以。

通常情况下,这种参数我们会通过 my.cnf 来进行设置,因此在my.cnf文件中,增加配置项:

lower_case_table_names=1

修改完配置,然后重启 MySQL 的容易,命令如下。

% docker restart 19949fb03dd9

其中 19949fb03dd9 替换为自己的 container id。在命令行重启后没有什么提示,但是 MySQL 不能使用。检查日志,发现启动失败,在日志中存在错误提示:

[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').

配置文件与数据字典的配置不同,从而导致无法启动。数据字典是在 MySQL 数据库服务器初始化时设置的,而配置则不能与数据字典不一致,这是 MySQL 的一个限制。因此,我们需要重新创建一个 MySQL 的容器,并在启动时给 lower-case-table-names 参数设置为 1 即可。

% docker run -itd --name mysql-new -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql --lower-case-table-names=1
5669d0d7c1776d2dc296a334484855f3c0c0a7d48d917e98d532e3a50b9c66d5
% docker exec -it mysql-new /bin/bash
root@5669d0d7c177:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 86
Server version: 8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 1     |
+------------------------+-------+
2 rows in set (0.00 sec)

这样 MySQL 的小坑就解决了。

总结

以前使用 MySQL 没有遇到过此类的问题,这也是在 Docker 中使用 MySQL 时遇到的问题。

本文分享自微信公众号 - 码农UP2U(gh_3c91b47a82e0),作者:码农UP2U

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker 使用Docker创建MySQL容器

    说明:如果不执行该步骤,执行创建MySQL容器时会自动拉取镜像:docker pull mysql:latest。

    授客
  • 使用docker的mysql镜像

    安装mysql镜像 到官网查看mysql镜像相关信息,使用docker指令pull安装

    双面人
  • 【DB宝19】在Docker中使用MySQL高可用之MHA

    MHA(Master High Availability Manager and tools for MySQL)目前在MySQL高可用方面是一个相对成熟的解决...

    小麦苗DBA宝典
  • 在docker中使用mysql数据库,在局域网访问

    注:本文所有内容均在CentOS Linux release 7.2.1511 (Core) 上测试完成

    双面人
  • 在CentOS7中使用Docker安装MySql

    上面是百度百科中Docker的介绍,因为Docker的诸多好处,准备在产品中使用,最近做了些技术的预研,本文主要介绍在CentOS7中使用Docker来安装My...

    oec2003
  • 使用 Docker 配置 MySQL 主从集群

    使用 Docker Compose 启动一主一从的 MySQL 集群。 GitHub:https://github.com/khs1994-docker/mys...

    康怀帅
  • 使用docker搭建MySQL主从复制

    MySQL的主从复制之前也没做过,刚百度了下发现并不算难,但同时开两个虚机挺麻烦,于是我就想到了使用docker来配置MySQL主从复制。

    没有故事的陈师傅
  • Centos 环境中使用 Docker 安装 MySQL 指南

    在前面的文章中已经介绍了如何在Centos下安装 Docker,本文就不多做介绍。直接开始说如何使用 Docker 安装 MySQL。

    飞翔的竹蜻蜓
  • windows使用docker运行mysql等工具(一)windows安装docker

    打开控制面板-->程序-->启用或关闭windows功能,勾选Hyper-V,然后点击确定即可。

    Java旅途
  • [MySQL] docker下安装使用mysql配置主从复制

    拉取mysql的镜像 docker search mysql docker pull mysql

    陶士涵
  • windows使用docker运行mysql等工具(二)安装运行mysql

    今天接着上一篇的内容继续来学习安装运行mysql。建议先阅读第一篇:windows安装docker

    Java旅途
  • 【DB宝18】在Docker中安装使用MySQL高可用之MGR

    6.2、其他节点加入MGR,在从库(172.72.0.16,172.72.0.17)上执行

    小麦苗DBA宝典
  • 【DB宝18】在Docker中安装使用MySQL高可用之MGR

    一、创建3台MySQL环境 二、修改MySQL参数 三、重启MySQL环境 四、安装MGR插件(所有节点执行) 五、设置复制账号(所有节点执行) 六、启动MGR...

    小麦苗DBA宝典
  • Docker安装Mysql 5.7并使用

    夹胡碰
  • 使用 Docker 安装并连接 MySQL

    作为开发,在本机捣鼓一下 Docker 还是很有必要的,本篇文章介绍如何使用 Docker 安装 MySQL,并在终端(iTerm2)使用命令连接 MySQL。

    程序员小航
  • Docker中CentOS容器安装使用MySQL

    进入CentOS终端后, root@d2568b5fe7b3中@符号后面的内容指的是该容器对应的ID,容器ID不等于镜像ID

    Coxhuang
  • 使用docker in docker

    工作中需要在容器里操作docker镜像,而且又不想污染宿主机上的docker镜像,找到了docker in docker(dind)的方案,这里记录一下。

    jeremyxu
  • Docker最全教程之MySQL容器化 (二十四)

    MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过此块,本篇仅从笔者角度进行总结和编写。

    雪雁-心莱科技
  • Docker 介绍、核心概念、常用命令

    Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。运行中的这个镜像称为容器,容器启动后非常快速...

    桑鱼

扫码关注云+社区

领取腾讯云代金券