docker中运行的MySQL
本地链接秒连,远程连接慢,经常完全卡死
经研究发现是因为MySQL的dns导致
MySQL如何使用DNS
当一个新线程连接到mysqld时,mysqld将产生一个新线程来处理请求。此线程将首先检查主机名是否在主机名缓存中。否则线程将调用gethostbyaddr\u r()和gethostbyname\u r()来解析主机名。
如果操作系统不支持上述线程安全调用,线程将锁定一个互斥锁,并改为调用gethostbyaddr()和gethostbyname()。请注意,在这种情况下,在第一个线程准备就绪之前,没有其他线程可以解析主机名缓存中没有的其他主机名。
您可以通过使用–skip name resolve启动mysqld来禁用DNS主机查找。在这种情况下,您只能在MySQL特权表中使用IP名称。
如果您有一个非常慢的DNS和许多主机,您可以通过使用–skip name resolve禁用DNS lookop或通过增加主机缓存大小define(默认值:128)并重新编译mysqld来获得更高的性能。
解决方法
1
在配置文件中加入skip-name-resolve
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
skip-name-resolve
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
然后重启容器 docker restart mysql
2 启动命令中使用--skip-name-resolve
docker run --name mysql --skip-name-resolve