配置文件路径搞错,服务启动不了
很多人在装完MySQL后,改配置第一件事就是找my.cnf或my.ini。Linux下通常在/etc/my.cnf或/etc/mysql/my.cnf,Windows则在安装目录下的my.ini。但如果装的是某些发行版(比如用Homebrew装的macOS环境),配置文件可能压根没生成,得自己创建。
遇到服务起不来,先看错误日志。命令行执行sudo mysqld --verbose --help,它会告诉你当前读取的是哪个配置文件路径。别急着乱改,确认清楚再下手。
端口被占用,连不上数据库
默认3306端口如果被其他程序占了,MySQL就启动失败。比如本地跑了两个MySQL实例,或者Docker容器占了端口,都会出问题。
查一下端口占用情况:
netstat -an | grep 3306或者Windows上用:
netstat -ano | findstr :3306看到LISTENING但连不上?可能是防火墙拦了。开发机可以先关防火墙试试,生产环境记得加规则放行。
字符集乱码,中文存不进去
刚配好的MySQL,一插中文数据变成问号或乱码,八成是字符集没设对。重点改配置文件里的这几项:
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = true改完重启服务。进库执行SHOW VARIABLES LIKE 'char%';,看看是不是全变成utf8mb4了。注意别用utf8,那是残缺版,只支持3字节,微信表情存不了。
权限配置不当,远程连不上
本地能连,换台机器就连不上?默认MySQL只绑定了127.0.0.1。打开my.cnf,找到bind-address:
bind-address = 127.0.0.1改成0.0.0.0允许所有IP连接,或者指定内网IP。改完还不够,用户权限也得开。
登录MySQL,执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码';
FLUSH PRIVILEGES;注意:生产环境别用root@%,按最小权限分配用户。
内存配置不合理,服务器卡死
小内存机器(比如1G)跑MySQL,默认配置直接把swap打满。关键调这几个参数:
[mysqld]
innodb_buffer_pool_size = 128M
key_buffer_size = 16M
max_connections = 50
query_cache_size = 16M别照搬网上的“高性能配置”,那都是给32G内存准备的。自己机器多少资源,就配多少量。可以用mysqltuner.pl脚本辅助分析。
数据目录迁移后启动失败
磁盘不够了想把data移到/home/mysql_data,改完datadir启动报错?除了改配置文件,还得注意权限问题。
比如Ubuntu下MySQL运行用户是mysql,你把数据拷过去是root属主,它读不了。得改回来:
chown -R mysql:mysql /home/mysql_data还有SELinux开着的CentOS,移动目录会被安全策略拦住,得重打标签或临时关闭SELinux验证是否为此导致。
版本混用引发兼容问题
开发用MySQL 8.0,测试环境是5.7,结果GROUP BY语句在5.7报错。不同版本SQL模式不一样,尤其是8.0默认开启严格模式和NO_AUTO_CREATE_USER。
建议团队统一版本,Docker是个好办法。启动时指定版本:
docker run -d -p 3306:3306 --name mysql-dev \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0避免“我本地好好的”这种经典问题。