mysql docker容器启动遇到的问题整理

发布于:2025-04-04 ⋅ 阅读:(23) ⋅ 点赞:(0)

好几个月没折腾mysql的部署,弄了下,又遇到不少问题

问题一:Access denied for user ‘root‘@‘172.18.0.1‘

docker容器启动后,本地navicat 连接报这个错误

查到两个方案,一个貌似是要让root用户能在任意ip地址,能够连接到mysql

方案一

docker 容器运行mysql 登录时报错 1045 - Access denied for user root@127.0.0.1 (using password:yes)

同时需要注意,上面是貌似mysql 5的处理方式,mysql 8好像要要分成多条执行语句

我的没有生效

方案二

在执行语句的时候docker加上环境参数

如果是 access denied for user ‘root‘@, 那就在 environment 中加一条 MYSQL_ROOT_HOST: '%'

问题二:docker Could not open file ‘/var/log/mysqld.log’ for error logging: Permission denied

分析docker启动MySQL挂载目录提示权限不足Permission denied原因

我的问题是 我挂载的my.cnf的 log-error 写错路径了,没写在docker-compose挂载的volume中

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
server-id = 1          # 服务器ID,确保每个服务器唯一
log-bin = /var/lib/mysql/binlog
#binlog-ignore-db = mysql  # 可选,忽略同步某些数据库
#binlog-do-db = your_database  # 可选,指定要同步的数据库
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
## 这里写错了,现在是正确的
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

docker-compose文件:

version : '3'
services:
  jkmysql:
    container_name: jkmysql
    image: xxxxxxxxxxx/mysql:1.0
    restart: on-failure:3
    ports:
      - 3306:3306
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./db/my.cnf:/etc/mysql/my.cnf:rw
      - ./db/logs:/var/log/mysql:rw
      - ./db/data:/var/lib/mysql
    command: [
          'mysqld',
          '--default-authentication-plugin=mysql_native_password',    
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00',
          '--lower-case-table-names=1'
        ]
    environment:
      MYSQL_ROOT_HOST: '%'
    healthcheck: 
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]  ## 由于我的环境初始化数据库,比较慢,时间可以自己调整
      interval: 60s
      retries: 3
      start_period: 30s

mysqld: Table ‘mysql.plugin‘ doesn‘t exist

在这里插入图片描述
一开始丈二和尚摸不到头脑,有的说法是 mysql半同步设置问题

但我的不是这个问题 ,后来有文章提到了是 大坑记录,docker创建MySQL8.0或以上容器时,mysqld: Table ‘mysql.plugin‘ doesn‘t exist

yyds ,我的也是 这个问题,我是在win10上部署容器 mysql:8.0.40-debian容器

我就在我挂载的my.cnf 去掉了 lower_case_table_names 的配置,只在docker-compose 对应mysql 容器的地方 加上 lower_case_table_names 的配置,

然后报这个

server option 'lower_case_table_names' is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination. Please consider either using a case sensitive file system for your data directory or switching to a case-insensitive table name mode.

然后 在重新删除 原来容器 volume挂载的data目录 ,这里提示的就是 文件系统的大小写 和docker 配置的不一致

最后附上lower_case_table_names 的说明
lower_case_table_names 是 MySQL 中的一个系统变量,用于控制数据库名和表名的大小写处理方式。不同的操作系统下,默认设置可能不同,这是因为文件系统的差异导致的。这个变量有三个可能的值:

0:这是默认在 Unix/Linux 系统上的设置。在这种情况下,MySQL 会保留表名的大小写形式,并且区分大小写。这意味着 MyTable 和 mytable 将被视为两个不同的表。
1:这是默认在 Windows 系统上的设置。在这种情况下,MySQL 会将所有表名转换为小写形式存储,并且不区分大小写。即使你在创建表时使用了大写字母,如 MyTable,实际存储的时候也会被转换成 mytable。
2:在这种情况下,MySQL 会保留表名的大小写形式存储,但在比较表名时忽略大小写。这是 macOS 的默认设置(虽然官方文档建议不要在 macOS 上依赖这个行为,因为 HFS+ 文件系统本质上是不区分大小写的)。