在MySQL 5.7.5中,为server层增加了离线模式(offline mode),以便于管理员的升级维护工作。
对应worklog:
该特性会产生的影响是:
1.在设置成离线模式后,非SUPER账户的会话会被断开(类似于执行kill session操作)
2.SUPER账户能够保持连接,并可以通过SUPER账户创建新的连接
3.备库复制线程不会被中断
a. 如何设置:
root@sb1 08:28:29>set global offline_mode = on;
Query OK, 0 rows affected (0.00 sec)
开启为ON时,即去kill所有非super的账户(其实就是设置kill标记),函数killall_non_super_threads
b.认证阶段(acl_authenticate)
如果新的连接请求过来,对于非super账户,会加锁LOCK_offline_mode并判断, 代码段如下:
if (!(sctx->master_access & SUPER_ACL) && !thd->is_error())
{
mysql_mutex_lock(&LOCK_offline_mode);
bool tmp_offline_mode= MY_TEST(offline_mode);
mysql_mutex_unlock(&LOCK_offline_mode);if (tmp_offline_mode)
{
my_error(ER_SERVER_OFFLINE_MODE, MYF(0));
DBUG_RETURN(1);
}}
用户登录失败会收到报错:
$perror 1917
MySQL error code 1917 (ER_SERVER_OFFLINE_MODE): The server is currently in offline mode
MySQL error code 1917 (ER_SERVER_OFFLINE_MODE): The server is currently in offline mode
显然加锁判断不是什么好的实现方式,对于短连接场景,早晚会成为一个新的瓶颈,比较理想的实现方式应该是LOCK-FREE的变量赋值,或者spin lock也好….