mydumper备份恢复
Mydumper是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具。
mydumper下载地址:https://launchpad.net/mydumper
mydumper安装
1、安装mydumper依赖的包
[root@localhost ~]# yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel zlib cmake gcc-c++ gcc
2、上传软件包,解压缩
[root@localhost soft]# gunzip mydumper-0.6.2.tar.gz
[root@localhost soft]# tar -xvf mydumper-0.6.2.tar
3、安装mydumper
[root@localhost ~]# cd /u01/mydumper-0.6.2/
[root@localhost mydumper-0.6.2]# cmake .
[root@localhost mydumper-0.6.2]# make
[root@localhost mydumper-0.6.2]# make install
4、添加环境变量
[root@localhost ~]# vi /etc/profile
--添加:
export PATH=$PATH:/usr/local/mysql/bin:/u01/mydumper/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib
[root@localhost ~]# source /etc/profile
备份数据库
查看帮助信息:
[root@localhost ~]# mydumper --help
备份sbtest表,默认4个线程备份(注意备份语句中,用户名、密码要与选项之间加空格:-u root -p root):
[root@localhost ~]# mydumper -B test -T sbtest -o /u01/databak/mydumper/ -u root -p root -h 192.168.100.111 -P 3306
[root@localhost mydumper]# ls -l
total 7076
-rw-r--r--. 1 root root 129 Apr 26 17:19 metadata
-rw-r--r--. 1 root root 358 Apr 26 17:19 test.sbtest-schema.sql
-rw-r--r--. 1 root root 7235617 Apr 26 17:19 test.sbtest.sql
[root@localhost ~]# mydumper -B test -o /u01/databak/mydumper/ -u root -p root -h 192.168.100.111 -P 3306
--如果不指定备份哪个表,就会备份所有的表
[root@localhost mydumper]# ll
total 7092
-rw-r--r--. 1 root root 129 Apr 26 17:22 metadata
-rw-r--r--. 1 root root 358 Apr 26 17:22 test.sbtest-schema.sql
-rw-r--r--. 1 root root 7235617 Apr 26 17:22 test.sbtest.sql
-rw-r--r--. 1 root root 153 Apr 26 17:22 test.t1-schema.sql
-rw-r--r--. 1 root root 156 Apr 26 17:22 test.t1.sql
-rw-r--r--. 1 root root 272 Apr 26 17:22 test.t-schema.sql
-rw-r--r--. 1 root root 145 Apr 26 17:22 test.t.sql
恢复表
mysql> drop table sbtest;
Query OK, 0 rows affected (0.11 sec)
[root@localhost ~]# myloader -d /u01/databak/mydumper/ -B test -u root -p root -h 192.168.100.111 -P 3306
** (myloader:8060): CRITICAL **: Error restoring test.t from file test.t-schema.sql: Table ‘t‘ already exists
** (myloader:8060): CRITICAL **: Error restoring test.t1 from file test.t1-schema.sql: Table ‘t1‘ already exists
** (myloader:8060): CRITICAL **: Error restoring test.t from file test.t.sql: Duplicate entry ‘2‘ for key ‘PRIMARY‘
mysql> select count(*) from sbtest;
+----------+
| count(*) |
+----------+
| 100018 |
+----------+
1 row in set (0.01 sec)
xtrabackup全库备份
对于innodb,xtrabackup基于innodb的crash-recovery功能进行备份。
crash-recovery是这样的:innodb维护了一个redo log,又称为transaction log,也叫事务日志,它包含了innodb数据的所有改动情况。innodb启动时会先去检查datafile和事务日志,然后应用所有已提交的事务并回滚所有未提交的事务。
xtrabackup在备份时并不锁定表,而是一页一页的复制innodb的数据,于此同时,xtrabackup还有另外一个线程监视着事务日志, 一旦log发生变化,就把变化过的log pages复制走(因为事务日志文件大小有限,写满之后,就会重新写到另一个日志中)
xtrabackup采用了其内置的innodb库以read-write模式打开innodb的数据文件,然后每次读写1MB(1MB/16kb=64page)的数据,一页一页的遍历,同时用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果正常则进行复制。
由于xtrabackup其内置的innodb库打开文件的时候是rw的,所以运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。
由于xtrabackup要从文件系统中复制大量的数据,所以它尽可能的使用posix_fadvise(),来告诉OS不要缓存读取到的数据(因为这些数据不会重用到了),从而提升性能。如果要缓存的话,大量的数据会对OS的虚拟内存造成很大的压力。
由于不锁表,所以复制出来的数据是不一致的,数据的一致性是在恢复的时候使用crash-recovery进行实现的。
对于myisam存储引擎的表,xtrabackup还是先锁定所有的表,然后复制所有文件。
增量备份的原理:
在完整备份和增量备份文件中都有一个文件xtrabackup_checkpoint会记录备份完成时检查点的LSN,在进行新的增量备份时,xtrabackup会比较表空间中每页的LSN是否大于上次备份完成的LSN,如果是,则备份该页,并记录当前检查点的LSN。
xtrabackup安装
下载地址:https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
[root@localhost soft]# ls -l
-rw-r--r--. 1 root root 64880640 Apr 26 20:14 Percona-XtraBackup-2.4.22-rc99a781-el7-x86_64-bundle.tar
-rw-rw-r--. 1 root root 7992904 Mar 10 17:56 percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
-rw-rw-r--. 1 root root 39827664 Mar 10 17:56 percona-xtrabackup-24-debuginfo-2.4.22-1.el7.x86_64.rpm
-rw-rw-r--. 1 root root 17055664 Mar 10 17:56 percona-xtrabackup-test-24-2.4.22-1.el7.x86_64.rpm
安装依赖包:
[root@localhost ~]# yum install perl-DBD-mysql
[root@localhost ~]# yum install libev*
--http://rpmfind.net/linux/rpm2html/search.php?query=libev&submit=Search+...&system=&arch=
[root@localhost soft]# wget http://rpmfind.net/linux/centos/7.9.2009/extras/x86_64/Packages/libev-4.15-7.el7.x86_64.rpm
[root@localhost soft]# rpm -ivh libev-4.15-7.el7.x86_64.rpm
1、安装xtrabackup的rpm包:
[root@localhost soft]# rpm -ivh percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm
[root@localhost soft]# rpm -ivh percona-xtrabackup-24-debuginfo-2.4.22-1.el7.x86_64.rpm
全库备份
执行以下命令备份:
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --no-timestamp --user root --password root --socket=/tmp/mysql.sock /u01/databak/xtrabackup/full_20210426_bak
--参数:--no-timestamp,不使用默认的时间格式
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -u root -p root -H 192.168.100.111 -P 3306 /u01/bakdata/xtrabackup/full_20210629
查看备份文件:
[root@localhost ~]# ls -l /u01/databak/xtrabackup/
total 0
drwxr-x---. 5 root root 202 Apr 26 20:52 full_20210426_bak
[root@localhost ~]# cd /u01/databak/xtrabackup/full_20210426_bak
[root@localhost full_20210426_bak]# ls -l
total 1048604
-rw-r-----. 1 root root 484 Apr 26 20:52 backup-my.cnf
-rw-r-----. 1 root root 1073741824 Apr 26 20:52 ibdata1
drwxr-x---. 2 root root 4096 Apr 26 20:52 mysql
drwxr-x---. 2 root root 4096 Apr 26 20:52 performance_schema
drwxr-x---. 2 root root 124 Apr 26 20:52 test
-rw-r-----. 1 root root 22 Apr 26 20:52 xtrabackup_binlog_info
-rw-r-----. 1 root root 141 Apr 26 20:52 xtrabackup_checkpoints
-rw-r-----. 1 root root 575 Apr 26 20:52 xtrabackup_info
-rw-r-----. 1 root root 2560 Apr 26 20:52 xtrabackup_logfile
不加--no-timestamp参数备份:
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock /u01/databak/xtrabackup/
查看备份:
[root@localhost xtrabackup]# pwd
/u01/databak/xtrabackup
[root@localhost xtrabackup]# ls -l
total 0
drwxr-x---. 5 root root 202 Apr 26 21:00 2021-04-26_21-00-53
drwxr-x---. 5 root root 202 Apr 26 20:52 full_20210426_bak
--就会产生一个默认格式的文件夹,所以建议使用--no-timestamp参数,自己定义备份目录的名称格式
基于全库备份的恢复
删除一个库:
mysql> drop database test;
Query OK, 4 rows affected (0.09 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
使用备份文件进行恢复:
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --apply-log /u01/databak/xtrabackup/full_20210426_bak/
查看数据库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
--并没有恢复
需要停止数据库,复制xtrabackup备份的文件夹:
[root@localhost ~]# pkill mysql
[root@localhost ~]# ps -ef|grep mysql
root 9026 2144 0 21:17 pts/1 00:00:00 grep --color=auto mysql
[root@localhost ~]# cd /u01/data
[root@localhost data]# mv mysql mysql_old
[root@localhost data]# mkdir mysql
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysq.sock --copy-back /u01/databak/xtrabackup/full_20210427/
--或者更直接的方式:
[root@localhost data]# cp -r /u01/databak/xtrabackup/full_20210426_bak /u01/data/mysql
[root@localhost data]# chown mysql:mysql -R /u01/data/mysql
启动数据库,查看数据是否恢复:
[root@localhost ~]# mysqld_safe --defaults-file=/etc/my.cnf &
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> use test;
mysql> select count(*) from sbtest;
+----------+
| count(*) |
+----------+
| 100018 |
+----------+
1 row in set (0.06 sec)
--数据已恢复
xtrabackup增量备份
示例,周三全备,模拟业务变化,周四插入数据并增量备份,周五删除数据并增量备份。
周三全备:
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --no-timestamp /u01/databak/xtrabackup/full_all_20210426
周四插入数据,并增量备份:
mysql> insert into t select 4;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into t select 5;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from t;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-basedir=/u01/databak/xtrabackup/full_all_20210426 /u01/databak/xtrabackup/full_incr_20210426
--增量备份需要指明参数,指明在哪个全备的基础上进行增备
周五执行删除操作,再进行增量备份:
mysql> delete from t where id<=3;
Query OK, 3 rows affected (0.01 sec)
mysql> select * from t;
+------+
| id |
+------+
| 4 |
| 5 |
+------+
2 rows in set (0.00 sec)
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-basedir=/u01/databak/xtrabackup/full_incr_20210426 /u01/databak/xtrabackup/full_incr_20210427
--需要添加参数指明增量备份,并且在增量备份的基础上再进行增量备份(根据备份目录指明)。
查看备份:
[root@localhost xtrabackup]# ls -l
total 0
drwxr-x---. 5 root root 202 Apr 26 21:55 full_all_20210426
drwxr-x---. 5 root root 228 Apr 26 22:00 full_incr_20210426
drwxr-x---. 5 root root 228 Apr 26 22:07 full_incr_20210427
从备份信息可以看出备份类型:
[root@localhost xtrabackup]# cd full_all_20210426
[root@localhost full_all_20210426]# ls
backup-my.cnf mysql test xtrabackup_checkpoints xtrabackup_logfile
ibdata1 performance_schema xtrabackup_binlog_info xtrabackup_info
[root@localhost full_all_20210426]# cat xtrabackup_checkpoints
backup_type = full-backuped --指出了备份类型是全库备份
from_lsn = 0
to_lsn = 123881427
last_lsn = 123881427
compact = 0
recover_binlog_info = 0
flushed_lsn = 123881427
针对增备的恢复
增量备份的恢复:完整全备份+增量备份+增量备份+binlog
增量备份完整后,又进行了插入操作,然后表被误删除:
mysql> insert into t select 6;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from t;
+------+
| id |
+------+
| 4 |
| 5 |
| 6 |
+------+
3 rows in set (0.00 sec)
mysql> drop table t;
Query OK, 0 rows affected (0.02 sec)
现在需要恢复表t。
1、先进行全备的恢复,注意参数--redo-only,只进行前滚操作,因为还有后续的增量备份没有恢复。不加--redo-only代表恢复完成,不进行增量的恢复
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --scoket=/tmp/mysql.sock --apply-log --redo-only /u01/databak/xtrabackup/full_all_20210426/
2、进行增量备份的恢复,两个目录,第一个是全备路径,第二个是增量备份的路径
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --apply-log --redo-only /u01/databak/xtrabackup/full_all_20210426 --incremental-dir=/u01/databak/xtrabackup/full_incr_20210426
3、进行增量备份的恢复,两个目录,第一个仍然是全备路径,第二个是后续增量备份的路径
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --apply-log /u01/databak/xtrabackup/full_all_20210426 --incremental-dir=/u01/databak/xtrabackup/full_incr_20210427
其实相当于,把数据都恢复到全备路径下。
4、再进行一次全备的恢复
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --apply-log /u01/databak/xtrabackup/full_all_20210426/
5、替换mysql目录,注意权限
[root@localhost ~]# pkill mysql
[root@localhost ~]# mv /u01/data/mysql /u01/data/mysql_old1
[root@localhost ~]# cp -r /u01/databak/xtrabackup/full_all_20210426/ /u01/data/mysql
[root@localhost ~]# chown mysql:mysql -R /u01/data/mysql
5、启动数据库,验证
[root@localhost ~]# mysqld_safe --defaults-file=/etc/my.cnf &
mysql> use test
mysql> select * from t;
+------+
| id |
+------+
| 4 |
| 5 |
+------+
2 rows in set (0.00 sec)
--可以看到,部分业务数据已恢复
使用binlog追加数据
以上,无论是全备恢复还是增量备份的恢复,都只能恢复到innobackupex完成时的数据,若想继续恢复之后的数据,需要根据binlog日志,追加。
使用mysqlbinlog方式将日志追加到最新时刻:
[root@localhost ~]# mysqlbinlog --start-position=120 /u01/data/mysql/mysql-bin.000001 | mysql -uroot -proot
以上命令中,可以只指定开始的position号。开始的position号和binlog文件名称,从全备的文件中查找:
[root@localhost ~]# cat /u01/databak/xtrabackup/full_20210427/xtrabackup_binlog_info
mysql-bin.000001 120
附件列表