Percona-xtrabackup工具的两个常用命令:
1.xtrabackup命令:只支持InnoDB和XtraDB存储引擎的数据库非阻塞地备份
2.innobackupex命令:通过perl封装了一层xtrabackup,对MyISAM的备份通过加表读锁的方式实现。
安装Percona-xtrabackup工具
安装Percona的yum拓展仓库:
[root@linux ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
启动存储库:
[root@linux ~]# percona-release enable-only tools release
安装2.4版本的xtrabackup:
yum -y install percona-xtrabackup-24
创建备份数据库的用户:
mysql> grant reload,lock tables,replication client,process,super on *.* to userbak@'localhost' identified by 'user123';
#创建用户userbak,密码user123,授权权限:reload,lock tables,replication client,process,super
刷新权限:
mysql> flush privileges;
创建备份文件存储目录:
[root@centos02 ~]# mkdir /data/mysqlbak
全量备份与恢复mysql数据库
备份:
[root@centos02 ~]# innobackupex --defaults-file=/etc/my.cnf --user=userbak --password=user123 /data/mysqlbak -S /tmp/mysql.sock
#由于创建授权userbak用户时定义的host为localhost,所以需要使用-S参数指定socket文件,如果用户host授权为127.0.0.1或实际IP地址,需要使用-h参数指定host
查看备份的文件:
[root@centos02 ~]# ls /data/mysqlbak/2019-10-26_14-42-29/
backup-my.cnf ibdata1 mysql performance_schema test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
#存放备份文件的目录是根据备份时间自动命名
对比mysql目录与备份目录大小:
[root@centos02 ~]# du -sh /data/mysql
111M /data/mysql
[root@centos02 ~]# du -sh /data/mysqlbak/
15M /data/mysqlbak/
#可以看出通过strabackup工具备份非常节省磁盘空间
恢复:
停止mysql服务:
[root@centos02 ~]# service mysql stop
删除datadir目录中的文件:
[root@centos02 ~]# rm -rf /data/mysql/*
说明:
因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。
使相关数据文件保持一致性:
[root@centos02 ~]# innobackupex --apply-log /data/mysqlbak/2019-10-26_14-42-29/
#在实现此步的准备工作过程中,如果服务器空闲内存够多,可以使用–user-memory参数来指定内存,使其加快速度,默认100M
恢复:
[root@centos02 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysqlbak/2019-10-26_14-42-29/
更改恢复后的文件的属主和属组:
[root@centos02 ~]# chown -R mysql:mysql /data/mysql
#接下来启动mysql服务即可
增量备份与恢复mysql数据库
注意:增量备份的前提是得有一次全备
第一次增量备份:
[root@centos02 ~]# ls /data/mysqlbak/
2019-10-26_14-42-29
[root@centos02 ~]# innobackupex --user=userbak --password=user123 --incremental /data/mysqlbak/ --incremental-basedir=/data/mysqlbak/2019-10-26_14-42-29 -S /tmp/mysql.sock
说明:
增量备份需要使用- -incremental 指定增量备份存放路径
使用- -incremental-basedir 指定全量备份的路径,也就是说基于全量备份做增量
第二次增量备份:
[root@centos02 ~]# ls /data/mysqlbak/
2019-10-26_14-42-29 2019-10-26_16-31-37
[root@centos02 ~]# innobackupex --user=userbak --password=user123 --incremental /data/mysqlbak/ --incremental-basedir=/data/mysqlbak/2019-10-26_16-31-37 -S /tmp/mysql.sock
说明:
此次- -incremental-basedir 需要指定上一次增量备份的目录,也就是说基于上一次增量做增量备份
增量备份的恢复:
当前备份目录包含一个全量备份和两个增量备份:
[root@centos02 ~]# ls /data/mysqlbak/
2019-10-26_14-42-29 2019-10-26_16-31-37 2019-10-26_16-38-00
停止mysql服务:
[root@centos02 ~]# service mysql stop
清空mysql数据存放目录的文件:
[root@centos02 ~]# rm -rf /data/mysql/*
准备全量:
[root@centos02 ~]# innobackupex --apply-log --redo-only /data/mysqlbak/2019-10-26_14-42-29/
准备第一次增量:
[root@centos02 ~]# innobackupex --apply-log --redo-only /data/mysqlbak/2019-10-26_14-42-29/ --incremental-dir=/data/mysqlbak/2019-10-26_16-31-37
准备第二次增量(最后一次增量不加- -redo-only):
[root@centos02 ~]# innobackupex --apply-log /data/mysqlbak/2019-10-26_14-42-29/ --incremental-dir=/data/mysqlbak/2019-10-26_16-38-00
再次准备全量(不加 - -redo-only):
[root@centos02 ~]# innobackupex --apply-log /data/mysqlbak/2019-10-26_14-42-29/
注意:准备最后一次增量备份和再次准备全量备份时,不加- -redo-only
恢复:innobackupex --copy-back /全量备份目录
[root@centos02 ~]# innobackupex --copy-back /data/mysqlbak/2019-10-26_14-42-29/
查看datadir目录:
[root@centos02 ~]# ls /data/mysql
ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mysql performance_schema test test_mysql xtrabackup_info xtrabackup_master_key_id
#数据文件已恢复
更改恢复的数据文件属主和属组:
[root@centos02 ~]# chown -R mysql:mysql /data/mysql
#接下来启动mysql服务即可
补充:
1.如果每一次的增量备份是基于前一次的增量备份来做增量备份,那么在恢复操作中准备的时候就需要准备第一次全备和每一次的增备
2.如果每一次的增量备份是基于第一次的全备,那么在恢复的时候只需要准备第一次的全备和最后一次增备
MariaDB10.3.x以上版本的全量/增量备份与恢复
MariaDB10.3.x及以上的版本用Percona XtraBackup工具会有问题,原因是MariaDB10.3以上版本的redo日志格式和之前不同了。
解决方案:使用mariabackup,它是MariaDB提供的一个开源工具,用于对InnoDB,Aria和MyISAM表进行物理在线备份,这个工具是基于Percona的XtraBackup(版本2.3.8)的解决方案。
全量备份与恢复:
备份:
[root@linux ~]# mariabackup --defaults-file=/etc/my.cnf --backup --user=bakuser --password=bak123 --target-dir /data/mysqlbak/20191026
#与xtrabackup工具不同的是Mariabackup备份文件存放目录需要自己定义,而xtrabackup工具会自动根据时间生成,只需指定/data/mysqlbak目录即可
恢复:
1.停止服务并清空datadir:
[root@linux ~]# service mysql stop
Redirecting to /bin/systemctl stop mysql.service
[root@linux ~]# rm -rf /data/mysql/*
2.准备:
[root@linux ~]# mariabackup --prepare --target-dir /data/mysqlbak/20191026/
3.开始恢复:
[root@linux ~]# mariabackup --copy-back --target-dir /data/mysqlbak/20191026/
4.更改恢复文件的属主和属组:
[root@linux ~]# chown -R mysql:mysql /data/mysql
#成功,接下来即可启动服务了
增量备份与恢复:
注意:增量备份的前提得需要有一次全备
第一次增备:
[root@linux ~]# mariabackup --backup --user=bakuser --password=bak123 --target-dir /data/mysqlbak/20191026_inc1 --incremental-basedir /data/mysqlbak/20191026/
# - -target-dir 定义增备文件存放路径,- -incremental-basedir 指定基于增备的全量目录
第二次增备:
[root@linux ~]# mariabackup --backup --user=bakuser --password=bak123 --target-dir /data/mysqlbak/20191026_inc2 --incremental-basedir /data/mysqlbak/20191026_inc1
# - -target-dir 定义第二次增备文件存放路径,- -incremental-basedir 指定基于第二次增备的第一次增备目录
恢复:
停止服务并清空datadir:
[root@linux ~]# service mysql stop
Redirecting to /bin/systemctl stop mysql.service
[root@linux ~]# rm -rf /data/mysql/*
准备全量备份:
[root@linux ~]# mariabackup --prepare --target-dir /data/mysqlbak/20191026 --apply-only
准备第一次增备:
[root@linux ~]# mariabackup --prepare --target-dir /data/mysqlbak/20191026 --incremental-dir /data/mysqlbak/20191026_inc1 --apply-only
准备第二次增备:
[root@linux ~]# mariabackup --prepare --target-dir /data/mysqlbak/20191026 --incremental-dir /data/mysqlbak/20191026_inc2 --apply-only
开始恢复:
[root@linux ~]# mariabackup --copy-back --target-dir /data/mysqlbak/20191026
变更恢复的数据文件的属主和属组:
[root@linux ~]# chown -R mysql:mysql /data/mysql
#完成后启动mysql即可
补充:
与xtrabackup不同的事,Mariabackup的每一次增备都基于上一次的增备的情况下,恢复时准备操作每一次增备都可以直接基于主备目录,不需要基于上一次的增备目录