备份就是为了防止原数据丢失,保证数据的安全。当数据库因为某些原因造成部分或 者全部数据丢失后,备份文件可以帮我们找回丢失的数据。因此,数据备份是很重要 的工作。
常见数据库备份的应用场景如下:
数据丢失应用场景:
- 人为操作失误造成某些数据被误操作
- 软件 BUG 造成部分数据或全部数据丢失
- 硬件故障造成数据库部分数据或全部数据丢失
- 安全漏洞被入侵数据恶意破坏
非数据丢失应用场景:
- 特殊应用场景下基于时间点的数据恢复
- 开发测试环境数据库搭建
- 相同数据库的新环境搭建
- 数据库或者数据迁移
根据备份的方法(是否需要数据库离线)可以将备份分为:
热备份可以在数据库运行中直接备份,对正在运行的数据库操作没有任何的影响,数
据库的读写操作可以正常执行。这种方式在 MySQL 官方手册中称为 Online Backup
(在线备份)。
冷备份必须在数据库停止的情况下进行备份,数据库的读写操作不能执行。这种备份
最为简单,一般只需要复制相关的数据库物理文件即可。这种方式在 MySQL 官方手
册中称为 Offline Backup(离线备份)。
温备份同样是在数据库运行中进行的,但是会对当前数据库的操作有所影响,备份时
仅支持读操作,不支持写操作。
- 按照备份后文件的内容,热备份又可以分为:
- 逻辑备份
- 裸文件备份
在 MySQL 数据库中,逻辑备份是指备份出的文件内容是可读的,一般是文本内容。
内容一般是由一条条 SQL 语句,或者是表内实际数据组成。如 mysqldump 和
SELECT * INTO OUTFILE 的方法。这类方法的好处是可以观察导出文件的内容,一
般适用于数据库的升级、迁移等工作。但其缺点是恢复的时间较长。
裸文件备份是指复制数据库的物理文件,既可以在数据库运行中进行复制(如
ibbackup、xtrabackup 这类工具),也可以在数据库停止运行时直接复制数据文
件。这类备份的恢复时间往往比逻辑备份短很多。
- 按照备份数据库的内容来分,备份又可以分为:
- 完全备份
- 部分备份
完全备份是指对数据库进行一个完整的备份,即备份整个数据库,如果数据较多会占 用较大的时间和空间。 部分备份是指备份部分数据库(例如,只备份一个表)
- 部分备份又分为:
- 增量备份
- 差异备份
增量备份需要使用专业的备份工具。指的是在上次完全备份的基础上,对更改的数据进行备份。也就是说每次备份只会备份自上次备份之后到备份时间之内产生的数据。 因此每次备份都比差异备份节约空间,但是恢复数据麻烦。
差异备份指的是自上一次完全备份以来变化的数据。和增量备份相比,浪费空间,但 恢复数据比增量备份简单。
优劣势对比
MySQL 中进行不同方式的备份还要考虑存储引擎是否支持,如 MyISAM 不支持热 备,支持温备和冷备。而 InnoDB 支持热备、温备和冷备。
一般情况下,我们需要备份的数据分为以下几种:
- 表数据
- 二进制日志、InnoDB
- 事务日志
- 代码(存储过程、存储函数、触发器、事件调度器)
- 服务器配置文件
建议的恢复策略:
完全+增量+二进制日志
完全+差异+二进制日志
下面是几种常用的备份工具:
- mysqldump:逻辑备份工具,适用于所有的存储引擎,支持温备、完全备份、部分备份、对于 InnoDB 存储引擎支持热备。
- cp、tar 等归档复制工具:物理备份工具,适用于所有的存储引擎、冷备、完全备份、部分备份。
- lvm2 snapshot:借助文件系统管理工具进行备份。
- mysqlhotcopy:名不副实的一个工具,仅支持 MyISAM 存储引擎。
- xtrabackup:一款由 percona 提供的非常强大的 InnoDB/XtraDB 热备工具,支持完全备份、增量备份。
1、先看通用查询日志看是否开启
SHOW VARIABLES LIKE '%general%';
显示OFF没有开启;
2、开启通用查询日志
SET GLOBAL general_log=1;
3、mkdir /backup/ #创建备份目录
4、#打包数据库文件。/var/lib/mysql为数据库文件存放目录
tar -zcvf /backup/mysql_all$(date +%F-%m-%S).tar.zip *
5、查看是否压缩成功
6、开启mysql服务,去删掉指定的数据库
查看数据库;
删除Class_Linux数据库
查看是否删除成功
7、停掉mysql服务,将之前打包的数据库文件压缩包解压到/var/lib/mysql
可以看到被删除的数据库恢复了
8、开启mysql服务,查看Class_Linux数据库是否恢复成功
恢复成功
1、导出特定表的结构 mysqldump -uroot -p -B 数据库名 --table 表名 > xxx.sql
mysqldump -uroot -p --databases Class_Linux > /backup/Class_Linux.sql
2、查看导出的文件
3、登录mysql,删除数据库
查看数据库
删除Class_Linux数据库
查看是否删除成功;
4、导入方法一:通过命令行恢复,(登陆的时候进行导入)
mysql -uroot -p < /backup/Class_Linux.sql
5、查看mysql,数据是否恢复成功
导入方法二:( 在mysql终端下执行)
在mysql终端下执行:
source /backup/Class_Linux.sql
1、查看表
2、flush刷新,生成新的二进制日志
mysqladmin -uroot -p flush-logs
3、查看二进制日志文件
show master status;
4、查找二进制日志文件
为binlog.000011
5、给students表插入新数据,并将表删除;
将binlog二进制日志文件导出;
查看是否导出成功;
7、注意,刷新生成的新的binlog.000011,只记录了刚才的添加数据和删除students表的操作,所以在恢复的时候,直接使用binlog.000011是不行的,他没有之间的students表,需要先根据之前的Class_Linux.sql将students表进行恢复,再使用binlog.000011二进制文件进行恢复
【直接导入二进制文件会报错】
①、需要现根据之前的Class_Linux.sql将students表进行恢复
查看students表,是没有我们之前添加的新的数据
②、将binlog.000011二进制文件导出成可以进行编辑的sql文件
mysqlbinlog binlog.000011 > /backup/new_students.sql
③找出我们之前删除students表的语句
将其注释后强制保存退出(为什么注释,因为不注释的话,相当于你之前通过Class_Linux.sql导入的students表,又会被删除,注释后它只保留了添加新数据的操作);
④导入到mysql【这个报错不影响】
再在mysql终端进行查看,发现成功了