连接器负责跟客户端建立连接,获取权限,维持和管理连接。
我们可以用命令行工具mysql,来跟服务器端建立连接。再完成经典TCP握手后,连接器就开始认证你的身份。
如果用户或密码不对,你会收到一个"Access denied for user"的错误,然后客户端程序结束执行。
如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。此后,这个连接里的权限判断,都依赖于此时查到的权限。
如果在认证通过之后,管理员对这个用户权限做了修改,不会影响已经连接的权限。只有新的连接才会使用新的权限设置。
连接完成后,如果没有后续动作,这个连接就处于空闲状态。也就是使用"show processlist"命令,查看到的”Sleep“ 状态。
如果这个连接很长时间没有操作,连接器就会断开它。这个断开时间是由”wait_timeout“ 参数决定的,默认是8小时。
如果连接被断开之后,客户端再次发送请求,就会收到一个错误提醒:Lost connection to MySQL server during query。这时如果想要继续请求,就需要重连了。
和数据库建立连接的过程比较复杂,所有在使用过程中要尽量减少建立连接的动作,尽量使用长连接。
全部使用长连接之后,可能会带来MySQL占用内存上涨很快的问题。这是因为MySQL在执行过程中使用的内存是在连接对象中管理的,这些内存在连接断开的时候才被释放。如果有很多个长连接一直占用着内存不释放,可能导致内存占用过大,被系统强行杀掉(OOM),从而导致MySQL重启。
解决这个问题,有两种方案:
1 定期断开长连接。在一段时间或者执行一个占用内存的大查询之后,就断开连接,需要时再重连。
2 在MySQL 5.7或之后的版本上,可以通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完成时的状态。
参考资料: 极客时间 《MySQL实战45讲》




