首页  :: 新随笔  :: 管理

MySQL备份之Percona Xtrabackup

Posted on 2022-08-02 22:19  高&玉  阅读(210)  评论(0编辑  收藏  举报

1. XtraBackup介绍

Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。

Percona XtraBackup可以热备份Percona Server、MySQL和MariaDB数据库。

Percona XtraBackup下载:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

2. Percona XtraBackup参数介绍

参数 解释
--print-defaults 打印备份即将使用的参数,加此参数不会执行备份
--no-defaults 除了--login-path参数指定的登录文件,不从其他文件读取任何参数
--defaults-file=# 从指定的文件中读取相关参数
--defaults-extra-file=# 在读取全局文件之后读取此参数额外指定的文件
--defaults-group-suffix=# 使用concat(grooup,suffix)读取组信息
--login-path=# 指定登录文件
-v, --version 打印xtrabackup的版本信息
--target-dir=name 指定备份路径
--backup 定义备份,并备份到target-dir指定的路径
--stats 计算datadir目录的统计信息(建议MySQL为离线状态)
--prepare 为恢复在备份上做好准备
--export 在准备期间为导入到其他库创建文件
--apply-log-only 在准备期间,应用完日志后停止恢复进程不进行LSN
--print-param 打印回拷过程中mysqld需要的参数
--use-memory=# 备份/恢复过程中用来替代innodb_buffer_pool_size的值
--throttle=# 限制每秒钟IO操作数(读和写)为IOS值(--backup)
--log[=name] 忽略此参数,此参数为监控MySQL选项
--log-copy-interval=# 日志复制线程执行检查的时间间隔(单位:毫秒,默认是1秒)
--extra-lsndir=name 在此目录为xtrabackup_checkpoints保存额外的副本(--backup)
--incremental-lsn=name 只复制.ibd页比指定的LSN'high:low',如果指定LSN值错误,将导致备份不可用(--backup)
--incremental-basedir=name 增量备份中指定上一次备份的路径,只拷贝比上次备份更新的.ibd文件(--backup)
--incremental-dir=name 在指定的目录应用.delta和logfile文件(--prepare)
--to-archived-lsn=# 不应用日志序列号比较大的归档日志
--tables=name 指定表名
--tables-file=name 指定表名列表文件,内容格式为:database.table
--databases=name 指定数据库
--databases-file=name 指定数据库列表文件
--tables-exclude=name 指定的表不备份,优先级高于--tables
--databases-exclude=name 指定的数据库不备份,优先级高于--databases
--create-ib-logfile --prepare动作后创建ib_logfile*,如果想创建ib_logfile*,只需重复执行此命令
 --stream=name 指定备份文件输出格式,目前支持tar和xbstream
--compress[=name] 指定压缩单个备份文件的压缩算法,目前支持quicklz和lz4,能压缩到1/5
--compress-threads=# 指定并行数据压缩的线程数,默认值是1
--compress-chunk-size=# 指定压缩线程工作缓冲区大小(单位:bytes),默认值是64K
--encrypt=name 指定加密算法用于加密备份文件
--encrypt-key=name 指定使用的加密秘钥
--encrypt-key-file=name 指定包含加密秘钥的文件
--encrypt-threads=# 指定数据加密的线程数,默认值:1
--encrypt-chunk-size=# 指定加密线程工作缓冲区大小(单位:bytes),默认值是64K
--rebuild-threads=# 指定在精简备份中重建索引的线程数量,仅对--prepare和--rebuild-indexes参数有效
--incremental-force-scan 即使存在更改的页面位图数据或服务器上启用了页跟踪,增量备份也要执行全面扫描
--close-files 不保持一直打开文件,使用风险自负
--core-file 将致命信号写入内核
--copy-back 将备份目录中的文件复制到datadir,俗称“回拷”
--move-back 将备份目录中的文件移动到datadir
--galera-info 该选项会创建xtrabackup_galera_info文件,其中包含备份时的本节点状态。仅在Percona-XtraDB-Cluster备份时使用。当使用备份锁创建备份时无效
--slave-info 此选项在备份复制从服务器时非常有用。它打印二进制日志的位置和主服务器的名称。它还将此信息作为“CHANGE MASTER”命令写入“xtrabackup_slave_info”文件。通过在此备份上启动从服务器并使用保存在“xtrabackup_slave_info”文件中的二进制日志位置发出“CHANGE master”命令,可以为该主服务器设置一个新的从服务器。
--page-tracking 使用页面跟踪服务器特性进行增量备份,而不是对数据文件进行全面扫描。使用--page-tracking, xtrabackup将在备份期间通过调用mysqlbackup组件服务API在服务器上启动页面跟踪。当在后续增量备份中使用--page-tracking时,它将使用服务器生成的页面跟踪文件复制自上次备份以来修改的增量页面。
--no-lock 使用此选项可以禁用lock-ddl和表锁,并使用“FLUSH TABLES with READ lock”。只有当你所有的表都是InnoDB并且你不关心备份的二进制日志位置时才使用它。如果正在执行DDL语句,或者正在对非innodb表(包括mysql数据库中的系统MyISAM表)进行更新,则不应该使用此选项,否则可能导致不一致的备份。如果您考虑使用--no-lock,因为您的备份无法获得锁,这可能是因为传入复制事件阻止了锁的成功。请尝试使用--safe-slave-backup暂时停止复制从线程,这可能会帮助备份成功,然后你不需要使用这个选项。
--lock-ddl 如果服务支持,在备份开始时为备份发出LOCK TABLES/LOCK INSTANCE,以阻止所有DDL操作。(默认是开启的,可以使用--skip-lock-ddl禁用)
--lock-ddl-timeout=# 如果LOCK TABLES FOR BACKUP没有在指定的超时时间内返回结果,则会强制终止备份。
--lock-ddl-per-table 在xtrabbackup开始复制阶段之前,锁定每个表的DDL,直到备份完成。
--backup-lock-timeout=# 尝试获取元数据锁的超时时间(以秒为单位)。
--backup-lock-retry-count=# 尝试获取元数据锁的次数。
--dump-innodb-buffer-pool 命令MySQL服务器通过发出SET GLOBAL innodb_buffer_pool_dump_now=ON命令来转储innodb bufferpool
--dump-innodb-buffer-pool-timeout=# 该选项指定xtrabackup等待innodb bufferpool转储完成的秒数
--dump-innodb-buffer-pool-pct=# 这个选项指定要转储的innodb  bufferpool的百分比
--safe-slave-backup 该选项在备份开始时停止从SQL线程,并等待启动备份,直到“SHOW STATUS”中的Slave_open_temp_tables为零。如果没有开放的临时表,就会进行备份,否则就会启动并停止SQL线程,直到没有开放的临时表为止。如果Slave_open_temp_tables在--safe-slave-backup-timeout秒后没有变为零,备份就会失败。从SQL线程将在备份完成后重新启动。
--rsync 使用rsync实用程序优化本地文件传输。当指定该选项时,innobackupex使用rsync复制所有非innodb文件,而不是为每个文件生成一个单独的cp,这对于拥有大量数据库或表的服务器来说更快。此选项不能与--stream一起使用。
--force-non-empty-directories 当指定此选项时,将使--copy-back或--move-back将文件传输到非空目录。注意,现有文件不会被覆盖。如果--copy-back或--nove-back必须从目标目录中已经存在的备份目录复制文件,它仍然会失败并报错。
--no-server-version-check 该选项允许在服务器版本大于(更新)PXB支持的版本时继续进行备份
--no-version-check 该选项禁用由--version-check选项启用的版本检查。
--tables-compatibility-check 此选项启用引擎兼容性警告。(默认ON,可使用--skip-tables- compatible -check来禁用。)
--no-backup-locks 此选项控制是否应该在备份阶段上使用备份锁,而不是使用FLUSH TABLES WITH READ LOCK。它将禁用lock-ddl。当服务器不支持备份锁时,该选项不起作用。这个选项默认是禁用的,使用--no-backup-locks禁用。
--rollback-prepared-trx 强制回滚准备好的InnoDB事务。
--decompress 用于解压使用--compress=quicklz选项备份后扩展名为.qp的文件。(需要安装qpress)
-u, --user=name 指定连接MySQL服务的用户名
-H, --host=name 使用TCP/IP连接MySQL使用的主机名
-P, --port=# 使用TCP/IP连接MySQL使用的端口
-p, --password[=name] 连接MySQL使用的密码
-S, --socket=name 指定本地连接MySQL使用的socket文件
--incremental-history-name=name 此选项指定存储在PERCONA_SCHEMA中的备份系列的名称。Xtrabackup_history增量备份的历史记录。xtrabbackup将搜索历史表,查找系列中最近(最高的innodb_to_lsn)的成功备份,并使用to_lsn值作为增量备份的起始lsn。这将与--incremental-history-uuid、--incremental-basedir和--incremental-lsn互斥。如果找不到有效的lsn(没有该名称的系列,也没有该名称的成功备份),xtrabackup将返回一个错误。它与--incremental选项一起使用。
--incremental-history-uuid=name 这个选项指定存储在PERCONA_SCHEMA中的特定历史记录的UUID。增量备份的基础Xtrabackup_history。--incremental-history-name,--incremental-basedir和--incremental-lsn。如果找不到有效的lsn(没有包含该uuid的成功记录),xtrabackup将返回一个错误。它与--incremental选项一起使用。
--decrypt=name 解密之前使用--encrypt选项创建的备份中所有扩展名为.xbcrypt的文件。(目前支持算法:AES128,AES192和AES256)
--remove-original 在解密解压缩后删除.qp和.xbcrypt文件。
--ftwrl-wait-query-type=name 该选项指定在innobackupex发出全局锁之前允许完成哪些类型的查询。默认:all。
--kill-long-query-type=name 此选项指定应该终止哪些类型的查询以解除全局锁的阻塞。默认设置是“SELECT”。
--history[=name] 这个选项允许在PERCONA_SCHEMA中跟踪备份历史。xtrabackup_history表。可以指定一个可选的历史系列名称,该名称将与当前备份的历史记录一起放置。
--kill-long-queries-timeout=# 该选项指定从启动FLUSH TABLES WITH READ LOCK到终止那些阻塞它的查询之间的等待秒数。默认值是0秒,这意味着innobackupex不会试图终止任何查询。
--ftwrl-wait-timeout=# 该选项指定innobackupex在运行FTWRL之前等待阻塞查询的时间(以秒为单位)。如果在超时时仍然有这样的查询,innobackupex将终止并返回一个错误。默认值是0,在这种情况下,innobackupex不等待查询完成,并立即启动FTWRL。
--ftwrl-wait-threshold=# 该选项指定查询的运行时间阈值,innobackupex使用这个阈值来检测长时间运行的查询,它的值是非零的--ftwrl-wait-timeout。FTWRL直到这种长时间运行的查询存在时才会启动。如果--ftwrl-wait-timeout为0,则此选项无效。缺省值是60秒。
--debug-sleep-before-unlock=# 这是XtraBackup测试套件仅用于调试的选项。
--safe-slave-backup-timeout=# 从slave备份到Slave_open_temp_tables变为0需要等待多少秒。(默认300秒)
--check-privileges 在执行任何查询之前检查数据库用户权限。
--read-buffer-size[=#] 设置数据文件读取缓冲区的大小。默认值是10MB。
--server-public-key-path=name PEM格式的服务器RSA公钥文件路径。
--get-server-public-key 获取服务器公钥
--ssl-mode=name SSL连接模式
--ssl-ca=name PEM格式的CA文件
--ssl-capath=name CA目录
--ssl-cert=name PEM格式的X509证书
--ssl-cipher=name 要使用的SSL密码
--ssl-key=name PEM格式的X509密钥
--ssl-crl=name 证书作废列表
--ssl-crlpath=name 证书作废列表路径
--tls-version=name 使用TLS版本,允许的值有:TLSv1.2
--ssl-fips-mode=name SSL FIPS模式(仅适用于OpenSSL);允许的值是:OFF, ON, STRICT
--tls-ciphersuites=name 使用TLS v1.3加密
--ssl-session-data=name 用于启用ssl会话重用的会话数据文件
--ssl-session-data-continue-on-failed-reuse 如果设置为ON,该选项将允许连接,即使会话数据不能重用。
--server-public-key-path=name PEM格式的服务器RSA公钥文件路径
--transition-key[=name] 转换键,用于加密表空间键
--xtrabackup-plugin-dir=name xtrabackup插件目录
--plugin-load=name 要加载的插件列表
--generate-new-master-key 复制时生成新的主密钥
--generate-transition-key 生成转换密钥并将其存储到密钥环中
--keyring-file-data[=name] keyring文件的路径
--component-keyring-config[=name] 加载组件配置的路径。用于参数--prepare,--move-back,--copy-back和--stats
--component-keyring-file-config[=name] 加载密匙环组件配置的路径。用于--prepare,--move-back,--copy-back和--stats(已经被弃用,请使用--component-keyring-config)
--parallel=# 用于并行数据文件传输的线程数。缺省值为1。
--strict 当向xtrabackup传递无效参数时失败并报错。(默认开启,使用--skip-strict禁用)
--rocksdb-checkpoint-max-age=# ROCKSB最大检查点年龄(秒)。
--rocksdb-checkpoint-max-count=# ROCKSB检查点的最大计数
-h, --datadir=name MySQL数据库的datadir
-t, --tmpdir=name 临时文件的路径。可以指定多个路径,用冒号(:)分隔,在这种情况下,它们以循环的方式使用。
--log[=name] MySQL选项兼容性,忽略此选项
--log-bin[=name] MySQL binary log
--log-bin-index=name 保存binary log名称的文件
--innodb[=name] MySQL选项兼容性,忽略此选项
--innodb-adaptive-hash-index 启用InnoDB自适应哈希索引(默认为启用)。(默认为ON;使用--skip-innodb-adaptive-hash-index禁用。)
--innodb-autoextend-increment=# 数据文件自动扩展尺寸(单位:MB)
--innodb-buffer-pool-size=# InnoDB用来缓存表数据和索引的内存缓冲区的大小。
--innodb-checksums 启用InnoDB校验和验证(默认启用)。(默认为ON;使用--skip-innodb-checksums禁用。)
--innodb-data-file-path=name 单个文件的路径及其大小。
--innodb-data-home-dir=name InnoDB 数据库文件的家目录
--innodb-io-capacity[=#] 服务器能达到的IOPs。调优后台IO速率
--innodb-file-io-threads=# InnoDB中文件I/O线程数。
--innodb-read-io-threads=# InnoDB后台读I/O线程数。
--innodb-write-io-threads=# InnoDB后台写I/O线程数。
--innodb-file-per-table 存储引擎为innodb的每张表在datadir路径下有一个.ibd文件
--innodb-flush-log-at-trx-commit[=#] 设置为0(每秒写入和刷新一次)、1(每次提交时写入和刷新)或2(提交时写入,每秒刷新一次)。
--innodb-flush-method=name 磁盘刷新策略
--innodb-force-recovery=# 有助于在数据库的磁盘映像损坏的情况下保存数据。
--innodb-log-buffer-size=# InnoDB日志缓存大小
--innodb-log-file-size=# InnoDB日志组中每个innodb日志文件的大小
--innodb-log-files-in-group=# InnoDB日志组中innodb日志文件的个数。InnoDB以循环方式写入。此处建议值为3。
--innodb-log-group-home-dir=name InnoDB日志的存储路径
--innodb-max-dirty-pages-pct=# Bufferpool中允许的脏页百分比
--innodb-open-files=# InnoDB同时打开的最大文件数
--innodb-use-native-aio 如果这个平台支持,请使用本机AIO
--innodb-page-size=# InnoDB页面大小,默认是16K
--innodb-log-block-size=# 事务日志文件的日志块大小。不支持更改已创建的日志文件。使用风险自负!
--innodb-buffer-pool-filename=name InnoDB缓冲池文件名
--debug-sync=name 调试同步点。这仅用于xtrabackup测试套件
--innodb-checksum-algorithm=name InnoDB用于页面校验和的算法。[crc32, strict_crc32, innodb, strict_innodb, none, strict_none]
--innodb-log-checksums InnoDB重做日志块是否计算和校验(默认ON;使用--skip-innodb-log-checksums禁用。)
--innodb-undo-directory=name undo表空间文件所在的目录,此路径可以是绝对路径。
--innodb-directories=name 扫描表空间文件的目录'dir1;dir2;..;默认是扫描'innodb-data-home-dir;innodb-undo-directory;datadir'
--temp-tablespaces-dir=name 临时表空间存储路径,此路径可以是绝对路径。
--innodb-undo-tablespaces=# undo表空间数量
--innodb-redo-log-encrypt 启用/禁用REDO表空间加密功能
--innodb-undo-log-encrypt 启用/禁用UNDO表空间加密功能
--defaults-group=name 配置文件中默认组(默认"mysqld")。
--open-files-limit=# 使用setrlimit()保留的文件描述符的最大数量。
--server-id=# MySQL server_id
--rocksdb-datadir=name RocksDB数据目录
--rocksdb-wal-dir=name RocksDB预写日志目录

注释:以上参数来源于xtrabackup 8.0.29。

3. xtrabackup备份与恢复

3.1 全量备份与恢复

全量备份

[mysql]# xtrabackup -S /tmp/mysql80.sock --backup --target-dir=/backup/backup_full

恢复

[mysql]# xtrabackup -S /tmp/mysql80.sock --prepare --target-dir=/backup/backup_full
[mysql]# xtrabackup -S /tmp/mysql80.sock --copy-back --target-dir=/backup/backup_full --datadir=/data/mysql

3.2 增量备份与恢复

全备+增量备份

[mysql]# xtrabackup --user=root --password=mysql --socket=/tmp/mysql.sock --backup --target-dir=/backup/backup_0
[mysql]# xtrabackup --user=root --password=mysql --socket=/tmp/mysql.sock --backup --target-dir=/backup/backup_1 --incremental-basedir=/backup/backup_0
[mysql]# xtrabackup --user=root --password=mysql --socket=/tmp/mysql.sock --backup --target-dir=/backup/backup_2 --incremental-basedir=/backup/backup_1

恢复

[mysql]# xtrabackup --prepare --apply-log-only --target-dir=/backup/backup_0
[mysql]# xtrabackup --prepare --apply-log-only --target-dir=/backup/backup_0 --incremental-dir=/backup/backup_1
[mysql]# xtrabackup --prepare --target-dir=/backup/backup_0 --incremental-dir=/backup/backup_2
[mysql]# xtrabackup --prepare --target-dir=/backup/backup_0
[mysql]# xtrabackup --copy-back --target-dir=/backup/backup_0 --datadir=/<datadir>/

3.3 压缩备份与恢复

安装qpress

[root]# yum install qpress -y 

备份并压缩

[mysql]# xtrabackup -S /tmp/mysql80.sock --backup --target-dir=/backup/backup_compress --compress

解压缩,然后恢复

[mysql]# xtrabackup -S /tmp/mysql80.sock --decompress --target-dir=/backup/backup_compress
[mysql]# xtrabackup -S /tmp/mysql80.sock --prepare --target-dir=/backup/backup_compress
[mysql]# xtrabackup -S /tmp/mysql80.sock --copy-back --target-dir=/backup/backup_compress --datadir=/<datadir>/

3.4 加密备份与恢复

生成秘钥

[mysql]# openssl rand -base64 24
W2Bf/yMf6sT5mmMzgTHkLMpZqJaMeXa/

备份并加密

[mysql]# xtrabackup -S /tmp/mysql80.sock --backup --encrypt=AES256 --encrypt-key="W2Bf/yMf6sT5mmMzgTHkLMpZqJaMeXa/" --target-dir=/backup/backup_01

解密并恢复

[mysql]# xtrabackup -S /tmp/mysql80.sock --decrypt=AES256 --encrypt-key="W2Bf/yMf6sT5mmMzgTHkLMpZqJaMeXa/" --target-dir=/backup/backup_01
[mysql]# xtrabackup -S /tmp/mysql80.sock --prepare --target-dir=/backup/backup_01
[mysql]# xtrabackup -S /tmp/mysql80.sock --copy-back --target-dir=/backup/backup_01 --datadir=/<datadir>/