这里说的MySQL服务就是mysqld,MySQL服务器.
MySQL有很多选项和系统变量可以在配置文件配置,服务启动的时候会读取这个配置文件.这篇文章就主要将配置文件.
服务器配置和默认值
可以通过这个命令来查看mysqld所有的选项和系统变量
mysqld --verbose --help
内容太多这里就不截图了.
查看服务器在运行时系统变量的值,连接到MySQL并执行以下语句:
show variables;
如果觉得打印的不好看,可以使用 :show variables/G
内容也太多了,也不截图了.
当然如果觉得内容太多,可以用like进行过滤.
show variables like '%tmp%';

查看服务器在运行时的一些统计和状态指示器,连接到MySQL并执行以下语句:
show status;
这个也可以用like
系统变量和状态变量也可以用mysqladmin来查看
mysqladmin variables;
mysqladmin extended-status
这里就不截图了.
关于服务器的选项、系统变量、状态变量参考以下官网列表:
https://dev.mysql.com/doc/refman/8.0/en/server-option-variable-reference.html
系统变量和状态变量作用域分为:Global(全局), Session (当前会话或连接), 或两者都支持
系统变量和选项
为了保证每次启动的时候参数都是一样的,所以最好使用配置文件.
mysqld从选项文件(配置文件)里的[mysqld]节点读取内容.
还有就是部分系统变量可以通过set动态设置.
还有一点就是选项是没办法在运行时修改的.这也就能区分选项和系统变量,选项是在启动或者连接时设置,而系统变量可以通过set动态设置.
选项是 "配置指令",系统变量是 "运行参数";指令的作用是初始化参数,参数的作用是控制运行 。
还有就是有的选项和系统变量在配置文件中的写法是一样的,可以说是一种映射关系.就拿最大连接数来说,选项的值会赋值给系统变量.
上面我给了一个网站,就可以通过这个网站查看,打开后就是这样的:


这个是说明就可通过这个来查.
使用系统变量
上面说了,系统变量大部分是动态的,可以通过set进行设置(在客户端设置),举个例子:
set Global max_connection = 1000;
set Global @@.max.connection=1000;
注:这两者是等价的,但是推荐第一种写法
将全局系统变量持久化到 mysqld-auto.cnf 文件(同时设置运行时值):
mysql> SET PERSIST max_connections = 1000;
mysql> SET @@PERSIST.max_connections = 1000;
这个文件在数据目录里,数据目录的路径为:/var/lib/mysql,在这个里面可以查看.

如果执行了上面的命令,就会有这样的内容.
删除持久化的系统变量可以使用语句:
RESET PERSIST IF EXISTS system_var_name;

这样就删除了.
有一点要注意的是,要注意作用域,Global是全局生效的,Session是仅仅针对于当前会话.
选项和系统变量就说到这里,使用请参考官方文档.
MySQL数据目录
这个是重点,数据库中的数据都在这里面,包括日志,服务器进程ID文件,持久化全局系统变量的文件也在这里面,目录是:/var/lib/mysql.
日志简介:
日志类型有:一般查询日志,慢查询日志,错误日志,中继日志,二进制日志等,这里主要介绍这几种日志.
1.一般情况下,windows下默认开启错误日志,其他日志不开启,linux下默认开启错误日志和二进制日志.
2.在服务器运行期间可以控制一般查询和慢查询日志的禁用与开启,也可以更改日志文件名
3.一般查询日志和慢查询日志记录可以写入日志表、日志文件或两者同时写入
4.默认情况下,所有启用的日志将写入数据目录,可以通过刷新日志强制服务器关闭并重新打开日志文件
5.通过FLUSH LOGS 语句刷新日志来强制服务器关闭并重新打开日志文件,也可以使mysqladmin 的 flush-logs 或 refresh 参数,或mysqldump 的 --flush-logs 或 --master-data 选项
6.中继日志仅用于主从复制过程中的从服务器。
日志日志可以输出在文件中,或者表中,也可以两者都写入,开启这些日志必然会降低服务器的性能.
可以通过下面两个配置来开启慢日志查询和文件输出位置:

一般查询也可以配置,我上面的截图是通过官网截的图,一般日志的开启也可以在这上面查看到,上面我也给出了网站.
就是日志文件默认的输出位置为MySQL的数据目录,这里可以指定一个创建的目录,方便查询日志
还有就是日志的输出方式,上面说了可以是表,文件,两者,这里可以在服务器运行的时候通过set手动修改 命令是:
set Global log_output file
在MySQL中0表示关闭,1表示开启,用这个控制日志的开启.
既然可以写入文件中,为什么还要写到表中呢?
当然写入表自然有它的优点:
1.可以通过 SQL 语句的条件查询过滤日志内容,从而选择满足特定条件的日志记录。比如,某个客户端的日志;
2.可以通过客户端程序连接到服务器并查询表中的日志信息,无需登录服务器主机访问文件系统。
日志记录具有标准格式,可看日志表的结构,可以使用以下语句:
SHOW CREATE TABLE mysql.general_log; # 一般查询日志
SHOW CREATE TABLE mysql.slow_log; # 慢查询日志
一般查询日志
一般查询日志开启后记录连接和断开信息,和每个从客户端接收到的sql信息.我来开启一般查询日志,看一下数据目录.

这样就开启了,当然也可以使用set开启.但是有一点要注意的是,如果是配置文件的方式要重启服务器.set不需要.
我执行了select * 操作 就有了这个文件,在数据目录下
这样就一般查询日志的开启
再来看一下文件内容

这些都是你的操作行为,第一个是时间,第二个是服务器id,第三个是操作类型,第四个是具体的语句.
慢查询日志
首先说一下,在开启慢日志情况下会向慢日志中写内容?
首先就是达到一定的时间,就是sql语句执行的时间,默认是达到10秒,才会写入日志中,还有就是管理操作和有索引的查询就算超过10秒也不会写入慢日志.
当然要是想记录管理语句,可以启动这个配置环境变量:log_slow_admin_statements 就可以记录了.
记录带索引的语句可以开启log_queries_not_using_indexes 这个环境变量.当然开启带索引的会产生大量的日志,影响服务器性能,可以开启这个系统变量: log_throttle_queries_not_using_indexes来限制每分钟写入的数量.
开启慢日志查询
也是在配置文件中配置系统变量,有三种和一般查询日志一样共用一个系统变量.

这样就开启了慢查询日志.因为慢日志查询我模拟不了,所以这里就不演示文件内容了.
同样也可以修改日志文件的位置,默认位置就是数据目录.
错误日志
首先这里说明一下,这个日志不在数据目录下
错误日志是默认开启的,不用自己手动开启,日志文件位置也可以修改,默认位置就是下面这个图片

可以打开这个文件,看看里面的内容,大部分都能看懂.能看懂就可以了.
二进制日志
二进制日志包含数据库更改的"事件",不会记录SELECT 和SHOW
主要作用就是主从复制和数据恢复.

这些就是二进制文件.
默认情况下二进制是开启的.禁用二进制日志,可以指定 --skip-log-bin 或 --disable-log-bin 选项
二进制日志文件名是由基本名+数字扩展名组成的,服务器每次创建一个新的日志文件时,数字扩
展名都会增加,从而保证有序的文件系列,发生以下事件时,服务器都会在创建一个新的日志文件:
1.服务器已启动或重新启动
2.服务器刷新日志
3.当前日志文件的大小达到 max_binlog_size (单个日志文件的最大字节数,最小值 4096 字
节,最大值和默认值 1GB).
4.二进制日志文件大小可能会超出 max_binlog_size 设定的值,因为二进制日志在记录事务
时,会完整的记录整个事务,不存在把一个事务拆分的情况,如果遇到一个大事务时,即使记录
整个事务会超过日志大小限制,也会保证事务的完整性
5.mysqld还会创建一个包含二进制日志文件名的日志索引文件,默认情况下,这与二进制日志文件
具有相同的基本名称,扩展名为 .index . 可以使用选项--log-bin-index[=file_name ]修改索引文件名;
6.二进制日志文件和索引文件的默认位置是数据目录。可以使用 --log-bin[=file_name ] 选项
指定自定义路径, file_name 格式 = 绝对路径+基本名。--log-bin 对应的系统变量log_bin_basename ;
7.MySQL 5.7 中,启用二进制日志必须指定服务器 ID,对应server_id 选项,否则服务器将无法
启动。在 MySQL 8.0 中, server_id 系统变量默认设置为 1,在集群环境中,每台MySQL服务
器必须有唯一的server_id ;
8.二进制日志记录事件支持三种格式类型:基于行的日志记录、基于语句的日志记录和混合日志记
录,稍候具体介绍;
9.二进制日志记录在语句或事务完成之后,释放锁或在提交完成之前进行。这样做是为了确保按照提交顺序记录日志;
10.在一个未提交的事务中,对支持事务的表(如InnoDB表)的更改都会被缓存(UPDATE, DELETE或INSERT),直到服务器收到COMMIT 语句,mysqld在执行 COMMIT 之前将整个事务写入二进制日志;
11.如果事务回滚,则在整个事务中记录一个ROLLBACK 语句,但是对非事务性表(如MyISAM表)的修改不能回滚,所以这些修改将被复制到从节点;
12.对非事务表的更新在执行后立即存储在二进制日志中;
13.当处理事务的线程启动时,它会分配一个大小为binlog_cache_size 的缓冲区来缓存语句。如
果语句大小大缓冲区的值,线程则打开一个临时文件来存储事务,临时文件在线程结束时删除;
14.Binlog_cache_use 状态变量显示使用该缓冲区(可能还有临时文件)存储事务的数量;
Binlog_cache_disk_use 状态变量显示有多少事务实际上使用了临时文件。结合这两个变量
可以把binlog_cache_size 调优到一个足够大的值,从而避免使用临时文件;
写这么多应该就够了.
默认二进制日志的过期时间为30天,过期后将自动删除,要指定自定义过期时间,可以使用系统变
量binlog_expire_logs_seconds=N 单位为秒,在下一次启动服务器和刷新日志时删除过期
日志文件;