MySQL高阶篇之配置文件详解与各类客户端工具
本文系统梳理服务端配置项与系统变量的对应关系、客户端公共选项、配置文件的加载顺序与优先级、配置文件的编写方法以及 mysqlcheck、mysqldump、mysqlimport、mysqladmin、mysqlshow、mysqldumpslow、mysqlbinlog、mysqlslap 八大客户端工具的用法与经典实例。一、服务端配置项与系统变量1.1 基本对应关系MySQL 的每一个配置项都对应一个系统变量启动选项--xxx中的连字符写法对应系统变量xxx的下划线写法。例如--character-set-server ──► character_set_server --default-storage-engine ──► default_storage_engine在配置文件中修改相当于在服务器启动时直接设置 GLOBAL 变量之后每个会话建立连接时会从 GLOBAL 变量拷贝出自己的 SESSION 副本这就是改配置文件能影响所有新连接的原理。1.2 字符集与校对规则启动选项系统变量默认值--character-set-servercharacter_set_serverutf8mb4--collation-servercollation_serverutf8mb4_0900_ai_ci1.3 数据目录与存储引擎启动选项系统变量说明--datadirdatadir数据文件目录Ubuntu 默认/var/lib/mysql--default-storage-enginedefault_storage_engine表默认引擎默认 InnoDB1.4 日志相关配置启动选项系统变量说明--log-outputlog_output日志输出目的地FILE/TABLE/NONE默认 FILE--general-loggeneral_log一般查询日志开关默认关闭测试时使用--general-log-filegeneral_log_file一般日志文件名默认host_name.log--slow-query-logslow_query_log慢查询日志开关0/1 或 OFF/ON--slow-query-log-fileslow_query_log_file慢日志文件名默认host_name-slow.log--long-query-timelong_query_time慢查询阈值秒默认10--log-errorlog_error错误日志目标控制台为stderr否则为文件名--log-binN/Abinlog 基本名1.5 连接与表缓存启动选项系统变量说明--server-idserver_id服务器 ID默认 1主从必须唯一--max-connectionsmax_connections最大并发连接数--table-open-cachetable_open_cache所有线程可打开的表数量--max-connect-errorsmax_connect_errors主机连续失败达到该值后被阻止连接--open-files-limitopen_files_limitmysqld 可用的文件描述符数量--max-allowed-packetmax_allowed_packet单个数据包最大值默认 64MB1.6 InnoDB 相关启动选项系统变量说明--innodb-buffer-pool-sizeinnodb_buffer_pool_size缓冲池大小默认 128MB--innodb-log-buffer-sizeinnodb_log_buffer_size日志缓冲区默认 16MB--innodb-redo-log-capacityinnodb_redo_log_capacity重做日志占用磁盘空间--innodb-thread-concurrencyinnodb_thread_concurrencyInnoDB 内最大线程数默认 0不限制--innodb-autoextend-incrementinnodb_autoextend_increment表空间自动扩展增量MB默认 641.7 其他常用变量启动选项系统变量说明--flush-timeflush_time非 0 时每隔该秒数关闭所有表并刷盘--join-buffer-sizejoin_buffer_size无索引 JOIN 的最小缓冲默认 256KB--sort-buffer-sizesort_buffer_size每个需排序会话的缓冲大小--binlog-row-event-max-sizebinlog_row_event_max_sizeROW 事件最大值须为 256 的倍数默认 8192 字节1.8 动态变量与静态变量动态变量可在运行时用SET GLOBAL/SESSION修改无需重启静态变量只能在启动时设置如datadir。完整动态变量列表见官方文档[https://dev.mysql.com/doc/refman/8.0/en/dynamic-system-variables.html](https://dev.mysql.com/doc/refman/8.0/en/dynamic-system-variables.html)。二、客户端公共选项MySQL 客户端程序包括mysql、mysqlcheck、mysqldump、mysqlimport、mysqladmin、mysqlshow、mysqldumpslow、mysqlbinlog、mysqlslap等。2.1 连接选项选项说明--host / -h服务器主机地址--port / -P服务器端口号--user / -u连接用户名--password / -p密码-p的特殊规则如果在命令行直接写密码必须紧跟选项、中间不能有空格mysql -uroot -p123456 # 正确 mysql -uroot -p 123456 # 此时 123456 会被当成数据库名不写密码时服务器会返回报文要求你输入密码。2.2 其他常用选项选项说明--defaults-file只读取指定配置文件必须是第一个选项客户端/服务器程序通用--database / -D指定要使用的数据库--compress / -C压缩客户端与服务器之间的传输--reconnect连接断开后自动重连--quick / -q不缓存结果收到一行打印一行--protocol传输协议默认 TCP--delimiter指定语句分隔符--execute / -e执行 SQL 后退出--version / -V显示版本并退出--help / -?显示帮助并退出规律长选项用--短选项用-。2.3 实用小技巧命令行中第一个不带-的值会被解析为数据库名可用来替代--databasemysql -uroot -p test_db # 等价于 mysql -uroot -p -D test_db三、配置文件加载顺序与优先级3.1 Linux/Unix 读取顺序顺序文件适用1/etc/my.cnf全局2/etc/mysql/my.cnf全局3$MYSQL_HOME/my.cnf服务器$MYSQL_HOME 是你系统的环境变量4--defaults-extra-file指定文件额外这个需要你自己在命令行指定5~/.my.cnf当前用户6~/.mylogin.cnf客户端mysql_config_editor 生成加密7DATADIR/mysqld-auto.cnf服务器8.0JSON 格式持久化变量3.2 优先级原理越早读取优先级越低越晚读取优先级越高——这就好比对同一个变量不断赋值只有最后一次赋值生效。整体优先级从低到高环境变量 → 选项文件按读取顺序→ mysqld-auto.cnf → 命令行选项3.3 控制读取的三个命令行选项选项作用--no-defaults不读取任何选项文件--defaults-filepath只读取指定文件--defaults-extra-filepath读完标准文件后再读该文件3.4 读取时机服务器启动 mysqld 时读取用于设置 GLOBAL 变量客户端建立连接时读取用于设置会话选项。文件名不一定固定重点是.cnf后缀Windows 下为.ini。四、配置文件编写4.1 选项组选项组作用范围[mysqld]只对 mysqld 服务器生效[client]对所有客户端程序生效[mysql]只对 mysql 客户端生效[mysqldump]等只对对应工具生效注释符号#和;都可以。4.2 服务端配置实例编辑/etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] server-id 5201314重启生效systemctl restart mysql mysql -uroot -p -e SELECT server_id;修改前记得备份原始文件。4.3 客户端配置实例编辑/etc/mysql/conf.d/mysql.cnf[client] host 127.0.0.1 port 3306 user root password # 留空则连接时提示输入但是我们在命令行中就可以不写 -p 了 [mysql] port 3307 # 更具体的组覆盖 [client]最终 mysql 客户端使用3307在同文件中后出现。4.4 include 与 includedir# 包含单个文件 !include /home/mydir/myop.cnf # 包含目录下所有 .cnf 文件不递归穿透子目录 !includedir /home/mydirUbuntu 上/etc/mysql/mysql.cnf的内容正是!includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/这解释了为什么配置放在mysql.conf.d目录里也能被加载。4.5 mysqld-auto.cnf 与 SET PERSIST8.0 支持把变量持久化到mysqld-auto.cnfSET PERSIST max_connections 500; SET PERSIST_ONLY xxx; // 只写入文件运行时不立即生效该文件为 JSON 格式由服务器自动维护不要手动编辑。五、mysqlcheck表维护工具5.1 作用对表执行四种维护操作作用支持引擎分析查看关键字分布辅助执行计划InnoDB / MyISAM / NDB检查检查完整性与损坏InnoDB / MyISAM / ARCHIVE / CSV优化回收空间、减少碎片InnoDB / MyISAM / ARCHIVE修复修复损坏表MyISAM / ARCHIVE / CSV5.2 注意事项服务器必须在运行执行期间表会被锁定不支持的引擎会报错修复前先备份。5.3 经典实例mysqlcheck -uroot -p test_db t_user # 检查单表 mysqlcheck -uroot -p test_db # 检查整库 mysqlcheck -uroot -p --all-databases # 检查所有库 mysqlcheck -uroot -p -a test_db t_user # 分析 mysqlcheck -uroot -p -o test_db t_user # 优化 mysqlcheck -uroot -p -r test_db t_user # 修复MyISAM mysqlcheck -uroot -p --all-databases --auto-repair # 检查并自动修复 mysqlcheck -uroot -p -f --all-databases # 出错也继续⚠️InnoDB 不支持-r修复会提示The storage engine for the table doesnt support repair。小技巧把程序复制/软链接为mysqlrepair、mysqlanalyze、mysqloptimize默认行为随之变为修复、分析、优化。六、mysqldump逻辑备份工具6.1 作用执行逻辑备份生成包含建库建表语句和数据的 SQL 文件也可生成 CSV、XML。6.2 权限要求操作所需权限转储表SELECT转储视图SHOW VIEW转储触发器TRIGGER未用--single-transactionLOCK TABLES未用--no-tablespacesPROCESS参考MySQL进阶篇之备份下半篇-CSDN博客七、mysqlimport文本数据导入工具7.1 作用LOAD DATA INFILE的命令行封装文件名去掉扩展名后必须等于表名t_user.csv→ 导入t_user。7.2 经典实例# 导入 CSV mysqlimport -uroot -p \ --fields-terminated-by, \ --fields-enclosed-by \ --lines-terminated-by\n \ test_db /var/lib/mysql-files/t_user.csv # 冲突时忽略 / 替换 mysqlimport -uroot -p --ignore test_db /var/lib/mysql-files/t_user.csv mysqlimport -uroot -p --replace test_db /var/lib/mysql-files/t_user.csv # 跳过表头 mysqlimport -uroot -p --ignore-lines1 test_db /var/lib/mysql-files/t_user.csv八、mysqladmin服务器管理工具8.1 常用命令命令作用ping检查服务器是否存活version版本、运行时长、线程数status简短状态processlist活动线程列表create/drop db建/删数据库password修改密码shutdown关闭服务器reload重新加载授权表flush-logs刷新日志flush-hosts刷新主机缓存kill终止线程extended-status状态变量start-replica/stop-replica8.0.26 启停复制8.2 经典实例mysqladmin -uroot -p ping mysqladmin -uroot -p version mysqladmin -uroot -p status mysqladmin -uroot -p -i 2 status # 每 2 秒刷新 mysqladmin -uroot -p processlist mysqladmin -uroot -p create test_db mysqladmin -uroot -p drop test_db mysqladmin -uroot -p password newpass mysqladmin -uroot -p shutdown mysqladmin -uroot -p reload mysqladmin -uroot -p flush-logs mysqladmin -uroot -p flush-hosts mysqladmin -uroot -p kill 12,15 mysqladmin -uroot -p extended-status mysqladmin -uroot -p start-replica mysqladmin -uroot -p stop-replica密码含空格时用双引号包裹kill的多个 ID 用逗号连接、不能有空格。九、mysqlshow库表列信息工具9.1 作用为SHOW语句提供命令行接口直接写 SQL 也能获得相同结果。9.2 经典实例mysqlshow -uroot -p # 列出所有库 mysqlshow -uroot -p test_db # 列出库中表 mysqlshow -uroot -p test_db t_user # 列出表的列 mysqlshow -uroot -p -k test_db t_user # 显示索引 mysqlshow -uroot -p --status test_db # 显示表状态 mysqlshow -uroot -p test_db user% # 通配符支持通配符*、?、%、_只显示当前权限可访问的对象。十、mysqldumpslow慢查询日志汇总工具10.1 作用解析慢查询日志并按相似 SQL 分组汇总默认把数字替换为N、字符串替换为S。10.2 输出解读Count: 3 Time2.53s (7s) Lock0.00s (0s) Rows10.0 (30) ↑次数 ↑单次/总耗时 ↑锁等待 ↑单次/总行数10.3 经典实例# 按平均查询时间排序前 10 条 mysqldumpslow -s at -t 10 /var/lib/mysql/host-slow.log # 按出现次数 / 返回行数排序 mysqldumpslow -s c -t 10 /var/lib/mysql/host-slow.log mysqldumpslow -s r -t 10 /var/lib/mysql/host-slow.log # 只看包含 t_user 的 mysqldumpslow -g t_user /var/lib/mysql/host-slow.log # 显示真实值 mysqldumpslow -a /var/lib/mysql/host-slow.log排序参数t/at总/平均时间默认、l/al锁时间、r/ar行数、c次数。十一、mysqlbinlog二进制日志处理工具11.1 作用以文本格式显示 binlog 内容也可用于重放PITR。binlog 默认存于数据目录Linux/var/lib/mysql文件名以.00000n递增。11.2 经典实例# 查看文本 mysqlbinlog /var/lib/mysql/binlog.000001 # ROW 格式加 -v 显示伪 SQL-vv 更详细 mysqlbinlog -v /var/lib/mysql/binlog.000001 mysqlbinlog -vv /var/lib/mysql/binlog.000001 # 解码 ROW 为可读 SQL mysqlbinlog --base64-outputDECODE-ROWS -v /var/lib/mysql/binlog.000001 # 按时间段过滤 mysqlbinlog --start-datetime2024-01-01 10:00:00 \ --stop-datetime2024-01-01 11:00:00 \ /var/lib/mysql/binlog.000001 # 按位置过滤 mysqlbinlog --start-position157 --stop-position1000 \ /var/lib/mysql/binlog.000001 # 只看某个库 mysqlbinlog --databasetest_db /var/lib/mysql/binlog.000001 # 重放多个 binlogPITR mysqlbinlog binlog.000001 binlog.000002 | mysql -uroot -p # 远程读取 mysqlbinlog -R -h 192.168.1.100 -uroot -p binlog.000001⚠️ PITR 时必须用--stop-position/--stop-datetime停在误操作之前否则会把误操作也重放。十二、mysqlslap负载仿真工具12.1 作用模拟多个客户端并发访问服务器报告各阶段耗时用于性能诊断。12.2 三个阶段创建数据单连接建库建表运行负载多并发查询清理单连接删库--no-drop可保留。12.3 经典实例# 全自动100 并发1000 次查询 mysqlslap -uroot -p --auto-generate-sql \ --concurrency100 --number-of-queries1000 # 简写100 并发跑 5 轮 mysqlslap -uroot -p -a -c 100 -i 5 # 对比引擎 mysqlslap -uroot -p -a --engineinnodb,myisam --concurrency50 # 自定义查询 mysqlslap -uroot -p --concurrency50 --iterations10 \ --querySELECT * FROM t_user WHERE id1 \ --create-schematest_db # 使用 SQL 文件 mysqlslap -uroot -p --concurrency50 --iterations10 \ --createcreate.sql --queryquery.sql --delimiter; # 混合读写每 10 条提交 mysqlslap -uroot -p -a -c 100 --number-of-queries10000 --commit10 # 自动生成表结构2 INT 列、3 VARCHAR 列1000 行 mysqlslap -uroot -p -a -c 50 \ --number-int-cols2 --number-char-cols3 \ --auto-generate-sql-write-number1000 # 输出 CSV mysqlslap -uroot -p -a -c 50,100 -i 3 --csvresult.csv注意SQL 文件默认每行一条语句多行语句需用--delimiter指定分隔符文件中不能包含注释。