MySQL装好了,但启动报错、连不上、乱码、性能差,十有八九是my.ini没配明白。这个藏在MySQL安装目录里的文本文件,决定了服务器用什么字符集存数据、允许多少人同时连、能吃掉多少内存、出问题时把日志写在哪儿。网上教程一大堆,但多是“照着抄就行”,没人讲清楚每项参数到底在干嘛,导致不少人改完反而把数据库搞挂。这篇文章就从怎么找到文件、每个配置项背后的原理,到一份可以直接抄的完整配置,再到常见报错的排查思路,把my.ini彻底聊透。
1. 内容整体设计与思路拆解
1.1 为什么所有问题都指向my.ini
先搞清楚一件事:MySQL在Windows上跑的时候,很多“莫名其妙”的问题,根源都在my.ini。
比如你明明设了utf8mb4,插入中文还是乱码;本地测试一切正常,一重启服务就连接失败;数据库数据一多,查询突然慢得离谱;或者MySQL进程直接消失,Windows事件查看器里只有一条“MySQL服务意外停止”。这些问题单独看各有各的排查方向,但最终都会汇聚到一个共同点——MySQL在启动时读的配置文件没有设置正确。
MySQL的架构决定了它启动时会按固定顺序搜索配置文件。Windows平台上,搜索顺序大致是:
C:\Windows\my.ini或C:\Windows\my.cnf(全局配置)C:\my.ini或C:\my.cnf(系统盘根目录)- MySQL安装目录下的
my.ini(比如D:\mysql-8.0.40-winx64\my.ini) %APPDATA%\MySQL\.mylogin.cnf(登录路径配置,一般不涉及服务器参数)
这个顺序很关键。如果你机器上恰好存在多个my.ini,MySQL会按顺序读取,后面的配置会覆盖前面的同名配置项。很多时候你改了安装目录下的my.ini,但系统盘根目录还躺着一个旧的,MySQL实际加载的是那个旧的,你改了半天自然没效果。排查这类问题,第一步就是确认到底加载了哪个文件。
1.2 一个配置文件管着MySQL的“性格”
把my.ini理解成MySQL的“性格配置文件”最准确。它管三件事:
- 活不活得下去:basedir告诉你MySQL文件在哪,datadir告诉它数据存哪,port决定它监听哪个端口,这些配错了,服务根本起不来。
- 活得好不好:内存怎么分配、缓存开多大、连接数上限多少,这些直接决定并发量上来时数据库是风轻云淡还是当场崩溃。
- 出事留不留痕:错误日志、慢查询日志、二进制日志,每一项开关决定了出事时你能排查到什么程度。
很多初学者只把my.ini当成一个“照着抄就行”的模板,抄完发现本机配置和别人不一样,或者用了完全不适合自己场景的参数,结果问题越抄越多。
比如sql_mode这一项,MySQL 8.0 默认是STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,这个模式下插入超长字符串会直接报错而不是静默截断。有人觉得“报错太麻烦”,把sql_mode改成空,结果数据被悄悄截断,业务侧查不出原因,数据直接丢失。这就是不了解配置背后的行为逻辑导致的典型事故。
接下来我按“基础配置 → 性能配置 → 日志配置 → 完整配置示例 → 问题排查”五个方面,把my.ini的每一个关键配置项都拆开讲清楚。
2. 核心细节解析与实操要点
2.1 基础配置:先让MySQL能正常跑起来
这部分是my.ini的基石,任何一项错了,MySQL要么起不来,要么数据落在你完全找不到的地方。
basedir(安装目录)
MySQL所有程序文件的根目录。8.0解压版的典型路径是D:\mysql-8.0.40-winx64。注意,Windows路径分隔符用反斜杠,但my.ini里建议统一用正斜杠或双反斜杠:
basedir=D:/mysql-8.0.40-winx64这里踩过的坑是:有人写成basedir="D:\mysql-8.0.40-winx64",带了引号,结果MySQL启动时把引号也算进路径里,直接报错找不到文件。路径里不要加引号,不要加多余空格。
datadir(数据目录)
这是MySQL实际存放数据库文件的目录,也就是今后所有数据库、表、索引文件(.ibd、.frm、.myd等)落盘的地方。这个目录必须在MySQL启动前就创建好,而且用户要有读写权限。
datadir=D:/mysql-data这里有个特别容易踩的坑:如果你改了datadir指向新目录,但新目录是空的,MySQL启动时不会自动帮你初始化系统库(mysql、performance_schema这些)。你需要在修改datadir后手动执行初始化:
mysqld --initialize-insecure--initialize-insecure会生成一个密码为空的root用户,方便首次登录;而--initialize会生成一个随机密码,写在错误日志里。生产环境建议用--initialize,测试环境用--initialize-insecure更省事。
port(端口号)
MySQL默认监听3306端口。如果3306被其他程序占用,或者你希望数据库跑在非标准端口来规避扫描,可以改成其他数值:
port=3306修改端口后,客户端连接都要带上-P参数(注意是大写),不然默认还是连3306。命令行示例:
mysql -h localhost -P 3307 -u root -pJava JDBC连接串里也要显式写端口:
jdbc:mysql://localhost:3307/dbname?useSSL=false&serverTimezone=Asia/Shanghaicharacter-set-server 与 collation-server(字符集与排序规则)
这是中文乱码问题的核心配置。服务端字符集决定MySQL以什么编码存储和传输数据。强烈建议统一使用utf8mb4,这是真正的四字节UTF-8编码,能存下emoji和生僻字:
character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci注意一个常见误区:utf8在MySQL里是“假utf8”,最多支持三字节,像emoji这类四字节字符根本存不了,插入会报错。MySQL 8.0默认已经是utf8mb4了,但5.7及更早版本你要手动设。
collation-server是排序规则。_unicode_ci按Unicode标准排序,准确性高但稍微慢一点;_general_ci更快但对某些语言的排序不准确。中文场景用utf8mb4_unicode_ci完全足够。顺带一提,排序规则还影响查询大小写是否敏感,_ci结尾的都是大小写不敏感的,如果你需要区分大小写,可以用utf8mb4_bin。
default-storage-engine(默认存储引擎)
MySQL 8.0默认就是InnoDB,不需要额外设置。但如果你是从5.6、5.7迁移过来的老配置,可能还写着default-storage-engine=MyISAM,建议改回InnoDB。InnoDB支持事务、行级锁、崩溃恢复,MyISAM这些全都没有,生产环境用MyISAM等于裸奔。这项配置的另一个作用是防止建表时漏写引擎导致用了错误引擎:
default-storage-engine=InnoDB2.2 连接与并发配置:决定能扛住多少人
max_connections(最大连接数)
这个参数决定MySQL最多允许多少个客户端同时连接。设太小,业务稍微一并发就报Too many connections;设太大,MySQL要为每个连接分配内存和文件描述符,系统资源被白白吃掉。
合理值怎么算?先看两个指标:
- 当前使用峰值:
SHOW STATUS LIKE 'Threads_connected'; - 历史最大使用量:
SHOW STATUS LIKE 'Max_used_connections';
经验公式:max_connections设置在Max_used_connections的1.5到2倍左右。如果 Max_used_connections 长期在100附近,设200~300就够。直接设成几千没有必要,因为每个连接无论是否活跃都要占用约数MB的内存(取决于各种缓冲区设置),5000个连接可能就吃掉十几GB内存。
max_connections=500还有一个隐藏参数max_connect_errors,默认值是100。意思是某个IP连续连接失败超过100次,MySQL会直接拒绝该IP的所有连接,报Host is blocked。客户端密码配置错误就可能导致这个情况。如果遇到这个报错,把值调大或者清零:
max_connect_errors=1000清理方法是在MySQL里执行FLUSH HOSTS;。
wait_timeout 与 interactive_timeout(超时时间)
连接建立后如果一直空闲,MySQL会在wait_timeout秒后主动断开。默认值是28800秒(8小时)。对于大多数业务来说太长了,空闲连接占着资源不干活。建议根据业务心跳周期调整:
wait_timeout=600 interactive_timeout=600这两个参数的单位是秒,600秒就是10分钟。如果你的业务有长连接需要保持,可以设到1800或3600。注意:interactive_timeout针对交互式连接(比如命令行客户端),wait_timeout针对非交互连接(比如应用程序连接池),两个最好一起设置。
3. 实操过程与核心环节实现
3.1 性能配置:让InnoDB跑出应有水平
innodb_buffer_pool_size(InnoDB缓冲池大小)
这是MySQL最重要的性能参数,没有之一。它决定InnoDB在内存里缓存多少数据页和索引页。读操作优先走内存,内存没有才去磁盘,所以这个值越大,磁盘I/O越少,查询越快。
经验值:设置为物理内存的60%~75%。比如机器有16GB内存,分配给MySQL约10GB。
innodb_buffer_pool_size=10G但要注意:这是MySQL自己用的内存,不包含操作系统和其他程序的开销。如果机器上还跑着Web服务、监控程序等,别给到75%,50%~60%更安全。MySQL 8.0里这个参数是动态的,可以在运行时调整:
SET GLOBAL innodb_buffer_pool_size = 10 * 1024 * 1024 * 1024;但写在my.ini里最省事,重启后依然生效。
另外MySQL 8.0还支持innodb_buffer_pool_instances,建议在buffer pool超过1GB时设置为多个实例(默认是自动):
innodb_buffer_pool_instances=8多实例可以减少并发访问时的锁竞争,尤其是大内存机器上效果明显。
innodb_log_file_size(redo log大小)
redo log是InnoDB实现崩溃恢复的关键。每次数据修改是先写redo log,再写数据文件。redo log太小,写入频繁触发日志切换和刷盘,性能拉胯;太大,崩溃后恢复时间变长。
MySQL 5.7默认值是48MB,8.0默认值已经是48MB,但官方建议生产环境至少1GB。
innodb_log_file_size=512M按经验来说,如果数据库写入量大,设1GB~2GB很常见。修改这个参数需要正常关闭MySQL、删除旧的redo log文件后才能生效(8.0.30以后不需要删文件,可以自动安全扩展)。
innodb_flush_log_at_trx_commit(日志刷盘策略)
这是数据安全与性能之间的核心权衡参数,有三个可选值:
0:每秒刷一次磁盘,事务提交时不同步刷。性能最快,但MySQL崩溃可能丢最后一秒的事务。1:每个事务提交都刷盘。最安全,但性能最差(尤其是机械硬盘)。2:每个事务提交时写入操作系统缓存,每秒刷一次磁盘。性能折中,操作系统崩溃可能丢数据,MySQL崩溃不丢。
默认值就是1。如果业务能接受崩溃时丢最后一秒数据,追求性能就设2:
innodb_flush_log_at_trx_commit=2我的经验是:高并发写入场景用2,配合NNN架构能解决大部分性能瓶颈;金融级业务必须用1,别拿数据开玩笑。
innodb_file_per_table(每表独立表空间)
这个参数开启后,每张表的数据和索引都存放在独立的.ibd文件里。好处是DROP TABLE或TRUNCATE时直接删文件释放磁盘空间,否则数据只标记为“可复用”但不还给操作系统,导致磁盘空间只涨不跌。8.0默认开启,但5.7及以下需要显式设置:
innodb_file_per_table=ONquery_cache_type(查询缓存)
这里想单独提醒一下:MySQL 8.0已经彻底移除了查询缓存这个功能。如果你是5.7及以下,也建议不要开query_cache。这个机制的失效成本极高,任何对表的更新都会让该表所有查询缓存失效,写入频繁时缓存命中率极低,反而拖累性能。看到网上老教程让你开查询缓存的,可以直接关掉。
3.2 日志配置:出事时不抓瞎
log_error(错误日志)
MySQL运行时的所有错误、警告、启动信息都记录在这个文件里。无论MySQL出了任何问题,第一站永远是看错误日志。
log_error=D:/mysql-logs/error.log注意:日志目录需要提前创建好,MySQL不会自动帮你建目录。日志文件路径里的目录如果不存在,MySQL启动会直接失败。
slow_query_log 与 long_query_time(慢查询日志)
慢查询日志记录执行时间超过阈值的SQL语句,是性能优化的第一手资料。
slow_query_log=ON slow_query_log_file=D:/mysql-logs/slow.log long_query_time=2long_query_time单位是秒,设2秒,意味着超过2秒的查询会被记录。第一次调优时可以从1秒开始,逐渐收敛。注意一个细节:long_query_time的最小值是0,可以精确到微秒,如果你想记录所有未使用索引的查询,还可以加:
log_queries_not_using_indexes=ON这个开关会把没走索引的SQL也记到慢查询日志里,适合找漏加索引的语句,但生产环境会增大日志量,建议只在排查阶段开启。
general_log(通用查询日志)
记录所有到达MySQL的SQL语句,包括成功和失败的。这个日志非常吃磁盘,生产环境不建议长期开启,只有调试阶段临时开一下:
general_log=ON general_log_file=D:/mysql-logs/general.log用完记得关掉。
binlog(二进制日志)
binlog记录所有“可能导致数据改变”的操作(增删改,以及可能影响数据的DDL),用于数据恢复和主从复制。MySQL 8.0默认开启,但如果你只是本机单实例使用,可以考虑关闭来减少磁盘I/O;而一旦涉及主从复制或时间点恢复,必须开启。
server-id=1 log-bin=D:/mysql-logs/mysql-bin binlog_format=ROW expire_logs_days=7各参数含义:
server-id:实例唯一标识,主从复制必须有,单机也要配上,值随意但必须非0。log-bin:binlog文件前缀。binlog_format:ROW模式记录每行变更,比STATEMENT更准,是8.0默认值。expire_logs_days:binlog自动清理天数。生产环境建议设7~15天,太长撑爆磁盘,太短恢复不到更早的时间点。
3.3 完整配置示例:可以直接用的版本
综合以上内容,这里给出一份适合Windows机器、8GB内存、开发/测试环境的完整my.ini配置:
[mysqld] # 基础配置 basedir=D:/mysql-8.0.40-winx64 datadir=D:/mysql-data port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=InnoDB # 连接配置 max_connections=500 max_connect_errors=1000 wait_timeout=600 interactive_timeout=600 # InnoDB性能配置 innodb_buffer_pool_size=4G innodb_buffer_pool_instances=4 innodb_log_file_size=512M innodb_flush_log_at_trx_commit=2 innodb_file_per_table=ON # 日志配置 log_error=D:/mysql-logs/error.log slow_query_log=ON slow_query_log_file=D:/mysql-logs/slow.log long_query_time=2 # binlog配置 server-id=1 log-bin=D:/mysql-logs/mysql-bin binlog_format=ROW expire_logs_days=7 [client] default-character-set=utf8mb4注意[mysqld]和[client]的区别。[mysqld]段是MySQL服务器启动时读取的;[client]段是命令行客户端(mysql.exe)连接时读取的。如果你在命令行里插入中文出现乱码,检查[client]段是否配了default-character-set=utf8mb4,这可能是很多人忽略的一个坑。
以上所有路径的目录都要提前建好,然后以管理员身份打开命令行,执行:
mysqld --defaults-file="D:/mysql-8.0.40-winx64/my.ini" --initialize初始化完成后,安装或启动服务:
mysqld --install MySQL8 net start MySQL8接下来验证配置是否生效,登录MySQL后执行:
SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'max_connections';能查到预期值就说明my.ini生效了。
4. 常见问题与排查技巧实录
4.1 MySQL服务启动失败
现象:net start MySQL8提示服务启动失败,或者服务启动后几秒又自动停止。
排查顺序:
- 打开错误日志
log_error指向的文件,看最后的报错信息。这是最重要的第一步,绝大数问题的答案都在里面。 - 检查datadir目录是否存在且有写入权限。Windows下MySQL服务账户通常是
NETWORK SERVICE,这个账户需要对这个目录有完全控制权限,否则启动即失败。 - 检查basedir路径是否正确。路径里不要有中文、空格。
- 如果datadir里已经有数据但my.ini改了配置,可能是配置项冲突,逐个注释掉对比。
实际案例:有次我遇到MySQL启动失败,错误日志显示Can't start server: Bind on TCP/IP port. Got error: 10048,这是端口被占用。用netstat -ano | findstr 3306查出PID,再在任务管理器里找到对应进程发现是另一个残留的MySQL实例占着3306。杀进程后正常启动,顺手在my.ini里把端口改了更省事。
4.2 本地连接报ERROR 2002 (HY000)类似错误
很多人用mysql -u root -p连接时报:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'这个报错在Windows上不太常见,但如果在类Unix环境或者用某些封装版MySQL时会出现。核心原因是客户端在找socket文件而不是走TCP/IP。解决办法是在连接时显式指定协议和端口:
mysql -u root -p -h 127.0.0.1 -P 3306注意:-h localhost在某些平台会被解释为socket连接,-h 127.0.0.1才会强制走TCP/IP。另外检查MySQL服务是否真的在运行,tasklist | findstr mysqld(Windows)或ps -ef | grep mysqld(Linux)。
4.3 修改了my.ini但配置没生效
现象:改了my.ini里的max_connections,通过SHOW VARIABLES查还是旧值。
原因:有多个my.ini文件,MySQL加载的不是你改的那个。
排查方法:在MySQL里直接查询:
SHOW VARIABLES LIKE 'basedir'; SHOW VARIABLES LIKE 'datadir';查看实际的安装目录和数据目录,然后确认那个目录下有没有my.ini。或者用命令查看MySQL读取配置文件的顺序:
mysqld --verbose --help | findstr "my.ini"在Windows下也可以直接在服务属性里看“可执行文件的路径”,如果带有--defaults-file="xxx"参数,则说明MySQL明确指定了配置文件,其他位置的my.ini都会被忽略。
还有一个低级错误:改完my.ini忘记重启服务。my.ini里的绝大多数配置项都是启动时读一次,运行中修改不生效。修改完必须net stop MySQL8 && net start MySQL8。
4.4 中文乱码问题
现象:插入中文后查询显示???或者乱码,命令行客户端显示乱码。
排查方向:
- 服务端字符集:
SHOW VARIABLES LIKE 'character_set_server';,应该是utf8mb4。 - 客户端字符集:
SHOW VARIABLES LIKE 'character_set_client';,也应该是utf8mb4。 - 客户端连接时的字符集:
status;或SHOW VARIABLES LIKE 'character_set_connection';。 - 数据库/表/字段字符集:
SHOW CREATE TABLE 表名;
乱码通常是三层字符集不一致。my.ini里配好[mysqld]的character-set-server=utf8mb4和[client]的default-character-set=utf8mb4能解决80%的情况。剩下20%在于建库建表时指定:
CREATE DATABASE `appdb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `users` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;还有连接串也要显式指定字符集:
jdbc:mysql://localhost:3306/appdb?useUnicode=true&characterEncoding=utf8mb4如果已经建好的表字符集不对,可以批量转换:
ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;4.5 内存占用过高或服务器卡死
现象:MySQL服务占内存持续走高,系统变得卡顿。
原因:innodb_buffer_pool_size设太大,或者max_connections设太高,多个连接叠加导致内存溢出。
排查方法:通过SHOW GLOBAL STATUS LIKE 'Threads_connected';看当前连接数,通过操作系统的资源监视器看mysqld进程内存占用。如果内存占用远高于预期,检查是否有大量长连接没有释放,SHOW PROCESSLIST;查看Sleep状态的连接数量,它们会持续占用内存。
合理做法:从低到高调整innodb_buffer_pool_size,观察一段时间。纯粹追求大buffer但不考虑系统其他进程需求,服务器会频繁触发内存交换,性能反而更差。
4.6 忘记root密码
场景:装完MySQL后忘了密码,或者初始化时用了--initialize-insecure结果后续改了密码又忘了。
方法:在my.ini的[mysqld]段临时加上skip-grant-tables,重启MySQL后无需密码就能进入,然后修改root密码:
[mysqld] skip-grant-tables重启后:
mysql -u root -p(无密码直接回车)
USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; FLUSH PRIVILEGES;改完密码后,务必把my.ini里的skip-grant-tables注释掉再重启。这个参数等于让MySQL放弃身份验证,任何人都能免密进入,绝不能在没做权限隔离的环境里长期开启。
4.7 主从复制或远程连接报SSL相关错误
MySQL 8.0默认开启了SSL连接,但很多客户端版本不兼容,常见报错:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)或者SSL握手失败。排查技巧:
- 在JDBC连接串里显式加上
useSSL=false或sslMode=DISABLED(8.0以后的驱动推荐用sslMode)。如果是开发环境,直接关闭SSL:
jdbc:mysql://localhost:3306/appdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai注意allowPublicKeyRetrieval=true也很关键,MySQL 8.0的caching_sha2_password插件要求客户端必须显式允许获取服务器的RSA公钥,否则报错。
- 如果是远程连接的客户端报SSL错误,可以在MySQL里查看:
SHOW VARIABLES LIKE '%ssl%';如果确认不需要SSL,可以在my.ini里关闭:
skip_ssl但生产环境不建议关,升级驱动版本才是正道。
5. 实操心得:配置my.ini的正确策略
5.1 先小步验证,再逐步上量
我最开始接手公司数据库时,看到前辈留下的配置里innodb_buffer_pool_size=32G,机器总内存才64G,而系统里还跑着两个应用服务。结果每次一到大促,整台服务器内存直接打满,操作系统开始疯狂swap,数据库响应时间飙到十几秒。
如果你不确定当前负载需要多大内存,先别一步到位。用默认值跑一周,记录MySQL的Buffer pool hit rate:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests'; SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';命中率 =Innodb_buffer_pool_read_requests / (Innodb_buffer_pool_read_requests + Innodb_buffer_pool_reads),如果长期低于95%,说明buffer pool偏小,逐步加大,直到命中率达到99%以上。这个方式比拍脑袋定值科学得多。
5.2 一次只改一个参数
配置my.ini最忌讳的就是一次改一堆参数,然后出了问题不知道是哪一项引起的。正确做法是:一次只改一个关键参数,改完重启、跑测试、观察监控,确认稳定后再改下一个。
有一次我尝试同时调了大buffer pool、改小 redo log、打开慢查询日志、还把innodb_flush_log_at_trx_commit从1改成2,结果系统出现间歇性提交延迟。排查了半天,最后把所有修改逐个回退才发现是redo log太小导致频繁日志切换。这个过程本来可以通过“一次一项”轻松定位,非要贪快就付出了几小时的排查代价。
5.3 配置文件的备份与版本管理
my.ini是运维级的配置文件,建议修改前保存一份备份,在文件顶部写明修改时间和原因:
# 2025-01-15 修改:innodb_buffer_pool_size 从2G调至4G,解决高峰期查询慢 # 2025-01-20 新增:slow_query_log 开启,配合调优这样半年后回头看,能搞清楚每项变动的来龙去脉。团队协作时,配置文件放Git里管理,改什么都有diff记录,出了异常随时能查是谁改的。
5.4 动态参数能不改文件就不改文件
MySQL很多配置项是支持运行时动态修改的,比如max_connections、innodb_buffer_pool_size、slow_query_log。这类参数先用SQL在线调,验证没问题后再同步到my.ini,可以避免频繁重启带来的服务中断。
SET GLOBAL max_connections = 1000; SET GLOBAL innodb_buffer_pool_size = 8 * 1024 * 1024 * 1024;但注意:SET GLOBAL修改的值在MySQL重启后会失效,只有写进my.ini才能持久化。所以动态修改只是应急手段,最终要落到文件里。
5.5 不要迷信“默认配置”
MySQL默认配置考虑的是“在绝大多数机器上都能启动”,而不是“在你的业务负载下最优”。默认参数对开发机够用,但对生产环境完全不够。比如8.0默认的innodb_buffer_pool_size是128MB,这在2025年随便一台服务器都有256GB内存的时代,简直是浪费硬件。
每台服务器上的内存、CPU、磁盘类型(SSD还是HDD)、业务负载特点(读多写少还是写多读少)都不一样,没有任何一组配置能通吃所有场景。花时间了解每个参数背后的机制,再结合自己的业务压测,才能配出真正适合自己的my.ini。
5.6 最后再分享一个小技巧
排查配置问题时,可以用下面的SQL快速浏览当前实例所有非默认配置,一眼找出可疑项:
SHOW VARIABLES WHERE Variable_name IN ( 'basedir', 'datadir', 'port', 'character_set_server', 'collation_server', 'max_connections', 'innodb_buffer_pool_size', 'innodb_log_file_size', 'slow_query_log', 'long_query_time', 'log_error' );把查询结果和my.ini里的值比对,如果发现某个参数在my.ini里写了但运行值和文件里不一致,优先怀疑是不是加载了别的配置文件,或者服务没重启。
最后用我个人经验来收个尾:与其遇到问题后再疯狂翻文档,不如装好MySQL之后花半小时把my.ini从头到尾理一遍,搞清楚每一个参数在本机是什么意思、配了会有什么影响。这个前期投入的回报率极高——因为后续你遇到的90%的数据库问题,最终都要回到配置文件上找答案。