MySQL全量、增量备份与恢复

MySQL全量、增量备份与恢复
理论讲解
1 . 本章结构
数据库备份的分类
Mysql完全备份与恢复
Mysql增量备份与恢复
Mysql备份恢复案例
数据备份的重要性
在生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果
造成数据丢失的原因
程序错误
人为错误
计算机失败
磁盘失败
灾难(如火灾、地震)和偷窃

2 . 数据库备份的分类
从物理与逻辑的角度,备份可分为
物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)
冷备份:是在关闭数据库的时候进行的
热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件
逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份
从数据库的备份策略角度,备份可分为
完全备份:每次对数据进行完整的备份
差异备份:备份那些自从上次完全备份之后被修改过的文件
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
MySQL完全备份
完全备份是对整个数据库的备份、数据库结构和文件结构的备份
完全备份保存的是备份完成时刻的数据库
完全备份是增量备份的基础
完全备份的优点
备份与恢复操作简单方便
完全备份的缺点
数据存在大量的重复
占用大量的备份空间
备份与恢复时间长

3 . mysqldump备份库
MySQL数据库的备份可以采用用多种方式
直接打包数据库文件夹,如/usr/local/mysql/data
使用专用备份工具 mysqldump
mysqldump命令
MySQL自带的备份工具,相当方便对MySQL进行备份
通过该命令工具可以将指定的库、表或全部的库导出为SQL脚本,在需要恢复时可进行数据恢复
mysqldump命令对单个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] [数据库名] > /备份路径/备份文件名
单库备份例子
mysqldump -u root –p auth > /backup/auth.sql
mysqldump -u root –p mysql > /bakcup/mysql.sql
mysqldump命令对多个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --databases 库名 1 [库名2] … > /备份路径/备份文件名
多库备份例子
mysqldump -u root –p --databases autth mysql > /backup/databases-auth-mysql.sql
对所有库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
所有库备份例子
mysqldump -u root -p --opt --all-databases > /backup/all-data.sql

4 . mysqldump备份表
在实际生产环境中,存在对某个特定表的维护操作,此时mysqldump同样发挥重大作用
使用mysqldump备份表的操作
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
备份表的例子
mysqldump -u root -p mysql user > /backup/mysql-user.sql

5 . 恢复数据库
使用mysqldump命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入
source命令
mysql命令
使用source恢复数据库的步骤
登录到MySQL数据库
执行source 备份sql脚本的路径
source 恢复例子
MySQL [(none)]> source /backup/all-data.sql
使用mysql命令恢复数据
mysql -u 用户名 -p [密码] < 库备份脚本的路径
mysql 命令恢复例子
mysql -u root -p < /backup/all-data.sql

6 . 恢复表的操作
恢复表时同样可以使用source或者mysql命令进行
source恢复表的操作与恢复库的操作相同
当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在
mysql -u 用户名 -p [密码] < 表备份脚本的路径
mysql -u root -p mysql < /backup/mysql-user.sql
在生产环境中,可以使用shell脚本自动实现定期备份

7 . MySQL备份思路
定期实施备份,制定备份计划或者策略,并严格遵守
除了进行完全备份,开启MySQL服务器的日志功能是很重要的
完全备份加上日志,可以对MySQL进行最大化还原
使用统一的和易理解的备份文件名称
不要使用backup1、backup2等这样没有意义的名字
推荐使用库名或者表名加上时间的命名规则

小结
完全备份的特点
Mysqldump工具的使用方法

8 . MySQL增量备份
使用mysqldump进行完全备份的存在的问题
备份数据中有重复数据
备份时间与恢复时间长
增量备份就是备份自上一次备份之后增加或变化的文件或者内容
增量备份的特点
没有重复数据,备份量不大,时间短
恢复麻烦:需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复
MySQL没有提供直接的增量备份方法
可以通过MySQL提供的二进制日志(binary logs)间接实现增量备份
MySQL二进制日志对备份的意义
二进制日志保存了所有更新或者可能更新数据库的操作
二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些旧的日志保存到安全的地方就完成了一个时间段的增量备份
9 . MySQL数据库增量恢复
一般恢复

基于位置恢复
就是将某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复
基于时间点恢复
使用基于时间点的恢复,可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,所以我们需要一种更为精确的恢复方式

增量恢复的方法
一般恢复
mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p
基于位置的恢复
恢复数据到指定位置
mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码
从指定的位置开始恢复数据
mysqlbinlog --start-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码
mysqlbinlog --stop-position=‘594’ /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p

基于时间点的恢复
从日志开头截止到某个时间点的恢复
mysqlbinlog [–no-defaults] --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码
从某个时间点到日志结尾的恢复
mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码
从某个时间点到某个时间点的恢复
mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码
mysqlbinlog --start-datetime=‘2019-09-30 00:06:30’ --stop-datetime=‘2019-09-30 00:11:40’ mysql-bin.000007 | mysql -uroot -p
案例:MySQL企业备份7-1
需求描述
北京移电通信公司的用户信息数据库为client,用户资费数据表为user_info
请为该公司每周进行完全备份
每天为该公司进行增量备份
用户信息如表所示
身份证 姓名 性别 用户ID 资费
000000006 孙空悟 男 016 10
000000007 蓝精灵 女 017 91
000000008 姜姜 女 018 23
000000009 关云长 男 019 37
0000000010 罗纲 男 020 36
1 . 初始数据记录添加
2 . 开启MySQL的二进制日志功能
方法1:MySQL的配置文件的 [mysqld] 项中加入log-bin=filepath项,如log-bin=mysql-bin,然后重启mysqld服务
二进制日志的默认路径/usr/local/mysql/data/
方法2:启动Mysql时增加–log-bin=filepath参数
其中filepath要改为实际的二进制文件的路径
执行完后/usr/local/mysql/data/中会生成mysql-bin.000001日志文件
3 . 使用mysqldump命令进行备份,可对数据库或表进行备份
mysqldump –u root –p client user_info > client-userinfo.sql
mysqldump -u root -p --databases client > client.sql
4 . 插入新的数据,以模拟数据的增加或者变更
2018-5-9 11:10:29 插入张三
2018-5-9 11:13:10 插入李四
MySQL [(none)]> use client;
Database changed
MySQL [client]> insert into user_info values(‘0000000011’,‘张三’,‘男’,‘021’,‘62’);
Query OK, 1 row affected (0.00 sec)
MySQL [client]> insert into user_info values(‘0000000012’,‘李四’,‘女’,‘022’,‘78’);
Query OK, 1 row affected (0.00 sec)
MySQL [client]>
5 . 模拟误操作,删除user_info表
mysqldump –u root –p client user_info > client-userinfo.sql
6 . 执行完全恢复
[root@Mysql1 ~]# mysql -u root -p client < client-userinfo.sql
[root@Mysql1 ~]# mysql -u root -p
MySQL [(none)]> use client
Database changed
MySQL [client]> select * from user_info;
±-----------±----------±-------±------------±-------+
| 身份证 | 名 | 性别 | 用户ID号 | 资费 |
±-----------±----------±-------±------------±-------+
| 000000006 | 孙悟空 | 男 | 016 | 10 |
| 000000007 | 蓝精灵 | 女 | 017 | 91 |
| 000000008 | 姜姜 | 女 | 018 | 23 | 此时只有最原始的数据
| 000000009 | 关云长 | 男 | 019 | 37 |
| 0000000010 | 罗纲 | 男 | 020 | 36 |
±-----------±----------±-------±------------±-------+
5 rows in set (0.00 sec)
7 . 基于时间恢复张三的数据记录
[root@Mysql1 ~]# mysqlbinlog --stop-datetime=‘2018-5-9 11:10:30’ /usr/local/mysql/data/mysql-bin.000001 | mysql -u root -p
Enter password:
[root@Mysql1 ~]# mysql -u root -p
Enter password:
MySQL [(none)]> use client;
Database changed
MySQL [client]> select * from user_info;
±-----------±----------±-------±------------±-------+
| 身份证 | 名 | 性别 | 用户ID号 | 资费 |
±-----------±----------±-------±------------±-------+
| 000000006 | 孙悟空 | 男 | 016 | 10 |
| 000000007 | 蓝精灵 | 女 | 017 | 91 |
| 000000008 | 姜姜 | 女 | 018 | 23 |
| 000000009 | 关云长 | 男 | 019 | 37 |
| 0000000010 | 罗纲 | 男 | 020 | 36 |
| 0000000011 | 张三 | 男 | 021 | 62 |
±-----------±----------±-------±------------±-------+
6 rows in set (0.00 sec)
8 . 基于位置恢复到添加张三之前的数据记录
[root@Mysql1 ~]# mysqlbinlog --stop-position=‘5480’ /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p
Enter password:
[root@Mysql1 ~]# mysql -u root -p
Enter password:
MySQL [(none)]> use client;
Database changed
MySQL [client]> select * from user_info;
±-----------±----------±-------±------------±-------+
| 身份证 | 名 | 性别 | 用户ID号 | 资费 |
±-----------±----------±-------±------------±-------+
| 000000006 | 孙悟空 | 男 | 016 | 10 |
| 000000007 | 蓝精灵 | 女 | 017 | 91 |
| 000000008 | 姜姜 | 女 | 018 | 23 |
| 000000009 | 关云长 | 男 | 019 | 37 |
| 0000000010 | 罗纲 | 男 | 020 | 36 |
±-----------±----------±-------±------------±-------+
5 rows in set (0.00 sec)

本章总结
Mysql的备份方式
Mysql完全备份与恢复
Mysql增量备份与恢复

实验:增量备份与恢复
实验环境
某学校在进行期中考试,要求数据库管理员录入各班考试成绩。为保证数据的可靠性,数据库管理员在录入学生成绩需要做数据库备份。并且为了测试备份数据是否可用,模拟数据丢失故障,进行数据还原需求描述
姓名 班级 学号 语文 数学 英语 理综
张三 一班 20170822 110 105 92 235
李四 一班 20170820 95 115 110 260
王五 一班 20170818 95 103 108 270
赵六 一班 20170816 100 109 112 265

姓名 班级 学号 语文 数学 英语 理综
李宁 二班 20170824 92 98 105 235
陈铭 二班 20170826 111 107 96 204

姓名 班级 学号 语文 数学 英语 理综
付杰 二班 20170828 115 118 116 268
郭尚 二班 20170830 111 99 80 259
需求描述
在数据库表中,分三次录入学生考试成绩
首次录入成绩后,做该表的完全备份,后两次成绩的录入之后,分别作增量备份
模拟数据丢失,并使用增量备份分别基于位置和时间点恢复一班所有学生成绩与二班陈铭与付杰的成绩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值