日志
错误日志
错误日志记录了mysqld启动和停止时,以及服务器运行中错误信息。数据库出故障时,应首先查看此日志。
日志默认路径: /var/log/mysql/mysqld.log
, 查看方式如下:
1 | mysql> show variables like '%log_error%'; |
二进制日志
binlog记录所有DDL和DML语句,但不包括select,show语句
binlog作用:
- 灾难时数据恢复
- MySQL主从复制
1
2
3
4
5
6
7
8
9
10
11mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/binlog |
| log_bin_index | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------+
1 | # cat /var/lib/mysql/binlog.index |
日志格式
- STAETMENT 基于SQL语句日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中。
- ROW 基于行的日志记录,记录的是每一行的数据变更 (默认)
- MIXED 混合了STATEMENT和ROW两种格式, 默认采用STATEMENT, 在某些特殊情况下自动切换为ROW进行记录
查看默认日志格式
1 | mysql> show variables like '%binlog_format%'; |
日志删除
对于繁忙的业务系统,每天生成大量的binlog数据,如果长时间不清理,将占用大量磁盘空间,可以通过以下几种方式清理日志:
指令 | 含义 |
---|---|
reset master | 删除全部binlog日志,删除之后日志编号将从binlog.000001重新开始 |
purge master logs to ‘binlog.******’ | 删除******编号之前的所有binlog |
purge master logs before ‘yyyy-mm-idd hh24:mm:ss | 删除给定时间点之前产生的所有binlog |
查询日志
查询日志记录了客户端所有操作语句, binlog不包含查询数据的SQL语句
1 | mysql> show variables like '%general%'; |
查询日志默认是关闭的, 开启查询日志需要修改MySQL配置文件/etc/my.cnf.d/mysql-server.cnf
, 添加如下内容:
1 | general_log=1 |
再重启MySQL system restart mysqld
慢查询日志
记录了所有执行时间超过参数long_query_time设置值,并且扫描记录数不小于min_examined_row_limit的所有SQL语句日志, 默认未开启:
修改/etc/my.cnf.d/mysql-server.cnf
1 | #慢查询日志开关 |
默认情况下,不记录管理语句,也不记录不适用索引查找的语句。可以修改配置文件改变这个默认的行为:
1 | #记录执行较慢的管理语句 |
主从复制
概述
主从复制指将主库的DDL和DML通过二进制日志传到从库, 然后在从库对这些日志重新执行(重做), 从而使得从库和主库数据保持同步
MySQL支持一台主库同时向多台从库复制,从库同时可作为其他从服务器的主库,实现链状复制
主从复制解决以下问题:
- 主库故障,可以切换到从库提供服务
- 实现读写分离, 降低主库访问压力
- 在从库中执行备份,避免备份期间影响主库服务
原理
- Master主库在事务提交时,会吧数据变更记录在二进制日志文件Binlog中
- 从库读取主库的二进制日志文件Binlog, 写入到从库的中继日志Relay Log
- slave重做中继日志中的事件,将改变反映它自己的数据
搭建
https://www.bilibili.com/video/BV1Kr4y1i7ru?spm_id_from=333.788.player.switch&vd_source=d8559c2d87607be86810cd806158bb86&p=160
准备两台服务器
(TODO 搞两台虚拟机)
分库分表
单数据库问题:
- IO瓶颈: 热点数据多,数据库缓存不足,产生大量磁盘IO,效率低。请求数据太多,带宽不够,网络IO瓶颈
- CPU瓶颈: 排序,分组,连接查询,聚合统计等SQL耗费CPU资源,请求数据太多,CPU出现瓶颈
分库分表中心思想是:将数据分散存储,使得单一数据库或表的数据量变小,缓解单一数据库性能问题,从而达到提升数据库性能目的
拆分策略
- 垂直拆分 (垂直分库, 垂直分表)
- 水平拆分 (水平分库, 水平分表)
** 垂直分库 **
以表为依据,根据业务将不同表拆分不同库
特点:
- 每个库的表结构不一样
- 每个库的数据也不一样
- 所有库的并集是全量数据
** 垂直分表 **
以字段为依据,根据字段属性将不同字段拆分到不同表中。
特点:
- 每个表结构和数据不一样,一般通过一列(主键)关联
- 所有表并集是全量数据
** 水平分库 **
以字段为依据,按照一定策略,将一个库数据拆分到多个库中
特点:
- 每个库的表结构都一样
- 每个库的数据都不一样
- 所有库的并集是全量数据
** 水平分表 **
以字段为依据,按照一定策略,将一个表数据拆分到多个表中
特点:
- 每个表的表结构都一样
- 每个表的数据都不一样
- 所有表的并集是全量数据
分库分表技术
- shardingJDBC 只支持Java,性能较高
- MyCat 数据库分库分表中间件,支持多种语言 (应用程序 -> MyCat -> MySQL)
MyCat
MyCat是开源的,基于Java语言编写的MySQL数据库中间件,可以像使用Mysql一样来使用mycat,对于开发人员来说感知不到MyCat存在