MySQL 数据库备份(二)(增量备份与恢复)
文章目录
- 引言
- 1.增量备份的特点
- 2.二进制日志对备份的意义
- 2.1增量备份示例
- 二、MySQL增量恢复
- 1.增量恢复的场景
- 2. 丢失完全备份之后更改的数据的恢复
- 3. 完全备份之后丢失所有数据
- 4. 基于时间点与位置的恢复
- 4.1基于时间点的恢复
- 4.2 基于位置的恢复
- 5. 指定企业备份策略的思路
- 总结
引言
前面说了完全备份有两种方式,一种是使用tar打包数据文件,另一种是使用mysqldump进行完全备份,完全备份存在的问题很容易看到,每次都是把所有的数据内容进行备份,备份数据中有大量的重复数据,并且完全备份的时间与恢复的时间很长,解决完全备份存在的问题就是使用增量备份的方式,增量备份就是备份自上一次备份之后增减或改变的文件或者内容
一、MySQL增量备份
1.增量备份的特点
- 优点:没有重复数据,备份量不大,时间短
- 缺点:需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且对所有增量备份进行逐个反推恢复,操作较为繁琐
- MySQL没有提供直接的增量备份方法,可以痛过二进制文件间接实现增量备份
2.二进制日志对备份的意义
- 二进制日志保存了所有更新或者可能更新数据库的操作
- 在启动MySQL服务器后开始开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
- 只需要定时执行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.*
#查看二进制文件
-rw-r-----. 1 mysql mysql 691 10月 31 14:31 mysql-bin.000001
-rw-r-----. 1 mysql mysql 177 10月 31 16:06 mysql-bin.000002
-rw-r-----. 1 mysql mysql 154 10月 31 16:06 mysql-bin.000003
-rw-r-----. 1 mysql mysql 57 10月 31 16:06 mysql-bin.index#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式)
#默认格式是 STATEMENT
②每周选择服务器负载较轻的时间段,或者用户访问较少的时间段进行备份
#对表进行完全备份
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 1 * * 3 mysqldump -uroot -p123123 SCHOOL CLASS01 > /opt/SCHOOL_CLASS01_$(date +%F).sql
30 1 * * 3 mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql
#每周三的凌晨 1:30 对数据库和表进行完全备份
二进制日志(binlog)有3种不同的记录格式: STATEMENT
(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
(1) STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率低
(2) ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update…set…where true 那么binlog的数据量会越来越大
总结:update、delete以多行数据起作用,来用行记录下来,只记录变动的记录,不记录sql的上下文环境,比如sql语句记录一行,但是ROW就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低比较大所以记录都记下来
(3) MIXED 推荐使用一般的语句使用statement,函数使用ROW方式存储。
③可每天进行增量备份操作,生成新的二进制日志文件,这样在插入新的数据后,新的二进制文件对应的就是数据库的变化
ls /usr/local/mysql/data
mysqladmin -uroot -p123456 flush-logs
④插入新的数据,以模拟数据的增加或变更
mysql> insert into IT_member values('运维工程师','张三',22,'8','本科',7,20000);
Query OK, 1 row affected (0.01 sec)mysql> select * from IT_member;
+--------------------+-----------+--------+----------+--------+--------+----------+
| 岗位 | 姓名 | 年龄 | 员工ID | 学历 | 年限 | 薪资 |
+--------------------+-----------+--------+----------+--------+--------+----------+
| 云计算工程师 | 顾磊 | 18 | 1 | 本科 | 6 | 18888.00 |
| 云计算工程师 | 崔配文 | 19 | 2 | 本科 | 7 | 19999.00 |
| 运维工程师 | 张三 | 22 | 8 | 本科 | 7 | 20000.00 |
+--------------------+-----------+--------+----------+--------+--------+----------+
3 rows in set (0.00 sec)
⑤ 生成新的二进制文件并查看其内容
cd /usr/local/mysql/data/
mysqladmin -uroot -p123456 flush-logs
注意:之前的步骤④的数据库操作会保存到mysql-bin.000002文件中,之后我们测试删除库的操作会保存在mysql-bin.000003文件中
(以免当我们基于mysql-bin.000002日志进行恢复时,依然会删除库)
#将记录变更的二进制文件02复制至/opt目录下
cp mysql-bin.000002 /opt/cd /opt/
#使用64位编码机制去解码,按行读取详细内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
二、MySQL增量恢复
增量恢复比完全恢复操作更为频繁 每个增量备份都是单独的个体,数据不重复,需要控制得更加精确
1.增量恢复的场景
增量备份的场景:
- 认为的SQL语句破坏了数据库
- 在进行下一次全备之前发送系统故障导致数据库数据丢失
- 在主从架构中,主库数据发生故障
根据数据丢失的情况可以分为两类:
- 只丢失了完全备份之后更改的数据
- 完全备份之后丢失所有的数据
2. 丢失完全备份之后更改的数据的恢复
#添加表内容
mysql> insert into gl values ('wangliu',4);
mysql> insert into gl values ('wangw',5);#截取日志文件
mysqladmin -u root -p123456 flush-logs
[root@mysql /usr/local/mysql/data]#ls #生成03,添加数据的操作保存在02中
mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 ......#删除插入的两条数据,模拟完全备份后数据丢失的故障
mysql> delete from gl where id=4;
mysql> delete from gl where id=5;#使用二进制文件进行恢复操作
mysqlbinlog --no-defaults mysql-bin.000002 | mysql -uroot -p
3. 完全备份之后丢失所有数据
#创建新的数据库和数据表
mysql> create database class;
mysql> use class;
mysql> create table gl(name char(8),ID int not null,primary key (ID));
mysql> insert into gl values('zhangsan','1');
......
mysql> insert into gl values('laal','6');
mysql> select * from gl where id;
+----------+----+
| name | ID |
+----------+----+
| zhangsan | 1 |
| wangwu | 2 |
| wangliu | 3 |
| lisi | 4 |
| wb | 5 |
| laal | 6 |
+----------+----+#完全备份
mysqldump -uroot -p123456 class gl > /opt/class_gl_$(date +%F).sql#刷新日志
mysqladmin -u root -p flush-logs#继续在数据库表中添加信息
insert into gl values('ssa',7);
insert into gl values('sa',8);
mysql> select * from gl;
+----------+----+
| name | ID |
+----------+----+
| zhangsan | 1 |
| wangwu | 2 |
| wangliu | 3 |
| lisi | 4 |
| wb | 5 |
| laal | 6 |
| ssa | 7 |
| sa | 8 |
+----------+----+#删除库class,模拟故障
mysql> drop database class;#基于000001的全量备份进行还原数据,依次还原000002、000003,并验证结果
mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p
mysqlbinlog --no-defaults mysql-bin.000002 | mysql -uroot -p
mysqlbinlog --no-defaults mysql-bin.000003 | mysql -uroot -p
4. 基于时间点与位置的恢复
利用二进制日志可实现基于时间点与位置的恢复,例如由于误操作删除了一张表,这时完全恢复是没有用的
因为日志里还有误操作的语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作的语句,再恢复后面操作的语句
4.1基于时间点的恢复
- 将某个起始时间的二进制文件导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复
- 使用mysqlbinlog加上 --stop-datetime选项,表示在哪个时间点结束,后面误操作的语句不执行, --start-datetime 选项表示执行后面的语句
- 结合使用就可以跳过误操作的语句,完成恢复工作
- 二进制文件中保存的日期格式需要调整为“-”分割
#恢复用户“lier”的数据
mysql -uroot -p123456 -e "truncate table class.gl;" #清空表数据
mysql -uroot -p123123 -e "select * from class.gl;"mysqlbinlog --no-defaults --stop-datetime='2021-10-27 0:39:20' mysql-bin.000002 |mysql -uroot -p123456mysql -uroot -p123456 -e "select * from class.gl;"
4.2 基于位置的恢复
- 基于位置的恢复,就是使用基于时间点的恢复
- 可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,基于位置是一种更为精确的恢复方式
#使用64位编码机制解码并按行读取二进制文件02(增量备份)的详细内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001
#仅恢复“778”之前的数据,也就是不恢复“lier”的数据
mysql -uroot -p123456 -e "select * from class.gl;"
mysql -uroot -p123456 -e "truncate table class.gl;"
mysql -uroot -p123456 -e "select * from class.gl;"
mysqlbinlog --no-defaults --stop-position='778' mysql-bin.000001 | mysql -uroot -p123456
mysql -uroot -p123456 -e "select * from class.gl;"
#仅恢复“lier”的数据
mysql -uroot -p123456 -e "select * from class.gl;"
mysqlbinlog --no-defaults --start-position='955' mysql-bin.000001 | mysql -uroot -p123456
mysql -uroot -p123456-e "select * from class.gl;"
5. 指定企业备份策略的思路
- 指定企业备份策略要根据企业数据库的实际读写的频繁性与数据的重要性进行
- 数据更新频繁,则应该进行较为频繁的备份
- 数据较为重要,则在有适当更新时进行备份
- 在数据库压力小的时段进行全备,如一周一次,然后每天增备
- 根据公司的规模,中小公司可一天一次全备,大公司可每周一次全备,每天进行一次增备,并且尽量为企业实现主从复制架构
总结
- 使用分割日志的方式进行增量备份
- 增量备份需要根据日志文件的时间先后逐个执行
- 使用基于时间和位置的方式进行恢复可以更精确的恢复数据
MySQL 数据库备份(二)(增量备份与恢复)相关推荐
- 企业级MySQL数据库备份方案:增量备份、全量备份、逻辑备份
一份好的备份方案无非包括以下几点: 为什么需要备份? 备份的方式有哪些? 某几种备份方式的区别在哪? 备份实战操作概述 恢复实战操作概述 其它备注信息 那么,此文将从以上几个角度,结合一些实际的实战经 ...
- MYSQL数据库备份实战之xtrabackup(增量备份/差异备份)
xtrabackup Percona 官网:www.percona.com percona-server InnoDB --> XtraDB Xtrabackup percona提供的mysql ...
- windows mysql 备份_Windows下MySQL数据库备份脚本(二) | 系统运维
说明: MySQL数据库安装目录:C:\Program Files\MySQL\MySQL Server 5.0 MySQL数据库存放目录:C:\Program Files\MySQL\MySQL S ...
- Java实现MySQL数据库备份(二)
权声明:本文为博主原创文章,未经博主允许不得转载. 博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这种方法比较繁杂,下面介绍另一种备份MyS ...
- 2.5.1 MySQL数据库备份恢复基础讲解
MySQL数据库备份恢复基础 MySQL常见的故障类型 对于用户来说,数据库中保存的数据通常至关重要,所以要采取各种手段来防止各种可能的数据损失和数据故障. DBA主要任务就是维持数据库的高可靠性运行 ...
- mysql数据库备份总结_MySQL数据库备份总结
一个企业的正常运行,数据的完整性是最关键的:所以我们需要在工作中要很熟练的掌握数据的备份与恢复方法:下面是对Mysql数据库备份的三种方法总结,希望对大家会有所帮助 备份开始前的工作环境准备: 1.创 ...
- MySQL数据库 日志管理、备份与恢复
MySQL数据库 日志管理.备份与恢复 一.MySQL日志管理 MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种: 通过配置文件或者是通过命令 通过命令修改 ...
- 阿里云 mysql 导出数据库备份_导出整个mysql数据库备份
mysql和mssql的备份和恢复数据的方法 mysql数据库的备份方法可以用 导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] ...
- [ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原(Part 2:备份.sql文件方式)
本文主要讲解如何用Navicat(Navicat Premium ,或者Navicat for mysql)进行MySQL备份和恢复数据库(利用.sql文件的方式). 关于MySQL数据库备份,本博客 ...
- 浅谈MySQL数据库备份的几种方法
mysql常见的备份方式有:mysqldump.mysqlhotcopy.BACKUP TABLE .SELECT INTO OUTFILE,又或者备份二进制日志(binlog),还可以是直接拷贝数据 ...
最新文章
- python真正实现多线程的方法_python多线程几种方法实现
- RecyclerView 缓存机制
- “最粉嫩”的JVM垃圾回收器及算法,王者笔记!
- delphi面向对象(1)
- MySQL用户与权限管理
- 信工干货||C语言中的运算符和表达式
- Halcon算子学习:图像阈值分割-threshold、binary_threshold、dyn_threshold算子
- CentOS7安装Mono和MonoDevelop
- 大数据分析有哪些陷阱
- 最高响应比调度算法_高响应比调度算法(c语言程序实现)
- python实现小波降噪_15转载python实现小波分解【实测成功】
- ignite集成mysql_Ignite集成Spark之IgniteDataFrames
- NBA比赛数据table表格
- html5 3d场景设计,三维场景设计是什么_三维场景设计的介绍
- Ant design分析后台首页
- Parallel GC
- linux挂载镜像iso文件作为yum源
- 机器视觉镜头的计算方法
- 浅谈音乐与计算机,浅析电脑音乐在音乐教育中的应用
- MySQL数据查询---连接查询