MySQL 数据库备份(二)(增量备份与恢复)

文章目录

  • 一、MySQL 增量备份
    • 1.增量备份的概念
      • 1.1 为什么使用增量备份
      • 1.2 增量备份的特点
    • 2.增量备份示例
  • 二、MySQL 增量恢复
    • 1.增量恢复的场景
    • 2.丢失完全备份之后更改的数据的恢复步骤
    • 3.完全备份之后丢失所有数据的恢复步骤
    • 4. 基于时间点与位置的恢复
      • 4.1 基于时间点的恢复
      • 4.1 基于位置的操作
    • 5. 指定企业备份策略的思路


一、MySQL 增量备份

增量备份可以在完全备份的基础上,减少备份文件的大小,从而加快备份和恢复的速度

1.增量备份的概念

1.1 为什么使用增量备份

  • 前面章节讲到了完全备份有两种方式,一种是使用 tar 打包数据文件,另一种是
    使用 mysqldump 进行完全备份
  • 完全备份存在的问题很容易看到,每次都是把所有的数据内容进行备份,备份数据中有大量的重复数据,并且完全备份的时间与恢复的时间很长
  • 解决完全备份存在的问题就是使用增量备份的方式,增量备份就是备份自上一次备份之后增加或改变的文件或者内容

1.2 增量备份的特点

  • 增量备份的优点是没有重复数据,备份量不大,时间短
  • 缺点也很明显,需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且对所有增量备份进行逐个反推恢复,操作较为繁锁
  • MySQL 没有提供直接的增量备份方法,但是可以通过 MySQL 的二进制日志(binary
    logs)间接实现增量备份

二进制日志对备份的意义如下:

  1. 二进制日志保存了所有更新或者可能更新数据库的操作
  2. 二进制日志在启动 MySQL 服务器后开始记录,并在文件达到 max_binlog_size 所设置的大小或者接收到 flush logs 命令后重新创建新的日志文件
  3. 只需要定时执行 flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份

2.增量备份示例

  1. 开启二进制日志功能
vim /etc/my.cnf

...
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
#指定二进制日志(binlog)的记录格式为 MIXED


systemctl restart mysqld.service
#重启服务

cd /usr/local/mysql/data
ls -l /usr/local/mysql/data/mysql-bin.*
#查看二进制文件


#二进制日志(binlog)3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式)
#默认格式是 STATEMENT

MySQL 数据库备份(二)(增量备份与恢复)_第1张图片
mark

  1. 每周选择服务器负载较轻的时间段,或者用户访问较少的时间段进行备份
mysqldump -uroot -p123123 SCHOOL CLASS01 > /opt/SCHOOL_CLASS01_$(date +%F).sql
#对表进行完全备份

mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql
#对库进行完全备份

crontab -e
#也可以使用计划性任务来执行
30 3 * * 3 mysqldump -uroot -p123123 SCHOOL CLASS01 > /opt/SCHOOL_CLASS01_$(date +%F).sql
30 3 * * 3 mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql
每周三的凌晨 3:00 对数据库和表进行完全备份

MySQL 数据库备份(二)(增量备份与恢复)_第2张图片
mark

  1. 可每天进行增量备份操作,生成新的二进制日志文件,这样在插入新的数据后,新的二进制文件对应的就是数据库的变化的内容
ls /usr/local/mysql/data

mysqladmin -uroot -p123123 flush-logs

MySQL 数据库备份(二)(增量备份与恢复)_第3张图片

  1. 插入新的数据,以模拟数据的增加或变更
use SCHOOL;

insert into CLASS01 values(3,'wangsan','woman','games');
insert into CLASS01 values(4,'wangsi','man','runing');

select * from CLASS01;

MySQL 数据库备份(二)(增量备份与恢复)_第4张图片

  1. 生成新的二进制文件并查看其内容
cd /usr/local/mysql/data/
ls

mysqladmin -uroot -p123123 flush-logs

MySQL 数据库备份(二)(增量备份与恢复)_第5张图片

cp mysql-bin.000002 /opt/
#将记录变更的二进制文件02复制至/opt目录下
cd /opt/
ls

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#使用64位编码机制去解码,按行读取详细内容

MySQL 数据库备份(二)(增量备份与恢复)_第6张图片
MySQL 数据库备份(二)(增量备份与恢复)_第7张图片


二、MySQL 增量恢复

  • 增量恢复比完全恢复操作更为繁琐
  • 每个增量备份都是单独的个体,数据不重复,需要控制得更加精确

1.增量恢复的场景

  • 当数据发送错误时,应根据实际情况选择使用完全备份恢复,还是增量备份
  • 增量备份的场景是:
    • 人为的 SQL 语句破坏了数据库
    • 在进行下一次全备之前发送系统故障导致数据库数据丢失
    • 在主从架构中,主库数据发送了故障
  • 根据数据丢失的情况可以分为两类:
    • 只丢失了完全备份之后更改的数据
    • 完全备份之后丢失所有的数据

2.丢失完全备份之后更改的数据的恢复步骤

  • 当完全备份之后更改的数据丢失,需要把完全备份之后的所有增量备份文件逐个恢复
  • 步骤如下:
mysql -uroot -p123123
use SCHOOL;

delete from CLASS1 where id=3;
delete from CLASS1 where id=4;
#删除插入的两条数据,模拟完全备份后数据丢失的故障

select * from CLASS01;
#检查
quit

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
#使用二进制文件进行恢复操作

mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#检查表内容是否恢复

MySQL 数据库备份(二)(增量备份与恢复)_第8张图片
MySQL 数据库备份(二)(增量备份与恢复)_第9张图片

3.完全备份之后丢失所有数据的恢复步骤

  • 当完全备份和增量备份之后,所有的数据丢失,需要把完全备份和所有增量备份文件逐个恢复
  • 步骤如下:
mysql -uroot -p123123
use SCHOOL;
drop table CLASS01;
#直接删除整个表,假设完全备份后所有数据都丢失了
quit

mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS01_2021-02-06.sql
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#进行完全备份后查看一下

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
#增量备份
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"

MySQL 数据库备份(二)(增量备份与恢复)_第10张图片
MySQL 数据库备份(二)(增量备份与恢复)_第11张图片

4. 基于时间点与位置的恢复

  • 利用二进制日志可实现基于时间点与位置的恢复,例如由于误操作删除了一张表,这时完全恢复是没有用的
  • 因为日志里还有误操作的语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作的语句,再恢复后面操作的语句

4.1 基于时间点的恢复

  • 基于时间点的恢复,就是将某个起始时间的二进制文件导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复
  • 使用 mysqlbinlog 加上 --stop-datetime 选项,表示在哪个时间点结束,后面误操作的语句不执行
  • –start-datetime 选项表示执行后面的语句
  • 结合使用它们就可以跳过误操作的语句,完成恢复工作
  • 需要注意的是,二进制文件中保存的日期格式需要调整为用“-”分割
#恢复用户“wangsan”的数据,而不恢复“wangsi”
mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS01;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"

mysqlbinlog --no-defaults --stop-datetime='2021-02-06 15:58:39' /opt/mysql-bin.000002 |mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"

MySQL 数据库备份(二)(增量备份与恢复)_第12张图片

#恢复“wangsi”的数据
mysqlbinlog --no-defaults --start-datetime='2021-02-06 15:58:39' /opt/mysql-bin.000002 |mysql -uroot -p

MySQL 数据库备份(二)(增量备份与恢复)_第13张图片

4.1 基于位置的操作

  • 基于位置的恢复,就是使用基于时间点的恢复
  • 可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,基于位置是一种更为精确的恢复方式
mysqlbinlog --no-defaults --stop-position='609' /opt/mysql-bin.000002 | mysql -uroot -p
#使用64位编码机制去解码并按行读取二进制文件02(增量备份)的详细内容
...
...

MySQL 数据库备份(二)(增量备份与恢复)_第14张图片

#仅恢复“1810”之前的数据,即不恢复“wangsi”的数据
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS01;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysqlbinlog --no-defaults --stop-position='1810' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"

MySQL 数据库备份(二)(增量备份与恢复)_第15张图片

#仅恢复“wangsi”的数据,跳过“wangsan”的数据恢复,即仅有第四条记录
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysqlbinlog --no-defaults --start-position='1810' /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"

MySQL 数据库备份(二)(增量备份与恢复)_第16张图片

5. 指定企业备份策略的思路

  • 指定企业备份策略要根据企业数据库的实际读写的频繁性与数据的重要性进行
  • 数据更新频繁,则应该进行较为频繁的备份
  • 数据较为重要,则在有适当更新时进行备份
  • 在数据库压力小的时段进行全备,如一周一次,然后每天增备
  • 根据公司的规模,中小公司可一天一次全备,大公司可每周一次全备,每天进行一次增备,并且尽量为企业实现主从复制架构

你可能感兴趣的:(数据库应用,Mysql,数据库,基于时间点与位置的增量恢复,丢失完全备份之后更改的数据恢复,完全备份之后丢失所有数据恢复,增量恢复与备份)