在科技迅速发展的今天,我们每个人都生活在大数据时代,谁掌握的数据越多,就越能了解消费者的需求,也就更能拥有更好的发展前景,因此数据变得很重要。这时数据的备份就不可缺少了。今天我们就来谈一下mysql数据的备份与恢复。
数据备份按业务划分可分为:完全备份,增量备份,差异备份。
1. 完全备份(Full Backup)
所谓全备份就是对整个数据库的数据和数据结构进行备份。这种备份方式的好处就是很直观,容易被人理解。而且当发生数据丢失的灾难时,只要用灾难之前的备份文件,就可以恢复丢失的数据。然而它也有不足之处:首先由于每天都对系统进行完全备份,因此在备份数据中有大量是重复的。这些重复的数据占用了大量的空间,这对用户来说就意味着增加成本;其次,由于需要备份的数据量相当大,因此备份所需时间较长。对于那些业务繁忙,备份窗口时间有限的单位来说,选择这种备份策略无疑是不明智的。
2、增量备份(IncrementalBackup)
就是每次备份的数据只是相当于上一次备份后增加的和修改过的数据。这种备份的优点很明显:没有重复的备份数据,即节省空间,又缩短了备份时间。但它的缺点在于当发生灾难时,恢复数据比较麻烦。举例来说,如果系统在星期四的早晨发生故障,丢失大批数据,那么现在就需要将系统恢复到星期三晚上的状态。这时管理员需要首先找出星期一的那份完全备份数据进行系统恢复,然后再找出星期二的数据来恢复星期二的数据,然后在找出星期三的数据来恢复星期三的数据。很明显这比第一种策略要麻烦得多。另外这种备份可靠性也差。在这种备份下,各备份数据间的关系就象链子一样,一环套一环,其中任何一个备份数据出了问题都会导致整条链子脱节。
3、差异备份(DifferentialBackup)
就是每次备份的数据是相对于上一次全备份之后新增加的和修改过的数据。管理员先在星期一进行一次系统完全备份;然后在接下来的几天里,管理员再将当天所有与星期一不同的数据(新的或经改动的)备份到磁带上。
按方式划分:可分为热备、温备、冷备
热备份(Hot Backup)是指在数据库运行中直接备份,对正在运行的数据库没有任何影响。
冷备份(Cold Backup)是指在数据库停止的情况下进行备份,这种备份最为简单,一般只需要拷贝相关的数据库物理文件即可。
温备份(Warm Backup)备份同样是在数据库运行时进行,但是会对当前数据库的操作有所影响,例如加一个全局读锁以保证备份数据的一致性。
mysqldump: 逻辑备份工具,适用于所有存储引擎,可用于温备,能实现完全备份,部分备份;对InnoDB存储引擎支持热备;cp, tar等文件系统工具:物理备份工具,适用于所有存储引擎;用于冷备,能实现完全备份,部分备份;
mysqldump+binlog
命令的语法格式
mysqldump [OPTIONS] database [tables]:备份单个库,或库指定的一个或多个表
mysqldump [OPTIONS] --databases [OPTIONS]DB1 [DB2 DB3...]:备份一个或多个库
mysqldump [OPTIONS] --all-databases[OPTIONS]:备份所有库
mysqldump+binlog
其他选项
-x, --lock-all-tables:锁定所有表
-l, --lock-tables:锁定备份的表
--single-transaction:启动一个大的单一事务实现备份
-C, --compress:压缩传输
-E, --events:备份指定库的事件调度器
-R, --routines:备份存储过程和存储函数
--triggers:备份触发器
--master-data={0|1|2}
0:不记录
1:记录CHANGE MASTER TO语句;此语句未被注释
2:记录为注释语句
-F,--flush-logs:锁定表之后执行flushlogs命令
实战训练
1、 准备备份目录
mkdir -pv /backup/binlog
2、 准备备份数据库及表
3、 进行完整备份
mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 >/backup/‘data +%F_%T‘-all.sql
查看备份数据:ls /backup/
4、 向表中插入数据
5、 进行增量备份,备份二进制日志
mysqlbinlog --start-position=245 --stop-position=440 /var/log/mariadb/mariadb_bin.000004 > /backup/‘data +%F_%T‘-all.sql
6、 继续插入数据,在没备份的情况下删除数据库,模拟误操作
7、数据恢复,由于最后我们没有备份就删除了数据库,所以我们首先需要保护最后的二进制日志,查看删除操作之前的position值
mysqlbinlog /mydata/data/mysql-bin.000015
8 、将最后操作的二进制日志备份
mysqlbinlog --stop-position=630 /var/lib/mysql/mysql_bin.000004 > /backup/binlog/binlog-`date +%F_%T`.sql
查看备份的日志:ls /backup/binlog/
9、导入之前的所有备份
mysql < /backup/2017.....-all.sql 完全备份
mysql < /backup/2017......sql 增量备份
mysql < /backup/2017 .......sql 误操作之前的备份
10、查看数据库及数据
lvm2快照+binlog
LVM 快照简单来说就是将所快照源分区一个时间点所有文件的元数据进行保存,如果源文件没有改变,那么访问快照卷的相应文件则直接指向源分区的源文件,如果源文件发生改变,则快照卷中与之对应的文件不会发生改变。快照卷主要用于辅助备份文件。
实验
1 、添加硬盘,并划分磁盘类型为lvm 类型
在设置里添加硬盘以后,要使其写入内核,可以用 echo ‘- - -‘/sys/class/scsi_host/host0/scan
2 、partx -a/dev/sdb 使内核识别新磁盘
3 、pvcreate/dev/sdb1 添加物理卷
4 、vgcreatemyvg /dev/sdb1 添加卷组
5 、 lvcreate -nmydata -L 5G myvg 添加逻辑卷
6 、mkfs.ext4/dev/mapper/myvg-mydata 格式化逻辑卷
7 、挂载mount/dev/mapper/myvg-mydata /lvm_data 使用,挂载点若没有,要提前创建
8 、修改Mysql 配置,使得数据文件在逻辑卷上 datadir=/lvm_data
修改文件:vim /etc/my.cnf
9 、service mysqld restart 启动Mysql 服务
10 、 创建数据库,进行操作
11 、mysql>FLUSH TABLES WITH READ LOCK; # 锁定表
12 、lvcreate -L1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata # 创建快照卷Logicalvolume "mydata-snap" created.
13 、mysql>UNLOCK TABLES; # 解锁所有表
14 、 mount/dev/myvg/mydata-snap /lvm_snap/ # 挂载snap
15 、tar cvf/tmp/mysqlback.tar ./* # 打包物理备份
16 、umount/lvm_snap/ # 卸载snap
17 、lvremovemyvg mydata-snap # 删除snap
18 、删除mysql 数据 rm -rf/lvm_data/*
19 、解压恢复删除数据tar xvf /tmp/mysqlback.tar ./
20 、验证数据库数据是否正确恢复