iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何进行MySQL中的xtrabackup备份恢复
  • 446
分享到

如何进行MySQL中的xtrabackup备份恢复

2024-04-02 19:04:59 446人浏览 独家记忆
摘要

这篇文章给大家介绍如何进行Mysql中的xtrabackup备份恢复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。    XtraBackup是Percona推出

这篇文章给大家介绍如何进行Mysql中的xtrabackup备份恢复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

   XtraBackup是Percona推出的一款备份工具,算是对于mysqldump的一个补充。对于大批量数据的导入使用mysqldump会出现一定的瓶颈,这一点做过一些数据迁移项目的同学可能感同身受。

  数据迁移中的数据量,小有小的好,大有大的招,见招拆招,找到适合的场景是最佳的。

    如果现在去Percona官网下载,就会发现最新的版本已经是2.4.6了。下载可以选择一个完整的打包,或者逐个的rpm根据需求来安装也可以。完整的工具大概在60M左右。如何进行MySQL中的xtrabackup备份恢复

    而目前的MySQL版本大多都在5.5, 5.6, 对于5.7相对来说要新一些。中间会有一些时间的过渡,在多年前,可能相对来说用2.0版本一下的还比较多。

   XtraBackup其实包含两个工具,一个是xtrabackup,另外一个是innobackupex。我们暂且以一个较早的版本作为演示,然后使用新版本来对比下。

# xtrabackup --version
xtrabackup version 1.6.5 for Percona Server 5.1.59

innobackupex --version
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012.  All Rights Reserved.

   可以看到这两个工具的版本还有一些差别,

xtrabackup主要是用于热备份innodb,或者是 xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;

innobackupex是将xtrabackup进行封装的perl脚本,可以备份和恢复MyISAM表以及数据表结构。

   所以总体来看InnoDB的使用场景虽然最为普遍,但是还得考虑到MyISAM,两者总体来说,使用innobackex的场景会多一些。

备份浅析

  使用innobackupex备份,命令选项还不少,可以使用innobackupex --help来查看明细的参数使用。

比如我需要做一个全备。可以采用如下类似的方式,在备份命令中加几个辅助选项,备份使用Socket连接,备份目录在/home/databak/full/20170322下。

innobackupex --socket=/home/mysql/mysql.sock  /home/databak/full/20170322  --no-timestamp --no-lock --throttle=100备份后查看对应的目录,备份的数据情况如下,其中红色的几个文件是备份中额外生成的。整体看来和源库的目录结构一样。

# du -sh ./*
2.6G    ./backend
4.0K    ./backup-my.cnf
646M    ./gm
1.0G    ./ibdata1
99M     ./mobile_activity
5.0G    ./mobile_billing
1.1M    ./mysql
2.0G    ./oem_mon
212K    ./perfORMance_schema
112K    ./test
4.0K    ./xtrabackup_binary
4.0K    ./xtrabackup_checkpoints
4.0K    ./xtrabackup_logfile对于上面生成的文件,我们简单看一下。

binary结尾的文件是备份中用到的可执行文件,这个可以对应几个版本,比如xtrabackup_51,xtrabackup_55等

# more xtrabackup_binary
xtrabackup_55logfile结尾的文件的内容无法直接查看,但是可以用strings来看。通过strings解析可以看到对应的二进制日志,当然事务的Xid也有的。

# strings xtrabackup_logfile
xtrabkup 170322 16:33:40
{       ';{
        ';{
MySQLXid
./mysql-bin.000009
        393102654
08360000000039DB下面的这个文件就更特别了,这个是作为数据的备份恢复的关键,里面有着备份恢复所有的检查点LSN,从下面的数据来看,这是一个全备,因为from_lsn=0.

# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 30754980731
last_lsn = 30754980731

而在源库的目录结构下,我们稍作过滤,也会得到一个几乎和这个工具备份出来一样的目录结构来。  

# du -sh ./*|grep -v mysql-bin|grep -v innodb|grep -v log
2.6G    ./backend
646M    ./gm
1.0G    ./ibdata1
4.5M    ./ib_lru_dump
99M     ./mobile_activity
5.0G    ./mobile_billing
1.1M    ./mysql
4.0K    ./mysql.pid
0       ./mysql.sock
2.0G    ./oem_mon
212K    ./performance_schema
112K    ./test所以xtrabackup这样一个工具就是一个热备工具,有点类似有文件级别的拷贝,但是不止于此,我们往下看。   

全库恢复模拟

  数据恢复是DBA最重要的工作之一,多年之前,这个“之一“的字眼还要去掉。数据无法恢复,则备份无意义。

   数据的恢复还是使用innobackupex这个工具,这是参数有些差别。

   这里的数据恢复分为两个步骤,prepare和还原恢复,prepare的意义就在于,如果我们备份数据的时候,存在未提交的事务,但是数据却存在于备份中,这样就是一个数据不一致的状态,在启动数据库的时候需要走一个前滚,然后是一个回滚的操作。这个体现主要就在于logfile和ibdata。是使用apply-log这个选项实现的。

   我们使用如下的方式来做。

innobackupex --defaults-file=/home/databak/full/20170322/backup-my.cnf --user=root --apply-log /home/databak/full/20170322这个过程其实就会隐式调用xtrabackup_55这个可执行文件,调用的命令类似于:

xtrabackup_55  --defaults-file="/home/databak/full/20170322/backup-my.cnf"默认会使用100M的内存,也可以使用选项--use-memory来调整,整个过程会重构redo日志文件和ibdata.

   这个步骤完成之后就是最关键的地方了,还原恢复。这个过程是使用copy-back的选项实现的。

innobackupex --defaults-file=/home/databak/full/20170322/backup-my.cnf --user=root --copy-back /home/databak/full/20170322整个过程就是大量的拷贝工作。

完成之后需要修改一下文件的属主,默认是root,然后启动即可。

增量备份恢复


   我们接下来看看增量备份和恢复,先来创建一些数据。我们在数据库test下创建一个表test2.

> create table test2 (id int);
Query OK, 0 rows affected (0.01 sec)
> insert into test2 values(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

因为刚刚已经做了全备,我们继续做一个增备。

使用的命令如下:

 innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/databak/incre/20170322 --incremental /home/databak/incre/20170322但是很不幸,执行失败了。这个错误带有典型的意义。

170322 18:05:34  innobackupex: Starting ibbackup with command: xtrabackup_55  --defaults-file="/etc/my.cnf" --backup --suspend-at-end --target-dir=/home/databak/incre/20170322/2017-03-22_18-05-32 --incremental-basedir='/home/databak/incre/20170322'
innobackupex: Waiting for ibbackup (pid=4079) to suspend
innobackupex: Suspend file '/home/databak/incre/20170322/2017-03-22_18-05-32/xtrabackup_suspended'
...
xtrabackup: Error: cannot open /home/databak/incre/20170322/xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from /home/databak/incre/20170322/xtrabackup_checkpoints
innobackupex: Error: ibbackup child process has died at /usr/bin/innobackupex line 349.原因就在于里面的一个关键文件 _checkpoints

使用增备得有一个参考点,从哪里开始,即从哪个LSN开始,这个LSN在指定的参数--incremental-basedir=/home/databak/incre/20170322 下不存在,因为这个是一个新目录,所以需要指向全库备份的目录。

  然后修复后备份就没问题了,英为有了这个参考点LSN,所以需要要说明的是这个备份其实有累计增量和差异增量了。

  这个怎么理解呢,比如周日做一个全备,周一做一个增备,周二做一个周日全备到周二的一个增备,这就是一个累计增量备份,而周三的时候做一个周二至周三数据变化的备份,就是一个差异增量备份。

  下面的是一个累计增量备份。因为基准是上次的一个全备,备份后会自动生成一个目录,比如 2017-03-22_18-07-38

  innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/databak/full/20170322 --incremental /home/databak/incre/20170322   为了区别两次增量,我继续插入两行数据。

> insert into test2 values (3),(4);
Query OK, 2 rows affected (0.00 sec)  这样表test2就有4条数据了,每次插入2条。

  下面的是一个差异增量备份。基于上一次的增备。

 innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/databak/incre/20170322/2017-03-22_18-07-38 --incremental /home/databak/incre/20170322  整个恢复的过程是下面的形式,还是一个prepare的过程,首先是全备:

innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/databak/full/20170322然后是增备,注意这里标红的参数。

innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/databak/full/20170322 --incremental-dir=/home/databak/incre/20170322/2017-03-22_18-07-38这样做其实是一个merge的过程,对于增备来说,会生成如下的几个文件,都是.delta, .meta之类的文件。

[test]# ll
total 132
-rw-r--r-- 1 mysql mysql    61 Mar 22 17:58 db.opt
-rw-rw---- 1 mysql mysql  8556 Mar 22 18:03 test2.frm
-rw-r--r-- 1 root  root  81920 Mar 22 18:08 test2.ibd.delta
-rw-r--r-- 1 root  root     18 Mar 22 18:08 test2.ibd.meta

增备目录下的checkpoint文件就有意思了。有一个很清晰的LSN的增量描述。

[ 2017-03-22_18-07-38]# cat *checkpoints
backup_type = incremental
from_lsn = 30754980731
to_lsn = 30754984465
last_lsn = 30754984465而prepare之后的全备里面的checkpoint文件其实已经发生了变化

# cat *checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 30754984465
last_lsn = 30754984465这个时候我们使用如下的方式来还原恢复。

#innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/databak/incre/20170322/2017-03-22_18-07-38这个时候表test2里面的数据是几条? 是2条。

   这个过程我们相当于完成了一个全备+一个增备的数据恢复过程。

  而我们在一个增备之后又插入了一些数据,这个怎么继续恢复呢,还是prepare的过程。这个路径需要注意,还是merge到全备中。

innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/databak/full/20170322  --incremental-dir=/home/databak/incre/20170322/2017-03-22_18-11-26继续还原恢复。

innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/databak/full/20170322再次查看数据,我们要恢复的4条数据都恢复回来了。

> select *from test2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.06 sec)

备份中的选项补充

innobackupex中的选项很多,有几个还是比较有特色的,比如stream选项,--slave-info选项能够方便搭建从库,生成偏移量的信息,比如并行--parallel等,还可以根据LSN来备份,选项是--incremental-lsn

对于stream选项,默认是打包,可以结合管道来实现压缩,比如:innobackupex --defaults-file=/etc/my.cnf --user=root --stream=tar  /home/databak/full/20170322_2 | gzip > /home/databak/full/20170322_2/20170322_2.tar.gz   

备份中的常用场景

   很多时候其实我不想备份整个库,我只想备份一个表,那么这个操作如何来实现呢。

innobackupex --defaults-file=/etc/my.cnf --user=root --include='test.test2'  /home/databak/full/20170322_2这里有几点需要注意,工具还是会逐个去扫描,只是那些不符合的会被忽略掉,也就意味着备份出来的情况和全备的目录结构是一样的,但是指定的表会备份出ibd,frm文件。

[test]# ll
total 1036
-rw-r--r-- 1 mysql mysql    8556 Mar 22 18:34 test2.frm
-rw-r--r-- 1 root  root  1048576 Mar 22 19:26 test2.ibd
[ test]# cd ../mysql
[ mysql]# ll
total 0而且有一点值得吐槽一下的是,ibdata也会完整备份出来,如果这个文件很大,那就相当不给力了。

不过也别对这种备份失去信心,有一个场景还是很实用的。那就是迁移表。

迁移表

  还是刚刚的这个场景,如果表test2需要拷贝到另外一套环境中,我们可以使用Innobackupex来做物理备份,然后还原导入,达到迁移的目的。

下面的命令会声明指定目录下的备份需要导出对象。    innobackupex --apply-log --export /home/databak/full/20170322_2/2017-03-22_19-26-46这个过程的直接产物就是生成了一个.exp文件,在MySQL原生版本中是.cfg文件

[ test]# ll
total 1052
-rw-r--r-- 1 root  root    16384 Mar 22 19:29 test2.exp
-rw-r--r-- 1 mysql mysql    8556 Mar 22 18:34 test2.frm
-rw-r--r-- 1 root  root  1048576 Mar 22 19:26 test2.ibd对表test2做数据信息截断。

> alter table test2 discard tablespace;
Query OK, 0 rows affected (0.07 sec)然后就是物理拷贝,复制.exp文件和.ibd文件到指定目录下,修改属主权限。

然后使用import的方式即可完成导入。

> alter table test2 import tablespace;
Query OK, 0 rows affected (0.00 sec)有另外一点值得说的是,这个.exp文件是不是必须的,其实也不是。

我们只拷贝.ibd文件也照样可以。可能在新版本中会有一些警告提示,我们重新来做一下。

[test]> alter table test2 discard tablespace;
Query OK, 0 rows affected (0.03 sec)同时删除刚刚拷贝过来的.exp文件。

然后拷贝ibd文件到指定目录,赋权限

导入表空间信息。

[test]> alter table test2 import tablespace;
Query OK, 0 rows affected (0.00 sec)查看数据的情况,发现数据还是回来了。

[test]> select *from test2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)当然这个过程中还是有很多需要注意的地方。

关于如何进行MySQL中的xtrabackup备份恢复就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 如何进行MySQL中的xtrabackup备份恢复

本文链接: https://www.lsjlt.com/news/66306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行MySQL中的xtrabackup备份恢复
    这篇文章给大家介绍如何进行MySQL中的xtrabackup备份恢复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。    XtraBackup是Percona推出...
    99+
    2022-10-19
  • MySQL如何使用使用Xtrabackup进行备份和恢复
    目录1 备份1.1 全备1.2 增备2 备份恢复2.1 准备数据2.2 进行恢复3 目录结构4 备份脚本4.1 脚本4.2 配置文件5 恢复脚本5.1 脚本5.2 配置文件1 备份 进行备份前需要先创建备份用户,直接...
    99+
    2022-05-27
    MySQL Xtrabackup MySQL 备份和恢复
  • MySQL之xtrabackup备份恢复的实现
    目录1、安装xtrabackup2、备份2.1、做一次全备2.2、进入mysql添加数据2.3、做一次增备2.4、删除数据库(千万不要在生产库执行!!!)3、恢复3.1、准备阶段3.2、模仿数据库丢失,停掉服务3.3、恢...
    99+
    2023-02-03
    MySQLxtrabackup备份恢复 MySQL备份恢复
  • 如何用Percona XtraBackup进行MySQL从库的单表备份和恢复
    环境说明: 主库:192.168.0.1 从库1:192.168.0.2 从库2:192.168.0.3 备份工具 : Percona xtrabackup version 2.4.8 based on M...
    99+
    2022-10-18
  • 如何进行MySQL 5.6 xtrabackup 全量和增量的备份及恢复
    今天就跟大家聊聊有关如何进行MySQL 5.6 xtrabackup 全量和增量的备份及恢复,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。xtrab...
    99+
    2022-10-19
  • xtrabackup如何实现MySQL自动备份恢复
    这篇文章主要介绍了xtrabackup如何实现MySQL自动备份恢复,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. xtrabackup...
    99+
    2022-10-18
  • 如何mysql的备份中的xtrabackup
    今天就跟大家聊聊有关如何mysql的备份中的xtrabackup,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 mysql的备份方式  ...
    99+
    2022-10-19
  • 如何进行mysql的备份与恢复的探讨
    如何进行mysql的备份与恢复的探讨,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1,我现在的备份方案为:A(master)-...
    99+
    2022-10-19
  • 如何进行mongdb备份恢复
    如何进行mongdb备份恢复,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、物理备份(拷贝文件)#!/bin/sh DATE=`date...
    99+
    2022-10-18
  • 详解如何利用Xtrabackup进行mysql增量备份
    目录利用Xtrabackup进行mysql增量备份安装设置数据库用于备份账户全量备份增量备份提问总结原理为什么最后一次增量备份不用 "--apply-log-only"为什么备份完后要准备备份 &qu...
    99+
    2022-10-28
  • 如何使用mysqldump对mysql进行备份和恢复
    这篇文章给大家分享的是有关如何使用mysqldump对mysql进行备份和恢复的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysqldump是mysql的逻辑备份恢复工具,可以...
    99+
    2022-10-18
  • 如何使用MySQL进行数据备份和恢复?
    如何使用MySQL进行数据备份和恢复?数据库中的数据对于任何企业或个人而言都是非常重要的。由于各种原因(如硬件故障、人为错误或恶意攻击等),数据可能会丢失或损坏。因此,定期进行数据库备份是非常重要的。MySQL作为最受欢迎的开源关系型数据库...
    99+
    2023-10-22
    数据恢复 MySQL备份 MySQL数据备份
  • 如何进行MySQL管理基础中的维护、备份和恢复
    如何进行MySQL管理基础中的维护、备份和恢复,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.日志记录   &nb...
    99+
    2022-10-19
  • 使用xtrabackup工具如何热备和恢复mysql
    下文主要给大家带来使用xtrabackup工具如何热备和恢复mysql,希望这些内容能够带给大家实际用处,这也是我编辑使用xtrabackup工具如何热备和恢复mysql这篇文章的主要目的。好了,废话不多说...
    99+
    2022-10-18
  • mysql中lnnobackupex怎么进行全备加上增量的备份恢复
    mysql中lnnobackupex怎么进行全备加上增量的备份恢复,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 ...
    99+
    2022-10-19
  • 使用DBeaver进行mysql数据备份与恢复
    目录 前言 一、Dbeaver是什么? 二、Dbeaver如何备份与恢复数据 1.备份Mysql数据 2.恢复Mysql数据 三、导入sql失败与解决 总结 前言 项目迭代、版本升级的过程中,有时候会涉及到数据库表结构的更改,因而,数据库...
    99+
    2023-08-18
    android 前端 后端
  • MySQL命令行方式进行数据备份与恢复
    目录备份还原方式一方式二平时经常管理数据库的时候 发现身边小伙伴儿 都是使用各种图形化工具对mysql数据 进行数据的备份和还原操作 离开了工具就束手无策了 美其名曰 巧妇难为无米之炊 今天就和大家分享一下命令行方式对M...
    99+
    2022-08-18
    MySQL命令行数据备份与恢复 MySQL数据备份 MySQL命令行恢复
  • MySQL利用xtrabackup进行增量备份的详细过程
    本篇内容主要讲解“MySQL利用xtrabackup进行增量备份的详细过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL利用xtrabackup进行增...
    99+
    2022-10-18
  • 如何使用SQL语句在MySQL中进行数据备份和恢复?
    如何使用SQL语句在MySQL中进行数据备份和恢复?在数据库中,数据备份和恢复是非常重要的操作,可以保证数据的安全性并且在遇到意外情况时能够迅速恢复数据。MySQL是一个非常常用的关系型数据库,它提供了多种方式来进行数据备份和恢复,其中一种...
    99+
    2023-12-17
    MySQL SQL 数据备份
  • mysql如何备份与恢复数据
    下文我给大家简单讲讲关于mysql如何备份与恢复数据,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完mysql如何备份与恢复数据对大家多少有点帮助吧。mysql物理备份与逻辑备...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作