我的一个数据库一直异常关闭,但日志显示“正常”:
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 也遇到了这个问题。
你应该运行这个 Linux 命令
history | grep mysqladmin
Run Code Online (Sandbox Code Playgroud)
这将让您查看是否有人从服务器内部运行了关闭操作。请注意,这不会让您看到远程 mysqladmin 关闭。也许运行tcpdump并找到单词mysqladminorshutdown可能会有所帮助。
命令行实用程序中不存在关闭命令。因此,二进制日志不会记录关闭情况。当你说的时候,你是在正确的轨道上;
我认为的一种可能性是某人(具有超级权限)关闭了二进制日志,然后运行 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 关闭命令。
试一试 !!!
| 归档时间: |
|
| 查看次数: |
17241 次 |
| 最近记录: |