问题描述:
内网Docker中安装了Mysql,在使用连接工具进行连接时,发现连接很慢(十几秒左右)。
原因分析:
查阅相关资料得知,由于mysql对连接的客户端进行DNS反向解析。
当一个新线程连接到mysqld时,mysqld将产生一个新线程来处理请求。此线程将首先检查主机名是否在主机名缓存中。否则线程将调用gethostbyaddr\ur()和gethostbyname\u r()来解析主机名。
如果操作系统不支持上述线程安全调用,线程将锁定一个互斥锁,并改为调用gethostbyaddr()和gethostbyname()。请注意,在这种情况下,在第一个线程准备就绪之前,没有其他线程可以解析主机名缓存中没有的其他主机名。
您可以通过使用–skip name resolve启动mysqld来禁用DNS主机查找。在这种情况下,您只能在MySQL特权表中使用IP名称。
如果您有一个非常慢的DNS和许多主机,您可以通过使用–skip name resolve禁用DNS lookop或通过增加主机缓存大小define(默认值:128)并重新编译mysqld来获得更高的性能。
这里我推断,由于docker镜像安装时安装的是最小容器,因此缺少DNS解析等某些模块,所以连接时会出现连接超慢的问题。
解决办法
修改mysql容器下的mysql配置,添加skip-name-resolve这一行配置
/etc/mysql/my.cnf
[mysqld]
skip-name-resolve
如果没有挂载文件夹,再容器内又不能通过vi工具修改配置,可先创建my.cnf文件,再复制进容器
docker cp /root/mysql/my.cnf mysql-server:/etc/mysql/my.cnf
/root/mysql/my.cnf为自己的文件路径
mysql-server:/etc/mysql/my.cnf为容器名和配置文件路径