MySQL运维
MySQL运维
日志
错误日志
错误日志是MySQL中最重要的日志之一,它记录了当mysqlId启动、停止以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,查看此日志。
该日志时默认开启的,默认存放目录/var/log/,默认的日志文件名为mysqld.log。
日志变量
1 | # 查看日志位置 |
查看日志
1 | tail -50f ./xxx.err |
二进制日志
二进制日志(BINLOG)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
作用
- 灾难数据恢复
- MySQL主从复制
1 | show variables like '%log_bin%'; |
日志格式
MySQL服务器中提供了多种格式来记录二进制日志
日志格式 | 含义 |
---|---|
STATEMENT | 基于SQL语句的日志记录,记录的SQL语句,对于数据进行修改的SQL都将记录在日志文件中 |
ROW(default) | 基于行的日志记录,记录的是每一行的数据变更 |
MIXED | 综合了STATEMENT和ROW两种格式,默认采用STATEMENT,在某些特殊的情况下会自动切换为ROW进行记录 |
日志变量
1 | show variables like '%binlog_format%'; |
查看日志
二进制日志由二进制的方式存储,不能直接读取,需要通过二进制日志查询工具
mysqlbinlog
来查看。
语法
1 | mysqlbinlog [options] log_filename |
选项
1 | -d # 指定数据库名称,列出指定的数据库相关操作 |
删除日志
对于比较繁忙的业务系统,每天生成的binlog数据较多,长时间不清理,将占用大量的磁盘空间。
指令 | 含义 |
---|---|
reset master | 删除全部binlog日志,删除后将日志编号从binlog.000001重新开始 |
purge master logs to ‘binlog.***’ | 删除***编号之前的所有日志 |
purge master logs before ‘yyyy-mm-dd hh24:mi:ss’ | 删除日志为’yyyy-mm-dd hh24:mi:ss’之前产生的所有日志 |
MySQL配置文件中配置二进制日志的过期时间,设置后二进制日志过期会自动删除
1 | show variables like '%binlog_expire_logs_seconds%'; |
查询日志
查询日志中记录客户端所有操作语句,而二进制日志不包含查询数据的SQL语句,默认情况下,查询日志是未开启的。
日志变量
1 | show variables like '%general%'; |
修改配置文件
1 | # /etc/my.cnf配置文件 |
慢查询日志
慢查询日志记录了所有执行时间超过参数long_query_time设置值并且扫描记录数不小于min_examined_row_limit的所有的SQL语句的日志。默认未开启。long_query_time默认为10秒,最小为0秒,精度可以到微秒。
1 | 设置慢查询日志是否开启 |
默认情况下,慢查询日志不会记录管理语句和不使用索引进行查找的查询。可以使用log_show_admin_statements和log_queries_not_using_indexes。
1 | 记录执行较慢的管理语句 |
主从复制
概述
主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(日志重做)。使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制,从库同时可以作为其他服务器的主库,实现链状复制。
优点
主库出现问题,可以快速切换到从库提供服务
实现读写分离,降低主库的访问压力,另外从服务器可以使用MyISAM,提升查询性能以及节约系统的开销
主从服务器负责各自的读和写,极大程度缓解了锁的争用
从库中执行备份(添加全局锁),避免备份期间影响主库服务
原理
MySQL主从复制主要涉及三种线程:binlog线程
、I/O线程
和SQL线程
- binlog线程:负责将主服务器上的数据更改写入二进制日志(binary log)中
- I/O线程:负责从主服务器上读取二进制日志(binary log),并写入从服务器的中继日志(relay log)中
- SQL线程:负责读取中继日志(relay log)并重放其中的SQL语句
步骤
- 主库在提交事务时,binlog线程会将数据变更记录在二进制日志文件binary log中
- 从库I/O线程从主库读取二进制文件binary log,并写入从库的中继日志relay log中
- 从库SQL线程读取中继日志relay log并重放其中的SQL语句
配置
搭建
分库分表
介绍
使用单个数据库进行数据存储存在以下性能瓶颈:
- IO瓶颈:热点数据过多,导致缓存不足,产生大量磁盘IO;请求数量过多,带宽不足导致网络IO瓶颈
- CPU瓶颈:排序、分组、连接查询、集合统计等SQL语会耗费大量CPU资源,请求数量多会出现CPU瓶颈
分库分表的思想是:将数据分散存储,使得单一数据库/表的数据量表变小缓解单一数据库的性能问题,从而达到提升数据库性能的目的
拆分策略
水平拆分
垂直拆分
- 垂直分库:以表为依据,根据业务将不同的表拆分到不同库中,通常按照数据库中表的密集程度部署到不同的库中。
- 每个库的表结构和数据不一样,所有库的并集是全量数据
- 垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中,通常按照列的关系密集程度进行切分,也可以将经常被使用的列和不经常被使用的列切分到不同的表中。
- 某个表的表结构和数据不一样,一般通过一列(主键/外键)关联,所有表的并集是全量数据