Percona Xtrabackup:MySQL数据库热备份工具详解
- XtraBackup概述
Percona XtraBackup是一款专为MySQL设计的热备份工具,它能够在不锁定数据库的情况下执行备份操作。该工具支持对Percona Server、MySQL和MariaDB等主流数据库系统进行热备份。
XtraBackup的官方下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
- XtraBackup主要参数解析
| 参数 | 说明 |
|---|---|
| --print-defaults | 显示备份将使用的参数配置,添加此参数不会实际执行备份 |
| --no-defaults | 除--login-path指定的登录配置文件外,不从其他文件读取参数 |
| --defaults-file=# | 从指定文件中读取相关参数配置 |
| --defaults-extra-file=# | 在读取全局配置文件后,额外读取指定文件 |
| --defaults-group-suffix=# | 使用concat(组名,后缀)方式读取配置组信息 |
| --login-path=# | 指定登录配置文件路径 |
| -v, --version | 输出xtrabackup版本信息 |
| --target-dir=name | 设置备份文件存储目录 |
| --backup | 执行备份操作并将结果保存到target-dir指定的路径 |
| --stats | 计算数据目录的统计信息(建议在MySQL离线状态下使用) |
| --prepare | 为从备份恢复做准备 |
| --export | 在准备阶段为导入到其他数据库创建必要文件 |
| --apply-log-only | 在准备过程中应用完日志后停止恢复进程,不执行LSN操作 |
| --print-param | 输出回拷过程中MySQL服务所需的参数 |
| --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 | 仅复制比指定LSN'high:low'更新的.ibd页面,LSN值错误将导致备份失败(用于--backup) |
| --incremental-basedir=name | 指定上一次备份路径,仅复制比上次更新的.ibd文件(用于增量备份) |
| --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*文件,重复执行可创建多个 |
| --stream=name | 指定备份文件输出格式,支持tar和xbstream |
| --compress[=name] | 指定备份文件压缩算法,支持quicklz和lz4,可压缩至原大小的1/5 |
| --compress-threads=# | 指定并行数据压缩线程数,默认为1 |
| --compress-chunk-size=# | 指定压缩线程工作缓冲区大小(字节),默认为64K |
| --encrypt=name | 指定用于加密备份文件的算法 |
| --encrypt-key=name | 指定加密密钥 |
| --encrypt-key-file=name | 指定包含加密密钥的文件路径 |
| --encrypt-threads=# | 指定数据加密线程数,默认为1 |
| --encrypt-chunk-size=# | 指定加密线程工作缓冲区大小(字节),默认为64K |
| --rebuild-threads=# | 指定精简备份中重建索引的线程数,仅对--prepare和--rebuild-indexes有效 |
| --incremental-force-scan | 强制执行全面扫描,即使存在更改的页面位图或启用了页跟踪 |
| --close-files | 不保持文件持续打开,使用此选项需自行承担风险 |
| --core-file | 将致命信号转储到核心文件 |
| --copy-back | 将备份目录中的文件复制到数据目录,通常称为"回拷" |
| --move-back | 将备份目录中的文件移动到数据目录 |
| --galera-info | 创建xtrabackup_galera_info文件,包含备份时的节点状态,仅用于Percona-XtraDB-Cluster备份 |
| --slave-info | 备份复制从服务器时非常有用,输出二进制日志位置和主服务器信息,并写入xtrabackup_slave_info文件 |
| --page-tracking | 使用服务器页面跟踪功能进行增量备份,而非全面扫描数据文件 |
| --no-lock | 禁用DDL锁和表锁,使用"FLUSH TABLES with READ LOCK",仅适用于全InnoDB表且不关心二进制日志位置的情况 |
| --lock-ddl | 如果服务器支持,在备份开始时发出LOCK TABLES/LOCK INSTANCE阻止所有DDL操作(默认启用,可用--skip-lock-ddl禁用) |
| --lock-ddl-timeout=# | 如果LOCK TABLES FOR BACKUP未在指定超时时间内返回,则强制终止备份 |
| --lock-ddl-per-table | 在xtrabackup复制阶段前锁定每个表的DDL,直到备份完成 |
| --backup-lock-timeout=# | 尝试获取元数据锁的超时时间(秒) |
| --backup-lock-retry-count=# | 尝试获取元数据锁的次数 |
| --dump-innodb-buffer-pool | 通过命令SET GLOBAL innodb_buffer_pool_dump_now=ON转储InnoDB缓冲池 |
| --dump-innodb-buffer-pool-timeout=# | 指定xtrabackup等待InnoDB缓冲池转储完成的秒数 |
| --dump-innodb-buffer-pool-pct=# | 指定要转储的InnoDB缓冲池百分比 |
| --safe-slave-backup | 备份开始时停止从SQL线程,等待Slave_open_temp_tables为零后开始备份 |
| --rsync | 使用rsync实用程序优化本地文件传输,不能与--一起使用 |
| --force-non-empty-directories | 允许--copy-back或--move-back将文件传输到非空目录,但不会覆盖现有文件 |
| --no-server-version-check | 允许在服务器版本大于PXB支持的版本时继续备份 |
| --no-version-check | 禁用--version-check启用的版本检查 |
| --tables-compatibility-check | 启用引擎兼容性警告(默认启用,可用--skip-tables-compatible-check禁用) |
| --no-backup-locks | 控制是否使用备份锁而非FLUSH TABLES WITH READ LOCK,默认禁用 |
| --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中的备份系列名称 |
| --incremental-history-uuid=name | 指定存储在PERCONA_SCHEMA中的特定历史记录UUID |
| --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 |
| --ftwrl-wait-timeout=# | 指定innobackupex在运行FTWRL前等待阻塞查询的秒数,默认为0 |
| --ftwrl-wait-threshold=# | 指定检测长时间运行的查询的阈值,默认为60秒 |
| --debug-sleep-before-unlock=# | XtraBackup测试套件专用调试选项 |
| --safe-slave-backup-timeout=# | 等待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,即使会话数据无法重用也允许连接 |
| --transition-key[=name] | 用于加密表空间键的转换键 |
| --xtrabackup-plugin-dir=name | xtrabackup插件目录 |
| --plugin-load=name | 要加载的插件列表 |
| --generate-new-master-key | 复制时生成新的主密钥 |
| --generate-transition-key | 生成转换密钥并将其存储到密钥环 |
| --keyring-file-data[=name] | 密钥环文件路径 |
| --component-keyring-config[=name] | 加载组件配置的路径,用于--prepare、--move-back、--copy-back和--stats |
| --component-keyring-file-config[=name] | 加载密钥环组件配置的路径(已弃用,请使用--component-keyring-config) |
| --parallel=# | 用于并行数据文件传输的线程数,默认为1 |
| --strict | 传递无效参数时报错(默认启用,可用--skip-strict禁用) |
| --rocksdb-checkpoint-max-age=# | RocksDB最大检查点年龄(秒) |
| --rocksdb-checkpoint-max-count=# | RocksDB检查点的最大数量 |
| -h, --datadir=name | MySQL数据库的数据目录 |
| -t, --tmpdir=name | 临时文件路径,可指定多个路径用冒号(:)分隔 |
| --log-bin[=name] | MySQL二进制日志 |
| --log-bin-index=name | 保存二进制日志名称的文件 |
| --innodb[=name] | MySQL选项兼容性,忽略此选项 |
| --innodb-adaptive-hash-index | 启用InnoDB自适应哈希索引(默认启用) |
| --innodb-autoextend-increment=# | 数据文件自动扩展大小(MB) |
| --innodb-buffer-pool-size=# | InnoDB用于缓存表数据和索引的内存缓冲区大小 |
| --innodb-checksums | 启用InnoDB校验和验证(默认启用) |
| --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表的每张表在数据目录下创建单独的.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-log-files-in-group=# | InnoDB日志组中日志文件的个数,建议值为3 |
| --innodb-log-group-home-dir=name | InnoDB日志的存储路径 |
| --innodb-max-dirty-pages-pct=# | 缓冲池中允许的脏页百分比 |
| --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重做日志块是否计算和校验(默认启用) |
| --innodb-undo-directory=name | undo表空间文件所在目录,可为绝对路径 |
| --innodb-directories=name | 扫描表空间文件的目录,默认为扫描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版本。
- XtraBackup备份与恢复实践
3.1 完整备份与恢复
执行完整备份
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --backup --target-dir=/backups/full_backup
执行恢复
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --prepare --target-dir=/backups/full_backup
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --copy-back --target-dir=/backups/full_backup --datadir=/var/lib/mysql
3.2 增量备份与恢复
完整备份+增量备份
[mysql]# xtrabackup --user=admin --password=secret --socket=/var/run/mysqld/mysqld.sock --backup --target-dir=/backups/base_backup
[mysql]# xtrabackup --user=admin --password=secret --socket=/var/run/mysqld/mysqld.sock --backup --target-dir=/backups/inc_backup_1 --incremental-basedir=/backups/base_backup
[mysql]# xtrabackup --user=admin --password=secret --socket=/var/run/mysqld/mysqld.sock --backup --target-dir=/backups/inc_backup_2 --incremental-basedir=/backups/inc_backup_1
恢复过程
[mysql]# xtrabackup --prepare --apply-log-only --target-dir=/backups/base_backup
[mysql]# xtrabackup --prepare --apply-log-only --target-dir=/backups/base_backup --incremental-dir=/backups/inc_backup_1
[mysql]# xtrabackup --prepare --target-dir=/backups/base_backup --incremental-dir=/backups/inc_backup_2
[mysql]# xtrabackup --prepare --target-dir=/backups/base_backup
[mysql]# xtrabackup --copy-back --target-dir=/backups/base_backup --datadir=/<mysql_data_dir>/
3.3 压缩备份与恢复
安装qpress压缩工具
[root]# yum install qpress -y
执行压缩备份
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --backup --target-dir=/backups/comp_backup --compress
解压并恢复
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --decompress --target-dir=/backups/comp_backup
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --prepare --target-dir=/backups/comp_backup
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --copy-back --target-dir=/backups/comp_backup --datadir=/<mysql_data_dir>/
3.4 加密备份与恢复
生成加密密钥
[mysql]# openssl rand -base64 24
aBcD3fGh8jKlMnOpQrStUvWxYz123456/
执行加密备份
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --backup --encrypt=AES256 --encrypt-key="aBcD3fGh8jKlMnOpQrStUvWxYz123456/" --target-dir=/backups/enc_backup
解密并恢复
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --decrypt=AES256 --encrypt-key="aBcD3fGh8jKlMnOpQrStUvWxYz123456/" --target-dir=/backups/enc_backup
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --prepare --target-dir=/backups/enc_backup
[mysql]# xtrabackup -S /var/lib/mysql/mysql.sock --copy-back --target-dir=/backups/enc_backup --datadir=/<mysql_data_dir>/