A few days ago I was doing some cleanup on a passive master database using the MySQL client. I didn’t want my commands to be replicated so I executed set sql_log_bin=0 in my session.

One of my queries dropped an unused schema that I knew was corrupt, so I wasn’t too surprised when the drop database command crashed the MySQL server. After the crash, the server came back up quickly, and my client automatically reconnected, so it was safe to keep running queries right?

Wrong.

When the client reconnected I lost my session state, so sql_log_bin reverted to 1, and any commands I ran from that point forward would be replicated, which I did not want.

This behavior makes sense, and it’s documented in the manual:

Automatic reconnection can be convenient because you need not implement your own reconnect code, but if a reconnection does occur, several aspects of the connection state are reset on the server side and your application will not know about it. The connection-related state is affected as follows:

  • Any active transactions are rolled back and autocommit mode is reset.
  • All table locks are released.
  • All TEMPORARY tables are closed (and dropped).
  • Session variables are reinitialized to the values of the corresponding variables. This also affects variables that are set implicitly by statements such as SET NAMES.
  • User variable settings are lost.
  • Prepared statements are released.
  • HANDLER variables are closed.
  • The value of LAST_INSERT_ID() is reset to 0.
  • Locks acquired with GET_LOCK() are released.

But it’s easy to overlook such details when working with automatic features like MySQL client auto-reconnect. In this specific case I didn’t execute any other commands in the reconnected session so I didn’t inadvertantly replicate anything, but this incident served as a good reminder to be vigilant about my session state when using the MySQL client.

Here’s a snippet from my session to show the value of sql_log_bin before and after the crash:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mysql> set sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec) mysql> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec) mysql> drop database test;
Query OK, 1 row affected (0.19 sec) mysql> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec) mysql> drop database reports;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select @@sql_log_bin;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 505
Current database: *** NONE *** +---------------+
| @@sql_log_bin |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)

https://mechanics.flite.com/blog/2013/05/03/the-downside-of-mysql-auto-reconnect/

最新文章

  1. 剑指Offer面试题:12.在O(1)时间删除链表结点
  2. Nokia 920板砖自救(理论上通用,升级Win10成板砖也可以用这个恢复)
  3. duapp获取mysql用户名密码等等……
  4. 实现开启和关闭android移动网络(转)
  5. sqlserver 出现 因为文件组 'PRIMARY' 已满 的解决办法 有可能是磁盘剩余空间不足 导致的
  6. e.target与事件委托简例
  7. MySQL常用命令大全(转)
  8. map遍历的四种方式
  9. Python学习笔记整理总结【RabbitMQ队列】
  10. 用 Javascript 实现的“Dual listbox”(双向选择器)
  11. 简单Socket网络通信
  12. Windows2008R2操作系统日志清理
  13. react表单的一些小例子
  14. Centos 6.3 安装教程
  15. 交叉编译zookeeper的C库
  16. [代码]--db2中left()函数和right()函数对应oracle中的substr()函数
  17. C/S与B/S区别
  18. ThreadLocal与Synchronized
  19. AndroidA——背景选择器selector用法汇总(一)
  20. window 命令行

热门文章

  1. 深入理解.sync修饰符
  2. 页面打印pdf格式文件
  3. Supervisod的使用
  4. 多线程,线程同步,synchronized关键字的用法
  5. Java实现排行榜基于Redis
  6. 开启linux远程访问权限
  7. 面试题----实现memcpy
  8. 对类型“DevExpress.Xpf.Grid.GridControl”的构造函数执行符合指定的绑定约束的调用时引发了异常。
  9. [编程] TCP协议概述
  10. ubuntu 上安装ssh