俗话说”常在河边走,哪有不湿鞋”。在DBA的实际运维过程中经常会遇到误删除、改错数据的情况。遇到这种情况我们除了跑路还能怎么办?我们又怎么能做到有备无患呢?我计划用三章的时间和大家聊聊数据库的备份和恢复工具xtrabackup、mysqldump以及闪回工具binlog2sql,今天先介绍下xtrabackup的原理以及使用方法。
1. 备份的种类
+
对于DBA来说,数据库的备份和恢复是日常运维中最常见的工作之一。在数据库运维过程中,经常会遇到数据库宕机、磁盘损坏等情况。在这种情况下,要想保住数据不丢失或者将损失降到最低,备份起着至关重要的作用。
在数据库的备份中,可以选择不同的方式进行备份。根据备份方法,备份可以划分为如下三种:
1. 热备:指在数据库运行的过程中进行备份,对生产环境没有影响。常见的热备工具有mysqldump、xtrabackup等。
2. 冷备:指在数据库关闭的情况下进行备份,复制相关的物理文件即可。一般生产上很少用。
3. 温备:指在数据库运行当中进行备份,但是备份对数据库操作有所影响,一般生产上也较少使用。
根据备份文件的种类,备份可以分为以下两种:
1. 物理备份:指复制数据库的物理文件,可以在数据库运行时进行备份,常用的备份工具有MySQL EnterpriseBackup(商业)、Xtrabackup等。
2. 逻辑备份:逻辑备份出的文本一般是有一条条的sql或者实际的数据组成。常见的备份方式有mysqldump、mydumper、select * into outfile等。逻辑备份往往耗时比较长。
2. Xtrabackup原理
+
Xtrabackup是Percona公司的开源项目,这套工具里面有两个重要的程序:innobackupex和Xtrabackup,Xtrabackup是用来备份innodb的。Innobackupex脚本是对Xtrabackup的封装,通过调用Xtrabackup来备份Innodb表,同时也可以通过mysqldump等命令来备份非Innodb 表。
Xtrabackup是基于Innodb自身崩溃机制完成备份的,它会一页页的复制Innodb表数据,由于服务正在运行,这样就会出现内部数据不一致的情况。要想保持数据的一致性,需要恢复时使用crash recovery进行操作。
Xtrabackup之所以可以通过复制Innodb表的ibd文件工作,是因为Innodb内部维护了一个重做日志(redo log)。这里面包含了每次Innodb更改数据的记录。当Innodb启动的时候它会应用已经提交的事务,并且回滚未提交的事务。Xtrabackup在备份的时候会启动一个线程监视redo log的变化,并且复制变化的部分。在复制全部数据文件之后停止复制redo log。
工作流程如下:
1.innobackupex启动,fork出Xtrabackup进程并启动。2.Xtrabackup在备份innodb相关文件时会开启两个线程:Ibd复制线程,负责复制ibd文件。redo log复制线程,负责监视并复制redo log的变化。Xtrabackup首先启动redo log复制线程,从最近的checkpoint点开始复制redo log,然后启动ibd复制线程。3.Xtrabackup复制完ibd后,通知innobackupex进程,此时redo log复制线程仍然在工作。4.Innobackupex收到通知后开始备份非innodb表文件。5.当非innodb文件复制完成后,innobackupex会获取binlog的位置,并将binlog的位点信息写入文件中。6.Xtrabackup会停止redo log的复制线程,然后告知innobackupex,redo log复制完成。7.Innobackupex收到通知后开始释放锁资源、打印备份目录以及写入xtrabackup_info文件信息等。8.最后innobackupex等待Xtrabackup进程结束退出。
3. Xtrabackup相关参数
+
备份参数
--user:备份账号--password:备份的密码--host:备份数据库的地址--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"test1test2",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表--defaults-file:指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置--incremental:表示创建一个增量备份,需要指定--incremental-basedir--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用--inremental-dir:该选项表示还原时增量备份的目录--include=name:指定表名,格式:databasename.tablename--compress:该选项表示压缩Innodb数据文件的备份。--compress-threads:该选项表示并行压缩worker线程的数量。--no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。Prepare参数
--apply-log:此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G--export:表示开启可导出单独的表之后再导入其他Mysql中--redo-only:此选项在prepare base fullbackup,往其中merge增量备份时候使用还原时参数
--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。--move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本备份产生的文件
1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN,BINLOG的位置2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复4)backup-my.cnf:备份命令用到的配置选项信息5)xtrabackup_logfile:备份生成的日志文件注意事项
1.datadir目录必须为空。除非指定innobackupex --force-non-emptydirectorires选项指定,否则--copy-backup选项不会覆盖
2.restore还原之前,必须停止 MySQL服务,不能将一个运行中的实例restore到datadir目录中
3.修改恢复文件的权限为mysql
4.最后一次增量备份还原要回滚事务
4. Xtrabackup备份实践
+
环境准备
安装xtrabackup软件
#解压软件tar -xvf percona-xtrabackup-2.4.3-Linux-x86_64.tar#移动软件到/usr/local/xtrabackup下mv percona-xtrabackup-2.4.3-Linux-x86_64 /usr/local/xtrabackup#对/usr/local/xtrabackup/赋权限chown -R mysql.mysql /usr/local/xtrabackup/#安装必备软件包yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL#创建备份用户mysql>CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';#为用户赋权mysql>GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, SUPER, CREATE TABLESPACE,PROCESS, CREATE, INSERT, SELECT ON *.* TO 'bkpuser'@'localhost';mysql>flush privileges;全备与恢复
1.备份阶段,只需指定连接数据库的参数和备份目录即可。innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password='123456' /dbback/2.关闭mysql数据库/etc/init.d/mysqldstop3.Prepare阶段,对全备进行apply log操作innobackupex --defaults-file=/etc/my.cnf --apply-log --user=bkpuser --password='123456'/dbback/2020-05-07_00-05-474.恢复阶段,对全备进行copy back操作innobackupex --defaults-file=/etc/my.cnf --copy-back --user=bkpuser --password='123456'/dbback/2020-05-07_00-05-47增量备份与恢复
开始进行增量备份
1.增量备份是基于全备的,所以要先进行全备innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=123456 /dbback/full2.增量备份(第一次增备)innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password='123456' --incremental/dbback/inc --incremental-basedir=/dbback/full/2020-05-07_00-45-59 (全备目录)3.增量备份(第二次增备)innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password='123456' --incremental/dbback/inc --incremental-basedir=/dbback/inc/2020-05-07_00-49-32 (上一次增备目录)
开始恢复增量备份
1.增量备份的恢复(首先恢复全备)innobackupex --apply-log --redo-only /dbback/full/2020-05-07_00-45-592.恢复第一次增备innobackupex --apply-log --redo-only --incremental /dbback/full/2020-05-07_00-45-59--incremental-dir=/dbback/inc/2020-05-07_00-49-32 (第一次增备的目录)3.恢复第二次增备,最后一次增备不用加--redo-only。innobackupex --apply-log --incremental /dbback/full/2020-05-07_00-45-59--incremental-dir=/dbback/inc/2020-05-07_00-57-20 (第二次增备的目录)4.进行copy backinnobackupex --defaults-file=/etc/my.cnf--copy