大数据量备份与还原,始终是个难点。关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天推荐另一个备份工具innobackupex。
innobackupex和mysqldump都可以对mysql进行热备份的,mysqldump对mysql的innodb的备份可以使用single-transaction参数来开启一个事务,利用innodb的mvcc来不进行锁表进行热备份,mysqldump备份是逻辑备份,备份出来的文件是sql语句,所以备份和恢复的时候很慢,但是备份和恢复时候很清楚。当MYSQL数据超过10G时,用mysqldump来导出备份就比较慢了,此种情况下用innobackupex这个工具就比mysqldump要快很多,现在我们就利用它对mysql做全量和增量备份.
Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。
Percona XtraBackup是一款开放源代码且免费的MySQL热备份软件,是目前最流行的 MySQL备份软件之一,可以非阻塞地对InnoDB和XtraDB数据库进行备份。 使用Percona XtraBackup,可以:
• 快速可靠地完成备份。
• 在备份期间不间断地处理事务。
• 节省磁盘空间和网络带宽。
• 自动备份验证。
• 更快地恢复,以保障业务有更长的在线时间。
Percona XtraBackup支持所有版本的Percona Server、MySQL和MariaDB分支的MySQL 热备份,可以进行流备份、压缩备份、增量备份,对InnoDB、XtraDB和HailDB存储引擎 支持完全非阻塞的备份。此外,还可以简单地备份MyISAM、Merge和Archive存储引擎 (会锁定表)。 注意:本章内容根据XtraBackup 2.4.4版本撰写,在该版本中innobackupex命令为xtrabackup的软链接,本 质上它们是同一个二进制程序。
官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/intro.html
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex(mysql 8.0开始innobackupex 已经完成和Xtrabackup合并,移除了innoxtrabackup命令)
mysql 5.7及以下的版本使用innobackupex
mysql 5.7以上的版本使用Xtrabackup
官网地址:https://www.percona.com/doc/percona-xtrabackup
Xtrabackup下载与安装:
https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
Xtrabackup增量备份与恢复:
https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html
Xtrabackup全量备份与恢复:
https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/full_backup.html
Xtrabackup参数选项及使用说明:
https://www.percona.com/doc/percona-xtrabackup/LATEST/xtrabackup_bin/xbk_option_reference.html
完全备份流程(图片源自网络)
• innobackupex在开始备份时,首先使用指定的账号和密码连接MySQL,该数据库 连接用于在备份过程中执行如加锁、解锁,刷新redo日志等与数据库进行交互操作。
• 读取--defaults-file选项指定的配置文件,解析innodb_data_home_dir和innodb_log_ group_home_dir等系统参数,找到数据表空间和redo日志文件的位置。创建 xtrabackup_logfile文件,模拟MySQL实例方式,以读写模式打开并读取redo日志,检查当 前检查点,从当前检查点位置开始复制redo日志,同时持续扫描redo日志,有新产生的 redo日志数据就复制到xtrabackup_logfile文件中(在整个备份过程中一直在复制redo日 志,通过查看备份目录下的xtrabackup_logfile文件,可以看到这个文件在不断增长)。
• 另外一个线程调用xtrabackup命令开始复制数据文件(包括共享表空间文件和独立 表空间文件,相当于获得了redo日志、undo日志和数据文件,只是没有内存中的脏页数 据,不过没有关系,直接用redo日志来恢复就可以了)。
• 全局执行FLUSH TABLES WITH READ LOCK语句(下文中提到的FTWRL为该语 句的简写)加一个S锁,此时数据库处于不可写状态(执行FLUSH TABLES WITH READ LOCK语句的目的是为了防止读取数据时发生DDL操作,并且获取binlog文件位置)。 redo日志暂时也会卡在这里。
• 开始复制表结构文件,即.MYD和.MYI文件(由于前面步骤会锁定表,所以如果 数据库中有很大的MyISAM表就要注意了,会一直锁定到MyISAM的.MYD、.MYI、.frm 文件复制完成且获取了binlog文件位置之后才解锁。如果没有MyISAM表,那么在复制完
表空间文件之后的操作是非常快的,可能不到1分钟就完成了复制表.frm文件,获取到 binlog文件位置。
• 先执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS语句将InnoDB层的redo日 志持久化到磁盘后进行复制(因为xtrabackup并不备份二进制日志,所以,如果这个过程 出现问题,就会导致恢复之后丢失redo日志中的数据,做主从复制可能会同步出错,但在 XtraBackup 2.2.3之后不会再出现丢失redo日志的情况),然后停止读redo日志复制的线 程。需要注意,innobackupex备份数据的时间点是停止redo日志复制时的数据对应的时间 点。
• 当redo日志的复制线程停止之后,执行UNLOCK TABLES语句解锁表。
• innobackupex完成收尾工作,如释放资源、记录与备份相关的元数据信息等(例如 backup-my.cnf和xtrabackup_info文件),最后退出innobackupex备份进程(在XtraBackup 2.3之前的版本中,innobackupex和xtrabackup是两个程序,innobackupex需要等待 xtrabackup子进程结束后再退出。关于两个程序之间的协调下文中会详细介绍,这里不再 赘述)
• 在备份恢复时,启动一个mini instance(最小化数据库实例),把数据文件复制到 内存中,然后再读取xtrabackup_log中的redo日志进行应用,最后对没有提交的事务使用 undo日志进行回滚。
• 如果查看备份恢复时打印的日志,就会发现使用innobackupex命令执行备份恢复的 过程和mysqld进程启动过程非常相似,在使用innobackupex命令执行备份恢复的过程中会 做一次 crash recovery(崩溃恢复)操作。恢复的目的是把备份数据恢复到一个一致性位 点(undo、redo日志和表空间中的数据相对应)。
• 备份时执行FTWRL后,数据库处于只读状态,非InnoDB表是在持有全局读锁的情 况下复制的,所以其本身就对应于FTWRL的时间点。InnoDB的.ibd文件复制是在FTWRL
前做的,复制出来的不同.ibd文件的最后更新时间点是不一样的,这种状态的.ibd文件是 不能直接用的,但是redo日志是从备份开始就一直持续复制的,最后的redo日志时间点是 在执行FTWRL后取得的,所以最终通过redo日志应用后的.ibd文件数据的时间点和 FTWRL的时间点是一致的。因此,恢复过程只涉及InnoDB文件的恢复,非InnoDB表是不 需要恢复的。当备份恢复完成后,就可以把数据文件复制到对应的目录下,通过mysqld来 启动了。
每个InnoDB页面都会包含一个LSN号,每当相关的数据发生改变时,相关页面的LSN 号就会自动增长。这正是InnoDB表可以进行增量备份的基础,innobackupex可以通过把上 一次备份之后发生改变的那一部分页面复制出来以实现增量备份。也就是说,增量备份基 于上一次备份的LSN号,备份大于该LSN号的那一部分数据文件页。在xtrabackup_ checkpoints或xtrabackup_info等文件中from_lsn、to_lsn、last_lsn记录的是LSN号,其中, from_lsn表示备份数据开始的LSN号(如果是增量备份,则该LSN号与上一次备份中的 to_lsn相等),to_lsn表示备份数据结束的LSN号(也是备份中最新的检查点位置), last_lsn表示备份结束时复制的redo日志LSN号。增量备份是基于上一次备份中的to_lsn来 实现的(即:基于上一次备份的检查点位置)。检查点机制可以确保LSN号小于检查点位 置的数据页已经被刷新到磁盘中,所以在执行增量备份时,通过比对数据文件中数据页的 LSN号,就能够找出哪些数据页需要被复制(只要是LSN号大于上一次备份的to_lsn的数 据页,在执行增量备份时就需要被复制)。第一次增量备份必须基于一次完整的备份进 行,第二次增量备份可以基于第一次增量备份进行,依此类推(当然,第二次增量备份也 可以基于完全备份进行,如果采用这样的备份策略,那么第二次增量备份与第一次增量备 份之间就没有关联了,恢复时需要一次完全备份+一次增量备份)。
在增量备份恢复时,除最后一次增量备份外,其他的完全备份和增量备份(如果进行 了多次增量备份)必须同时使用--apply-log和--redo-only选项,即只做前滚,不做回滚。 最后一次增量备份恢复时禁用--redo-only选项,单独使用--apply-log选项,即回滚操作放 在最后一次增量备份上。 不管是完全备份还是增量备份,当备份完成时都会获取备份完成时刻的检查点,用于 生成xtrabackup_checkpoints文件。
xtrabackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。
为什么要用rw模式呢?直接read模式不好么?因为xtrabackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。
全量备份
备份:
xtrabackup --defaults-file=/etc/my.cnf --user=backup --password=xxx --socket=/usr/local/mysql/mysqld.sock --databases=zabbix --backup --host=ip --target-dir=/data/backup/xtrabackup/
--host=ip 数据库的ip,本地的可以不加(适用于远程备份)。
恢复:
准备恢复
xtrabackup --prepare --target-dir=/data/backup/xtrabackup/
执行数据恢复
xtrabackup --host=localhost --user=root --password=xxxx --port=3306 --datadir=/data/mysqldata/3306/data --copy-back --target-dir=/backup/mysql/data/
--copy-back :复制数据到目标目录下,当前备份数据不删除
--move-back :移动数据到目标目录下,当前数据会删除(适合存储空间不大的情况)
后台执行:nohup backup.sh > backup.log &
增量备份
备份:
首先先创建完全备份:
xtrabackup --user=backup --password=xxxx --databases=zabbix --backup --target-dir=/data/backup/xtrabackup/
创建第一次增量备份:
xtrabackup --user=backup --password=xxxx --databases=zabbix --backup --target-dir=/data/backup/inc1 --incremental-basedir=/data/backup/xtrabackup/
--incremental-basedir=/data/backup/ 全备目录
--target-dir=/data/backup/inc1 增备目录
创建第二次增量备份:
xtrabackup --user=backup --password=xxxx --databases=zabbix --backup --target-dir=/data/backup/inc2 --incremental-basedir=/data/backup/inc1
--incremental-basedir=/data/backup/inc1上次增备的目录
--target-dir=/data/backup/inc2 增备目录
应用日志:
先准备全量备份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/xtrabackup/
将第一次增量备份应用到完全备份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/xtrabackup/ --incremental-dir=/data/backup/inc1
准备第二次增量备份是一个类似的过程:
xtrabackup --prepare --target-dir=/data/backup/xtrabackup/ --incremental-dir=/data/backup/inc2/
恢复数据
xtrabackup --host=localhost --user=root --password=oracle --port=3306 --datadir=/data/mysqldata/3306/data --copy-back --target-dir=/backup/mysql/data/
全量备份:
远程流备份:
互信配置:
ssh-keygen
cat ~/.ssh/id_*.pub|ssh root@ip 'cat>>~/.ssh/authorized_keys'
ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip
ssh root@ip date
innobackupex --defaults-file=/etc/mysql3307.cnf --parallel=2 --user=root --password='xxx' --socket=/data/danmaku/data/mysql3307.sock --host='ip' --stream=xbstream /bakdir | ssh root@192.169.100.52 "xbstream --parallel=2 -x -C /bakdir" &
应用日志:
/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --apply-log /bakdir &
还原数据:
/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --move-back /bakdir &
增量备份:
innobackupex --defaults-file=/etc/my.cnf --parallel=2 --user=root --password=xxx --socket=/data/mysql/mysqld.sock /data/backup/full
全量备份(以xbstream流的方式备份到远程服务器上)
innobackupex --defaults-file=/etc/mysql3307.cnf --parallel=2 --user=root --password='xxx' --socket=/data/danmaku/data/mysql3307.sock --host='ip' --stream=xbstream /bakdir | ssh root@192.169.100.52 "xbstream --parallel=2 -x -C /bakdir" &
或者(强压缩的方式备份):
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkuser --password=pwd --no-timestamp --slave-info --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --extra-lsndir=${lsndir}/lsn_full -t=${tmpDir} $backdir/full 2> $out_log |pbzip2 -fz -p10 -m2000 -5 > $backdir/full/full-`date +%Y%m%d`.xbstream.bz2
第一次增备
innobackupex --defaults-file=/etc/my.cnf --user=root --password=xxxx--socket=/usr/local/mysql/mysqld.sock --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/full/2017-12-24_10-22-30/ --parallel=2
--incremental 表示增备目录
--incremental-basedir 表示增量备份的全备目录
或者
innobackupex --defaults-file=$file_cnf --no-timestamp --host=$host --user=$user_name --password=$password --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --extra-lsndir=$lsndir --incremental --incremental-basedir=$lsndir $backdir/rec0 2> $out_log | pbzip2 -fz -p10 -m2000 -5 > $backdir/rec0-`date +%Y%m%d`.bz2
第二次增量备份:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=xxxx --socket=/usr/local/mysql/mysqld.sock --incremental /data/backup/incremental/--incremental-basedir=/data/backup/full/2017-12-24_10-22-30/ --parallel=2
或者
innobackupex --defaults-file=$file_cnf --no-timestamp --host=$host --user=$user_name --password=$password --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --extra-lsndir=$lsndir --incremental --incremental-basedir=$lsndir $backdir/rec1 2> $out_log |pbzip2 -fz -p10 -m2000 -5 > $backdir/rec1-`date +%Y%m%d`.bz2
应用日志:
/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --apply-log /bakdir &
还原数据:
/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --move-back /bakdir &
/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --user=backup --password='dIwBO8UVp*s!' --no-timestamp --parallel=6 --throttle=200 --stream=xbstream --use-memory=4G --extra-lsndir=/datas/backup/lsn_full -t=/datas/backup/tmp /datas/backup/full 2> /datas/backup/bak.log |pbzip2 -fz -p10 -m2000 -5 > /datas/backup/full/full-`date +%Y%m%d`.xbstream.bz2
强压缩方式数据的解压:
1。解压bz2文件成为strea流 (强压缩 备份时间短,但是解压时间长)
bzip2 -d full-20200813.xbstream.bz2
-p 10 (可以指定-p32) 表示使用32颗CPU
2.解压strea流 成为数据文件:
xbstream -x < full-20200813.xbstream -C /tmp/fullbak
如
xbstream -x < full-20201014 -C /data/bakdata/
full-20201014 为流格式的压缩文件
/data/bakdata/ 为解压的目录,即需要还原到的mysql的数据目录。
**注意:
mysql 8.0里面需要删除掉-t=${tmpDir}
/bin/xtrabackup --defaults-file=/etc/my.cnf --socket=/tmp/mysql3306.sock --user=backup --password='xxxxx' --backup --no-timestamp --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --backup --extra-lsndir=/data/bakData/mysql/lsn_full > /data/bakData/mysql/xtrabackup_log_20210407 |pbzip2 -fz -p10 -m2000 -5 > /data/bakData/mysql/full/full-`date +%Y%m%d`.xbstream.bz2
(1)备份速度快,物理备份可靠
(2)备份过程不会打断正在执行的事务(无需锁表)
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动备份校验
(5)还原速度快
(6)可以流传将备份传输到另外一台机器上
(7)在不增加服务器负载的情况备份数据
(8)可并行备份,并且可以现在备份的压力
(9)可增量备份
定制数据备份策略。例如每周日完整备份,周一到周六增量备份。
xtrabackup 本身只能备份 InnoDB 和 XtraDB ,不能备份 MyISAM;
innobackupex 本身是 Hot Backup 脚本修改而来,同时可以备份 MyISAM 和 InnoDB,但是备份 MyISAM 需要加读锁。
innobackupex 相关参数
--apply-log
通过应用同一目录下的事务日志文件xtrabackup_logfile,在BACKUP-DIR目录准备一个备份。页建立一个新的事务日志文件。innoDB的配置是从innobackupex备份时建立的文件backup-my.cnf读取。
--close-files
不保持文件被打开。默认备份时tablespace不关闭,但如果表空间很大并且不适合任何限制,有一个可选的方法是关闭不再访问的文件。使用该选项会产生不一致的备份。
--compact
建立一个忽略耳机索引页的简洁备份。
--compress
建立一个innoDB数据文件的压缩备份。它直接提交给xtrabackup的子进程
--compres-threads=#
并行压缩的工作进场数量,它直接提交给xtrabackup的子进程
--compress-chunk-size=#
指定每个压缩进程的内部工作缓冲区的尺寸,用字节来测量。它直接提交给xtrabackup的子进程
--copy-back
复制所有的备份到他们原来的位置
--databases=LIST
指定将要备份的数据库列表。支持databasename.tablename格式,如果没指定参数,则备份所有数据库
--decompress
解压所有以选项--compress备份的,结尾是.qp的文件。使用参数--parallel允许多个文件同时被解密和或解压。
--decrypt=ENCRPYTION-ALGORITHM
解密用--encrpyt选项加密的以.xbcrypt结尾的文件。
--defaults-file=[my.cnf]
通过制定一个字符串来设置MySQL的默认选项
--defaults-extra-file=[my.cnf]
在从标准的默认文件中取值默认之前的额外文件。接收一个字符串作为选项
--defaults-group=GROUP-NAME
如果用了Mysqld_multi,可设置读取配置文件的特定组
--encrypt=ENCRYPTION-ALGORITHM
该选项指引xtrabackup使用参数ENCRYPTION_ALGORITHM参数制定的算法,加密innoDB数据文件的备份,它直接指向子进程
--encrypt-key=ENCRYPTION_KEY
指示xtrabackup在备份时使用ENCRYPTION_KEY指定的key做--encrypt加密。它直接传给子进程
--encrypt-key-file=ENCRYPTION_KEY_FILE
当用选项--encrpyt加密时使用存储在ENCRYPTION_KEY_FILE里存储的加密key
--encrypt-threads=#
指定并行加密的工作线程数。它直接传给子进程
--encrypt-chunk-size=#
指定每个加密进程使用的内粗工作缓冲区的尺寸,以字节计算大小
--export
它用于导出单个表用于导入另一个server
--extra-lsndir=DIRECTORY
指定xtrabackup_checkpoints文件的保留目录
--force-non-empty-directories
该参数使得选项--copy-back or --move-back选项传输文件到非空目录。不存在的文件将被覆盖。如果选项--copy-back or --move-back必须从备份目录到一个已经存在的目标目录,则将失败
--galera-info
该选项在备份时建立包含本地节点状态xtrabackup_galera_info文件。用于执行Percona-XtraDB-Cluster备份
--host=HOST
执行通过TCP/IP连接访问数据库的主机,它传给mysql的子进程
--ibbackup=IBBACKUP-BINARY
接收字符串参数,它用来指定要使用的xtrabackup binary、
--include=REGEXP
指定一个正则表达式,用语匹配格式为databasename.tablename的表名称,它传递给--tables选项
--incremental
建立一个增量备份,传递给xtrabackup的子进程。该参数可以和参数--incremental-lsn or --incremental-basedir配合使用。
--incremental-basedir=DIRECTORY
指定一个包换全库备份的目录作为增量备份的基础数据库
--incremental-dir=DIRECTORY
指定增量备份与全库备份合并去建立一个新的全备份的目录。
--incremental-lsn=LSN
指定增量备份将要开始的LSN,它替代选项--incremental-basedir
--kill-long-queries-timeout=SECONDS
该选项指定innobackupex在开始FLUSH TABLES WITH READ LOCK和杀掉这些阻碍他的查询之间的时间的等待时间,以秒计算,默认为0,意味着innobackupex不尝试杀任何查询,
该选项需要process and super权限
--kill-long-query-type=all|select
指定解锁全局锁时将被杀掉的查询类型,默认是all
--lock-wait-timeout=SECONDS
运行FLUSH TABLES WITH READ LOCK之前,innobackupex等待阻塞查询的时间数(秒数)
--lock-wait-threashold=SECONDS
选项指定查询运行时间阀值,当innobackupex发现长运行查询伴随着--lock-wait-timeout的一个非0值,
--lock-wait-query-type=all|update
指定innobackupex发出一个全局锁之前什么类型的查询允许完成
--lock-copy-interval=#
指定日志日志复制线程检车完成的时间间隔,以毫秒计算
--move-back
移动之前的所有备份从一个备份目录到他们的原始位置
--no-lock
不允许使用flush tables with read lock表锁。如果你的所有表示INNODB并且你不关心二进制日志备份的位置。如果有任何DDL语句被执行或任何非INNODB表上的update操作,这个选项就不能使用
--notimestamp
把备份放在一个通过选项backup-root-dir指定的子目录里
--no-version-check
禁止版本检查
--parallel=NUMBER-OF-THREADS
该选项接收一个整数,xtarbackup子进程将用于同时备份文件的并发数。如果有多个.ibd文件可以并行,如果只有一个表空间文件,则该选项无效
--password=PASSWORD
指定连接到数据库的账户密码
--port=PORT
该选项指定通过TCP/IP连接到数据库时所用的端口
--rebuild-indexes
只有用--apply-log选项时它才有效,当应用日志后使得xtrabackup重建所有的二级索引。一般用于准备简约备份
--rebuild-threas=NUMBER-OF-THREADS
当一起使用选项--apply-log and --rebuild-indexes选项时才有用,使用后,当重建索引时,xtrabackup处理表空间时用一定数量的线程的并行模式
--redo-only
选项用于准备全库备份和合并处最有一个备份外的所有增量备份。它强制xtrabackup忽略“rollback”阶段只做“redo”.
--rsync
使用rsync工具优化本地文件传输。它让xtrabackup使用rsync复制所有非innoDB文件,而不是使用多个cp
--safe-slave-backup
停止从SQL进程并等待启动备份直到slave_open_temp_tables的值为0。如果没有打开临时表,备份会进行,否则SQL进程将启动并直到没有打开的临时表时停止。如果slave_open_temp_tables在--
safe-slave-backup-timeout秒后没有变成0,则备份会失败。备份结束后,从SQL进程将重新启动
--safe-slave-backup-timeout=SECONDS
--safe-slave-backup要等slave_open_temp_tables变成0的时间,默认为300秒
--scopt=SCP-OPTIONS
当参数--remost-host指定时传递给scp的参数
--slave-info
当备份一个复制从库操作的时候用,它打印二进制日志的position和主库的名字,它页把这些信息写入xtrabackup_slave_info文件作为一个CHANGE MASTER命令
--socket=SOCKET
指定连接到本地数据库sever时使用的一个unix domain socket,它没有修改的传入mysql子进程
--sshopt=SSH-OPTIONS
当使用参数--remost-host时,使用ssh的命令行参数
--stream=STREMNAME
当使用流备份时使用的特定格式。备份将以特定格式传到STDOUT。支持的格式为tar and xbstream
--tables-file=FILE
指定备份的表的列表,格式为database.tablename
--throttle=IOS
指定I/O操作的数量/秒。该参数只适用于备份阶段。不适用于参数--apply-log,--copy-back
--tmpdir=DIRECTORY
在参数--stream使用时指定,是指临时文件被存储的位置
--use-memory=#
该参数只能和参数--apply-log配合使用,被用于xtrabackup做creash恢复时准备锁使用的内存量(单位:字节)。也支持其他单位,如:1MB,1M,1GB,1G
--user=USER
指定连接到mysql时使用的用户名
--version
显示innobackupex的版本信息和版权等信息
--version-check
指定该选项后,innobackupex将在建立一个连接后,在备份阶段执行一个版本检查
xtrabackup相关参数
--apply-log-only
这个参数使在准备备份时,只执行重做阶段,这对于增量备份非常重要。
ssh-keygen
cat ~/.ssh/id_*.pub|ssh root@ip 'cat>>~/.ssh/authorized_keys'
ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip
ssh root@ipdate
如果认证报错
可以通过修改.ssh/know_host 文件中的秘钥信息,重新创建连接
innobackupex --defaults-file=/etc/my.cnf --user=root --password='root' --host='ip' --stream=xbstream /bakdir | ssh root@remoteip "xbstream -x -C /bakdir" &
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --apply-log /bakdir &
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --move-back /bakdir &
chmod -R 755 /mysql/data/
chown -R mysql:mysql /mysql/data/
mysqld_safe --defaults-file=/etc/my.cnf &
cat xtrabackup_binlog_info
a39dd15a-820c-11ea-8c17-000c29034b31:1-3
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='a39dd15a-820c-11ea-8c17-000c29034b31:1-3';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
获取位置信息
在231.145上配置同步
change master to master_host='ip',\
master_port=3309,master_user='repl',master_password='xxx',\
master_log_file='xxx',master_log_pos=xxx;
CHANGE MASTER TO
MASTER_HOST='ip',
MASTER_USER='repl',
MASTER_PASSWORD='xxxx',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
start slave;
show slave status \G;
select * from mysql.slave_master_info\G
管道的方式一步解压:
pbzip2 -dc -p10 -m2000 -5 /data/backup/mgyw/mysql.last/full/full-20190110.bz2 |xbstream -x
分步执行解压(会占用两份空间)
1。解压bz2文件成为strea流 (强压缩 备份时间短,但是解压时间长)
bzip2 -d full-20220110.xbstream.bz2
nohup sh unzip.sh > unzip.log &
-p 10 (可以指定-p32) 表示使用32颗CPU
2.解压strea流 成为数据文件:
xbstream -x < full-20220110.xbstream -C /datas/backup/full
vi xbstream.sh
nohup sh xbstream.sh > xbstream.log &
如
full-20201014 为流格式的压缩文件
/data/bakdata/ 为解压的目录,即需要还原到的mysql的数据目录。
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --apply-log /datas/backup/full &
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --move-back /datas/backup/full &
mkdir -p /datas/database/mysql
mkdir -p /datas/logs/mysql
mkdir -p /datas/database/tmp
chown -R mysql:mysql /datas/database
chown -R mysql:mysql /datas/logs
mysqld_safe --defaults-file=/etc/my.cnf &
change master to master_host='ip',\
master_port=3309,master_user='repl',master_password='xxxx',\
master_log_file='xxx',master_log_pos=xxx;
start slave;
show slave status \G;
select * from mysql.slave_master_info\G
ssh-keygen
ssh -p 16818 oracle@ip date
ssh-copy-id -i ~/.ssh/id_rsa.pub mysql@10.25.xx.xxx
cat ~/.ssh/id_*.pub|ssh mysql@10.25.xx.xxx 'cat>>~/.ssh/authorized_keys'
三、备份指定的数据库:
1.创建备份
常规备份
xtrabackup --user=backup --password=xxxx --databases=zabbix --backup --target-dir=/data/backup/xtrabackup/
常规流备份方式
xtrabackup --defaults-file=/etc/my.cnf --socket=/tmp/mysql3306.sock --backup --user=root --password='xxxxx' --no-timestamp --throttle=200 --parallel=4 --host='ip' --stream=xbstream | ssh root@remoteip "xbstream --parallel=2 -x -C /data/bak/" &
强压缩备份方式
xtrabackup --defaults-file=/etc/my.cnf --socket=/tmp/mysql3306.sock --backup --user=root --password='xxxx' --no-timestamp --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --backup --extra-lsndir=/data/bak/ -t=/data/bak/ 2> /data/bak/bac.log |bzip2 -fz > /data/bak/full/full-`date +%Y%m%d`.xbstream.bz2
nohup sh bak.sh > bak.log 2>&1 &
Plugin initialization aborted with error Generic error.
xtrabackup: innodb_init(): Error occured.
2.将备份推送到测试机
scp -r xtrabackup/ root@192.168.20.201:/data/backup/
3.准备备份
非增量方式
xtrabackup --prepare --apply-log-only --target-dir=/data/bak/
增量方式
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --use-memory=2G --user root --apply-log /data/databackup/full --incremental-dir=/data/databackup/rec4 &
4.恢复备份
/usr/bin/xtrabackup --defaults-file=/etc/my.cnf --use-memory=2G --parallel=10 --user root --move-back /data/bak/ &
5.更改权限:
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /data/log
chown -R mysql:mysql /var/run/mysql
6.启动数据库:
mysqld_safe --defaults-file=/etc/my.cnf &
7.获取gtid位置信息
在最后一次增备中获取gitd的位点信息:
[root@localhost rec4]# cat /data/databackup/rec4/xtrabackup_binlog_info
mysql-bin.000316 314746908 23d75ae2-1b3c-11e6-8474-78acc0f8bc20:1-6362590505,
6013ccd5-1b3e-11e6-8482-52540071a7f7:1-497091575,
9e841bb0-4b71-11e7-8426-78acc0fbff52:1-647435776
8.配置gtid信息
reset master;(慎重使用)
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='23d75ae2-1b3c-11e6-8474-78acc0f8bc20:1-6362590505,6013ccd5-1b3e-11e6-8482-52540071a7f7:1-497091575,9e841bb0-4b71-11e7-8426-78acc0fbff52:1-647435776';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
9.配置同步
CHANGE MASTER TO
MASTER_HOST='ip',
MASTER_USER='repl',
MASTER_PASSWORD='xxxxx',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
10.启动同步:
start slave;
show slave status \G;
select * from mysql.slave_master_info\G