如题,在初次尝试在docker里运行mysql服务,稳定运行了2周后GG了。
事发经过
先是测试说接口跑不通了,我看后台显示 无法连接到数据库
dial tcp 127.0.0.1:3306: connect: connection refused
我查看容器
docker ps -a
发现Redis容器在运行,而MySQL容器已经在2小时前GG了。
然后我重启容器
docker restart xxx
我进入容器
docker exec -it xxx bash
登录MySQL服务
mysql -u root -p
查看数据库
show databases;
焯!发现数据库没了。
但是我查询用户表 我之前配置的user还是在的。
也就是说mysql的库都是在的,我创建的用于项目项目的库没了。
还好是测试阶段 这要是线上环境,就属于生产事故了。
不管了 我先重新创建了项目用到的库 然后启动项目(项目启动时会初始化表和默认数据),先给测试用着,然后我再具体分析分析。
分析过程
然后我先查看下日志
docker logs CONTAINER_ID
哇,一大段 我看不懂 扔给AI帮我分析分析
2023-07-31T00:20:45.218110Z 1184 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.31).
2023-07-31T00:20:46.489655Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
2023-07-31 09:32:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
2023-07-31 09:32:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2023-07-31 09:32:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
2023-07-31T09:32:59.561121Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2023-07-31T09:32:59.562044Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
2023-07-31T09:32:59.566847Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-07-31T09:32:59.718230Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-07-31T09:32:59.856212Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-07-31T09:32:59.856263Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2023-07-31T09:32:59.858171Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2023-07-31T09:32:59.874618Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2023-07-31T09:32:59.874690Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
2023-07-31T09:42:48.621426Z 13 [Warning] [MY-013360] [Server] Plugin sha256_password reported: ''sha256_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
2023-07-31T09:48:46.304616Z 0 [System] [MY-013172] [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.31).
2023-07-31T09:48:47.229344Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
2023-07-31 09:49:18+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
2023-07-31 09:49:18+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2023-07-31 09:49:18+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
2023-07-31T09:49:19.113432Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2023-07-31T09:49:19.114371Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
2023-07-31T09:49:19.119433Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-07-31T09:49:19.291367Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-07-31T09:49:19.431918Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-07-31T09:49:19.431955Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2023-07-31T09:49:19.433727Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2023-07-31T09:49:19.452711Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2023-07-31T09:49:19.452767Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
AI分析后
以下内容来自AI
这是一段mysql服务启动和关闭的日志。从日志中可以看出,mysql服务在启动时出现了一些问题,导致服务崩溃。以下是一些可能的原因:
- InnoDB初始化失败:日志中提到InnoDB初始化失败,这可能是由于InnoDB文件损坏或缺失导致的。您可以尝试使用备份文件或其他方法修复InnoDB文件。
- TLS配置错误:日志中提到了TLS配置错误,这可能是由于您没有正确配置mysql服务的TLS参数导致的。您可以查看mysql服务的文档,了解如何正确配置TLS参数。
- CA证书错误:日志中提到CA证书错误,这可能是由于您没有正确安装或配置mysql服务的CA证书导致的。您可以查看mysql服务的文档,了解如何正确安装和配置CA证书。
- X Plugin配置错误:日志中提到X Plugin配置错误,这可能是由于您没有正确配置mysql服务的X Plugin参数导致的。您可以查看mysql服务的文档,了解如何正确配置X Plugin参数。
总之,mysql服务启动和关闭的日志中提到了许多可能导致服务崩溃的错误,您可以根据上述分析尝试解决问题。如果您无法解决问题,可以考虑寻求mysql服务的技术支持。
以上内容来自AI
这我也看不懂啊,笑嘻了,反正总结: 就是崩溃了。服务GG了,我创建的库也没了。
然后我决定救助互联网 我搜索一番后 发现 我这种情况不在少数。
大家给出的建议就是docker里只运行mysql服务即可,数据还是放在主机里。
好了 思路有了 为什么会崩溃后边有能力了再研究,先根据网友提供的解决方案重新配置下。
解决方案
先看一下我创建容器时使用的命令
docker run -d --name mysqls -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234qwer mysql:8.0.31
可以看到 我只映射了3306地址 并没有挂载系统盘,也就是说数据是保存在docker容器里的。并且没有使用配置文件,而是只指定了root的密码。
接下来 根据网友提供的思路,我修改了我的命令
docker run -d --name mysqls -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234qwer -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d mysql:8.0.31
可以看到多在原有的基础上多加了三条
- -v /home/mysql/log:/var/log/mysql 将日志文件夹挂载到主机
- -v /home/mysql/data:/var/lib/mysql 将mysql储存文件夹挂载到主机
- -v /home/mysql/conf:/etc/mysql/conf.d 将配置文件夹挂载到主机
可以看到 :左边均为本机文件路径 :右边为docker容器的路径 我们现在本机创建要存放数据的文件路径(不一定非得放在 /home/mysql 下,我查阅资料时大部分是放在 /mydata/mysql,具体取决于你的使用习惯,这里我就放在 /home/mysql 下)
mkdir -p /home/mysql/xxx
docker里的路径会在mysql服务初始化时自动创建 我们不用处理。
先停止当前的容器
docker stop mysqls
再删除当前容器
docker rm mysqls
先别急着启动 因为我们指定了 挂载文件 那么我们就需要一个配置文件
my.conf 名字随便 后缀是.conf即可
进入 /home/mysql/conf
vim my.conf
写入如下配置
[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake
保存 退出
然后我们使用新指令 创建新容器
docker run -d --name mysqls -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234qwer -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d mysql:8.0.31
创建成功后 会返回一个容器id
等十几秒 等容器里的MySQL 初始化完成
然后我们进入 本机路径查看
cd /home/mysql/data
可以看到 已经有了系统库和表的数据了。
这样一来,我就将日志,数据,配置等文件 全部放在我们本机,这样就算docker崩溃也没事,我们的数据还在。
然后就可以登录mysql服务配置你的数据库了。