Innobackupex MySQL 全备、增备及恢复

简介:

在这之前都是通过 mysqldump 来备份数据库的,由于是逻辑备份,所以采用这种备份方式数据是很安全的,跨平台、版本都很容易。

凡事有利必有弊,逻辑备份在你数据库比较大时,备份、恢复数据所耗费的时间也是蛮长的,所以要不断改进,使用物理备份。

由于线上数据库表使用的是混合引擎 MyISAM 跟 Innodb ,所以也不能使用 mysqlhotcopy ,这个工具还是蛮好用的,可惜只能备份 MyISAM。

Percona XtraBackup 是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,且是开源项目。

了解到 XtraBackup 工具下有一个 innobackupex 支持 MyISAM 跟 Innodb 的备份,所以来搞一搞。

一、安装 XtraBackup

shell > yum -y install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

# 或者

shell > wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

shell > yum -y install epel-release

shell > yum -y install rsync libev-devel numactl-devel perl-DBD-MySQL

shell > rpm -ivh percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

# 需要解决依赖关系

二、innobackupex 全备

shell > innobackupex --user=user --password=passwd --no-timestamp ./2016/09-29/`date +%H-%M`.dbname

# --no-timestamp 如果不加的话会在备份目录下生成一个备份时间的目录,备份数据存在该目录下

# 将整个数据库备份到 ./2016/09-29/ 以备份时间加自定义名称的一个目录下

# 虽然可以使用 --stream=tar 加 | gzip > 的方式直接打包并压缩,但是备份速度就下降了,所以我宁愿快速备份,之后再去处理打包、压缩。

# 全备脚本

shell > vim script/backupdb.sh

#!/bin/bash
# 0 0 */2 * * sh /root/script/backupdb.sh
# author: Wang XiaoQiang 2016/09/29

dbname=‘alldatabases‘
dbuser=‘user‘
dbpassword=‘passwd‘

backup_dir=‘/data/backup_db‘
backup_log=‘/root/script/logs/backup.log‘

ymtime=`date +%Y-%m`
dtime=`date +%d`

wlog(){
  echo -e "`date "+%F %T"` DBname: $1 State: $2\n" >> $backup_log
}

[ ! -d $backup_dir/$ymtime ] && mkdir -p $backup_dir/$ymtime

cd $backup_dir/$ymtime && /usr/bin/innobackupex --user=$dbuser --password=$dbpassword --no-timestamp $dbname > /dev/null 2>&1

if [ $? -eq 0 ];then
  wlog $dbname ‘Backup success.‘
  dbakfile=$dbname.$dtime.tar.gz
  tar zcf $dbakfile $dbname --remove-files
  [ $? -eq 0 ] && wlog $dbakfile ‘Packaging success.‘ || wlog $dbakfile ‘Packaging failed.‘
else
  wlog $dbname ‘Backup failed.‘
fi

# End

三、innobackupex 全备恢复

shell > /etc/init.d/mysql.server stop  # 首先关闭数据库

shell > cd /data/backup_db  # 切换到备份目录

shell > mv /usr/local/mysql-5.5.52/data data.old  # 将原来的数据目录备份一下

shell > tar zxf alldatabase.11.tar.gz  # 然后将原来的备份解压缩

shell > innobackupex --apply-log alldatabase  # 在备份上应用日志,一般没有看到报错且最后显示 OK 就没有问题 ( --use-memory 使用该参数加快速度 )

161011 12:07:33 completed OK!

shell > innobackupex --copy-back alldatabase  # 将备份还原到 my.cnf 指定的 datadir 中,不指定 --defaults-file,默认 /etc/my.cnf

Error: datadir must be specified.  # 报错信息显示,在默认配置文件 /etc/my.cnf 中,没有找到 datadir 配置项

shell > vim /etc/my.cnf  # 加入 datadir 配置项

datadir         = /usr/local/mysql-5.5.52/data

shell > innobackupex --copy-back alldatabase  # 再次执行 copy 动作,没有报错且显示 OK 

161011 12:17:52 completed OK!

shell > ll -d /usr/local/mysql-5.5.52/data
drwxr-x--- 6 root root 4096 10月 11 12:17 /usr/local/mysql-5.5.52/data

shell > chown -R mysql.mysql /usr/local/mysql-5.5.52/data  # 修改数据目录权限

shell > /etc/init.d/mysql.server start

# 备份已经恢复!
# 回顾整个恢复过程,发现一个问题:之前数据库里的东西全部没有了...
# 也就是说,innobackupex 只适用于该 MySQL 中除系统库外,只有一个库的备份。
# 虽然有选项 --databases 可以指定备份哪个数据库,但是备出来的结果却是 all databases,且恢复的时候也是全部覆盖。
# 1、采用 innobackupex 备份整库,然后恢复到一台新库上,再通过 mysqldump 将需要还原的单库备份一次,之后导入需要恢复的数据库中 ( 要考虑恢复时间 )。
# 2、采用 innobackupex 备份只有一个业务库的 MySQL Server,恢复到只有该业务库的 MySQL Server 中。
# 3、如果一个 MySQL Server 中有多个数据库,又只想备份某个库,且该库体积比较小的情况下,建议使用 mysqldump 备份。

三、innobackupex 增备

shell > mysql -uuser -ppassword -A # 创建测试库、表,插入测试数据

mysql> create database test_incre character set utf8;

mysql> create table test_incre.incre(id int(10) not null,name varchar(20));

mysql> insert into test_incre.incre values(1,‘Wang XiaoQiang‘);

mysql> quit

shell > innobackupex --user=user --password=password --database=test_incres --no-timestamp /data/backup_db/test_incre # 第一次全备

# 再次证明:--databases 就是来卖萌的,你可以去源数据库目录 du -sh 跟 目标备份目录 du -sh 比对,真的是一毛一样。

shell > mysql -uuser -ppassword -A # 添加测试数据

mysql> insert into test_incre.incre values(2,‘Xiao GuaiShou‘);

mysql> quit

shell > innobackupex --user=user --password=password --database=test_incres --no-timestamp --incremental-basedir=/data/backup_db/test_incre --incremental /data/backup_db/test_incre01

# --incremental-basedir=/data/backup_db/test_incre 第一次增备指定全备路径
# --incremental 参数说明这是一次增备,并指定增备路径

# 全备目录 du -sh 跟 增备目录 du -sh 比较发现,增备目录只比全备目录少了 1G,这说明对于 MyISAM 表来讲,还是全备!!!

shell > mysql -uuser -ppassword -A # 再次添加测试数据

mysql> insert into test_incre.incre values(3,‘King‘);

mysql> quit

shell > innobackupex --user=user --password=password --database=test_incres --no-timestamp --incremental-basedir=/data/backup_db/test_incre01 --incremental /data/backup_db/test_incre02

# 第二次增备是在第一次增备的基础上,所以 --incremental-basedir 指定的是第一次增备目录,最后指定的第二次增备目录

shell > cat test_incre/xtrabackup_checkpoints    # backup_type 提示:这是一次全备,from_lsn 从 0 开始至 1601917 结束
backup_type = full-backuped
from_lsn = 0
to_lsn = 1601917
last_lsn = 1601917
compact = 0
recover_binlog_info = 0

shell > cat test_incre01/xtrabackup_checkpoints  # backup_type 提示:这是一次增备,from_lsn 从上次结束 lsn 1601917 开始至 1602789 结束
backup_type = incremental
from_lsn = 1601917
to_lsn = 1602789
last_lsn = 1602789
compact = 0
recover_binlog_info = 0

shell > cat test_incre02/xtrabackup_checkpoints  # backup_type 提示;这是一次增备,from_lsn 从上次结束 lsn 1602789 开始至 1603652 结束
backup_type = incremental
from_lsn = 1602789
to_lsn = 1603652
last_lsn = 1603652
compact = 0
recover_binlog_info = 0

# 好了,这就是增量备份了,可以发现:对于 MyISAM 来说全部是全量备份,并且根本没有什么 --databases 一说。

# 增备脚本

四、innobackupex 增备恢复

shell > /etc/init.d/mysql.server stop  # 关闭数据库

shell > cd /data/backup_db

shell > mv /usr/local/mysql-5.5.52/data data.old02  # 备份原有数据库

shell > innobackupex --apply-log --redo-only test_incre  # 指定全备目录,--redo-only 对已提交的事务进行前滚,仅最后一次增备恢复不需要添加该参数

shell > innobackupex --apply-log --redo-only test_incre --incremental-dir=/data/backup_db/test_incre01  # --incremental-dir 指定第一次增备目录 ( 绝对路径 )

shell > innobackupex --apply-log test_incre --incremental-dir=/data/backup_db/test_incre02  # 指定第二次增备目录,最后一次增备还原不需要添加 --redo-only 参数

shell > innobackupex --copy-back test_incre  # 最后一步,复制整合后的全备文件,位置为 my.cnf 中 datadir 指定路径

shell > chown -R mysql.mysql /usr/local/mysql-5.5.52/data

shell > /etc/init.d/mysql.server start  # 启动数据库,查看数据是否恢复

shell > mysql -uuser -ppassword -A

mysql> select * from test_incre.incre;
+----+----------------+
| id | name           |
+----+----------------+
|  1 | Wang XiaoQiang |
|  2 | Xiao GuaiShou  |
|  3 | King           |
+----+----------------+

# OK,木有问题!

时间: 2024-10-13 08:58:36

Innobackupex MySQL 全备、增备及恢复的相关文章

基于Innobackupex的增备及恢复

MySQL的热备(物理备份)可以采取全备加增量备份的方式来减轻数据库I/O压力及系统资源的占用.增量备份主要是以全备或增量备份为基础,备份那些变更过的页面.其备份的原理是基于一个不断增长的LSN序列,这个LSN与Oracle的SCN类似.在恢复期间,我们需要将已提交的事务前滚,未提交的事务回滚.本文主要描述了增量备份及增量恢复. 1.增备的相关知识点    As not all information changes between each backup, the incremental ba

基于mysqldump编写自动全备增备的shell脚本

基于mysqldump编写自动全备增备的shell脚本 在线上MySQL数据库备份分为全备和增备,而xtrabackup备份已经支持了增量备份了,但是mysqldump就不支持增量备份,所以我们需要写一个shell脚本对于mysqldump来自动全备和增备. 一下脚本要求我们做一个全备的策略,然后如何做增量备份,自动完成每天执行增量备份,每个星期天执行全备.备份完删除二进制文件,减低磁盘压力. [[email protected] ~]# cat mysqlback.sh #!/bin/bash

Innobackupex(全备+增量)备份恢复

MySQL的热备(物理备份)可以采取全备加增量备份的方式来减轻数据库I/O压力及系统资源的占用.增量备份主要是以全备或增量备份为基础,备份那些变更过的页面.其备份的原理是基于一个不断增长的LSN序列,这个LSN与Oracle的SCN类似.在恢复期间,我们需要将已提交的事务前滚,未提交的事务回滚.本文主要描述了增量备份及增量恢复. 1.增备的相关知识点    As not all information changes between each backup, the incremental ba

mysql-zrm备份工具实现全备+增备策略

本博文声明,特别适合初次应用此工具的小白使用,原因看完就明白,OK,开始吧! 1.前期准备: 因为mysql-zrm这个备份工具是用perl语言写成的工具,所有要先安装一些软件包,来为mysql-zrm工具提供必要的环境 yum install perl-DBI perl-DBD-MySQL perl-XML-Parser -y PS:(网上好多人云亦云,要不就是复制.转载别人的,不需要那么复杂,只需要安装这3个包即可) 2.创建备份用户 mysql> grant select,insert,u

使用shell实现mysql自动全备、增备&日志备份

数据库热备脚本: vim backup.sh #!/bin/sh time=`date "+%Y%m%d_%H%M%S"` host=`hostname` week=`date +%w` monitor="/home/mysql/monitor/mysql_hotbackup_status.txt" ##zabbix监控文件 time_start=`date +%s` n=0 ###要周几做全备,周日是0,周一到周六依次为1~6 function check_sta

innobackupex 全备、增备脚本

全备脚本:innobackupex --defaults-file=/etc/my.cnf --user root --password mypasswd /mydata/fullbak/ 增备脚本:innobackupex --defaults-file=/etc/my.cnf --user root --password mypasswd --incremental-basedir=/mydata/fullbak 原文地址:https://www.cnblogs.com/liang54562

xtrabackup自动全备,增备以及自动恢复脚本

cat xtrabackup.sh #!/bin/bash [ -d /home/increment/ ] || mkdir -p /home/increment/ mysql_path=/home/ mysql_increment_path=/home/increment/ #mysql全备 mysql_backup() { innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' --backup $my

基于Innobackupex的全备恢复

对于MySQL数据库的热备,xtrabackup是大多数DBA朋友们的选择.xtrabackup内嵌了一个innobackupex可用于热备MySQL数据库.本文描写叙述了基于innobackupex这个工具全备下的恢复并给出演示供大家參考. 有关Innobackupex的全备可參考:Innobackupex 全备数据库 1.Innobackupex恢复原理    After creating a backup, the data is not ready to be restored. The

mysql增备

mysql每隔5分钟增备一次 1,逻辑示意图 2,目录结构图 3,producer #!/usr/local/bin/python3 # -*- coding: UTF-8 -*- # ==================================================== # Author: changbo - [email protected] # Last modified: 2017-9-3 # Filename: mysqlincrement.py # Descript