0%

MySQL运维

日志

错误日志

错误日志记录了mysqld启动和停止时,以及服务器运行中错误信息。数据库出故障时,应首先查看此日志。
日志默认路径: /var/log/mysql/mysqld.log, 查看方式如下:

1
2
3
4
5
6
7
8
9
10
mysql> show variables like '%log_error%';
+----------------------------+----------------------------------------+
| Variable_name | Value |
+----------------------------+----------------------------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /var/log/mysql/mysqld.log |
| log_error_services | log_filter_internal; log_sink_internal |
| log_error_suppression_list | |
| log_error_verbosity | 2 |
+----------------------------+----------------------------------------+

二进制日志

binlog记录所有DDL和DML语句,但不包括select,show语句
binlog作用:

  • 灾难时数据恢复
  • MySQL主从复制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    mysql> 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
2
3
4
# cat /var/lib/mysql/binlog.index
./binlog.000001
./binlog.000002
......

日志格式

  • STAETMENT 基于SQL语句日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中。
  • ROW 基于行的日志记录,记录的是每一行的数据变更 (默认)
  • MIXED 混合了STATEMENT和ROW两种格式, 默认采用STATEMENT, 在某些特殊情况下自动切换为ROW进行记录

查看默认日志格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+

-- 后台查询binlog
# mysqlbinlog -v binlog.000001
### UPDATE `pc`.`score`
### WHERE
### @1=1
### @2='Tom'
### @3=11
### @4=20
### @5=30
### SET
### @1=1
### @2='Tom'
### @3=12
### @4=20
### @5=30
### UPDATE `pc`.`score`
......
# End of log file

日志删除
对于繁忙的业务系统,每天生成大量的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
2
3
4
5
6
7
mysql> show variables like '%general%';
+------------------+--------------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/iZuf65qw76eb18m9yp8b38Z.log |
+------------------+--------------------------------------------+

查询日志默认是关闭的, 开启查询日志需要修改MySQL配置文件/etc/my.cnf.d/mysql-server.cnf, 添加如下内容:

1
2
general_log=1
general_log_file=/var/lib/mysql/mysql_query.log

再重启MySQL system restart mysqld

慢查询日志

记录了所有执行时间超过参数long_query_time设置值,并且扫描记录数不小于min_examined_row_limit的所有SQL语句日志, 默认未开启:
修改/etc/my.cnf.d/mysql-server.cnf

1
2
3
4
#慢查询日志开关
slow_query_log=1
#执行时间参数
long_query_time=2

默认情况下,不记录管理语句,也不记录不适用索引查找的语句。可以修改配置文件改变这个默认的行为:

1
2
3
4
#记录执行较慢的管理语句
log_slow_admin_statements=1
#记录执行较慢的未使用索引的语句
log_queries_not_using_indexes=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存在

读写分离