MySQL物理备份

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
修改以下两条配置
ff2.png
[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.登录数据库查看数据完整性

你可能感兴趣的:(MySQL物理备份)