2020-09-25
物理备份
直接备份数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同版本的MySQL
三种备份方式比较
1.完整备份(全量备份)
每次都将所有数据进行完整的备份(不论备份前有没有对数据库修改),备份后会清除文件的存档属性,方便日后增量备份和差异备份进行版本比较。
特点:占用空间大,备份速度慢,但恢复速度快,一次性恢复到位
2.增量备份(与上一次备份比较)
其工作机制就是备份上一次备份后有变化的文件(即添加了存档属性的文件),并把这些存档属性清除。
特点:备份体积小,速度快,但恢复时必须按备份的时间顺序将逐个备份版本进行恢复,因此恢复时间长
3.差异备份(与第一次完整备份比较)
每次都是将第一次完整备份之后所有修改过的文件进行备份,且不用清除文件的存档属性(但第一次完整备份后是需要清除存档属性的)
特点:占用空间比增量备份大,比完整备份小,恢复时只需恢复第一个备份的版本和最后一个版本即可,速度介于完备和增备之间
安装xtrabackup
[root@localhost ~]# wget http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
[root@localhost ~]# rpm -ivh percona-release-0.1-4.noarch.rpm
[root@localhost ~]# vim /etc/yum.repos.d/percona-release.repo
修改以下两条配置
[root@localhost xtrabackup]# yum -y install percona-xtrabackup-24.x86_64
完整备份+数据恢复
#创建备份目录
[root@localhost ~]# mkdir /xtrabackup
#完整备份的命令
[root@localhost ~]# innobackupex --user=root --password='123' --port=3306 --socket=/usr/local/mysqld/tmp/mysql.sock /xtrabackup #最后一行出现completed OK!说明成功
#查看备份目录是否产生备份文件
[root@localhost ~]# ls /xtrabackup/2020-09-25_14-33-49/
#数据恢复
1.停止数据库
[root@localhost ~]# systemctl stop mysqld
2.清除旧数据
[root@localhost ~]# rm -rf /var/lib/mysql/* (yum安装的数据存储目录)
[root@localhost ~]# rm -rf /usr/local/mysqld/data/* (源码安装的数据存放目录)
[root@localhost ~]# rm -rf /var/log/mysqld.log #可选操作
[root@localhost ~]# rm -rf /var/log/mysql-slow/slow.log #可选操作
3.验证恢复
[root@localhost ~]# innobackupex --apply-log /xtrabackup/2020-09-25_14-33-49/ #最后一行出现completed OK!说明成功
4.确认配置文件里关于数据存储目录的设置
[root@localhost ~]# vim /etc/my.cnf
datadir = /usr/local/mysqld/data
5.正式恢复数据
[root@localhost ~]# innobackupex --copy-back /xtrabackup/2020-09-25_14-33-49/
6.修改数据目录的属性
[root@localhost ~]# chown mysql.mysql /var/lib/mysql/* -R
7.启动数据库
[root@localhost ~]# systemctl start mysqld
8.登录数据库查看是否有数据
增量备份+数据恢复
假设周一做了全量备份,以下是周二,模拟有新数据的加入并做增量备份
#模拟数加入数据
mysql> create database db2;
mysql> use db2;
mysql> insert into t2 values(1,'dd'),(2,'ss');
#增量备份命令
[root@localhost ~]# innobackupex --user=root --password='123' --port=3306 --socket=/usr/local/mysqld/tmp/mysql.sock --incremental /root/ --incremental-basedir=/root/xbackup/2020-09-25_15-01-05/ #指定备份文件存放的路径(注意增量备份的文件不能和全量备份的文件放在同一目录,否则之后数据回滚会报错),然后指向上一次备份的文件
以下是模拟周三新增的数据和增量备份
mysql> insert into t2 values(3,'kk'),(4,'pp');
[root@localhost ~]# innobackupex --user=root --password='123' --port=3306 --socket=/usr/local/mysqld/tmp/mysql.sock --incremental /root/ --incremental-basedir=/root/xbackup/2020-09-25_16-04-21 #基于前一次备份的文件
恢复数据
1.停止数据库
[root@localhost ~]# systemctl stop mysqld
2.清理数据
(保险起见可以先把数据目录下的文件mv走,以防万一)
[root@localhost ~]# rm -rf /var/lib/mysql/* (yum装的)
[root@localhost ~]# rm -rf /usr/local/mysqld/data/* (源码装的)
3.依次回滚(从周一开始)
[root@localhost ~]# innobackupex --apply-log --redo-only /root/xbackup/2020-09-25_15-01-05 #周一的 全备
[root@localhost ~]# innobackupex --apply-log --redo-only /root/xbackup/2020-09-25_15-01-05 --incremental-dir=/root/2020-09-25_16-04-21 #周二的增量
[root@localhost ~]# innobackupex --apply-log --redo-only /root/xbackup/2020-09-25_15-01-05 --incremental-dir=/root/2020-09-25_16-26-04 #周三的增量
4.正式恢复数据
[root@localhost ~]# innobackupex --copy-back /root/xbackup/2020-09-25_15-01-05
5.修改属性
[root@localhost ~]# chown mysql.mysql /usr/local/mysqld/data/* -R
6.启动数据库
[root@localhost ~]# systemctl start mysqld
7.登录数据库查看数据是否恢复
差异备份+数据恢复
延续使用上面的数据,并模拟周四增加数据和做差异备份
#模拟增加数据
mysql> create database db3;
mysql> use db3
mysql> create table t3(id int,sex char(20));
mysql> insert into t3 values(1,'m'),(2,'f'),(3,'m');
#差异备份
[root@localhost ~]# innobackupex --user=root --password='123' --port=3306 --socket=/usr/local/mysqld/tmp/mysql.sock --incremental /root/cy --incremental-basedir=/root/xbackup/2020-09-25_15-01-05 #基于周一的全备,此操作备份了周一到周四期间数据库所有修改过的数据(增删改)
#数据恢复
1.停止数据库
[root@localhost ~]# systemctl stop mysqld
2.清理数据
(保险起见可以先把数据目录下的文件mv走,以防万一)
[root@localhost ~]# rm -rf /var/lib/mysql/* (yum装的)
[root@localhost ~]# rm -rf /usr/local/mysqld/data/* (源码装的)
3.重演回滚
[root@localhost ~]# innobackupex --apply-log --redo-only /root/xbackup/2020-09-25_15-01-05/ #回滚全量的
[root@localhost ~]# innobackupex --apply-log --redo-only /root/xbackup/2020-09-25_15-01-05/ --incremental-dir=/root/cy/2020-09-25_17-27-17/ #回滚周四的差异备份
4.正式恢复数据
[root@localhost ~]# innobackupex --copy-back /root/xbackup/2020-09-25_15-01-05/
5.修改属性
[root@localhost ~]# chown mysql.mysql /usr/local/mysqld/data/* -R
6.启动数据库
[root@localhost ~]# systemctl start mysqld
7.登录数据库查看数据完整性