MySQL备份之xtrabackup
为什么要学这个工具
背景
一个合格的运维工程师或者dba工程师,如果有从事数据库方面的话,首先需要做的就是备份,如果没有备份,出现问题的话,你的业务就会出问题,你的工作甚至会。。。
所以备份是重要的,但光有备份还不行,备份后如果出现问题,你还得使用备份数据来恢复,但恢复数据的时间一般都是很长的,不符合业务需求,所以一个快速备份与恢复的软件就很有必要。
就像前文给大家看的微盟数据库被删。。最后是腾讯云的工程师协助进行数据恢复
xtrabackup工具
Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
特点
- 物理备份工具,拷贝数据文件
- 备份和恢复数据的速度非常快,安全可靠
- 在备份期间执行的事务不会间断,备份
innodb
数据不影响业务 - 备份期间不增加太多数据库的性能压力
- 支持对备份的数据自动校验
- 运行全量,增量,压缩备份及流备份
- 支持在线迁移表以及快速创建新的从库
- 运行几乎所有版本的
mysql
和maridb
数据文件扩展名
.idb文件 | 以独立表空间存储的InnoDB引擎类型的数据文件扩展名 |
---|---|
.ibdata文件 | 以共享表空间存储的InnoDB引擎类型的数据文件扩展名 |
.frm文件 | 存放于表相关的元数据(meta)信息及表结构的定义信息 |
.MYD文件 | 存放MyISAM引擎表的数据文件扩展名 |
.MYI文件 | 存放MyISAM引擎表的索引信息文件扩展名 |
事务型引擎的ACID特性
目前为止,我们还未学习mysql的引擎,会在后面讲解,大家先了解下对于mysql的引擎是InnoDB
数据库引擎,就像是摩托车的发动机,有各种品牌的发动机
有了发动机,我们可以将摩托车跑起来,且无序关心它是怎么制造动力的
对于数据库的引擎,就是开发人员写好的一种程序,能够让运维不用关心数据是如何增删改查到磁盘上的,通过SQL语句,就可以数据。
因此数据库引擎就是一个用于存储、处理、保护数据的程序。
mysql支持如下图中的几种引擎
查看当前mysql用的哪一个引擎(哪一款发动机)
[root@mysql-server56 3307]# mysql -uroot -pyuchao7777 -P3307 -h127.0.0.1 -e 'show variables like "storage_engine%";'
Warning: Using a password on the command line interface can be insecure.
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+
[root@mysql-server56 3307]#
ACID
在MySQL中,InnoDB和MariaDB中的XtraDB都是事务型引擎,事务型引擎的共同特征是具备事务的4个特性,这4个特性分别是:
原子性(atomicity)
一致性(consistency)
隔离性(isolation)
持久性(durability)
又称为ACID特性。
InnoDB日志名词
有关innodb引擎原理的知识,后面专门学习,这里不需要关心太多
需要了解下InnoDB日志的原理词汇
- redo日志
redo
日志,也称事务日志,是innodb
引擎的重要组成部分,作用是记录innodb
引擎中每一个数据发生的变化信息。主要用于保证innodb
数据的完整性,以及丢数据后的恢复,同时可以有效提升数据库的io
等性能。redo
日志对应的配置参数为innodb_log_file_size
和innodb_log_files_in_group
- Undo日志
Undo
是记录事务的逆向逻辑操作或者向物理操作对应的数据变化的内容,undo
日志默认存放在共享表空间里面的ibdata*
文件,和redo
日志功能不同undo
日志主要用于回滚数据库崩溃前未完整提交的事务数据,确保数据恢复前后一致。 - LSN
LSN
,全拼log sequence number
,中文是日志序列号,是一个64
位的整型数字,LSN
的作用是记录redo
日志时,使用LSN
唯一标识一条变化的数据。 - checkpoint 用来标识数据库崩溃后,应恢复的
redo log
的起始点
Xtrabackup备份原理
工作原理流程
xtrabackup软件基于innodb等事务引擎自带的redo日志和undo功能来保证备份、恢复的数据一致性,确保数据可靠
redo日志文件会存储每一个table中的数据修改记录
xtrabackup备份流程原理
- xtrabackup程序开始备份时,该软件记录当前redo日志的位置(对应的LSN)号,且在后台启动一个进程持续监视redo日志文件变化,将变化的信息,写入到xtrabackup_logfile中
- 针对所有的innodb数据文件进行复制,待inndob数据文件备份完成后
- 执行命令
flush tables with read lock
,对整个数据库锁表 - 然后再复制myisam非事务引擎的数据文件
- 待所有的数据文件全都备份完毕后,获取binlog位置信息,也就是当前数据写到哪了
- 解锁表
unlock tables
,恢复数据库的读写 - 备份完成
图解
原理可能目前看的一头雾水,不慌,实际搭建完毕后,再回过头梳理下。
安装
超哥的环境
[root@mysql-server56 3307]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@mysql-server56 3307]#
[root@mysql-server56 3307]# uname -r
3.10.0-1160.11.1.el7.x86_64
yum安装基础环境
[root@mysql-server56 3307]# yum install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL -y
安装xtrabackup,centos7版本
[root@mysql-server56 mysql_script]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
# yum本地安装
[root@mysql-server56 mysql_script]# yum localinstall percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm -y
# 查看
[root@mysql-server56 mysql_script]# ls -l `which xtrabackup innobackupex`
lrwxrwxrwx 1 root root 10 Apr 21 13:54 /usr/bin/innobackupex -> xtrabackup
-rwxr-xr-x 1 root root 21659096 Nov 23 2017 /usr/bin/xtrabackup
应用实践
命令介绍
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录
参数
Xtrabackup命令是专门用于对InnoDB和XtraDB等事务引擎的数据库热备份的工具,不能用于备份MyISAM等其他类型的引擎数据,其主要特点是备份数据时完全不用锁表。
Innobackupex命令是将上述Xtrabackup命令使用perl脚本进行二次封装的工具,除了可以用于InnoDB和XtraDB等引擎之外,还可以备份MyISAM及多种引擎混合使用的场景,该命令的主要特点是备份事务引擎数据而不用锁表,可以备份非事务引擎数据,但要锁表。
DBA用的最多的是Innobackupex命令备份恢复
创建数据备份用户
[root@mysql-server56 mysql_script]# mysql -uroot -pyuchao7777 -P3307 -h127.0.0.1
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.6.40-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create user 'backup'@'localhost' identified by 'chaoge888';
Query OK, 0 rows affected (0.00 sec)
# 回收用户默认权限
mysql> REVOKE ALL PRIVILEGES ON *.* FROM 'backup'@'localhost';
Query OK, 0 rows affected (0.00 sec)
# 授权部分权限
mysql> grant reload,lock tables,process,replication client on *.* to 'backup'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
(忽略此步骤)
创建mysql日志文件目录
[root@mysql-server56 ~]# mkdir -p /xtrabackup/{log,cnf,data,mysql}
[root@mysql-server56 ~]# chown -R mysql.mysql /xtrabackup/
[root@mysql-server56 /]# ls -l /xtrabackup/
total 0
drwxr-xr-x 2 mysql mysql 6 Apr 21 14:56 cnf
drwxr-xr-x 2 mysql mysql 6 Apr 21 14:56 log
编写新配置文件
# egrep -v "#|^$" /xtrabackup/cnf/my.cnf
[client]
user=root
password=yuchao7777
[mysqld]
basedir = /xtrabackup/mysql #<==增加MySQL根目录。
datadir = /xtrabackup/data #<==MySQL数据目录,Xtrabackup
恢复数据时需要这个目录。
###########binlog############
log_bin = /xtrabackup/logs/mysql-bin #<==二进制日志路径调整,尽可能在装数据库前就调整好。
expire_logs_days = 7
###########slow log###########
slow-query-log = ON # 慢查询日志
long_query_time = 2 # 查询阈值,超过了该阈值则记录到慢查询日志中
log_queries_not_using_indexes = ON # 记录所有未使用索引的SQL,无论是否超过long_query_time所设置的值。
slow-query-log-file = /xtrabackup/logs/slow.log #&