背景
在官方代码中,用户刚登录mysql时,系统变量的会话值将被赋值为全局值。如果客户修改了sql_mode/long_query_time/time_zone的全局值,管控可能会收到影响,所以不希望管控的用户刚登录时的会话值受用户设置的全局值所影响
设计
管控用户刚登录mysql时,sql_mode、long_query_time、time_zone 这三个参数的会话值是指定的,分别指定为:NO_ENGINE_SUBSTITUTION、31536000、'+8:00',而不跟随全局值
具体方案:
对于sql_mode 、long_query_time:
添加了两个全局的系统变量:rds_user_default_long_query_time,rds_user_default_sql_mode,用来记录管控用户刚登录msyql时long_query_time_double和sql_mode的值,以达到不跟随long_query_time_double和sql_mode全局值的目的。
rds_user_default_long_query_time 默认值为 31536000.000000,只读,不可动态修改
rds_user_default_sql_mode默认值为 NO_ENGINE_SUBSTITUTION, 只读,不可动态修改
在管控用户开始一个新会话时,待会话值被赋值为全局值之后,将会话线程里sql_mode的值更新为 rds_user_default_sql_mode, long_query_time_double 更新为rds_user_default_long_query_time
对于time_zone:
生成一个东八区的静态Time_zone对象,待有新连接时,等会话值被赋值为全局值之后,将会话线程里time_zone的值改为静态Time_zone的对象指针