现场环境mysql账户登录错误,用户名和密码都确认过没有问题的。报错信息如下:
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)
查看1045对应的错误信息:
perror 1045:MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user '%-.48s'@'%-.64s' (using password: %s), 显然用户名和密码访问被拒绝了,从源码跟踪客户端认证的流程。
sql_connection.cc:check_connection 客户端认证的入口函数,主要工作:
vio_peer_addr函数:根据vio获取对端的ip地址
ip_to_hostname函数:根据ip解析对应的host_name,在没有配置skip_name_resolve的场景下工作
acl_check_host函数:匹配客户端机器是否满足mysql.user表中的host列,在程序启动的时候会将mysql.user表中的host分为两个hash结构存储:acl_check_hosts和acl_wild_hosts,该函数检查host或者ip是否在这两个结构中包含
acl_authenticate:进行客户端认证的主要函数
acl_authenticate 该函数主要功能如下图,其中scrample是生成的一串随机数值,用于认证使用;do_auth_once负责后续的认证工作
else
{
/* mark the thd as having no scramble yet */
mpvio.scramble[SCRAMBLE_LENGTH]= 1;
/*
perform the first authentication attempt, with the default plugin.
This sends the server handshake packet, reads the client reply
with a user