percona xtrabackup 学习总结

1. 安装版本选择

官网:https://www.percona.com/downloads/

Percona XtraBackup 8.0       只支持MySQL 8.0的版本

Percona XtraBackup 2.4      支持MySQL 5.11 , 5.5, 5.6 和5.7的版本

 

2. 安装

要先安装依赖包,否则会报错缺少依赖包 (使用root用户安装)

yum install -y perl-DBD-MySQL

rpm -ivh libev-4.15-7.el7.x86_64.rpm

  libev需要单独下载,根据操作系统硬件架构进行下载,下载地址:https://pkgs.org/download/libev

安装xtrabackup  (使用root用户安装)

rpm -ivh percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm

验证安装是否成功

[mysql@gip ~]$ whereis xtrabackup
xtrabackup: /usr/bin/xtrabackup /usr/lib64/xtrabackup /usr/share/man/man1/xtrabackup.1.gz
[mysql@gip ~]$ whereis innobackupex
innobackupex: /usr/bin/innobackupex /usr/share/man/man1/innobackupex.1.gz

3.工具命令

包含两个命令(xtrabackup 与 innobackupex)

相同点:二者都可用来进行数据库的备份,都支持innodb和非innodb

用法区别:

  • xtrabackup指定备份目录时需要加--target-dir选项,而innobackupex不需要。

             用法: [xtrabackup [--defaults-file=#] --backup | xtrabackup [--defaults-file=#] --prepare] [OPTIONS]

             该命令会读取配置文件中[xtrabackup]与[mysqld]组中的配置。

             举例:

xtrabackup --defaults-file=/mysql/conf/my.cnf --backup --user=back --password='*' --socket=/mysql/dbdata/data3308/data/mysql.sock --target-dir=/mysql/backup
  • xtrabackup备份的文件直接放在备份目录下,而innobackupex默认会在备份目录下建立一个日期命名的文件夹

        innobackupex命令用法:

innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE]
             [--encrypt=ENCRYPTION-ALGORITHM] [--encrypt-threads=NUMBER-OF-THREADS] [--encrypt-chunk-size=CHUNK-SIZE]
             [--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]
             [--include=REGEXP] [--user=NAME]
             [--password=WORD] [--port=PORT] [--socket=SOCKET]
             [--no-timestamp] [--ibbackup=IBBACKUP-BINARY]
             [--slave-info] [--galera-info] [--stream=tar|xbstream]
             [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME]
             [--databases=LIST] [--no-lock]
             [--tmpdir=DIRECTORY] [--tables-file=FILE]
             [--history=NAME]
             [--incremental] [--incremental-basedir]
             [--incremental-dir] [--incremental-force-scan] [--incremental-lsn]
             [--incremental-history-name=NAME] [--incremental-history-uuid=UUID]
             [--close-files] [--compact]
             BACKUP-ROOT-DIR
该命令对mysql数据库进行热备,默认会在备份目录中创建一个以日期和时间命名的文件夹,如果使用选项 --no-timestamp选项,则直接将备份文件放入备份目录中。

innobackupex --apply-log [--use-memory=B]
             [--defaults-file=MY.CNF]
             [--export] [--redo-only] [--ibbackup=IBBACKUP-BINARY]
             BACKUP-DIR
该命令为基于backup启动一个MySQL server准备一个backup。该命令不用连接database server。它会按照
BACKUP-DIR/backup-my.cnf 使用BACKUP-DIR/xtrabackup_logfile恢复data files,并创建新的redo log文件。

innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR
该命令从备份目录拷贝data,index,log文件到他们的指定位置。此位置由defaults-file选项的配置文件中来指定。 innobackupex
--move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR 该命令与copy-back类似,是移动备份文件而不是拷贝备份文件,会删除备份文件,此命令要慎用,磁盘空间不足时可以考虑使用。
innobackupex [
--decompress] [--decrypt=ENCRYPTION-ALGORITHM] [--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY] [--parallel=NUMBER-OF-FORKS] BACKUP-DIR
该命令用于解密或解压使用选项--compress或--encrypt做的备份。



举例:  

创建备份
innobackupex --defaults-file=/mysql/mysql3308.cnf --user=back --password='*' --socket=/mysql/dbdata/data3308/data/mysql.sock /mysql/backup/3308

恢复前准备动作
innobackupex --defaults-file=/mysql/mysql3308.cnf --user=root --use-memory=1G --apply-log /mysql/backup/3308/2023-01-16_14-31-18
拷贝备份到数据文件目录
innobackupex --defaults-file=/mysql/mysql3308.cnf --user=root --copy-back /mysql/backup/3308/2023-01-16_14-31-18
增量备份
innobackupex --defaults-file=/mysql/mysql3308.cnf --user=root --password=abc123 --host=172.17.140.158 --port=3308 --parallel=2 --throttle=200 --incremental-basedir=/mysql/backup/3308/2023-01-16_14-31-18/ --incremental /mysql/backup/3308

早期版本中innobackupex为xtrabackup的perl实现,2.4版本中是xtrabackup的一个符号链接 ,innobackupex在后续版本中会被废除。8.0版本中已没有此命令。因此对innobackupex即将废弃的命令只做一些说明,不做过多介绍。

 下面详细介绍xtrabackup的使用。

4. 使用

(1)全量备份:

本地备份

例子1:直接拷贝数据文件到备份目录

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --target-dir=/mysql/backup/3308
[mysql@gip conf]$ xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --target-dir=/mysql/backup/3308

xtrabackup: recognized server arguments: --datadir=/mysql/dbdata/data3308/data --server-id=3308158 --innodb_buffer_pool_size=512M --innodb_doublewrite=1 --innodb_file_per_table=1 --innodb_flush_log_at_trx_commit=1 --innodb_flush_method=O_DIRECT --innodb_io_capacity=200 --innodb_log_buffer_size=32M --innodb_log_file_size=512M --innodb_log_files_in_group=4 --innodb_read_io_threads=16 --innodb_write_io_threads=16 --log_bin=/mysql/dbdata/data3308/log/binlog --tmpdir=/mysql/dbdata/data3308/tmp
xtrabackup: recognized client arguments: --socket=/mysql/dbdata/data3308/data/mysql3308.sock --backup=1 --user=root --password=* --target-dir=/mysql/backup/3308
230117 15:16:12 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;mysql_socket=/mysql/dbdata/data3308/data/mysql3308.sock' as 'root' (using password: YES).
230117 15:16:12 version_check Connected to MySQL server
230117 15:16:12 version_check Executing a version check against the server...
230117 15:16:12 version_check Done.
230117 15:16:12 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: /mysql/dbdata/data3308/data/mysql3308.sock
Using server version 5.7.39-log
xtrabackup version 2.4.26 based on MySQL server 5.7.35 Linux (x86_64) (revision id: 19de43b)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /mysql/dbdata/data3308/data
xtrabackup: open files limit requested 0, set to 102400
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 4
xtrabackup: innodb_log_file_size = 536870912
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
230117 15:16:12 >> log scanned up to (16302181527)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 21 for sys/sys_config, old maximum was 0
230117 15:16:12 [01] Copying ./ibdata1 to /mysql/backup/3308/ibdata1
230117 15:16:13 >> log scanned up to (16302181527)
230117 15:16:14 [01] ...done
230117 15:16:14 >> log scanned up to (16302181527)
230117 15:16:14 [01] Copying ./sys/sys_config.ibd to /mysql/backup/3308/sys/sys_config.ibd
230117 15:16:14 [01] ...done
230117 15:16:14 [01] Copying ./test/tt.ibd to /mysql/backup/3308/test/tt.ibd
230117 15:16:14 [01] ...done

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

省略部分备份日志

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

230117 15:16:34 [01] Copying ./benchmark/t1.ibd to /mysql/backup/3308/benchmark/t1.ibd
230117 15:16:34 [01] ...done
230117 15:16:34 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
230117 15:16:34 Executing FLUSH TABLES WITH READ LOCK...
230117 15:16:34 Starting to backup non-InnoDB tables and files
230117 15:16:34 [01] Copying ./sys/x@0024ps_digest_95th_percentile_by_avg_us.frm to /mysql/backup/3308/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm
230117 15:16:34 [01] ...done
230117 15:16:34 [01] Copying ./sys/schema_unused_indexes.frm to /mysql/backup/3308/sys/schema_unused_indexes.frm
230117 15:16:34 [01] ...done

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

省略部分备份日志

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

230117 15:16:35 [01] Copying ./benchmark/bmsql_new_order.frm to /mysql/backup/3308/benchmark/bmsql_new_order.frm
230117 15:16:35 [01] ...done
230117 15:16:35 Finished backing up non-InnoDB tables and files
230117 15:16:35 [00] Writing /mysql/backup/3308/xtrabackup_binlog_info
230117 15:16:35 [00] ...done
230117 15:16:35 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '16302181518'
xtrabackup: Stopping log copying thread.
.230117 15:16:35 >> log scanned up to (16302181527)

230117 15:16:35 Executing UNLOCK TABLES
230117 15:16:35 All tables unlocked
230117 15:16:35 [00] Copying ib_buffer_pool to /mysql/backup/3308/ib_buffer_pool
230117 15:16:35 [00] ...done
230117 15:16:35 Backup created in directory '/mysql/backup/3308/'
MySQL binlog position: filename 'binlog.000005', position '1036534772', GTID of the last change '3ca3a216-8fdc-11ed-991f-00163e66fc59:1-87'
230117 15:16:35 [00] Writing /mysql/backup/3308/backup-my.cnf
230117 15:16:35 [00] ...done
230117 15:16:35 [00] Writing /mysql/backup/3308/xtrabackup_info
230117 15:16:35 [00] ...done
xtrabackup: Transaction log of lsn (16302181518) to (16302181527) was copied.
230117 15:16:35 completed OK!

最后出现“completed OK!” 表示备份成功。

上面执行的备份语句会将mysql数据文件(即由mysql3308.cnf里的变量datadir指定)拷贝至备份目录下(/mysql/backup/3308/)

注意:备份innodb引擎的表不会锁表,备份myisam等非事务引擎表会锁表。

如果不指定–defaults-file,将按照下面这个顺序寻找配置文件/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf。

[mysql@gip ~]$ cd /mysql/backup/3308
[mysql@gip 3308]$ ll
total 471092
-rw-r----- 1 mysql mysql 494 Jan 17 15:16 backup-my.cnf
drwxr-x--- 2 mysql mysql 4096 Jan 17 15:16 benchmark
-rw-r----- 1 mysql mysql 460 Jan 17 15:16 ib_buffer_pool
-rw-r----- 1 mysql mysql 482344960 Jan 17 15:16 ibdata1
drwxr-x--- 2 mysql mysql 4096 Jan 17 15:16 mysql
drwxr-x--- 2 mysql mysql 4096 Jan 17 15:16 performance_schema
drwxr-x--- 2 mysql mysql 12288 Jan 17 15:16 sys
drwxr-x--- 2 mysql mysql 4096 Jan 17 15:16 test
-rw-r----- 1 mysql mysql 67 Jan 17 15:16 xtrabackup_binlog_info
-rw-r----- 1 mysql mysql 147 Jan 17 15:16 xtrabackup_checkpoints
-rw-r----- 1 mysql mysql 615 Jan 17 15:16 xtrabackup_info
-rw-r----- 1 mysql mysql 2560 Jan 17 15:16 xtrabackup_logfile

例子2:以xbstream格式备份,将流备份重定向到归档文件backup.xbstream中,并将备份日志输出到文件中。备份文件大小跟原库文件差不多(该例中5.7G),耗时33秒

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --stream=xbstream --target-dir=/mysql/backup/3308 >/mysql/backup/3308/backup.xbstream 2>/mysql/backup/3308/bak.log 

  将流备份压缩并重定向到文件backup.xbstream.cpr中,这种方式还需要qpress解压。需安装qpress(关于qpress安装下载参考qpress-11-3.el7.x86_64.rpm CentOS 7, RHEL 7, Rocky Linux 7, AlmaLinux 7 Download (pkgs.org))备份文件压缩比约33%,耗时1分钟

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --stream=xbstream --compress --compress-threads=6 --target-dir=/mysql/backup/3308 >/mysql/backup/3308/backup.xbstream.cpr 2>/mysql/backup/3308/bak.log 

--compress-threads:压缩备份时压缩线程

将流备份以gz格式压缩,重定向到文件backup.xbstream.gz中,备份文件压缩比约52%,耗时10分钟

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --stream=xbstream --target-dir=/mysql/backup/3308 2>/mysql/backup/3308/bak.log |gzip - >/mysql/backup/3308/backup.xbstream.gz

将流备份以gz格式压缩加密,重定向到文件backup.xbstream.gz.des3中。耗时11分钟

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --stream=xbstream --target-dir=/mysql/backup/3308 2>/mysql/backup/3308/bak.log |gzip - |openssl des3 -salt -k "password" > /mysql/backup/3308/backup.xbstream.gz.des3

释放备份文件

释放流备份文件
xbstream -x < backup.xbstream

释放解压compress压缩的流备份文件
xbstream -x -C /mysql/backup/3308/compre < backup.xbstream.cpr
-C 表示释放后文件存放目录,会出现很多 .qp后缀的文件,再使用下面的命令来解压.qp文件。
xtrabackup --decompress --parallel=4 --target-dir=/mysql/backup/3308/compre --remove-original
--remove-original 选项清理备份目录中的压缩文件(.qp文件)。 需要安装qpress,此命令才能执行成功。

释放gz格式的加密备份文件
cat backup.xbstream.gz.des3|openssl des3 -d -k "password"|gzip -dv|xbstream -x -C ./gp8

 

远程备份:

xtrabackup 是物理备份,只能在数据库服务器本地去执行,然后将备份文件拷贝到远程服务器。

远程拷贝可以使用scp命令,高级用法可以通过管道符合并到一条命令中。

xtrabackup --defaults-file=/mysql/mysql3308.cnf --backup --user=root --password=abc123 --host=172.17.140.158 --port=3308 --parallel=2 --throttle=200 --compress --target-dir=/mysql/backup/3308 2>/mysql/backup/3308/bak.log 

参数解释:
--parallel 表示用于开启多个子进程并发备份多个数据文件(注意,一个数据文件只会有一个进程完成备份)
--throttle 用于限制备份过程中每秒的IO次数。
2>/mysql/backup/3308/bak.log  将备份日志输出到文件中。

备份与远程传输合并到一条命令中,压缩,传输到远程后再解压。
xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --compress --stream=xbstream --target-dir=/mysql/backup/3308/ |ssh mysql@172.17.140.73 "cd /mysql/backup/3308/;xbstream -x -C ./comp;xtrabackup --decompress --parallel=4 --target-dir=/mysql/backup/3308/comp --remove-original"

备注:
(1)远程主机也必须安装xbstream程序,否则无法使用。

   (2)这里的ssh命令不会提示输入密码,因此要提前使用ssh-keygen以及ssh-copy-id命令将证书传递给远程主机 mysql@172.17.140.73

        ssh-keygen     可用来生成ssh公钥认证所需的公钥和私钥文件,生成密钥时,不输入 passphrase 防止执行命令时要求输入密码

        ssh-copy-id -i .ssh/id_rsa.pub mysql@172.17.140.73

   (3)如果没有cd /mysql/backup/3308/comp;命令,那么会直接解压到远程主机用户的家目录

全量恢复:

关闭数据库,将数据文件与日志文件删除

rm -rf /mysql/dbdata/data3308/*/*

准备备份。因为xtrabackup备份数据文件是物理备份,备份过程中数据文件有变化,直接使用数据文件是处于不一致状态的。--prepare操作是将数据文件处理到一致状态,相当于apply-log
xtrabackup --prepare --target-dir=/mysql/backup/3308/comp

恢复备份

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --copy-back --target-dir=/mysql/backup/3308/comp

恢复后可以启动数据库。

 

(2)增量备份:

全备:
xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --stream=xbstream --target-dir=/mysql/backup/3308 >/mysql/backup/3308/backup.xbstream 2>/mysql/backup/3308/bak.log
第一次增备
xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --parallel=2 --throttle=200 --incremental-basedir=/mysql/backup/3308/fullback/ --target-dir=/mysql/backup/3308/incr1
第二次增备
xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --parallel=2 --throttle=200 --incremental-basedir=/mysql/backup/3308/incr1/ --target-dir=/mysql/backup/3308/incr2

增量备份 使用--incremental-bassedir选项指定基于哪个备份基础上做增量备份,可以基于全量备份做增量备份,也可以基于增量备份做增量备份。

注意要实现增备,基于的全备一定不能进行"准备"操作。

–-target-dir选项用于指定本次增量备份的目录,在该目录下存放着增量备份的所有文件。

在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息。

[mysql@gip 2023-01-16_14-31-18]$ cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 16273346727
last_lsn = 16273346727
compact = 0
recover_binlog_info = 0
flushed_lsn = 16302125351

[mysql@gip 2023-01-16_15-57-52]$ cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 16273346727
to_lsn = 16273347611
last_lsn = 16273347620
compact = 0
recover_binlog_info = 0
flushed_lsn = 16302134177

增量备份的from_lsn正好等于基备份的to_lsn

 

远程备份时,增量备份只能使用--incremental-lsn选项指定备份起始的lsn,因为无法获取要增备的basedir

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --target-dir=/mysql/backup/3308/ --incremental-lsn=16302186378 --stream=xbstream |ssh mysql@172.17.140.73 "cd /mysql/backup/3308/;xbstream -x -C ./incr"

 

 增量恢复:

 准备:

xtrabackup --prepare --apply-log-only --target-dir=/mysql/backup/3308/fullback
xtrabackup --prepare --apply-log-only --target-dir=/mysql/backup/3308/fullback --incremental-dir=/mysql/backup/3308/incr1
xtrabackup --prepare --target-dir=/mysql/backup/3308/fullback --incremental-dir=/mysql/backup/3308/incr2

先对全备进行apply-log-only ,再对第一次增备 apply-log-only,最后一次不用--apply-log-only, 这样备份就准备好了。

增备的准备过程和全备的准备过程有点不一样,不到最后恢复的时候不能进行任何"准备"过程。

增备过程中的每一次备份行为都会监控MySQL的redo log,写入到xtrabackup_logfile的日志中可能会有未提交的事务,但是到后面增备的时候进行了提交,也就是说提交过程记录到了增备时监控的日志xtrabackup_logfile中。如果在增备前进行了"准备",那么该事务就会被回滚,后面增备中的提交就丢失了,由此会造成数据丢失。
要保证将所有的备份集进行整合,需要使用在每个备份集的"准备"过程中使用"--apply-log-only"选项,这样应用日志时会"直线向前"直到最后一个备份集。它的本质是向全备集中不断的追加应用增备中的日志。但是,最后一个增备集需要作为备份集整合的终点,所以它不能使用"--apply-log-only"选项。

恢复

整合结束后就等价于一个全备集下面的恢复命令与全备恢复相同

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --copy-back --target-dir=/mysql/backup/3308/fullback

 

(3)指定库备份

xtrabackup --defaults-file=/mysql/conf/mysql3308.cnf --backup --user=root --password=abc123 --databases benchmark --parallel 4 --target-dir=/mysql/backup/3308/xtrabackup

 

 

 

5.原理:

 备份过程

(1).在启动xtrabackup时记下LSN并将redo log拷贝到备份目标目录下的xtrabackup_logfile文件中。由于拷贝需要一定时间,如果在拷贝时间段内有日志写入,将导致拷贝的日志和MySQL的redo log不一致,所以xtrabackup还有一个后台进程监控着mysql的redo log,每秒监控一次,当MySQL的redo log有变化,该监控进程会立即将变化的内容写入到xtrabackup_logfile文件,这样就能保证拷贝走的redo log中记录了一切变化。但是这也是有风险的,因为redo是轮训式循环写入的,如果某一时刻有非常大量的日志写到redo log中,使得还没开始复制的日志就被新日志覆盖了,这样会日志丢失,并报错。

(2).拷贝完初始版的redo log后,xtrabackup开始拷贝innodb表的数据文件(即表空间文件.ibd文件和ibdata1)。注意,此时不拷贝innodb的frm文件。

(3).当innodb相关表的数据文件拷贝完成后,xtrabackup开始准备拷贝非innodb的文件。但在拷贝它们之前,要先对非innodb表进行加锁防止拷贝时有语句修改这些类型的表数据。

对于不支持backup lock的版本,只能通过flush tables with read lock来获取全局读锁,但这样也同样会锁住innodb表,杀伤力太大。所以使用xtrabackup备份Oracle的MySQL,实质上只能实现innodb表的部分时间热备、部分时间温备。

对于支持backup lock的版本,xtrabackup通过lock tables for backup获取轻量级的backup locks来替代flush tables with read lock,因为它只锁定非innodb表,所以由此实现了innodb表的真正热备。

(4).当获取到非innodb表的锁以后,开始拷贝非innodb表的数据和.frm文件。当这些拷贝完成之后,继续拷贝其他存储引擎类型的文件。(实际上,拷贝非innodb表的数据是在获取backup locks(如果支持)后自动进行的,它们属于同一个过程)

(5).当拷贝阶段完成后,就到了备份的收尾阶段。包括获取二进制日志中一致性位置的坐标点、结束redo log的监控和拷贝、释放锁等。

对于不支持backup lock的版本,收尾阶段的过程是这样的:获取二进制日志的一致性坐标点、结束redo log的监控和拷贝、释放锁。

对于支持backup lock的版本,收尾阶段的过程是这样的:先通过lock binlog for bakcup来获取二进制日志锁,然后结束redo log的监控和拷贝,再unlock tables释放表锁,随后获取二进制日志的一致性位置坐标点,最后unlock binlog释放二进制日志锁。

(6).如果一切都OK,xtrabackup将以状态码0退出。

备份锁(backup lock)

percona Server 5.6+ 支持一种新锁——backup lock(备份锁),这种锁是percona对MySQL的补充,专门为备份而设计。这种锁在percona Server 5.6+ 有,MariaDB中也有,但是Oracle的MySQL中没有,至少MySQL 5.7中没有。

这种锁用在备份的时候替代 flush tables with read lock 获取全局锁,是一种轻量级的全局锁。它有两种类型的锁:备份表锁和二进制日志锁。

备份表锁在全局范围内只对非innodb表加锁,所以持有该锁后无法修改非innodb表,但却不影响innodb表的DML。当然,因为是全局锁,所以也会阻塞DDL操作。

二进制日志锁在全局范围内锁定二进制日志,所以会阻塞其他会话修改二进制日志。这样可以保证能够获取到二进制日志中一致性的位置坐标。 

对是否支持backup lock的版本,xtrabackup备份的时的行为是不一样的,如下图所示的备份过程。

 

 

 

 

 

 

 

准备过程

由于备份的时候拷贝走的数据文件可能是不一致的,比如监控着MySQL的redo log中在拷贝过程完成后又新的事务提交了,而拷贝走的数据是未提交状态的,那么就需要对该事务前滚;如果监控到的日志中有事务未提交,那么该事务就需要回滚。

但是如果只备份了myisam表或其他非事务表数据,因为备份阶段直接锁定了这些表,所以不会有不一致的状态。

xtrabackup有一个"准备"的阶段。这个阶段的实质就是对备份的innodb数据应用redo log,该回滚的回滚,该前滚的前滚,最终保证xtrabackup_logfile中记录的redo log已经全部应用到备份数据页上,并且实现了一致性。当应用结束后,会重写"xtrabackup_logfile"再次保证该redo log和备份的数据是对应的。

准备过程不需要连接数据库,该过程可以在任意装了xtrabackup软件的机器上进行,之所能实现是因为xtrabackup软件的内部嵌入了一个简化的innodb存储引擎,可以通过它完成日志的应用。

恢复过程

xtrabackup的恢复过程实质是将备份的数据文件和结构定义等文件拷贝回MySQL的datadir。同样可以拷贝到任意机器上。

要求恢复之前MySQL必须是停止运行状态,且datadir是空目录,除非恢复的操作是导入表的操作。

 

6 特点 

       属于物理备份,本地备份快。

      支持并行拷贝datafile

       支持压缩备份

       远程备份,以流格式进行远程传输,速度没有直接在远端使用mydumper备份快。

       如果不支持备份锁,依然会执行flush tables with read lock 锁表。

 

参考博客:

7.3.MySQL备份:使用XtraBackup远程备份数据库 (baidu.com)

Xtrabackup备份MySQL最佳实践

xtrabackup原理详解_51CTO博客_xtrabackup原理

posted on 2023-01-16 11:20  JennyYu  阅读(279)  评论(0编辑  收藏  举报