MySQL的备份和恢复
二进制日志
- 记录导致数据改变或潜在导致数据改变的SQL语句
- 记录已提交的日志
- 不依赖于存储引擎类型
事务日志和二进制区别
- 事务日志在线,二进制离线
- 事务日志记录事务执行的过程,包括提交和未提交,二进制日志记录只记提交的过程
- 事务日志只支持innodb,二进制都支持MyiSAM和innoDB
功能:通过"重放"日志文件中的事件来生成数据副本
注意:建议二进制日志和数据文件分开存放
二进制日志记录三种格式
- 基于"语句"记录:statement,记录语句,默认模式( MariaDB 10.2.3 版本以下 ),日志量较少
- 基于"行"记录:row,记录数据,日志量较大,更加安全,建议使用的格式,MySQL8.0默认格式
- 混合模式:mixed, 让系统自行判定该基于哪种方式进行,默认模式( MariaDB 10.2.4及版本以上)
格式配置
#MySQL 8.0 默认使用ROW方式
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.07 sec)
#Mariadb10.3 默认使用MIXED方式
MariaDB [hellodb]> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.001 sec)
#Mariadb5.5 默认使用STATEMENT方式
[root@centos7 ~]#mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server
MariaDB [(none)]> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
二进制日志文件的构成
有两类文件
1.日志文件:mysql|mariadb-bin.文件名后缀,二进制格式,如: on.000001,mariadb-bin.000002
2.索引文件:mysql|mariadb-bin.index,文本格式,记录当前已有的二进制日志文件列表
二进制日志相关的服务器变量:
sql_log_bin=ON|OFF:#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项
log_bin=/PATH/BIN_LOG_FILE:#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以
binlog_format=STATEMENT|ROW|MIXED:#二进制日志记录的格式,mariadb5.5默认STATEMENT
max_binlog_size=1073741824:#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
binlog_cache_size=4m #此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m #限制用于缓存多事务查询的字节大小。
sync_binlog=1|0:#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
expire_logs_days=N:#二进制日志可以自动删除的天数。 默认为0,即不自动删除
二进制日志相关配置
查看mariadb自行管理使用中的二进制日志文件列表,及大小
SHOW {BINARY | MASTER} LOGS
查看使用中的二进制日志文件
SHOW MASTER STATUS
在线查看二进制文件中的指定内容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
范例:
show binlog events in 'mysql-bin.000001' from 6516 limit 2,3
范例:
MariaDB [hellodb]> SHOW BINLOG EVENTS;
+------------------+-----+-------------------+-----------+-------------+--------
----------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info
|
+------------------+-----+-------------------+-----------+-------------+--------
----------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 256 | Server
ver: 10.3.17-MariaDB-log, Binlog ver: 4 |
| mysql-bin.000001 | 256 | Gtid_list | 1 | 285 | []
|
| mysql-bin.000001 | 285 | Binlog_checkpoint | 1 | 328 | mysql-
bin.000001 |
| mysql-bin.000001 | 328 | Rotate | 1 | 375 | mysql-
bin.000002;pos=4 |
+------------------+-----+-------------------+-----------+-------------+--------
----------------------------------------+
4 rows in set (0.000 sec)
MariaDB [hellodb]> SHOW BINLOG EVENTS in 'mysql-bin.000002' from 614 limit 2,3\G跳过前 2 个事件跳过之后,连续显示 3 个事件
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 782
Event_type: Query
Server_id: 1
End_log_pos: 1098
Info: use `hellodb`; CREATE TABLE `classes` (
`ClassID` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`Class` varchar(100) DEFAULT NULL,
`NumOfStu` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`ClassID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 1098
Event_type: Gtid
Server_id: 1
End_log_pos: 1140
Info: GTID 0-1-4
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 1140
Event_type: Query
Server_id: 1
End_log_pos: 1256
Info: use `hellodb`; /*!40000 ALTER TABLE `classes` DISABLE KEYS */
3 rows in set (0.000 sec)
mysqlbinlog:二进制日志的客户端命令工具,支持离线查看二进制日志
命令格式:
mysqlbinlog [OPTIONS] log_file…
--start-position=# 指定开始位置
--stop-position=#
--start-datetime= #时间格式:YYYY-MM-DD hh:mm:ss
--stop-datetime=
--base64-output[=name]
-v -vvv
范例:
mysqlbinlog --start-position=678 --stop-position=752 /var/lib/mysql/mariadb-bin.000003 -v
mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003 -vvv
范例: 同步远程主机的二进制日志
#从10.0.0.8远程主机实时同步从指定的二进制日志binlog.000002开始向后进行同步到当前目录
#先在10.0.0.8的MySQL创建用户并授权
[root@centos8 ~]#mysql -uroot -p123456
mysql> create user test@'10.0.0.%' identified by '123456';
mysql> grant REPLICATION SLAVE on *.* to test@'10.0.0.%' ;
#安装和MySQL服务器相同版本的客户端
[root@centos8 ~]#yum -y install mysql
#前台执行,自动同步二进制日志
[root@centos8 data]#mysqlbinlog -R --host=10.0.0.8 --user=test --password=123456--raw --stop-never binlog.000002
二进制日志事件的格式:
# at 328
#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1
exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;
事件发生的日期和时间:151105 16:31:40
事件发生的服务器标识:server id 1
事件的结束位置:end_log_pos 431
事件的类型:Query
事件发生时所在服务器执行此事件的线程的ID:thread_id=1
语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
错误代码:error_code=0
事件内容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID
清除指定二进制日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
范例:
PURGE BINARY LOGS TO 'mariadb-bin.000003'; #删除mariadb-bin.000003之前的日志
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
删除所有二进制日志,index文件重新记数
ESET MASTER [TO #]; #删除所有二进制日志文件,并重新生成日志文件,文件名从#开始记数,默认从
1开始,一般是master主机第一次启动时执行,MariaDB 10.1.6开始支持TO #
切换日志文件:
FLUSH LOGS;
范例:
[root@master ~]#file /var/lib/mysql/mariadb-bin.000001
/var/lib/mysql/mariadb-bin.000001: MySQL replication log, server id 18 MySQL
V5+, server version 10.3.17-MariaDB-log
范例: 切换二进制日志
[root@centos8 ~]#mysqladmin flush-binary-log
[root@centos8 ~]#mysqladmin flush-logs
[root@centos8 ~]#mysql
MariaDB [hellodb]> flush logs;
备份恢复概述
为什么要备份
灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景
参考链接: https://www.toutiao.com/a6939518201961251359/
备份类型
-
完全备份,部分备份
- 完全备份:整个数据集
- 部分备份:只备份数据子集,如部分库或表
-
完全备份、增量备份、差异备份
- 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
- 差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
- 增量和差异备份的基础和前提是完全备份
- 注意:二进制日志文件不应该与数据文件放在同一磁盘
-
冷、温、热备份
- 冷备:读、写操作均不可进行,数据库停止服务
- 温备:读操作可执行;但写操作不可执行
- 热备:读、写操作均可执行
- MyISAM:温备,不支持热备
- InnoDB:都支持
-
物理和逻辑备份
物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
逻辑备份:从数据库中"导出"数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可
能丢失精度
备份什么
- 数据
- 二进制日志、InnoDB的事务日志
- 用户帐号,权限设置,程序代码(存储过程、函数、触发器、事件调度器)
- 服务器的配置文件
备份注意要点
- 能容忍最多丢失多少数据
- 备份产生的负载
- 备份过程的时长
- 温备的持锁多久
- 恢复数据需要在多长时间内完成
- 需要备份和恢复哪些数据
还原要点
- 做还原测试,用于测试备份的可用性
- 还原演练,写成规范的技术文档
备份工具
- cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份
- LVM的快照:先加读锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
- mysqldump:逻辑备份工具,适用所有存储引擎,对MyISAM存储引擎进行温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
- xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份
- MariaDB Backup: 从MariaDB 10.1.26开始集成,基于Percona XtraBackup 2.3.8实现
- mysqlbackup:热备份, MySQL Enterprise Edition 组件
- mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库
mysqldump 备份工具
mysqldump 说明
**逻辑备份工具:**mysqldump, mydumper, phpMyAdmin
Schema和数据存储在一起、巨大的SQL语句、单个巨大的备份文件
mysqldump是MySQL的客户端命令,通过mysql协议连接至mysql服务器进行备份
命令格式:
mysqldump [OPTIONS] database [tables] #支持指定数据库和指定多表的备份,但数据库本身定义不备份
mysqldump [OPTIONS] -B DB1 [DB2 DB3...] #支持指定数据库备份,包含数据库本身定义也会备份
mysqldump [OPTIONS] -A [OPTIONS] #备份所有数据库,包含数据库本身定义也会备份
mysqldump参考:
https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
mysqldump 常见通用选项:
-u, --user=name User for login if not current user
-p, --password[=name] Password to use when connecting to server
-A, --all-databases #备份所有数据库,含create database
-B, --databases db_name… #指定备份的数据库,包括create database语句
-E, --events:#备份相关的所有event scheduler
-R, --routines:#备份所有存储过程和自定义函数
--triggers:#备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
--default-character-set=utf8 #指定字符集
--master-data[=#]:#注意:MySQL8.0.26版以后,此选项变为--source-data
#此选项须启用二进制日志
#1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1,适合于主从复制多机使用
#2:记录为被注释的#CHANGE MASTER TO语句,适合于单机使用,适用于备份还原
#此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启--single-transaction(果是 InnoDB 引擎,这两个参数连用,可以实现**“既拿到了 Binlog 坐标,又没有锁表”**。它利用了 MVCC(多版本并发控制)开启一个快照,业务照样跑,备份照样做。))
-F, --flush-logs #备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和--single-transaction或-x,--master-data 一起使用实现,此时只刷新一次二进制日志
--compact #去掉注释,适合调试,节约备份占用的空间,生产不使用
-d, --no-data #只备份表结构,不备份数据,即只备份create table
-t, --no-create-info #只备份数据,不备份表结构,即不备份create table
-n,--no-create-db #不备份create database,可被-A或-B覆盖
--flush-privileges #备份mysql或相关时需要使用
-f, --force #忽略SQL错误,继续执行
--hex-blob #使用十六进制符号转储二进制列,当有包括BINARY,VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码
-q, --quick #不缓存查询,直接输出,加快备份速度
mysqldump的MyISAM存储引擎相关的备份选项:
MyISAM不支持事务,只能支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
-x,--lock-all-tables #加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能,注意:数据量大时,可能会导致长时间无法并发访问数据库
-l,--lock-tables #对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致
#注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用
mysqldump的InnoDB存储引擎相关的备份选项:
InnoDB 存储引擎支持事务,可以利用事务的相应的隔离级别,实现热备,也可以实现温备但不建议用
--single-transaction
#此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务
#此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE,此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥,备份大型表时,建议将--single-transaction选项和--quick结合一起使用
//--quick 的作用:它强制 mysqldump 从服务器一行行地检索数据备份大表时,如果不加 --quick,可能会撑爆备份机的内存;加上它之后,内存占用极低,配合单事务模式,备份过程既稳又快。
生产环境实战备份策略
InnoDB建议备份策略
#A备份所有数据库,含create database F备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。E备份相关的所有event scheduler R备份所有存储过程和自定义函数 --triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器--flush-privileges 备份mysql或相关时需要使用 -hex-blob #使用十六进制符号转储二进制列,当有包括BINARY,VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --master-
data=2 --flush-privileges --default-character-set=utf8 --hex-blob
>${BACKUP}/fullbak_${BACKUP_TIME}.sql
#新版8.0.26以上
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --source-
data=2 --flush-privileges --default-character-set=utf8 --hex-blob
>${BACKUP}/fullbak_${BACKUP_TIME}.sql
MyISAM建议备份策略
mysqldump -uroot -p123456 -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob>${BACKUP}/fullbak_${BACKUP_TIME}.sql
xtrabackup 备份工
xtrabackup 工具介绍
Percona 公司
官网:www.percona.com
percona-server
InnoDB --> XtraDB
Xtrabackup备份工具
percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具
手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
下载: https://www.percona.com/downloads/
xtrabackup 特点:
- 备份还原过程快速、可靠
- 备份过程不会打断正在执行的事务
- 能够基于压缩等功能节约磁盘空间和流量
- 自动实现备份检验
- 开源,免费
xtrabackup工具文件组成
Xtrabackup2.2 版之前包括4个可执行文件:
- innobackupex: Perl 脚本
- xtrabackup: C/C++,编译的二进制程序
- xbcrypt: 加解密
- xbstream: 支持并发写的流文件格式
说明:
xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互
innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和
MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)
等。即innobackupex是在 xtrabackup 之上做了一层封装实现的
xtrabackup的新版变化
xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到
xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链
接,即xtrabackup现在支持非Innodb表备份,并且 Innobackupex 在下一版本中移除,建议通过
xtrabackup替换innobackupex
现状:innobackupex 已经彻底成为历史 XtraBackup 8.0(用于备份 MySQL 8.0)或更高版本:
物理移除:innobackupex 这个软链接在 8.0 版本中已经正式被移除了。
单一入口:现在只有二进制文件 xtrabackup。如果你尝试输入 innobackupex,系统会提示 command not found。
参数变化:以前 innobackupex 习惯使用的那种“长参数”风格(比如不带双横线的参数)也全部统一到了标准的 xtrabackup 命令行格式下。
现代写法 (2.4/8.0 标准):
xtrabackup --backup --target-dir=/data/backup --user=root --password=123
对于 MyISAM 或其他非事务表,xtrabackup 依然采用的是读锁(Read Lock)。
它会先拷贝 InnoDB 这种能在线备份的数据,最后执行一个 FLUSH TABLES WITH READ LOCK,快速把 .frm、.MYD 等文件拷走,然后立即解锁。
现状警告:在 MySQL 8.0 中,由于系统表空间(System Tablespace)和元数据(Data Dictionary)的变化,备份非 InnoDB 表的逻辑变得更加复杂,所以官方强烈建议将所有表转换为 InnoDB。
xtrabackup备份过程

备份生成的相关文件
使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:
- xtrabackup_info:体检报告单文本文件,innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置
- xtrabackup_checkpoints:**备份的“说明书”**文本文件,备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
- xtrabackup_binlog_info:**备份的“时间戳”**文本文件,MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
- backup-my.cnf:文本文件,备份命令用到的配置选项信息
- xtrabackup_logfile:备份期间的“补丁”备份生成的二进制日志文件个文件就像一个录音机,把备份期间所有的改动全录下来。在恢复数据前(Prepare 阶段),要把这些录下的改动“打补丁”到备份文件里,数据才是完整的。
范例:相关文件
[root@centos8 ~]#ll /backup/
total 12340
-rw-r----- 1 root root 487 Jun 12 15:07 backup-my.cnf
drwxr-x--- 2 root root 272 Jun 12 15:07 hellodb
-rw-r----- 1 root root 425 Jun 12 15:07 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 12 15:07 ibdata1
drwxr-x--- 2 root root 4096 Jun 12 15:07 mysql
drwxr-x--- 2 root root 8192 Jun 12 15:07 performance_schema
drwxr-x--- 2 root root 8192 Jun 12 15:07 sys
-rw-r----- 1 root root 25 Jun 12 15:07 xtrabackup_binlog_info
-rw-r----- 1 root root 135 Jun 12 15:07 xtrabackup_checkpoints
-rw-r----- 1 root root 479 Jun 12 15:07 xtrabackup_info
-rw-r----- 1 root root 2560 Jun 12 15:07 xtrabackup_logfile
[root@centos8 ~]#cat /backup/xtrabackup_info
uuid = 55a26ea0-ac7b-11ea-a8ab-000c293f7395
name =
tool_name = xtrabackup
tool_command = -uroot -payaka--backup --target-dir=/backup/
tool_version = 2.4.20
ibbackup_version = 2.4.20
server_version = 5.7.29-log
start_time = 2026-02-28 15:07:08
end_time = 2026-02-28 15:07:10
lock_time = 1
binlog_pos = filename 'centos8-bin.000002', position '10185'
innodb_from_lsn = 0
innodb_to_lsn = 2687527
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
[root@centos8 ~]#cat /backup/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2687527 #数据页拷贝结束时的刻度。
last_lsn = 2687536 #备份结束瞬间,日志里最新的刻度
compact = 0
recover_binlog_info = 0
flushed_lsn = 2687536 #已经刷到磁盘上的最新刻度。
[root@centos8 ~]#cat /backup/xtrabackup_binlog_info
centos8-bin.000002 10185 #果数据库明天坏了,你还原了这个全备后,必须从 centos8-bin.000002 这个文件的 10185开始回放
[root@centos8 ~]#cat /backup/backup-my.cnf
# This MySQL options file was generated by innobackupex.
# The MySQL server
[mysqld]
innodb_checksum_algorithm=crc32
innodb_log_checksum_algorithm=strict_crc32
innodb_data_file_path=ibdata1:12M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=50331648
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=./
innodb_undo_tablespaces=0
server_id=1
redo_log_version=1
server_uuid=6fb9641a-ac79-11ea-8bed-000c293f7395
master_key_id=0
[root@centos8 ~]#file /backup/xtrabackup_logfile
/backup/xtrabackup_logfile: data #记录下从 start_time 到 end_time 这 2 秒钟内,数据库产生的任何微小改动。
xtrabackup 安装
在EPEL源中
yum install percona-xtrabackup
范例: CentOS 8没有提供
[root@centos7 ~]#yum info percona-xtrabackup
Available Packages
Name : percona-xtrabackup
Arch : x86_64
Version : 2.3.6
Release : 1.el7
Size : 4.6 M
Repo : epel/7/x86_64
Summary : Online backup for InnoDB/XtraDB in MySQL, Percona Server and
MariaDB
URL : http://www.percona.com/software/percona-xtrabackup/
License : GPLv2
Description : Online backup for InnoDB/XtraDB in MySQL, MariaDB and Percona
Server.
范例: 最新版本下载安装:
https://www.percona.com/downloads/XtraBackup/LATEST/
[root@centos8 ~]#ll percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm
-rw-r--r-- 1 root root 8045696 Oct 12 08:42 percona-xtrabackup-24-2.4.20-
1.el8.x86_64.rpm
[root@centos8 ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm
Last metadata expiration check: 0:05:30 ago on Mon 12 Oct 2020 09:43:57 AM CST.
Dependencies resolved.
================================================================================
============================================
Package Architecture Version
Repository Size
================================================================================
============================================
Installing:
percona-xtrabackup-24 x86_64 2.4.20-1.el8
@commandline 7.7 M
Installing dependencies:
libev x86_64 4.24-6.el8
AppStream 52 k
mariadb-connector-c x86_64 3.0.7-1.el8
AppStream 148 k
mariadb-connector-c-config noarch 3.0.7-1.el8
AppStream 13 k
perl-DBD-MySQL x86_64 4.046-
3.module_el8.1.0+203+e45423dc AppStream 156 k
perl-DBI x86_64 1.641-
3.module_el8.1.0+199+8f0a6bbd AppStream 740 k
perl-Math-BigInt noarch 1:1.9998.11-7.el8
BaseOS 196 k
perl-Math-Complex noarch 1.59-416.el8
BaseOS 108 k
Enabling module streams:
perl 5.26
perl-DBD-MySQL 4.046
perl-DBI 1.641
Transaction Summary
================================================================================
============================================
Install 8 Packages
Total size: 9.1 M
Installed size: 35 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Running scriptlet: mariadb-connector-c-3.0.7-1.el8.x86_64
1/1
Preparing :
1/1
Installing : mariadb-connector-c-config-3.0.7-1.el8.noarch
1/8
warning: /etc/my.cnf created as /etc/my.cnf.rpmnew
Installing : mariadb-connector-c-3.0.7-1.el8.x86_64
2/8
Installing : libev-4.24-6.el8.x86_64
3/8
Installing : perl-Math-Complex-1.59-416.el8.noarch
4/8
Installing : perl-Math-BigInt-1:1.9998.11-7.el8.noarch
5/8
Installing : perl-DBI-1.641-3.module_el8.1.0+199+8f0a6bbd.x86_64
6/8
Installing : perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64
7/8
Installing : percona-xtrabackup-24-2.4.20-1.el8.x86_64
8/8
Running scriptlet: percona-xtrabackup-24-2.4.20-1.el8.x86_64
8/8
Verifying : perl-Math-BigInt-1:1.9998.11-7.el8.noarch
1/8
Verifying : perl-Math-Complex-1.59-416.el8.noarch
2/8
Verifying : libev-4.24-6.el8.x86_64
3/8
Verifying : mariadb-connector-c-3.0.7-1.el8.x86_64
4/8
Verifying : mariadb-connector-c-config-3.0.7-1.el8.noarch
5/8
Verifying : perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64
6/8
Verifying : perl-DBI-1.641-3.module_el8.1.0+199+8f0a6bbd.x86_64
7/8
Verifying : percona-xtrabackup-24-2.4.20-1.el8.x86_64
8/8
Installed:
libev-4.24-6.el8.x86_64 mariadb-
connector-c-3.0.7-1.el8.x86_64
mariadb-connector-c-config-3.0.7-1.el8.noarch percona-
xtrabackup-24-2.4.20-1.el8.x86_64
perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64 perl-DBI-
1.641-3.module_el8.1.0+199+8f0a6bbd.x86_64
perl-Math-BigInt-1:1.9998.11-7.el8.noarch perl-Math-
Complex-1.59-416.el8.noarch
Complete!
[root@centos8 ~]#rpm -ql percona-xtrabackup-24-2.4.20
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib/.build-id
/usr/lib/.build-id/07
/usr/lib/.build-id/07/7cff02ee26ea646a822a3f936194758707edd1
/usr/lib/.build-id/39
/usr/lib/.build-id/39/f3e9ba1bfa15a43b78bca58bc6ae9c3b15f1b5
/usr/lib/.build-id/3a
/usr/lib/.build-id/3a/911c034513e809c6752d5297c9d69c9c19bc9a
/usr/lib/.build-id/85
/usr/lib/.build-id/85/3597a47905af2ef200a6def4fb2582dc3ff60b
/usr/lib/.build-id/ad
/usr/lib/.build-id/ad/45538c7f190bf3875f39562c7e33c39ef9425c
/usr/lib/.build-id/ea
/usr/lib/.build-id/ea/0e60d4d718a1127d337df206d7004656433ebc
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24
/usr/share/doc/percona-xtrabackup-24/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
[root@centos8 ~]#ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 Apr 21 04:42 /usr/bin/innobackupex -> xtrabackup
[root@centos8 ~]#file /usr/bin/xtrabackup
/usr/bin/xtrabackup: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux
3.2.0, BuildID[sha1]=ad45538c7f190bf3875f39562c7e33c39ef9425c, stripped
xtrabackup 用法
xtrabackup工具备份和还原,需要三步实现
- 备份:对数据库做完全或增量备份
- 预准备: 还原前,先对备份的数据,整理至一个临时目录
- 还原:将整理好的数据,复制回数据库目录中
xtrabackup 选项参考:
https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
备份:
innobackupex [option] BACKUP-ROOT-DIR
xtrabackup --backup --target-dir=/backup/base/ -uroot -p'你的密码'
选项说明:
--user:#该选项表示备份账号
--password:#该选项表示备份的密码
--host:#该选项表示备份数据库的地址
--databases:#该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;
如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。
如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file:#该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental:#该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:#该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:#该选项表示还原时增量备份的目录
--include=name:#指定表名,格式:databasename.tablename
Prepare预准备:
innobackupex --apply-log [option] BACKUP-DIR
xtrabackup --prepare --use-memory=1G --target-dir=/backup/base/
选项说明:
-apply-log,--prepare:#一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--use-memory:#和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
--export:#表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:#此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并
还原:
innobackupex --copy-back [选项] BACKUP-DIR
innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR
# 方式 A:拷贝(原备份还在)
xtrabackup --copy-back --target-dir=/backup/base
# 方式 B:移动(原备份消失,节省空间)
xtrabackup --move-back --target-dir=/backup/base
选项说明:
--copy-back:#做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--move-back:#这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
--force-non-empty-directories #指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败
还原注意事项:
- datadir 目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-back选项不会覆盖
- 在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
- 由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户, 执行chown -R mysql:mysql /data/mysql,以上需要在用户调用innobackupex之前完成