一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。mysql
Percona XtraBackup的工做原理是在启动时记住日志序列号(LSN),而后复制数据文件。同时,Percona XtraBackup运行一个后台检测进程,该进程监视mysq redo事务日志文件,并从其中复制更改,记入后台日志文件xtrabackup_log中。以后复制innodb的数据文件一系统表空间文件ibdatax,复制结束后,将执行flush tables with readlock,而后复制.frm MYI MYD等文件,最后执行unlock tables,最终中止xtrabackup_logsql
方法一(官方推荐):
1.下载相应的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_6 4.rpm数据库
2.安装已下载的rpm安装包
yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpmcentos
3.查看是否已安装成功
rpm -qa | grep -i xtrabackup
相关文件查询
rpm -ql percona-xtrabackup-80缓存
4.建立备份目录服务器
5.修改mysql配置文件
开启bin-log日志,添加或修改数据库目录并发
方法二(官方推荐):app
安装Percona yum存储库
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpmsocket
安装Percona XtraBackup
yum install percona-xtrabackup-80工具
方法三:
解压
tar zxvf percona-xtrabackup-8.0.7-Linux-x86_64.libgcrypt20.tar.gz
mv percona-xtrabackup-8.0.7-Linux-x86_64 xtrabackup
cp -r xtrabackup /usr/local/xtrabackup
添加环境变量
echo "export PATH=$PATH:/usr/local/xtrabackup/bin" >
/etc/profile.d/xtrabackup.sh
让环境变量生效
source /etc/profile.d/xtrabackup.sh
(1)移除了innobackupex命令;
(2)Percona XtraBackup 8.0 支持MySQL8.0的版本;
(3)mysql8.0以前的版本须要使用xtrabackup2.4备份和恢复.
Xtrabackup一个以彻底备份所需的最低特权建立数据库用户:
mysql> CREATE USER ‘bkpuser'@'localhost' IDENTIFIED BY 's3cr%T';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON . TO 'bkpuser'@'localhost';
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
一旦链接到服务器,在服务器执行备份你对datadir须要READ和EXECUTE的文件系统级权限。
若是有多个服务器实例,则必须指定正确的链接参数(port, socket, host),以便xtrabackup与正确的服务器通讯。
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=xxxyyy --port=3306 --backup --target-dir=/backup/full/
--rsync
使用rsync实用程序优化本地文件传输。指定此选项后,xtrabackup将使用rsync复制全部非InnoDB文件,而不是为每一个文件生成单独的cp,这对于具备大量数据库或表的服务器而言能够更快。此选项不能与--stream一块儿使用。
--use-memory
此选项会影响分配多少内存以使用进行备份
--parallel=#
此选项指定建立备份时用于同时复制多个数据文件的线程数。默认值为1(即无并发传输)。
在恢复备份以前,datadir必须为空。一样重要的是,在执行恢复以前,MySQL服务器须要关闭。不能还原到正在运行的mysqld实例的datadir(导入部分备份时除外)。
准备一个全量备份,主要做用正是经过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxxyyy --prepare (--apply-log-only)--target-dir=/backup/full/
当数据恢复至数据目录之后,您应该检查恢复的文件是否具备正确的全部权和权限。因为文件属性将被保留,在大多数状况下,在启动数据库服务器以前,您须要将文件的全部权更改成mysql,由于它们将由建立备份的用户拥有:
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxxyyy --copy-back --target-dir=/backup/full/
chown -R mysql:mysql /var/lib/mysql
从新启动mysql服务
若是您打算将备份做为进一步增量备份的基础,那么在准备备份时应该使用—apply-log-only选项,不然将没法对其应用增量备份
--defaults-file
指定mysql配置文件:只能从给定的文件中读取默认选项。 且必须做为命令行上的第一个选项;必须是一个真实的文件,它不能是一个符号连接。
--target-dir
指定备份数据目录
--prepare
数据文件在准备好以前不是时间点一致的,由于它们是在程序运行的不一样时间复制的,而且在此过程当中可能已经被更改,此步骤使文件在同一时刻彻底一致
--backup
作一个备份,放入--target-dir
--copy-back
拷贝先前备份全部文件到它们的原始路径。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项。
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=xxxyyy --port=3306 --databases=”xxx” --backup --target-dir=/part/single
prepare部分备份的过程相似于导出表的过程,要使用--export选项进行,还原部分备份的过程跟导入表的过程相同。固然,也能够经过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。
--export
建立导出表所需的文件
要将innodb_file_per_table开启,数据要是innodb存储引擎,若是是delete数据的话,datadir目录下仍是会有.ibd、.frm文件,若是是drop的数据,那么咱们的手动执行要恢复表的建表语句,.cfg文件是用来和数据字典进行匹配的。
增量备份主要是经过拷贝innodb中有变动的页(指的是LSN大于xtrabackup_checkpoints中的LSN号)。文件xtrabackup_checkpoints会记录备份完成时检查点的LSN,增量备份是基于全备的,第一次增量备份的数据是基于上一次全备,以后的每一次增备都是基于上一次的增备,最终达到一致性的增备,增备的过程当中,和全备很相似,区别在于第二步
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=123456 --backup --target-dir=/incr/incr1
--incremental-basedir=/data/backup/
xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=123456 --backup --target-dir=/part/incr2
--incremental-basedir=/incr/incr1
须要注意的是,增量备份仅能应用于InooDB或XtraDB表,对于MyISAM表,增量与全备相同.
准备彻底备份,确保全备数据目录数据的一致性
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/backup
恢复增量备份到彻底备份(开始恢复的增量备份要添加--apply-log-only参数,到最后一次的增量备份要去掉--apply-log-only),即便--apply-log-only在最后一次的增量备份中使用了,备份仍将保持一致,但在这种状况下,服务器将执行回滚阶段。
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/backup/ --incremental-dir=/incr/incr1
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/ --incremental-dir=/incr/incr2
最终数据会在/data/backup/上,对应用了增量备份的新备份进行恢复
xtrabackup --user=root --password=xxxyyy --copy-back --target-dir=/data/backup/
chown -R mysql:mysql /var/lib/mysql
--prepare增量备份的步骤与彻底备份的步骤不一样。在彻底备份中,执行两种类型的操做以使数据库保持一致:已提交的事务相对于数据文件从日志文件中重放,未提交的事务被回滚。在准备增量备份时,必须跳过未提交事务的回滚,由于在备份时未提交的事务可能正在进行中,而且颇有可能将在下一个增量备份中提交。您应该使用该 --apply-log-only选项来防止回滚阶段。
--apply-log-only
此选项只致使在准备备份时执行重作阶段。这对于增量备份很是重要。
--target-dir
备份:增量备份目录
恢复:在准备增量备份时,这是增量备份与完整备份相结合以建立新的完整备份的目录。
--incremental-basedir
在建立增量备份时,此目录包含完整备份,即增量备份的基本数据集。
—apply-log-only
防止事务回滚阶段
(1)xtrabackup_checkpoints —— 备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息。
每一个InnoDB页(一般为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
(3)xtrabackup_info —— 记录的是你备份的时候的一些参数,脚本版本,数据库版本,备份时间,binlog,是否压缩,备份增量仍是全量等信息。
(4)backup-my.cnf —— 包含了my.cnf中备份时须要的信息。
(5)xtrabackup_logfile——记录了备份过程当中的日志,在对数据进行prepare时须要经过日志将数据还原成一致的可用的数据。
(6)其余一些数据库文件信息
有时您能够看到to_lsn (最后一个检查点LSN)和last_lsn(最后一个复制的LSN)之间存在差别,这意味着在备份过程当中服务器上有一些流量
导出SQLy语句文件
逻辑备份还原速度慢:须要MySQL加载和解释语句、转化存储格式、重建引擎
mysqldump命令必须带上--flush-logs选项以生成新的二进制日志文件
mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction --flush-logs --master-data=2 --all-database > /backup/all.sql
对于MyISAM将–single-transaction替换为–lock-all-tables
--flush-logs为结束当前日志,生成新日志文件;
--master-data=2 选项将会在输出SQL中记录下彻底备份后新日志文件的名称;以及其开始的pos位置
--all-database 全部数据库
--master-data=[0|1|2]
0 : 不记录
1 : 记录为CHANGE MASTER语句
2 : 记录为注释的CHANGE MASTER语句
--single-transaction 该选项在导出数据以前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB
mysql -h127.0.0.1 -P3306 -uroot -p < /backup/all.sql
mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction --flush-logs --master-data=2 dbname > /backup/part.sql
mysql -h127.0.0.1 -P3306 -uroot -pxxxx < /backup/part.sql
增量备份的数据是从上次全量备份以后更新的数据,对mysql来讲binlog日志文件存储着增量备份的数据。binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息。
mysqladmin -uroot -pxxxx flush-logs
执行增量备份的前提条件是MySQL打开binlog日志功能,在mysql配置文件my.cnf中加入log-bin=mysql-bin
mysqldump增量恢复:
mysqlbinlog mysql-bin.0000xx | mysql -uroot -p
mysqldump数据恢复指定的时间点或位置:
--start-datetime=YYYY-mm-dd HH:MM:SS
--stop-datetime=YYYY-mm-dd HH:MM:SS
上边一组参数用于指定恢复开始时间点和结束时间点,能够一块儿或单独给出
--start-position=xxxxx
--stop-position=xxxxx
上边一组参数用于指定恢复开始位置和结束位置,能够一块儿或单独给出
两组参数也能够结合使用
工具 | mysqldump | xtrabackup |
---|---|---|
数据量 | 1G左右 | 1G左右 |
全备时间 | 平均1m15s | 平均20s |
恢复全备时间 | 平均8m | 平均18s |
占用空间 | 617MB | 930MB |
工具 | mysqldump | xtrabackup |
---|---|---|
数据量 | 5G左右 | 5G左右 |
全备时间 | 平均3m50s | 平均1m10s |
恢复全备时间 | 平均45m | 平均1m5s |
占用空间 | 3.3GB | 4G |
一周作一次全量备份,其他时间增量备份或者一个月作一次全量备份,一周一次增量备份,依靠系统定时任务,在业务压力比较小的时间点凌晨(0--5点),定时执行备份脚本
若全量备份,能够天为单位进行删除 若全量+增量备份,按期删除(建议周期一个月)已过期备份文件