下载安装xtrabackup
官方下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ 官方安装步骤:https://www.percona.com/doc/percona-xtrabackup/8.0/installation/yum_repo.html rpm安装: wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm #需要EPEL源 xtrabackup -version
epel.repo
[epel] name=Extra Packages for Enterprise Linux 7 - $basearch baseurl=http://mirrors.aliyun.com/epel/7/$basearch failovermethod=priority enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 [epel-debuginfo] name=Extra Packages for Enterprise Linux 7 - $basearch - Debug baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=0 [epel-source] name=Extra Packages for Enterprise Linux 7 - $basearch - Source baseurl=http://mirrors.aliyun.com/epel/7/SRPMS failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=0
xtrabackup
介绍
XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部开源,真可谓是业界良心。阿里的 RDS MySQL 物理备份就是基于这个工具做的。
由于是采取物理拷贝的方式来做的备份,所以速度非常快,几十G数据几分钟就搞定了,而它巧妙的利用了mysql 特性做到了在线热备份,不用像以前做物理备份那样必须关闭数据库才行,直接在线就能完成整库或者是部分库的全量备份和增量备份。
新版本的xtrabackup改成了cmake安装,和以前有点不一样。 版本说明:2.3.3之后不备份死锁,如果数据库是mysql 5.7之后的必须要装2.4.4才可以用,当然了, 会向下兼容的。 `Xtrabackup`是由`percona`提供的`mysql`数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点: 1. 备份过程快速、可靠; 2. 备份过程不会打断正在执行的事务; 3. 能够基于压缩等功能节约磁盘空间和流量; 4. 自动实现备份检验; 5. 还原速度快;
xtrabackup选项 选项 --apply-log-only prepare备份的时候只执行redo阶段,对增量备份非常重要 --backup 创建备份并且放入--target-dir目录中 --close-files 不保持文件打开状态,xtrabackup打开表空间的时候通常不会关闭文件句柄目的是为了正确处理DDL操作。然而,如果表空间数量非常巨大并且不适合任何限制,一旦文件不在被访问的时候这个选项可以关闭文件句柄.打开这个选项会产生不一致的备份。自己评估风险。。 --compact 创建一份没有辅助索引的紧凑备份 --compress 压缩所有输出数据,包括事务日志文件和元数据文件,通过指定的压缩算法,目前唯一支持的算法是quicklz.结果文件是qpress归档格式,每个xtrabackup创建的*.qp文件都可以通过qpress程序提取或者解压缩 --compress-chunk-size=# 压缩线程工作buffer的字节大小,默认是64K --compress-threads=# xtrabackup进行并行数据压缩时的worker线程的数量,该选项默认值是1,并行压缩('compress-threads')可以和并行文件拷贝('parallel')一起使用。例如:'--parallel=4 --compress --compress-threads=2'会创建4个IO线程读取数据并通过管道传送给2个压缩线程 --create-ib-logfile 这个选项目前还没有实现,目前创建Innodb事务日志,你还是需要prepare两次bakcup --datadir=DIRECTORY backup的源目录,mysql实例的数据目录。从my.cnf中读取,或者命令行指定 --defaults-extra-file=[MY.CNF] 在global files文件之后读取,必须在命令行的第一选项位置指定 --defaults-file=[MY.CNF] 唯一从给定文件读取默认选项,必须是个真实文件,必须在命令行第一个选项位置指定 --defaults-group=GROUP-NAME 从配置文件读取的组,innobakcupex多个实例部署时使用 --export 为导出的表创建必要的文件 --extra-lsndir=DIRECTORY (for --bakcup):在指定目录创建一份xtrabakcup_checkpoints文件的额外的备份 --incremental-basedir=DIRECTORY 创建一份增量备份时,这个目录是增量别分的一份包含了full bakcup的Base数据集 --incremental-dir=DIRECTORY prepare增量备份的时候,增量备份在DIRECTORY结合full backup创建出一份新的full backup --incremental-force-scan 创建一份增量备份时,强制扫描所有增在备份中的数据页即使完全改变的page bitmap数据可用 --incremetal-lsn=LSN 创建增量备份的时候指定lsn。 --innodb-log-arch-dir 指定包含归档日志的目录。只能和xtrabackup --prepare选项一起使用 --innodb-miscellaneous 从My.cnf文件读取的一组Innodb选项。以便xtrabackup以同样的配置启动内置的Innodb。通常不需要显示指定 --log-copy-interval=# 这个选项指定了log拷贝线程check的时间间隔(默认1秒) --log-stream xtrabakcup不拷贝数据文件,将事务日志内容重定向到标准输出直到--suspend-at-end文件被删除。这个选项自动开启--suspend-at-end --no-defaults 不从任何选项文件中读取任何默认选项,必须在命令行第一个选项 --databases=# 指定了需要备份的数据库和表 --database-file=# 指定包含数据库和表的文件格式为databasename1.tablename1为一个元素,一个元素一行 --parallel=# 指定备份时拷贝多个数据文件并发的进程数,默认值为1 --prepare xtrabackup在一份通过--backup生成的备份执行还原操作,以便准备使用 --print-default 打印程序参数列表并退出,必须放在命令行首位 --print-param 使xtrabackup打印参数用来将数据文件拷贝到datadir并还原它们 --rebuild_indexes 在apply事务日志之后重建innodb辅助索引,只有和--prepare一起才生效 --rebuild_threads=# 在紧凑备份重建辅助索引的线程数,只有和--prepare和rebuild-index一起才生效 --stats xtrabakcup扫描指定数据文件并打印出索引统计 --stream=name 将所有备份文件以指定格式流向标准输出,目前支持的格式有xbstream和tar --suspend-at-end 使xtrabackup在--target-dir目录中生成xtrabakcup_suspended文件。在拷贝数据文件之后xtrabackup不是退出而是继续拷贝日志文件并且等待知道xtrabakcup_suspended文件被删除。这项可以使xtrabackup和其他程序协同工作 --tables=name 正则表达式匹配database.tablename。备份匹配的表 --tables-file=name 指定文件,一个表名一行 --target-dir=DIRECTORY 指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件 --throttle=# 指定每秒操作读写对的数量 --tmpdir=name 当使用--print-param指定的时候打印出正确的tmpdir参数,除此之外没有任何用。。 --to-archived-lsn=LSN 指定prepare备份时apply事务日志的LSN,只能和xtarbackup --prepare选项一起用 --user-memory = # 通过--prepare prepare备份时候分配多大内存,目的像innodb_buffer_pool_size。默认值100M如果你有足够大的内存。1-2G是推荐值,支持各种单位(1MB,1M,1GB,1G) --version 打印xtrabackup版本并退出
全量备份
#全量备份 xtrabackup --user=用户名 --password=数据库密码 --databases=数据库名称 --backup --target-dir=备份文件路径 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base chown -R mysql:mysql /backup/base #恢复备份:在同版本数据库中执行;恢复不用启动MySQL xtrabackup --user=root --password=数据库密码 --datadir=/usr/local/mysql8/data/ --copy-back --target-dir=/backup/base xtrabackup --prepare --target-dir=/backup/base xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm --datadir=/usr/local/mysql8/data/ --copy-back --target-dir=/backup/base chown -R mysql.mysql /data chown -R mysql.mysql /usr/local/mysql/
实例演示
备份:
#全量备份 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base ... ... MySQL binlog position: filename 'mysql-bin.000009', position '155' 210913 18:03:04 [00] Writing /backup/base/backup-my.cnf 210913 18:03:04 [00] ...done 210913 18:03:04 [00] Writing /backup/base/xtrabackup_info 210913 18:03:04 [00] ...done xtrabackup: Transaction log of lsn (19198828) to (19198828) was copied. 210913 18:03:04 completed OK! #拷贝到备机 scp -P 10088 base.tgz 10.3.65.18:/backup/
备机恢复:
#停mysql /etc/init.d/mysql stop #解压备份 tar -zxvf base.tgz #恢复,先prepare回滚未提交事务;需要对未提交的事务进行回滚以及对提交的事务进行前滚 xtrabackup --prepare --target-dir=/backup/base #备份恢复,datadir目录必须为空 xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm --datadir=/data/mysql_3306/ --copy-back --target-dir=/backup/base xtrabackup: recognized server arguments: --datadir=/data/mysql_3306 --open_files_limit=65535 --log_bin=mysql-bin --server-id=7001 --innodb_data_home_dir=/data/mysql_3306 --innodb_data_file_path=ibdata1:10M:autoextend --innodb_log_group_home_dir=/data/mysql_3306 --innodb_buffer_pool_size=4096M --innodb_log_file_size=1024M --innodb_log_buffer_size=8M --innodb_flush_log_at_trx_commit=1 --datadir=/data/mysql_3306/ xtrabackup: recognized client arguments: --port=3306 --socket=/var/run/mysql/mysql_3306.sock --user=root --password=* --copy-back=1 --target-dir=/backup/base xtrabackup version 8.0.25-17 based on MySQL server 8.0.25 Linux (x86_64) (revision id: d27028b) Original data directory /data/mysql_3306/ is not empty! 原来要空的才行,但是我的数据目录下面还有别的东西,数据库重新初始化再来一遍吧 210914 14:46:12 [01] Copying ./xtrabackup_info to /data/mysql_3306/xtrabackup_info 210914 14:46:12 [01] ...done 210914 14:46:12 [01] Copying ./xtrabackup_binlog_pos_innodb to /data/mysql_3306/xtrabackup_binlog_pos_innodb 210914 14:46:12 [01] ...done 210914 14:46:12 [01] Copying ./xtrabackup_master_key_id to /data/mysql_3306/xtrabackup_master_key_id 210914 14:46:12 [01] ...done 210914 14:46:12 [01] Copying ./ibtmp1 to /data/mysql_3306/ibtmp1 210914 14:46:13 [01] ...done 210914 14:46:13 [01] Creating directory ./#innodb_temp 210914 14:46:13 [01] ...done. 210914 14:46:13 completed OK! #由于我是用root执行,所以属主要重新调整 chown -R mysql.mysql /data chown -R mysql.mysql /usr/local/mysql/ #启动数据库并进行验证 mysql> show databases; +--------------------+ | Database | +--------------------+ | TEST1 | | TEST2 | | TEST3 | | information_schema | | mysql | | performance_schema | | sys | | testDB | +--------------------+
增量备份
#先进行全量备份 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base #基于全量备份,做增量备份 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base #第二次创建增量备份 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 #检查增量备份 cat /backup/inc1/xtrabackup_checkpoints
恢复备份
#停止数据库 /etc/init.d/mysql stop #清空现有数据 rm -rf /data/mysql_3306/* #prepare完整备份,注意使用--apply-log-only选项,防止日志回滚,最后一个增量备份不用此选项 xtrabackup --prepare --apply-log-only --target-dir=/backup/base xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1 xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2 #还原数据库 xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm --datadir=/data/mysql_3306/ --copy-back --target-dir=/backup/base/ #还原属主为mysql chown -R mysql.mysql /data #chown -R mysql.mysql /usr/local/mysql/ #启动数据库检查 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --plugin-dir=/usr/local/mysql/lib/plugin --open-files-limit=65535 --pid-file=/var/run/mysql/mysql_3306.pid --user=mysql mysql -u root -h localhost -p
实例演示
#先进行全量备份,上面做了,这一步省略 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base #插入一条数据,好进行判断 mysql -u root -h localhost -p Enter password: MySQL [(none)]> use testDB; Database changed MySQL [testDB]> select * from t; +------+--------+ | a | b | +------+--------+ | 1 | 小王 | +------+--------+ 1 row in set (0.02 sec) MySQL [testDB]> insert into t(a,b) values (2, "小李"); Query OK, 1 row affected (0.23 sec) MySQL [testDB]> select * from t; +------+--------+ | a | b | +------+--------+ | 1 | 小王 | | 2 | 小李 | +------+--------+ 2 rows in set (0.00 sec) #基于全量备份,做增量备份 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base MySQL binlog position: filename 'mysql-bin.000011', position '155' 210914 15:49:32 [00] Writing /backup/inc1/backup-my.cnf 210914 15:49:32 [00] ...done 210914 15:49:32 [00] Writing /backup/inc1/xtrabackup_info 210914 15:49:32 [00] ...done xtrabackup: Transaction log of lsn (19228665) to (19228665) was copied. 210914 15:49:33 completed OK! #同上,在插入一条数据,继续做增量备份 MySQL [testDB]> insert into t(a,b) values (3,"小王八"); Query OK, 1 row affected (0.12 sec) MySQL [testDB]> select * from t; +------+-----------+ | a | b | +------+-----------+ | 1 | 小王 | | 2 | 小李 | | 3 | 小王八 | +------+-----------+ 3 rows in set (0.00 sec) #基于增量备份inc1,做增量备份 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 MySQL binlog position: filename 'mysql-bin.000012', position '155' 210914 15:55:42 [00] Writing /backup/inc2/backup-my.cnf 210914 15:55:42 [00] ...done 210914 15:55:42 [00] Writing /backup/inc2/xtrabackup_info 210914 15:55:42 [00] ...done xtrabackup: Transaction log of lsn (19231721) to (19231721) was copied. 210914 15:55:43 completed OK! #检查增量备份 cat /backup/inc1/xtrabackup_checkpoints backup_type = incremental from_lsn = 19198828 to_lsn = 19228665 last_lsn = 19228665 flushed_lsn = 19228665 #######恢复数据####### #停止数据库 /etc/init.d/mysql stop #清空现有数据 rm -rf /data/mysql_3306/* #prepare完整备份,注意使用--apply-log-only选项,防止日志回滚,最后一个增量备份不用此选项 xtrabackup --prepare --apply-log-only --target-dir=/backup/base ....... Starting shutdown... Log background threads are being closed... Shutdown completed; log sequence number 19198828 Number of pools: 1 210914 19:31:58 completed OK! xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1 ...... 210914 19:33:38 [00] Copying /backup/inc1/mysql-bin.index to ./mysql-bin.index 210914 19:33:38 [00] ...done 210914 19:33:39 completed OK! xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2 ...... Trying to access missing tablespace 4294967294 Starting shutdown... Log background threads are being closed... Shutdown completed; log sequence number 19231756 210914 19:34:11 completed OK! #还原数据库 xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm --datadir=/data/mysql_3306/ --copy-back --target-dir=/backup/base/ ...... 210914 19:35:05 [01] Creating directory ./#innodb_temp 210914 19:35:05 [01] ...done. 210914 19:35:05 completed OK! #还原属主为mysql chown -R mysql.mysql /data #chown -R mysql.mysql /usr/local/mysql/ #启动数据库检查 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --plugin-dir=/usr/local/mysql/lib/plugin --open-files-limit=65535 --pid-file=/var/run/mysql/mysql_3306.pid --user=mysql mysql -u root -h localhost -p mysql> use testDB; Database changed mysql> select * from t; +------+-----------+ | a | b | +------+-----------+ | 1 | 小王 | | 2 | 小李 | | 3 | 小王八 | +------+-----------+ 3 rows in set (0.01 sec)