文章目录
- 一.MySQL日志管理
- 1.1日志分类
- 1.2日志配置
- 1.3日志查询
- 二.MySQL数据备份
- 2.1物理备份
- 2.2逻辑备份
- 三.常用的备份方法
- 3.1物理冷备
- 3.2工具备份(温备)
- 3.3增量备份与恢复
- 3.3.1开启二进制日志功能
- 3.3.2二进制日志读取
- 3.3.3一般恢复
- 3.3.4节点恢复
- 3.3.5基于时间点恢复
- 四.总结
引言:在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果,那么对于数据的备份就将显的十分重要。对于MySQL而言,在其备份中,日志起到了很重要的作用
一.MySQL日志管理
MySQL的日志默认保存位置为:/usr/local/mysql/data下
配置文件位于:/etc/my.cnf文件中的[mysqld]内
1.1日志分类
- 错误日志
用来记录当MySQL启动、停止或运行时发生的错误信息,默认开启
log-error=/usr/local/mysql/data/mysql_error.log
- 通用查询日志
用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
- 二进制日志
用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
log_bin=mysql-bin
或 log-bin=mysql-bin
- 慢查询日志
用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 单位时间为s,缺省时为10s
慢查询日志也可用来查询哪些搜索的字段超时,可以选择是否需要增加索引,加快查询速度
- 中继日志
一般情况下,它在MySQL主从同步(复制)、读写分离集群的从节点开启,主节点一般不需要这个日志
1.2日志配置
修改配置文件
vim /etc/my.conf
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
#配置文件添加完后需要重启MySQL
systemctl restart mysql
修改my.cnf配置文件,在[mysqld]中添加如下内容
重启服务
1.3日志查询
登入MySQL数据库,查询日志是否开启
#variables 表示变量
#like 表示模糊查询
#%xxx,以什么结尾,xxx%以什么开头,%xxx%包含
#查看通用查询日志是否开启
show variables like 'general%';
#查看二进制日志是否开启
show variables like 'log_bin%';
#查看慢查询日功能是否开启
show variables like '%slow%';
#查看慢查询时间设置
show variables like 'long_query_time';
#在数据库中设置开启慢查询的方法
set global slow_query_log=ON;
- 查询通用日志是否开启
show variables like ‘general%’;
- 查询二进制日志是否开启
show variables like ‘log_bin%’;
- 查看慢查询日志是否开启
show variables like ‘long_query_time’;
查询慢查询日志超时时间
show variables like ‘long%’;
二.MySQL数据备份
在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果,数据备份的主要目的是灾难恢复
数据备份分为物理备份和逻辑备份两类
2.1物理备份
对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份的方法 :
- 冷备份(脱机备份) :是在关闭数据库的时候进行的;
- 热备份(联机备份) :数据库处于运行状态,依赖于数据库的日志文件;
- 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。
2.2逻辑备份
对数据库逻辑组件的备份,表示为逻辑数据库结构,此类型备份适用于可以编辑数据值或表结构
逻辑备份分类:
- 完全备份
每次都进行完全备份,会导致文件占用空间巨大,并且有大量重复数据,恢复时,直接使用完全备份的文件即可
优点:备份与恢复操作简单方便
缺点:数据存在大量的重复、占用大量的备份空间及备份与恢复时间长 - 差异备份
每次差异备份,都会备份上一次完全备份之后的数据,可能会出现备份重复数据,导致占用额外的磁盘空间,恢复时,先恢复完全备份的数据,再恢复差异备份的数据 - 增量备份
每次增量备份都是在上一次完全备份或者增量备份之后的数据,不会出现备份重复数据的情况,也不会占用额外的磁盘空间。恢复数据时,需要按照次序恢复完全备份和增量备份的数据
三.常用的备份方法
3.1物理冷备
备份时,数据库处于关闭状态,直接打包数据库文件,备份速度快,恢复时也是最简单的
#关闭服务
systemctl stop mysqld.service
#压缩备份
tar -czf /opt/mysql_all$(date +%F).tar.gz /usr/local/mysql/data/
mkdir /opt/mysql_bak
mv /usr/local/mysql/data/* /opt/mysql_bak/ #模拟删除数据库
#解压恢复
tar -xf mysql_all2022-06-21.tar.gz -C /usr/local/mysql/data/
cd /usr/local/mysql/data #切换目录
mv usr/local/mysql/data/* ./ #将解压的数据移到/usr/local/mysql/data/下
压缩备份
解压恢复
启动服务,查看数据是否还在
3.2工具备份(温备)
常用的工具有
mysqldump 常用的逻辑备份工具
mysqlhotcopy 仅拥有备份 MyISAM和ARCHIVE表
使用mysqldump工具备份一个或多个完整的库(包括其中的表)
#备份一个或多个库
mysqldump -u root -p --databases 库名1 库名2 > 备份路径/文件名.sql
#备份所有库(完全备份)
mysqldump -u root -p --all-databases > 备份路径/文件名.sql
#备份的文件名后缀必须为.sql
#备份一个库中的一个或多个表
mysqldump -u root -p --databases 库名 表名1 表名2 > 备份路径.sql
- 完全备份
mysqldump -u root -p --all-databases > /opt/mysql_all.sql
备份数据库中的所有库文件
- 完全备份恢复
方法一:
#在数据库中,使用source恢复数据
mysql> source /opt/mysql_all.sql
删除表与表内内容
进行完全备份恢复
查看数据是否恢复
方法二:
#完全恢复
mysql -uroot -p < 备份文件路径
#恢复指定库的指定表
mysql -uroot -p 库名 表名1 表名2 < 备份文件路径
mysqldump -uroot -p --databases xy > /opt/mysql_xy.sql
当备份时加 --databases,表示针对库xy
当备份时不加–databases时,表示针对xy库下的所有表
- 备份数据表结构
mysqldump -u root -p -d xy bank > /opt/xy_bank.sql
#-d 选项,说明只保留表的结构,不保留数据
#不加-d,则连同数据一起备份
也可以打开备份文件查看
小结:在数据恢复的时候建议使用source,简单方便
mysqldump工具属于温备份,在其进行数据备份的时候,会进行锁表,禁止写入
在备份库的时候要使用–databases
3.3增量备份与恢复
MySQL数据库增量恢复有,一般恢复、基于位置恢复、基于时间点恢复
3.3.1开启二进制日志功能
vim /etc/my.conf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
server-id = 1
#二进制日志有三种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认为STATEMENT
#server-id 为服务的序号,在MySQL主备、高可用中需要指定服务的序号
#改为配置文件需要重启服务
systemctl restart mysqld
STATEMENT(基于sQL语句):
每一条涉及到被修改的sql都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-definedfuctions ( udf) 、垂从复制等架构记录日志时会出现问题
总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率底
ROw(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update… …set… . .where true那么binlog的数据量会越来越大
总结: update、 delete以多行数据起作用,来用行记录下来,只记录变动的记录,不记录sql的上下文环境,比如sql语句记录一行,但是Row就可能记录10行,但是准确性高,高并发的时候由于操作量能变低比较大所以记录都记下来,
重启服务
systemctl restart mysqld.service
3.3.2二进制日志读取
二进制文件无法直接编辑查看,需要对其进行转换
mysqlbinlog --no-defaults 二进制日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制日志文件
#--base64-output=decode-rows 使用64位编码机制去解码;decode按行读取rows
#-v 显示详细内容
#--no-defaults 默认字符集(不加会报UTF-8错误)
#将解码后的文件导出为txt文件,重定向输出
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制日志文件 > 文件.txt
#刷新日志文件
mysqladmin -uroot -p flush-logs
3.3.3一般恢复
将所有的二进制日志内容全部恢复
mysqladmin -uroot -p flush-logs 刷新日志文件
对表内数据进行删除操作
使用日志文件对数据进行恢复
mysqlbinlog --no-defaults -v /opt/mysql-bin.000001 |mysql -uroot -p
3.3.4节点恢复
数据库在某一时间点可能既有错误的操作也有正确的操作,可以基于精准的位置跳过错误的操作
发生错误节点指点的上一个节点,上一次正确操作的位置点停止
模拟节点恢复,刷新日志,生成新的日志文件
进行数据库操作
基于节点进行数据恢复
查看日志文件
恢复数据
mysqlbinlog --no-defaults --stop-position='711' /opt/mysql-bin.000004 |mysql -uroot -p
#--stop-position='711' 恢复到711节点之前
#--start-position='711' 从节点711开始
3.3.5基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
在错误时间点停止,在下一个正确时间点开始
模拟时间点恢复,刷新日志,生成新的日志文件
修改表内数据
备份日志文件,并查看
mysqlbinlog --no-defaults --stop-datetime='2022-06-21 20:03:48' /opt/mysql-bin.000005 |mysql -uroot -p
四.总结
在增量备份恢复时,要先从完全备份恢复,再到二进制日志1、日志2…逐一恢复
如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start