一、MySQL完全备份与恢复
1.数据库备份的重要性
- 提高系统的高可用性和灾难可恢复性
- 在生产环境中,数据的安全性至关重要
- 任何数据的丢失都可能产生严重的后果
- 在使用数据库的过程中,有多种原因造成数据的丢失:
①程序错误
②人为错误:误操作或被攻击
③磁盘故障
④灾难 :火灾、地震和盗窃
2.数据库备份的分类
2.1 物理备份
- 冷备份 (脱机备份) :是在关闭数据库的时候进行的
- 热备份 (联机备份) :数据库处于运行状态,依赖于数据库的日志文件
- 温备份 :数据库锁定表格(不可写入但可读)的状态下进行备份操作
2.2 逻辑备份
-
完全备份:每次对数据进行完整备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长
-
差异备份:备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。恢复数据时只需要恢复上次的完全备份与最佳的一次差异备份
-
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
备份方式 | 完全备份 | 差异备份 | 增量备份 |
---|---|---|---|
完全备份时的状态 | 表1、表2 | 表1、表2 | 表1、表2 |
第一次添加内容 | 创建表3 | 创建表3 | 创建表3 |
备份内容 | 表1、表2、表3 | 表3 | 表3 |
第二次添加内容 | 创建表4 | 创建表4 | 创建表4 |
备份内容 | 表1、表2、表3、表4 | 表3、表4 | 表4 |
3.MySQL完全备份与恢复
3.1 使用tar打包文件夹备份
打包前应关闭数据库,防止出现数据丢失的错误
[root@localhost mysql]# tar -jcf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/ //数据库占用空间较大,可用xz格式压缩
[root@localhost mysql]# ls /opt/
mysql-2021-07-13.tar.xz
[root@localhost mysql]# du -sh data/ //压缩前大小
134M data/
[root@localhost mysql]# du -sh /opt/mysql-2021-07-13.tar.xz //压缩后大小
852K /opt/mysql-2021-07-13.tar.xz
如果数据库文件损坏数据丢失,可以直接解压备份文件
3.2 使用mysqldump工具备份
3.2.1 备份test库
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql
[root@localhost ~]# mysqldump -uroot -p123123 --databases test > /bak/test-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# cat /bak/test-bak.sql
3.2.2 备份test库下test01表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
[root@localhost ~]# mysqldump -uroot -p123123 test test01 > /bak/test01-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
3.2.3 备份所有库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
[root@localhost ~]# mysqldump -uroot -p123123 --all-databases > /bak/all-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
3.2.4 只备份test库下test01表的结构
[root@localhost ~]# mysqldump -uroot -p123123 -d test test01 > /bak/test01-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# cat /bak/test01-bak.sql
3.3 MySQL完全恢复
3.3.1 source命令恢复整库
3.3.2 mysql命令整库恢复
因为库被删了,需要先创建库再进行恢复,否则会报错
3.3.3 source恢复表
3.3.4 mysql命令恢复表
[root@localhost ~]# mysql -uroot -p123123 test < /bak/test01-bak.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
二、MySQL增量备份与恢复
1.增量备份的特点
-
一般恢复
将所有备份的二进制日志内容全部恢复 -
基于位置恢复
数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
发生错误节点之前的一个节点,上一次正确操作的位置点停止 -
基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
在错误时间点停止,在下一个正确时间点开始
2.实现增量备份
2.1 开启二进制日志功能
二进制日志(binlog)有3种不同的记录格式: STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
-
STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中 -
ROW(基于行)
只记录变动的记录,不记录sql的上下文环境 -
MIXED 推荐使用
一般的语句使用statement,函数使用ROW方式存储。
2.2 重启服务,查看二进制文件内容
2.3 进行完全备份并更新二进制日志
[root@localhost data]# mysqldump -uroot -p123123 test > /opt/test_all_$(date +%F).sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]# mysqladmin -u root -p flush-logs
Enter password:
[root@localhost data]#
2.4 插入新数据,模拟数据的增加并再次生成新的二进制日志
3.实现增量恢复
3.1 删除表test1
3.2 基于二进制日志文件恢复
[root@localhost ~]# mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
Enter password:
[root@localhost ~]#
3.3 查看test库
3.4 断点恢复
总结
从物理与逻辑的角度,备份分为物理备份与逻辑备份
从数据库的备份策略角度,备份可分为完全备份、差异备份、增量备份
一周一次的全备,全备的时间需要在不提供业务的时间区间进行
增量:3天/2天/1天一次增量备份
差异:选择特定的场景进行备份