记一次GCP云SQL数据库问题导致的线上故障
本文记录了一次由于GCP SQL云数据库异常导致的线上故障
接到业务部门反馈数据库查询异常。运维小伙伴第一时间排查确认:
1、登录运维系统检查监控日志发现一切正常。
2、登录GCP web控制台查看SQL状态发现一切正常。
3、登录服务器使用mysql命令行连接数据库进行查询检测发现有报错。如下:
[game@server-1 ~]$ mysql -h 10.1.2.3 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1344693
Server version: 8.0.31-google
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> use JobScheduleDb;
No connection. Trying to reconnect...
Connection id: 1344727
Current database: *** NONE ***
ERROR 1184 (08S01): Aborted connection 1344727 to db: 'unconnected' user: 'root' host: '10.1.2.3' (init_connect command failed)
mysql> select JobName from JobScheduleDb.JobScheduleLog limit 1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>
总结一下:就是执行任何SQL查询语句均为异常。(也包括root用户)
解决办法:
在GCP控制台删除当前用户,然后重新创建新用户。再次测试,发现业务正常。
联系GCP技术排查确认。GCP也没查到具体原因。事发时GCP后台出现过维护更新日志记录。
具体原因扔在排查跟进中。
导致的后果:
由于常规监控正常,但是业务异常,并且没有相关业务监控,导致事发后过了好久才发现。产生了很不好的影响。
完善解决方案
1、加强数据库查询监控,监控系统读取数据异常时,及时告警通知人员介入处理。
2、加强业务监控,业务不正常一定要及时告警出来。(业务监控也不能少)
3、这种数据库运行正常,用户查询异常的情况一般很少遇到,总结本次经验教训,监控一定要足够完善,否则很容易被拉出来背锅。
2025年3月1日更新
经排查确认:
可能跟
init_connect 'SET NAMES utf8mb4 COLLATE utf8mb4_bin'
这行配置有关,具体原因, 检查确认中 已确认,下文作了总结。
查看mysql官网文档对于init_connect的解释:
服务器将为每个连接的客户端执行的字符串。该字符串由一个或多个 SQL 语句组成,以分号字符分隔。
对于拥有 CONNECTION_ADMIN权限(或弃用SUPER 权限)的用户, 的内容 init_connect不会被执行。这样做是为了避免 的错误值 init_connect阻止所有客户端连接。例如, 值可能包含语法错误的语句,从而导致客户端连接失败。不执行 或 权限init_connect的用户可让他们打开连接并修复该 值。 CONNECTION_ADMINSUPERinit_connect
init_connect对于任何密码已过期的客户端用户,将跳过执行。这样做是因为这样的用户无法执行任意语句,因此init_connect 执行失败,导致客户端无法连接。跳过init_connect 执行使用户能够连接并更改密码。
服务器将丢弃由 的值中的语句生成的任何结果集init_connect。
解释一下就是 init_connect 设置了mysql用户连接数据库之后执行的第一条sql语句。但是以下两种情况例外:
1、具有超级数据库管理权限的用户会跳过。(避免因为设置错误,连不上数据库,无法修改管理配置的情况)
2、密码到期的客户端。(避免客户端密码到期后,连接不上无法修改密码。)
经过反复修改测试,init_connect 如果设置为'SET NAMES utf8mb4 COLLATE utf8mb4_bin',即带 单引号的方式确实会影响普通用户连接数据库和查询,主要是影响连接后的第一条sql语句执行。 添加时 应为:init_connect = SET NAMES utf8mb4 COLLATE utf8mb4_bin去掉单引号。
评论 (0)