MySQL 日志管理与优化

53 阅读6分钟

日志类型

①事务日志:用于存储记录数据库事务的相关内容,默认开启。

②错误日志:用于存储记录数据库出现错误,yum安装默认位置:/var/log/mysql.log,默认开启。

③慢查询日志:用于存储记录数据库具体些语句执行时较慢,默认关闭。

④通用日志:记录对数据库的通用操作,包括错误的sql语句,默认是关闭。

⑤二进制日志:二进制方式记录数据库所有操作可用于备份恢复数据,默认关闭。

⑥中继日志:主从复制架构中,从服务器用于保存主传输过来的二进制日志文件。

错误日志

错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启。

SHOW GLOBAL VARIABLES LIKE 'log_error' ;

 vim /etc/my.cnf
 ​
 [mysqld]
 log-error=mysql_error.log   #编译安装指定日志的保存位置
 log-error=/var/log/mysql_error.log   #yum安装的默认错误日志位置

二进制日志

二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启。


show variables like 'binlog_format'; 查看格式
show variables like 'log_bin%';  查看相关变量
 vim /etc/my.cnf
 ​
 [mysqld]
 server-id=1 #5.7及以上版本的话,不加server-id重启mysql服务会报错,5.7以下版本就不用加了
 log-bin=mysql-bin      #也可以log_bin=mysql-bin  #没有默认位置 需要手动指定
 #使用相对路径,则文
 binlog_format = MIXED
 
 使用mysql的功能少(不用存储过程,触发器,函数),选择默认的statement
 用到特殊功能(存储过程,触发器,函数)则选择mixed
 用到特殊功能希望数据最大化一致选择row
 

mysql-bin.index 文件会对二进制日志进行分割。

每次重启 mysql 或 在数据库中 "flush logs"刷新日志之后,会生成一个新的二进制日志。

通用查询日志

通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的。

默认位置 general_log_file=HOSTNAME.log 相对路径安装目录下

 vim /etc/my.cnf
 ​
 [mysqld]
 general_log=ON    #默认关闭  手动开启
 general_log_file=指定位置
 
set global general_log=1; #开启

SHOW GLOBAL VARIABLES LIKE 'log_output';
#默认通用日志存放在文件中
show variables like 'general%';
#通用日志存放的文件路径 

慢查询日志

慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的。

默认位置 slow_query_log_file=HOSTNAME-slow.log  相对路径安装目录下

show variables like '%slow%'; 确认日志
show variables like 'long_query_time%';


 vim /etc/my.cnf
 ​
 [mysqld]
 slow_query_log=ON
 slow_query_log_file=
 long_query_time=5    #慢查询时间,设置超过5秒执行的语句被记录,缺省时为10秒
set  global slow_query_log=1;
#开启
set long_query_time=1;

事务日志

innodb事务日志包括redo log和undo log。

redo log是重做日志,提供前滚操作,

undo log是日志,提供回滚操作

1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。

2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录

事务型存储引擎自行管理和使用,建议和数据文件分开存放

事务日志和二进制日志的区别

事务日志记录的是物理页的情况,它具有幂等性,因此记录日志的方式极其简练。幂等性的意思是多次操作前后状态是一样的,例如新插入一行后又删除该行,前后状态没有变化。而二进制日志记录的是所有影响数据的操作,记录的内容较多。例如插入一行记录一次,删除该行又记录一次。

show variables like '%innodb_log%';

vim /etc/my.cnf
innodb_flush_log_at_trx_commit=0|1|2
innodb_log_group_home_dir ./ #事务文件路径
innodb_log_file_size 50331648 #调整每个日志文件大小字节,默认约50M
innodb_log_files_in_group 2 #日志分隔个数,默认2个



select @@innodb_flush_log_at_trx_commit;
#查看默认值

1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性
0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务
2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失



如果你的应用不涉及很高的安全性 (金融系统),或者基础架构足够安全,或者 事务都很小,都可以用 0 或者 2 来降低磁盘操作。 

重启服务

 systemctl restart mysqld

mysql优化

硬件上优化

cpu:推荐4U的服务器做数据库服务器

内存:推荐使用4GB以上物理内存

磁盘:磁盘IO是制约mysql性能的最大因素之一,通常使用raid01磁盘阵列。成本够的话使用固态硬盘

修改配置文件

双1优化

sync_binlog=1 mysql在每写一次二进制日志都会同步到磁盘中
innodb_flush_log_at_trx_commit=1 每次提交事务mysql都会缓存的数据写入日志文件,并刷到磁盘中去

其他参数优化

max_connections=5000 mysql允许最大的进程连接数 最大可设置16384
max_allowed_packet=32M 设置在网络传输中一次消息传输量的最大值,系统默认值为1MB

增加tcp连接队列数

使用足够大的写入缓存 innodb_log_file_size

但是需要注意如果用 1G 的 innodb_log_file_size ,假如服务器当机,需要 10 分钟来恢复。

推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size

架构:主从复制,读写分离,负载均衡。

使用索引:

经常与其他表进行连接的表,在连接字段上应该建立索引 经常出现在where 子句中的字段,特别是大表的字段,应该建立索引 索引应该建在选择性高的字段上 索引应该建在小字段上

不适合创建索引的字段 唯一性太差的字段不适合建立索引;即重复率过高 更新太频繁地字段不适合创建索引 大的文本字段甚至超长字段,不要建立索引

开启慢查询日志的使用

安全优化

避免外网访问mysql,确保特定主机才能访问
禁用或限制远程访问
my.cnf文件里设置bind-address指定ip
定期备份
移除test数据库,默认匿名用户可以访问test数据库
移除匿名用户和废气用户
限制mysql用户权限
移除 .mysql_history文件

数据库读取慢

增加服务器数量或者增强数据库服务器性能

慢查询日志找出执行慢的语句

explain分析索引