/usr/libexec/mysqld:正常关机,但我的团队不这样做?

qua*_*nta 5 mysql shutdown

我的一个数据库一直异常关闭,但日志显示“正常”:

130422 13:23:01 [Note] /usr/libexec/mysqld: Normal shutdown

130422 13:23:01 [Note] Event Scheduler: Killing the scheduler thread, thread id 379021
130422 13:23:01 [Note] Event Scheduler: Waiting for the scheduler thread to reply
130422 13:23:01 [Note] Event Scheduler: Stopped
130422 13:23:01 [Note] Event Scheduler: Purging the queue. 41 events
130422 13:23:01 [Note] Error reading relay log event: slave SQL thread was killed
130422 13:23:01 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
130422 13:23:01 [Note] Slave I/O thread killed while reading event
130422 13:23:01 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.002426', position 107
...
130422 13:23:04  InnoDB: Starting shutdown...
130422 13:23:04  InnoDB: Waiting for 201 pages to be flushed
130422 13:23:08  InnoDB: Shutdown completed; log sequence number 6942784551767
130422 13:23:08 [Note] /usr/libexec/mysqld: Shutdown complete
Run Code Online (Sandbox Code Playgroud)

中没有相关的错误或堆栈跟踪mysqld.log,只有一些错误:

No data - zero rows fetched, selected, or processed
Run Code Online (Sandbox Code Playgroud)

从事件调度程序。

我很确定我的团队不会阻止它(通过 init 脚本或mysqladmin shutdown...)。grep通过最后一个binlog文件,我没有看到任何SHUTDOWN声明。

还有其他原因吗?如果您需要更多信息,请与我们联系。

PS: mysql Ver 14.14 Distrib 5.5.28, for Linux (x86_64) using readline 5.1


更新于 2013 年 4 月 22 日星期一 18:23:33 ICT

搜索源代码,我发现了这个:

$ grep -lir 'normal shutdown' mysql-5.5.28
mysql-5.5.28/scripts/mysqld_safe.sh
mysql-5.5.28/Docs/mysql.info
mysql-5.5.28/sql/share/errmsg-utf8.txt

$ grep -lr 'ER_NORMAL_SHUTDOWN' mysql-5.5.28
mysql-5.5.28/Docs/mysql.info
mysql-5.5.28/sql/mysqld.cc
mysql-5.5.28/sql/share/errmsg-utf8.txt
Run Code Online (Sandbox Code Playgroud)

mysql-5.5.28/sql/mysqld.cc

130422 13:23:01 [Note] /usr/libexec/mysqld: Normal shutdown

130422 13:23:01 [Note] Event Scheduler: Killing the scheduler thread, thread id 379021
130422 13:23:01 [Note] Event Scheduler: Waiting for the scheduler thread to reply
130422 13:23:01 [Note] Event Scheduler: Stopped
130422 13:23:01 [Note] Event Scheduler: Purging the queue. 41 events
130422 13:23:01 [Note] Error reading relay log event: slave SQL thread was killed
130422 13:23:01 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
130422 13:23:01 [Note] Slave I/O thread killed while reading event
130422 13:23:01 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.002426', position 107
...
130422 13:23:04  InnoDB: Starting shutdown...
130422 13:23:04  InnoDB: Waiting for 201 pages to be flushed
130422 13:23:08  InnoDB: Shutdown completed; log sequence number 6942784551767
130422 13:23:08 [Note] /usr/libexec/mysqld: Shutdown complete
Run Code Online (Sandbox Code Playgroud)

看起来没有其他原因可以将此消息记录到日志文件中。我在想的一种可能性是某人(具有SUPER特权)关闭了二进制日志,然后运行SHUTDOWN并关闭了数据库连接。

PS:在这个 bug报告中,有一个人在 5.5.24 也遇到了这个问题。

Rol*_*DBA 4

Linux 的观点

你应该运行这个 Linux 命令

history | grep mysqladmin
Run Code Online (Sandbox Code Playgroud)

这将让您查看是否有人从服务器内部运行了关闭操作。请注意,这不会让您看到远程 mysqladmin 关闭。也许运行tcpdump并找到单词mysqladminorshutdown可能会有所帮助。

MySQL的观点

命令行实用程序中不存在关闭命令。因此,二进制日志不会记录关闭情况。当你说的时候,你是在正确的轨道上;

我认为的一种可能性是某人(具有超级权限)关闭了二进制日志,然后运行 ​​SHUTDOWN 并再次将其打开。

查看具有该权限的用户。运行此查询:

SELECT user,host FROM mysql.user WHERE shutdown_priv='Y';
Run Code Online (Sandbox Code Playgroud)

你可能会看到这样的东西:

mysql> select user,host from mysql.user where shutdown_priv='Y';
+-------+--------------+
| user  | host         |
+-------+--------------+
| root  | localhost    |
| root  | 127.0.0.1    |
| root  | ::1          |
| root  | 10.240.163.% |
| root  | 10.48.19.%   |
| user1 | %            |
+-------+--------------+
6 rows in set (0.00 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

您将看到所有具有关机权限的用户。SUPER权限没有关机权限。有一个单独的特权称为SHUTDOWN

您可以快速撤销该特权。例如,记下用户user1@'%'。它具有远程关机权限。你可以用

REVOKE SHUTDOWN ON *.* FROM user1.'%';
Run Code Online (Sandbox Code Playgroud)

或者

UPDATE mysql.user SET shutdown_priv='N'
WHERE user='user1' AND host='%';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

这负责远程关闭权限。

您还应该通过删除每个不需要 SHUTDOWN 权限的用户来解决保护用户连接的问题。也许你可以这样做:

UPDATE mysql.user SET shutdown_priv='N'
WHERE CONCAT(user,'@',host) NOT IN
('root@localhost','root@127.0.0.1');
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

这样,只能root@localhost在本地主机内root@127.0.0.1完成。mysqladmin shutdown我肯定会root@127.0.0.1手头有这个,因为有时 mysqld 会失去与mysql.sock文件的连接并阻止root@localhost连接以发出关闭。使用root@127.0.0.1,您可以发出此命令:

mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp
Run Code Online (Sandbox Code Playgroud)

无需套接字文件即可发出 mysqladmin 关闭命令。

试一试 !!!