开发说一台MySQL连不上,需要修复下。
- 先查看MySQL日志
# 看下MySQL状态,找下MySQL的日志,这里有一个大坑,一定要注意:
# 看似MySQL没有启动,但这里一定不要着急启动!注意到这个service是被disabled掉的!
root@dvmysql01 data]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Jan 17 16:18:17 dvmysql01 systemd[1]: Unit mysqld.service entered failed state.
Jan 17 16:18:17 dvmysql01 systemd[1]: mysqld.service failed.
Jan 17 16:19:31 dvmysql01 systemd[1]: Starting MySQL Server...
Jan 17 16:19:35 dvmysql01 systemd[1]: Started MySQL Server.
Jan 17 16:20:36 dvmysql01 systemd[1]: Stopping MySQL Server...
Jan 17 16:20:38 dvmysql01 systemd[1]: Stopped MySQL Server.
Jan 17 16:26:39 dvmysql01 systemd[1]: Starting MySQL Server...
Jan 17 16:26:41 dvmysql01 systemd[1]: Started MySQL Server.
Jan 17 16:27:16 dvmysql01 systemd[1]: Stopping MySQL Server...
Jan 17 16:27:20 dvmysql01 systemd[1]: Stopped MySQL Server.
# 查看后发现是很标准的本机rpm安装,查看对应的配置文件,居然没有!
[root@dvmysql01 data]# cat /etc/my.cnf
#
# The Percona Server 5.7 configuration file.
#
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
# Please make any edits and changes to the appropriate sectional files
# included below.
#
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/
[root@dvmysql01 data]# cat /etc/percona-server.conf.d/mysqld.cnf
cat: /etc/percona-server.conf.d/mysqld.cnf: No such file or directory
# MySQL除了本机rpm安装外,现在也是可以被各种容器支撑,所以这里看下机器的容器
# 果然发现docker里也有一个MySQL!
[root@dvmysql01 data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef022073837b mysql_5.7:20230117 "/docker-entrypoint.…" 41 hours ago
# 看下这个容器的配置,发现对应的配置文件
[root@dvmysql01 data]# docker inspect MySQL_3306
...
"Mounts": [
{
"Type": "bind",
"Source": "/home/mysql/3306/data",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/mysql/3306/backup",
"Destination": "/home/mysql_bak",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/mysql/3306/imgs",
"Destination": "/home/imgs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/mysql/3306/etc/my.cnf",
"Destination": "/etc/my.cnf",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
...
[root@dvmysql01 data]# cat /home/mysql/3306/etc/my.cnf
...
log-error=/var/lib/mysql/mysql_log.log
...
# 这里要对路径按照docker的bind进行一下转换
# /var/lib/mysql = /home/mysql/3306/data
[root@dvmysql01 data]# vi /home/mysql/3306/data/mysql_log.log
...
2023-01-19T00:00:38.470634Z 0 [Note] InnoDB: Buffer pool(s) load completed at 230119 8:00:38
mysqld: File '/home/mysql/3306/data/mysql-bin.000002' not found (Errcode: 2 - No such file or directory)
2023-01-19T00:00:38.475864Z 0 [ERROR] Failed to open log (file '/home/mysql/3306/data/mysql-bin.000002', errno 2)
2023-01-19T00:00:38.475873Z 0 [ERROR] Could not open log file
2023-01-19T00:00:38.475882Z 0 [ERROR] Can't init tc log
2023-01-19T00:00:38.475888Z 0 [ERROR] Aborting
...
- 发现问题所在:MySQL启动时找不到对应的binlog,所以无法启动。
# 直接查看到这个报错binlog文件,文件存在,并且对应的权限也可以
[root@dvmysql01 data]# ls -lh /home/mysql/3306/data/mysql-bin.000002
-rwxrwxr-x 1 polkitd input 887K Jan 17 16:27 /home/mysql/3306/data/mysql-bin.000002
# 可是docker内的路径不应为外部宿主机的路径!按理说这个报错日志应该是docker内部的路径才对。所以这个路径指错了,但配置文件内没有定义log-bin路径!
# 去看一下对应的 mysql-bin.index 文件内容,果然直接指到了宿主机的路径:
[root@dvmysql01 data]# cat mysql-bin.index
/home/mysql/3306/data/mysql-bin.000001
/home/mysql/3306/data/mysql-bin.000002
- 解决问题
# 分析原因:
## 这台机器安装了多个MySQL:rpm安装、容器安装
## 可能是先使用宿主机安装的MySQL,用了一段时间,然后迁移至容器内运行。
## 这时因为某种原因重启了Server,某个开发不了解情况直接用systemctl start mysqld而没有用docker启动MYSQL
## 发现没起来,就修改了/etc/percona-server.conf.d/mysqld.cnf这个文件,发现改了几次也不行,就删掉这个文件毁尸灭迹~ 让运维来解决问题~
## 修改mysql-bin.index为容器内路径,使用docker启动
[root@dvmysql01 data]# cat mysql-bin.index
/var/lib/mysql/mysql-bin.000001
/var/lib/mysql/mysql-bin.000002
[root@dvmysql01 data]# docker start MySQL_3306
# 问题解决,一切归于平静