关于 MySQL 每次开机后需要很长时间才能启动的问题

今天是最新的消息,大年初四,
我遇到的问题似乎解决了,
先看三个地方

一,查看MySQL 日志

MySQL日志记录中显示有错误,
服务无法启动,绑定的地址已被使用,
有其他的 MySQL 运行在端口 3306,

[root@bogon ~]# cat /var/log/mysqld.log

2022-02-04 10:19:34 1539 [Note] Server hostname (bind-address): ‘*’;
port: 3306 2022-02-04 10:19:34 1539 [Note] IPv6 is available.
2022-02-04 10:19:34 1539 [Note] - ‘::’ resolves to ‘::’; 2022-02-04
10:19:34 1539 [Note] Server socket created on IP: ‘::’. 2022-02-04
10:19:34 1539
[ERROR] Can’t start server: Bind on TCP/IP port: Address
already in use 2022-02-04 10:19:34 1539
[ERROR] Do you already have
another mysqld server running on port: 3306 ? 2022-02-04 10:19:34 1539
[ERROR] Aborting

二,查看当前MySQL 进程状况

 查看当前和 MySQL 有关的进程中,有一个是 root 开头的,
 这是不对的,所有的 mysql 进程 都应该是以 mysql 开头的,
举个正确的例子,

[root@bogon ~]# ps aux |grep mysql

root … /bin/bash /usr/bin/mysql-systemd-start post

mysql 1209 0.1 11.4 963188 114064 ? Sl 11:38 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
mysql 1042 0.0 0.1 113260 1616 ? Ss 11:38 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr

三,查看MySQL服务当前状态

查看当前mysqld 服务的状态,发现有一行描述是,
拖延超时,计划重启

[root@bogon ~]# systemctl status mysqld

mysqld.service holdoff time over, scheduling restart

这三点,充分的说明了,因为有莫名其妙的MySQL服务已经运行了,并且占用了3306的端口,从而导致了MySQL 不得不等待好长时间才能再次重启计划,解决被占用的问题,所以出现了,systemctl
start mysqld 开启MySQL的mysqld 服务的时候,卡住了,等了好久都不一定能起来.

所以,就是要找出来是谁在一开机就占用了3306端口,
通过查找,发现了很多docker 的东西,
[root@bogon ~]# find / -name mysql

/var/lib/docker/…

反正现在也不用docker了,干脆删除它.
[root@bogon mysqld]# yum list installed |grep docker
[root@bogon mysqld]# yum -y removedocker-engine.x86_64

重启主机,秒进MySQL 丝滑,

所以说,历时5天,终于把遇到的MySQL启动慢,长达十分钟有时甚至半个小时的问题解决了,开心

总结,当遇到MySQL的问题,
第一时间要去看MySQL的日志 /var/log/mysqld.log
那里才是真正的原因所在.
每个人的安装/运行环境往往都不太一样,所以同样的表象也许背后的原因并不相同,不能一概而论,需要根据 MySQL的日志去针对处理.
这才是正解.
一定要学会看日志,

还是年初三
找到一篇好文章,搬来大家可以借鉴一下

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zgrjkflmkyc/article/details/105571586

今天是大年初三,
昨天研究到后半夜快三点了,今早起来就打开 centos
发现又出现了无法连接的情况 报 sock错误,
再查看,发现,mysqld没有启动,
但过了一小会一分多钟吧,就能使用MySQL了,
原因不详,
大家可以看看我下面不是特别正确的解决方案,等我研究明白了再来更新最终解决方案,

今天是大年初二

又有了新的研究成果,
最新的,
分享给大家,
在 centos7里新装的MySQL
开机需要很长时间,看日志是卡在了
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
这里,然后过了10分钟才又开始执行下面的语句
mysqld_safe Logging to '/var/log/mysqld.log'.

这之后的日志里还有

2022-02-01 14:02:04 1789 [ERROR] Can’t start server: Bind on TCP/IP port: Address already in use
2022-02-01 14:02:04 1789 [ERROR] Do you
already have another mysqld server running on port: 3306 ? 2022-02-01 14:02:04 1789 [ERROR] Aborting

但这都不是问题的根本,
直到我看了一位大神的文章豁然开朗,其实道理很简单,
如下:

版权声明:本文为CSDN博主「有一种人仅仅是认识就很好了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36350532/article/details/79591803

myslq 出于安全考虑,
默认拒绝用 centos 的root账号启动mysql服务。

这才是问题根本,
就是说,卡住的那段时间是因为,咱们尝试使用 centos 的root这个用户去 启动 MySQL 服务 mysqld,但MySQL又出于安全原因拒绝 root 用户启动 MySQL 的服务,所以就僵持住了,

这个,看下面两处,

[root@bogon ~]# systemctl status mysqld
● mysqld.service - MySQL Community Server
Loaded: loaded
(/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)

mysqld.service 服务要去引导,/usr/lib/systemd/system/mysqld.service

[root@bogon ~]# cat /usr/lib/systemd/system/
mysqld.service

[Service]
User=mysql

mysqld.service里的服务启动用户是centos的 mysql

[root@bogon system]# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MySQLServer:/var/lib/mysql:/bin/bash

可以看到centos里有mysql这个用户,

解决起来也非常简单
去改 MySQL 的启动配置文件 /etc/my.cnf 就可以了
在 [mysqld]里加这句 user=mysql
[root@bogon system]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

保存,退出 vi,再启动MySQL就没问题了,不会再卡了,很顺畅,

总结一下,MySQL 为了安全,是默认阻止 centos的 root 用户去开机启动 MySQL 的服务 mysqld 的,因为 centos 的 root 用户权限太大了,太危险了,所以 默认拒绝 root 启动 mysqld
所以,我们在 MySQL 的启动配置文件 /etc/my.cnf 中 告诉 MySQL 用centos 的mysql 用户去启动 MySQL ,等MySQL 启动后,用谁去连MySQL 数据库就都随意了,
下面的文章,是我大年初一 临时找的解决方案,不够科学,不用看,要是感兴趣可以简单读一下,看看我 解题思路,

现象,
通过查看 日志,

220201 13:48:56 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
220201 13:58:54 mysqld_safe Logging to ‘/var/log/mysqld.log’.

可以看到,这里经过了10分钟,MySQL才进行了第二次尝试启动,
在这里卡了10分钟之久,
查看, /etc/my.cnf
[root@bogon ~]# cat /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

symbolic-links

是否支持符号链接,即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录,为0不开启

sql_mode = STRICT_TRANS_TABLES

“STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER”
sql_mode 模式,定义了你MySQL应该支持的sql语法,对数据的校验等等,限制一些所谓的‘不合法’的操作
对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。
“NO_ENGINE_SUBSTITUTION”,表示不进行引擎替换.

symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION
这两货,在网上查了一下,似乎对MySQL启动并没有什么关系,
只是在使用 mysql的时候会有影响

但,神奇的是,我把这两货删除之后,重启服务器,MySQL秒启动,一点也不卡了.

回过头,咱们再来研究日志,

2022-02-01 14:01:48 5660 [Note] /usr/sbin/mysqld: Normal shutdown

2022-02-01 14:01:48 5660 [Note] Giving 0 client threads a chance to die gracefully

这是我重启服务器的日志描述,normal shutdown 正常关闭MySQL

2022-02-01 14:02:04 0 [Warning] TIMESTAMP with implicit DEFAULT
value is deprecated. Please use --explicit_defaults_for_timestamp
server option (see documentation for more details). 2022-02-01
14:02:04 0 [Note] /usr/sbin/mysqld (mysqld 5.6.51) starting as process
1789 … 2022-02-01 14:02:04 1789 [Warning] Buffered warning:
Changed limits: max_open_files: 1024 (requested 5000)

2022-02-01 14:02:04 1789 [Warning] Buffered warning: Changed limits:
table_open_cache: 431 (requested 2000)

到这里,出现了 [Warning] 但不是ERROR,所以忽略继续往下看

2022-02-01 14:02:04 1789 [ERROR] Can’t start server: Bind on TCP/IP port: Address already in use
2022-02-01 14:02:04 1789 [ERROR] Do you
already have another mysqld server running on port: 3306 ? 2022-02-01 14:02:04 1789 [ERROR] Aborting

到这里,出了3个ERROR, 但没卡住,还在继续往下走,

2022-02-01 14:02:06 1789 [Note] /usr/sbin/mysqld: Shutdown complete

220201 14:02:06 mysqld_safe mysqld from pid file
/var/run/mysqld/mysqld.pid ended
220201 14:12:04 mysqld_safe Logging
to ‘/var/log/mysqld.log’.

注意这里,02到12,卡了10分钟,
然后没停顿继续往下走,

220201 14:12:04 mysqld_safe Starting mysqld daemon with databases from
/var/lib/mysql 2022-02-01 14:12:05 0 [Warning] TIMESTAMP with implicit
DEFAULT value is deprecated. Please use
–explicit_defaults_for_timestamp server option (see documentation for more details). 2022-02-01 14:12:05 0 [Note] /usr/sbin/mysqld (mysqld 5.6.51) starting as process 5836 … 2022-02-01 14:12:05 5836 [Warning] Buffered warning: Changed limits: max_open_files: 1024
(requested 5000)

2022-02-01 14:12:05 5836 [Warning] Buffered warning: Changed limits:
table_open_cache: 431 (requested 2000)

虽然这里又出了3个 [Warning] ,但没卡继续往下走

2022-02-01 14:12:05 5836 [Note] /usr/sbin/mysqld: ready for
connections. Version: ‘5.6.51’ socket: ‘/var/lib/mysql/mysql.sock’
port: 3306 MySQL Community Server (GPL)

直接启动成功,

这里拦一下 一个循环结束 接着分析 下面的日志

这里,在下一个循环开始之前,

手工到  /etc/my.cnf 里把 
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION
这两个东西删了,保存退出,然后,开始下一个循环 ,重启服务器,

2022-02-01 15:03:00 5836 [Note] /usr/sbin/mysqld: Normal shutdown

2022-02-01 15:03:00 5836 [Note] Giving 0 client threads a chance to die gracefully

一个新的重启,

2022-02-01 15:03:17 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server
option (see documentation for more details). 2022-02-01 15:03:17 0
[Note] /usr/sbin/mysqld (mysqld 5.6.51) starting as process 1660 …
2022-02-01 15:03:17 1660 [Warning] Buffered warning: Changed limits:
max_open_files: 1024 (requested 5000)

2022-02-01 15:03:17 1660 [Warning] Buffered warning: Changed limits:
table_open_cache: 431 (requested 2000)

又出现了3个 [Warning] ,但没卡,继续往下走,

2022-02-01 15:03:17 1660 [Note] /usr/sbin/mysqld: ready for
connections. Version: ‘5.6.51’ socket: ‘/var/lib/mysql/mysql.sock’
port: 3306 MySQL Community Server (GPL)

一点也没卡,直接秒起,
第二个循环的 服务器重启时间是:15:03:00,数据库就位的时间是: 15:03:17,时间采用了170毫秒,
和刚才的 10分钟比起来,天差地别.

这就是 /etc/my.cnf 文件影响的MySQL 启动

February the 01st 2022 tuesday

补充,
重启服务器没问题,但是关闭服务器等半小时再开机,
就又出现了之前的问题,卡在
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
这里,然后过了10分钟才又开始执行下面的语句
mysqld_safe Logging to '/var/log/mysqld.log'.
卡在它俩中间了,

于是,继续研究,
去看 交给 chkconfig 管理的 mysqld 的内容,
[root@bogon ~]# cd /etc/rc.d/init.d
[root@bogon init.d]# ll

总用量 44
-rw-r–r--. 1 root root 17500 5月 3 2017 functions
-rwxr-xr-x. 1 root root 1141 2月 1 13:58 mysqld
-rwxr-xr-x. 1 root root 4334 5月 3 2017 netconsole
-rwxr-xr-x. 1 root root 7293 5月 3 2017 network
-rw-r–r--. 1 root root 1160 8月 5 2017 README

[root@bogon init.d]# cat mysqld

# chkconfig: 2345 3 20
# description:February the 01st tuesday 2022

[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target

我设置的 mysqld 的启动顺位是3,
但, [Unit] 写明了,要在 network 之后启动,
所以还要去看一下 network 的启动顺位是多少,
[root@bogon init.d]# cat network

# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured

可以看到,network 的启动顺位是 10,
所以,需要将 mysqld 的启动顺位调整到 network 之后,
[root@bogon init.d]# vi mysqld

# chkconfig: 2345 11 91
# description:February the 01st tuesday 2022

调整完毕,保存退出,
再关机等待一段时间后,开启服务器,看结果,
还是不行,

去查看
MySQL 当前状态
[root@bogon ~]# systemctl status mysqld

● mysqld.service - MySQL Community Server
Loaded: loaded(/usr/lib/systemd/system/mysqld.service; enabled; vendor preset:
disabled)

可以看出,MySQL 启动的时候,是要去load /usr/lib/systemd/system/mysqld.service它的,
去看看它里面都有啥,
[root@bogon ~]# cd /usr/lib/systemd/system/
[root@bogon system]# ll |grep mysql

-rwxr-xr–. 1 root root 1073 1月 5 2021 mysqld.service

打开看看
[root@bogon system]# cat mysqld.service

TimeoutSec=600

有一行这个,600秒不就是10分钟嘛,不正好是卡住的时间长度么(mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended),
既然我不知道问题出在哪里,
要不我就给这个时间减少点,这样会不会能快点启动呢?
着手实验,
[root@bogon system]# vi mysqld.service

TimeoutSec=6

改成 6 秒,保存退出,关机 等待一段时间,再开机,看看效果.
可以了,
不用等10分钟以上了.
但不知道,问题是不是彻底解决了,
需要在以后的使用中验证,

February the 01st 2022 tuesday

你可能感兴趣的:(笔记,心得,mysql,数据库,服务器)