当前位置:Gxlcms > 数据库问题 > 使用xtrabackup备份恢复Mariadb数据库

使用xtrabackup备份恢复Mariadb数据库

时间:2021-07-01 10:21:17 帮助过:20人阅读

Xtrabackup简介

Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)能够基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快;

 

官方介绍和下载地址:https://www.percona.com/software/percona-xtrabackup

xtrabackup安装

官方有系统rpm包版的软件,可以下载rpm包版的软件直接安装,由于xtrabackup是使用perl脚本编写的所以需要安装perl-DBD-MySQL否则会报依赖。

  1. [root@MariaDB~]# yum -y install perl-DBD-MySQL
  2. [root@MariaDB~]# rpm -ivh percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm

 

innobackupex: 客户端工具, 以mysql协议连入mysqld,不支持离线备份,但是支持离线恢复


一次完全备份和恢复

1、完全备份

使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

 

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

 

示例:

  1. [root@MariaDB~]# innobackupex --user=root --password=centos /backup/
  2. [root@MariaDB~]# ll /backup/
  3. total4
  4. drwxr-xr-x2 root root 4096 Jun 16 02:28 2015-06-16_02-28-54

备份时报了一个错

  1. innobackupex:Error: The xtrabackup child process has died at /usr/bin/innobackupex line2672.

解决方法:修改innodb日志文件大小为5M,修改完成重启服务生效

  1. [root@MariaDB~]# vim /etc/my.cnf
  2. innodb_log_file_size= 5M

备份完成之后在/backup目录下就有了如下内容

  1. [root@MariaDB ~]# ll /backup/2015-06-15_23-49-43/
  2. total 18468
  3. -rw-r--r-- 1 root root      356 Jun 15 23:49 backup-my.cnf
  4. drwxr-xr-x 2 root root     4096 Jun 15 23:49 hellodb
  5. -rw-r----- 1 root root 18874368 Jun 15 23:49ibdata1
  6. drwxr-xr-x 2 root root     4096 Jun 15 23:49 mysql
  7. drwxr-xr-x 2 root root     4096 Jun 15 23:49 performance_schema
  8. drwxr-xr-x 2 root root     4096 Jun 15 23:49 test
  9. -rw-r--r-- 1 root root       23 Jun 15 23:49 xtrabackup_binlog_info
  10. -rw-r----- 1 root root       89 Jun 15 23:49 xtrabackup_checkpoints
  11. -rw-r--r-- 1 root root      559 Jun 15 23:49 xtrabackup_info
  12. -rw-r----- 1 root root     2560 Jun 15 23:49 xtrabackup_logfile

文件说明:

(1)xtrabackup_checkpoints—— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

  1. [root@MariaDB 2015-06-15_23-49-43]# catxtrabackup_checkpoints
  2. backup_type = full-backuped   #备份类型,full-backuped表示完全备份
  3. from_lsn = 0                     #日志序列开始
  4. to_lsn = 1597945                #最大日志序列号
  5. last_lsn = 1597945              #当前日志序列号
  6. compact = 0                      #表示没有打包

(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

  1. [root@MariaDB 2015-06-15_23-49-43]# catxtrabackup_binlog_info
  2. mysql-bin.000005  245

(3)backup-my.cnf —— 备份命令用到的配置选项信息和备份无关的不会记录,备份配置文件的话需要单独备份

  1. [root@MariaDB 2015-06-15_23-49-43]# catbackup-my.cnf
  2. # This MySQL options file was generated byinnobackupex.
  3.  
  4. # The MySQL server
  5. [mysqld]
  6. innodb_checksum_algorithm=innodb
  7. innodb_log_checksum_algorithm=innodb
  8. innodb_data_file_path=ibdata1:10M:autoextend
  9. innodb_log_files_in_group=2
  10. innodb_log_file_size=5242880
  11. innodb_fast_checksum=0
  12. innodb_page_size=16384
  13. innodb_log_block_size=512
  14. innodb_undo_tablespaces=0

 

(4)xtrabackup_info —— 记录了mariadb的版本信息和一些属性信息,还原是检测版本匹配度时用到

  1. [root@MariaDB 2015-06-15_23-49-43]# catxtrabackup_info
  2. uuid = 25b79086-1376-11e5-980a-000c29bad792
  3. name =
  4. tool_name = innobackupex
  5. tool_command = --user=root --password=... /backup/
  6. tool_version = 1.5.1-xtrabackup
  7. ibbackup_version = xtrabackup version 2.2.3 basedon MySQL server 5.6.17 Linux (x86_64) (revision id: )
  8. server_version = 5.5.43-MariaDB-log
  9. start_time = 2015-06-15 23:49:43
  10. end_time = 2015-06-15 23:49:46
  11. lock_time = 1
  12. binlog_pos = filename ‘mysql-bin.000005‘, position245
  13. innodb_from_lsn = 0
  14. innodb_to_lsn = 1597945
  15. partial = N
  16. incremental = N
  17. format = file
  18. compact = N
  19. compressed = N
  20. encrypted = N

2、准备一个完全备份

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

 

innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:

 

[root@MariaDB 2015-06-15_23-49-43]# innobackupex--apply-log /backup/2015-06-15_23-49-43/

如果执行正确,其最后输出的一行信息通常如下:

150615 23:58:59 innobackupex: completed OK!

在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。

3、从一个完全备份中恢复数据

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。

语法:

# innobackupex --copy-back  /path/to/BACKUP-DIR

 

当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。


模拟数据库损坏

删除mariadb数据目录中的所有内容,模拟数据库损坏

  1. [root@MariaDB~]# rm -rf /mydata/data/*
  2. [root@MariaDB~]# ll /mydata/data/
  3. total0

恢复数据

  1. [root@MariaDB~]# innobackupex --copy-back /backup/2015-06-15_23-49-43/
  2. [root@MariaDB ~]# chown -R  mysql:mysql /mydata/data/
  3. [root@MariaDB~]# ll /mydata/data/
  4. total 28692
  5. drwxr-xr-x2 mysql mysql     4096 Jun 16 00:01hellodb
  6. -rw-r--r--1 mysql mysql 18874368 Jun 16 00:01 ibdata1
  7. -rw-r--r--1 mysql mysql  5242880 Jun 16 00:01ib_logfile0
  8. -rw-r--r--1 mysql mysql  5242880 Jun 16 00:01ib_logfile1
  9. drwxr-xr-x2 mysql mysql     4096 Jun 16 00:01 mysql
  10. drwxr-xr-x2 mysql mysql     4096 Jun 16 00:01performance_schema
  11. drwxr-xr-x2 mysql mysql     4096 Jun 16 00:01 test
  12. -rw-r--r--1 mysql mysql      559 Jun 16 00:01xtrabackup_info

 

恢复完成之后,还需要启动一下Mysql服务,否则Mariadb是是不会记录二进制日志的,这个时候启动起来是重新记录二进制日志的。

  1. [root@MariaDB ~]# service mysqld start

 

提示:在恢复完成之后应该再次做一次完全备份,后期的增量备份都依照这次的完全备份来做。

  1. [root@MariaDB ~]# innobackupex --user root --password centos/backup


使用innobackupex进行增量备份

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。


要实现第一次增量备份,可以使用下面的命令进行:

 

# innobackupex --incremental /backup--incremental-basedir=BASEDIR

 

其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。

 

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

 

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。

 

于是,操作就变成了:

# innobackupex --apply-log --redo-onlyBASE-DIR

 

接着执行:

# innobackupex --apply-log --redo-onlyBASE-DIR --incremental-dir=INCREMENTAL-DIR-1

 

而后是第二个增量:

# innobackupex --apply-log --redo-only BASE-DIR--incremental-dir=INCREMENTAL-DIR-2

              

其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;

 

备份过程

由于上面的完全备份恢复之后又进行了一次完全备份,这里不再进行完全备份,增量备份直接根据上面的完全备份进行。

查看lsn日志的起始和结束位置,第一次增量备份的LSN起始位置就是完全备份LSN的结束位置

  1. [root@MariaDB ~]# cat/backup/2015-06-15_23-45-01/xtrabackup_checkpoints
  2. backup_type = full-backuped
  3. from_lsn = 0
  4. to_lsn = 1602246
  5. last_lsn = 1602246
  6. compact = 0

修改数据库内容

  1. MariaDB[hellodb]> select * from tb1;
  2. +------+
  3. |id   |
  4. +------+
  5. |    1 |
  6. |    2 |
  7. |    3 |
  8. |   21 |
  9. |   22 |
  10. |   23 |
  11. +------+
  12. MariaDB[hellodb]> delete from tb1 where id=21;
  13. MariaDB[hellodb]> delete from tb1 where id=22;
  14. MariaDB[hellodb]> select * from tb1;
  15. +------+
  16. |id   |
  17. +------+
  18. |    1 |
  19. |    2 |
  20. |    3 |
  21. |   23 |
  22. +------+

第一次增量备份

只需要指向上一次完全备份的位置和这一次增量备份的存储位置即可

  1. [root@MariaDB ~]# innobackupex --user root--password centos --incremental /backup/ --incremental-basedir=/backup/2015-06-15_23-45-01/

备份完成之后查看checkpoints信息

  1. [root@MariaDB ~]# cat/backup/2015-06-15_23-47-02/xtrabackup_checkpoints
  2. backup_type = incremental   #备份类型表示为增量
  3. from_lsn = 1602246           #表示备份的起始位置
  4. to_lsn = 1604539
  5. last_lsn = 1604539
  6. compact = 0

再次修改一些数据

  1. MariaDB[hellodb]> insert into tb1 values (1000),(9000);
  2. MariaDB[hellodb]> select * from tb1;
  3. +------+
  4. |id   |
  5. +------+
  6. |    1 |
  7. |    2 |
  8. |    3 |
  9. |   23 |
  10. |1000 |
  11. |9000 |
  12. +------+


第二次做增量备份

这是备份是基于第一次增量备份进行

  1. [root@MariaDB ~]# innobackupex --user root--password centos --incremental /backup--incremental-basedir=/backup/2015-06-15_23-47-02/
  2. [root@MariaDB ~]# cat/backup/2015-06-15_23-51-55/xtrabackup_checkpoints
  3. backup_type = incremental
  4. from_lsn = 1604539 #备份起始位置是第一次增量备份的结束位置
  5. to_lsn = 1604539
  6. last_lsn = 1605623
  7. compact = 0

再次修改一次数据,这次修改没有做备份

  1. MariaDB[hellodb]> insert into tb1 values (88888);
  2. MariaDB[hellodb]> select * from tb1;
  3. +-------+
  4. |id    |
  5. +-------+
  6. |     1 |
  7. |     2 |
  8. |     3 |
  9. |    23 |
  10. |  1000 |
  11. |  9000 |
  12. |88888 |
  13. +-------+

 

说明:由于没有实现将bin-log文件和数据目录分开,所以我先导入二进制日志文件中的修改内容。

查看binlog_info日志位置记录位置为1621,那么只需要把1621之后的修改导出为sql文件即可。

  1. [root@MariaDB~]# cat /backup/2015-06-15_23-51-55/xtrabackup_binlog_info 
  2. mysql-bin.000005    979  
  3. [root@MariaDB ~]# mysqlbinlog --start-position=979/mydata/data/mysql-bin.000005 > /backup/timepoint.sql

模拟损坏

停止mysqld服务,然后删除数据目录下的所有数据,模拟硬盘损坏

  1. [root@MariaDB~]# service mysqld stop
  2. [root@MariaDB~]# rm -rf /mydata/data/*

数据恢复

恢复过程:合并完全备份

  1. [root@MariaDB ~]# innobackupex --apply-log-redo-only /backup/2015-06-15_23-45-01/

合并第一个增量备份

  1. [root@MariaDB ~]# innobackupex --apply-log-redo-only /backup/2015-06-15_23-45-01/--incremental-dir=/backup/2015-06-15_23-47-02/

合并第二个增量备份

  1. [root@MariaDB ~]# innobackupex --apply-log-redo-only /backup/2015-06-15_23-45-01/--incremental-dir=/backup/2015-06-15_23-51-55/

使用合并后的命令进行恢复

  1. [root@MariaDB ~]# innobackupex --copy-back/backup/2015-06-15_23-45-01/

设置完成之后修改数据目录的属主属组

  1. [root@MariaDB data]# chown -R mysql.mysql ./*
  2. [root@MariaDB data]# ll
  3. total 18452
  4. drwxr-xr-x 2 mysql mysql     4096 Jun 16 00:01 hellodb
  5. -rw-r--r-- 1 mysql mysql 18874368 Jun 16 00:01ibdata1
  6. drwxr-xr-x 2 mysql mysql     4096 Jun 16 00:01 mysql
  7. drwxr-xr-x 2 mysql mysql     4096 Jun 16 00:01 performance_schema
  8. drwxr-xr-x 2 mysql mysql     4096 Jun 16 00:01 test
  9. -rw-r--r-- 1 mysql mysql      632 Jun 16 00:01 xtrabackup_info

设置完成之后启动Mysql服务器

  1. [root@MariaDBdata]# service mysqld start

查看数据库这个时候还没有第二次增量备份之后修改的数据

  1. MariaDB[hellodb]> select * from tb1;
  2. +------+
  3. |id   |
  4. +------+
  5. |    1 |
  6. |    2 |
  7. |    3 |
  8. |   23 |
  9. |1000 |
  10. |9000 |
  11. +------+

将从二进制导出的sql文件,导入到数据库

  1. [root@MariaDB ~]# mysql -u root -p < /backup/timepoint.sql

查看数据就已经恢复了

  1. MariaDB[hellodb]> select * from tb1;
  2. +-------+
  3. |id    |
  4. +-------+
  5. |     1 |
  6. |     2 |
  7. |     3 |
  8. |    23 |
  9. |  1000 |
  10. |  9000 |
  11. |88888 |
  12. +-------+

 

导入或导出单张表

默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过,此时需要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来说,是要“导出”的表在其创建之前,mysql服务器就启用了innodb_file_per_table选项),并且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。

 

(1)“导出”表

导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--export选项将某表导出了:

# innobackupex --apply-log --export/path/to/backup

 

此命令会为每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其它服务器。

 

(2)“导入”表

要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:

mysql> CREATE TABLE mytable (...)  ENGINE=InnoDB;

 

然后将此表的表空间删除:

mysql> ALTER TABLEmydatabase.mytable  DISCARD TABLESPACE;

 

接下来,将来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,然后使用如下命令将其“导入”:

mysql> ALTER TABLEmydatabase.mytable  IMPORT TABLESPACE;

 

 

为了方便称呼,将导出表的服务器称为“源服务器”,导入表的服务器称为目标服务器。

 

操作:将源服务器hellodb数据库中的tb1表,导出到目标服务器的mydb数据库。

源服务器导出表

设置之前先做一次全库备份,因为导出表是根据备份进行导出的

  1. [root@MariaDB~]# innobackupex --user root --password centos /backup/

源服务器导出所有innodb存储引擎的表

  1. [root@MariaDB~]# innobackupex --apply-log --export /backup/2015-06-16_00-14-21/

查看hellodb导出的表文件

  1. [root@MariaDB ~]# ls/backup/2015-06-16_00-14-21/hellodb/
  2. classes.frm coc.MYD      courses.MYI  scores.MYI   tb1.cfg  teachers.frm  toc.MYD
  3. classes.MYD coc.MYI      db.opt       students.frm  tb1.exp teachers.MYD  toc.MYI
  4. classes.MYI courses.frm  scores.frm   students.MYD tb1.frm  teachers.MYI
  5. coc.frm     courses.MYD  scores.MYD   students.MYI tb1.ibd  toc.frm

目标服务器导入表准备

目标服务器创建数据库和准备导入的表

创建的表需要和源服务器上面的创建表的时候使用一模一样的命令;源服务器查看创建表的方法如下

  1. MariaDB[hellodb]> show create table tb1;
  2. +-------+---------------------------------------------------------------------------------------+
  3. |Table | Create Table                                                                         |
  4. +-------+---------------------------------------------------------------------------------------+
  5. |tb1   | CREATE TABLE `tb1` (
  6.   `id` int(11) DEFAULT NULL
  7. )ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  8. +-------+---------------------------------------------------------------------------------------+

获取到源服务器创建表的命令后,目标服务器就可以直接复制用来创建表

  1. MariaDB[(none)]> create database mydb;
  2. MariaDB[(none)]> use mydb;
  3. MariaDB[mydb]> CREATE TABLE `tb1` (
  4.     ->  `id` int(11) DEFAULT NULL
  5.     -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  6. MariaDB[mydb]> show tables;
  7. +----------------+
  8. |Tables_in_mydb |
  9. +----------------+
  10. |tb1            |
  11. +----------------+

目标服务器需要启用每表一个表空间的选项,此选项我在安装Mariadb时已经开启。

  1. MariaDB[mydb]> show global variables like ‘innodb_file%‘;
  2. +--------------------------+----------+
  3. |Variable_name            | Value    |
  4. +--------------------------+----------+
  5. |innodb_file_format       | Antelope |
  6. |innodb_file_format_check | ON       |
  7. |innodb_file_format_max   | Antelope |
  8. |innodb_file_per_table    | ON       |   #此处为ON表示启用
  9. +--------------------------+----------+
  10. 4rows in set (0.00 sec)

目标服务器删除创建表的表空间

  1. MariaDB[mydb]> ALTER TABLE tb1 DISCARD TABLESPACE;

复制表空间文件到远程服务器

  1. [root@MariaDBhellodb]# scp tb1.frm tb1.ibd 172.16.4.10:/mydata/data/mydb

修改属组和属主为Mysql

  1. [root@MariaDB~]# cd /mydata/data/mydb/
  2. [root@MariaDBmydb]# ll
  3. total112
  4. -rw-rw----1 mysql mysql    65 May 27 22:45 db.opt
  5. -rw-rw----1 mysql mysql  8556 May 27 22:53 tb1.frm
  6. -rw-r-----1 root  root  98304 May 27 22:53 tb1.ibd
  7. [root@MariaDBmydb]# chown -R mysql:mysql tb1.ibd 
  8. [root@MariaDBmydb]# ll
  9. total112
  10. -rw-rw----1 mysql mysql    65 May 27 22:45 db.opt
  11. -rw-rw----1 mysql mysql  8556 May 27 22:53 tb1.frm
  12. -rw-r-----1 mysql mysql 98304 May 27 22:53 tb1.ibd

重新导入表空间

  1. MariaDB[mydb]> ALTER TABLE tb1 IMPORT TABLESPACE;

查看数据库状态

  1. MariaDB[mydb]> show table status like ‘tb1‘\G;
  2. ERROR2006 (HY000): MySQL server has gone away
  3. Noconnection. Trying to reconnect...
  4. Connectionid:    1
  5. Currentdatabase: mydb
  6.  
  7. ***************************1. row ***************************
  8.            Name: tb1
  9.          Engine: InnoDB
  10.         Version: 10
  11.      Row_format: Compact
  12.            Rows: 8
  13.  Avg_row_length: 2048
  14.     Data_length: 16384
  15. Max_data_length:0
  16.    Index_length: 0
  17.       Data_free: 0
  18.  Auto_increment: NULL
  19.     Create_time: 2015-05-27 22:53:24
  20.     Update_time: NULL
  21.      Check_time: NULL
  22.       Collation: utf8_general_ci
  23.        Checksum: NULL
  24.  Create_options: 
  25.         Comment: 
  26. 1row in set (0.01 sec)
  27.  
  28. ERROR:No query specified

查看表已经有了数据

  1. MariaDB[mydb]> select * from tb1;
  2. +------+
  3. |id   |
  4. +------+
  5. |    1 |
  6. |    2 |
  7. |    3 |
  8. |   23 |
  9. |1000 |
  10. |9000 |
  11. +------+
  12. 6rows in set (0.01 sec)

补充:如果对于MyISAM存储引擎来说,直接复制三个文件(.frm: 表结构 .MYD:表数据.MYI:表索引)到表目录下即可,MyISAM会自动识别的。


本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1664771

使用xtrabackup备份恢复Mariadb数据库

标签:xtrabackup   数据库备份恢复   

人气教程排行