企业之Mysql备份恢复

为何要备份:mysql

备份的几个重要理由:sql

灾难恢复、需求改变、审计、测试等;如"测试"按期用最新的生产环境中的数据更新到测试环境服务器数据库

须要考虑的问题:vim

一、在不致使严重后果的状况下,能够容忍丢失多少数据?须要故障恢复,仍是能够接受自从上第二天常备份后全部的数据丢失?安全

二、恢复须要在多长时间内完成?哪一种类型的宕机是能够接受的?哪一种影响是应用和用户能够接受的?当状况发生时,又该怎样持续提供服务等?bash

三、须要恢复什么?常见的是恢复整个服务器、单个数据库、单个表,或只是特定的事务或语句等服务器

备份类型:网络

根据数据库是否须要在线备份仍是离线备份,可分为如下几点:app

热备份:备份期间不须要服务停机,业务不受影响less

温备份:备份期间仅容许读的请求

冷备份:备份期间须要关闭Mysql服务或读写请求都不受影响

备份方式:

彻底备份:full backup备份所有数据集

增量备份:incrementalbackup 上次彻底备份或增量备份以来改变的数据

差别备份:differentialbackup 上次彻底备份以来改变的数据

恢复数据时须要用到的备份文件:

彻底+增量备份方式

须要彻底备份+增量备份+二进制文件

彻底+差别备份方式

须要彻底备份+差别备份+二进制文件

逻辑备份仍是物理备份:

逻辑备份:

优势:

逻辑备份可使用编辑器或文本处理工具进行编辑或查看

恢复很是简单

比较灵活

与存储引擎无关

有助于避免数据损坏

缺点:

必须由数据库服务器完成逻辑备份工做,所以须要使用服务器更多资源

备份出的数据占用更大的空间

浮点数可能会丢失精度

数据还原以后,索引须要重建

物理备份:

优势:

备份与恢复数据比较简单

InnoDBMyISAM的物理备份容易跨平台、操做系统和Mysql版本

恢复速度比较快,不须要从新构建索引

缺点:

InnoDB的原始文件会比逻辑备份大得多

物理备份不是总能够跨平台、操做系统及Mysql版本;文件名大小写敏感和浮点格式有可能会有问题

备份的对象:

数据文件、配置文件、代码:存储过程,存储函数、触发器等、二进制日志、事务日志、中继日志、服务器配置、管理脚本、任务计划等

计划Mysql备份方案:

一、在生产环境中,对于数据来讲,备份是必要的;并选择适合的备份类型

二、保留多个备份集

三、按期从备份中抽取数据进行恢复测试

四、保存进制日志文件以用于基于故障时间点恢复,数据不宜于二进制文件放在同一个位置

五、若是不借助于备份工具有份,须要验证备份是否正常

六、经过测试演练整个数据的备份和恢复,测试恢复所须要的资源(如:CPU、磁盘空间、时间及网络带宽等)

七、对于安全性要考虑周全,若是有人能接触到生产服务器,他是否能访问备份服务器


使用Mysqldump备份工具实现彻底备份,并结合二进制日志实现增量备份

特色:逻辑备份工具、支持InnoDB热备份、MyISAM温备份;备份与恢复较慢

使用LVM逻辑卷快照功能实现几乎热血备份的彻底备份,并结合二进制日志实现增量备份;简单介绍"mylvmbackup"一键备份工具的使用

特色:几乎接近于热备份、物理备份、备份与恢复较快

使用Xtrabackup备份工具实现彻底备份与增量备份

特色:物理备份工具、支持InnoDB热备份、MyISAM温备份、速度较快


1、环境准备

一、安装Mysql数据库服务器

######安装编译环境
[root@localhost ~]# yum -y groupinstall "Server Platform Development" "Development tools"
######安装编译工具
[root@localhost ~]# yum install -y cmake
######建立Mysql用户
[root@localhost ~]# useradd -r mysql
######解压并安装Mysql
[root@localhost ~]# tar xf mysql-5.5.33.tar.gz
[root@localhost ~]# cd mysql-5.5.33
[root@localhost mysql-5.5.33]# cmake . \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \   #安装路径
> -DMYSQL_DATADIR=/mydata/data \              #数据存放路径
> -DSYSCONFDIR=/etc \                         #主配置文件目录
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \          #下面三项启用支持的存储引擎
> -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITH_READLINE=1 \                         #支持readline库
> -DWITH_SSL=system \                         #支持SSL加密
> -DWITH_ZLIB=system \                        #支持ZLIB压缩
> -DWITH_LIBWRAP=0 \                          #支持Libwrap库
> -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \         #Sock文件路径
> -DDEFAULT_CHARSET=utf8 \                    #默认字符集
> -DDEFAULT_COLLATION=utf8_general_ci         #默认字符集排序规则
######编译并安装
[root@localhost mysql-5.5.33]# make && make install
注释: 若是想清理此前的编译所生成的文件,则须要使用以下命令
make clean
rm CMakeCache.txt

二、为Mysql提供主配置文件与Sysv服务脚本

######为Mysql提供主配置文件
[root@localhost mysql-5.5.33]# cp support-files/my-large.cnf /etc/my.cnf
######为Mysql提供Sysv服务脚本
[root@localhost mysql-5.5.33]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
######赋于Sysv脚本执行权限
[root@localhost mysql-5.5.33]# chmod +x /etc/rc.d/init.d/mysqld
######将Mysqld加入系统服务
[root@localhost mysql-5.5.33]# chkconfig --add mysqld
[root@localhost mysql-5.5.33]# chkconfig mysqld on

三、让系统识别源码包安装的软件

[root@localhost mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@localhost mysql]# . /etc/profile
[root@localhost mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
[root@localhost ~]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf
[root@localhost ~]# ldconfig

四、修改Mysql主配置文件

[root@localhost mysql]# vim /etc/my.cnf
datadir = /mydata/data            #添加此行,数据存放目录
innodb_file_per_table = 1         #启用InnoDB表每表一个文件,默认全部数据库使用一个表空间
log-bin=/binlog/mysql-bin         #修改二制做存放目录

五、为Mysql建立数据库与二进制存放目录

######建立数据、二进制存放目录与备份目录
[root@localhost ~]# mkdir -p /backup /mydata/data  /binlog
######修改Mysql二进制与数据及备份目录的属主、属组为Mysql用户
[root@localhost mysql]# chown -R mysql.mysql /mydata/data
[root@localhost mysql]# chown -R mysql.mysql /binlog /backup
######修改Mysql安装目录的属组为Mysql组
[root@localhost mysql]# chown -R :mysql *

六、初始化Mysql并启动服务

[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@localhost ~]# service mysqld start
Starting MySQL......... SUCCESS!
######修改Mysql的root用户密码
[root@localhost ~]# mysqladmin -uroot password 'root@pass'

七、建立测试数据库与表并插入数据

[root@localhost ~]# mysql -uroot -proot@pass
mysql> create database allen;
mysql> use allen;
mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');

2、使用Mysqldump备份工具有份

一、使用Mysqldump对"allen"数据库作备份而且滚动二进制日志,记录日志位置

[root@localhost ~]# mysqldump -uroot -proot@pass --lock-all-tables --routines --events --triggers --master-data=2 --flush-logs --databases allen > /backup/allen_`date +%F`.sql
注释:
-u                        #指定用户名
-p                        #指定用户密码
-h                        #指定主机地址
-A|--all-databases        #备份全部数据库
--databases               #备份指定数据库
--single-transcation      #基于此项能够实现对InnoDB表作热备份,但不须要使用
--lock-all-tables         #执行备份时为全部表请求加锁
-E|--events               #备份事件调度器代码
--opt                     #同时启动各类高级选项
-R|--routines             #备份存储过程和存储函数
--flush-logs              #备份以前刷新日志
--triggers                #备份触发器
--master-data=2           #该选项将会记录binlog的日志位置与文件名并追加到文件中,若是为1将会输出CHANGE MASTER命令,主从下有用
######更多选项请参考man手册

二、备份二进制日志文件并查看已备份的数据文件

[root@localhost ~]# cp /binlog/mysql-bin.00000* /backup/
[root@localhost ~]# ls /backup/
allen_2013-09-06.sql  mysql-bin.000001  mysql-bin.000002  mysql-bin.000003  mysql-bin.000004

三、在"allen"数据库中新添加数据来模拟作增量备份,并查看当前日志文件及所处位置

mysql> create table tab2 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab2 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F');
mysql> show master status; #查看二进制日志文件所处位置
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1289 |              |                  |
+------------------+----------+--------------+------------------+

四、作增量备份,基于上一次彻底备份到目前日志所处的位置

######查看数据库备份的二进制日志
[root@localhost ~]# less /backup/allen_2013-09-06.sql
######从下面能够看出二进制日志文件及彻底备份后日志所处位置"107"
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=107;
######基于二进制日志作增量备份,
[root@localhost ~]# mysqlbinlog --start-position=107 /binlog/mysql-bin.000004 > /backup/allen_incremental.sql
注释:
--start-position     #指定从哪一个位置开始导出二进制日志
--stop-position      #指定到哪一个位置结束;若是到最后能够不用指定
--start-datetime     #指定从哪一个时间开始 时间格式:"2013-09-06 14:50:26"
--stop-datetime      #指定到哪一个时间结束

五、向"allen"数据库新添加两条记录,而后模拟误操做把数据库删除了,怎么恢复到当前数据

mysql> insert into tab2 (Name,Age,Gender) values ('Zhu BaJie',26,'M'),('Sun WuKong',24,'F');
mysql> drop database allen;
mysql> show master status; #查看二进制文件及所处位置
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1644 |              |                  |
+------------------+----------+--------------+------------------+

六、恢复数据到当前数据,须要恢复完整备份+增量备份+增量备份后删除以前的二进制文件

######查看二进制文件,下面能够看出删除操做是在"1561"时作的
[root@localhost ~]# mysqlbinlog  /binlog/mysql-bin.000004
# at 1561
#130906  5:31:04 server id 1  end_log_pos 1644  Query   thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1378416664/*!*/;
drop database allen
######导出删除以前至增量备份后的二进制日志数据
[root@localhost ~]# mysqlbinlog --start-position=1289 --stop-position=1561 /binlog/mysql-bin.000004  > /backup/allen_1561.sql
[root@localhost ~]# mysql -uroot -proot@pass
mysql> set global sql_log_bin=0;            #关闭二进制日志记录,由于恢复数据对咱们来讲记录没有意义
mysql> source /backup/allen_2013-09-06.sql  #恢复完整备份
mysql> source /backup/allen_incremental.sql #恢复增量备份
mysql> source /backup/allen_1561.sql        #恢复增量后至删除前的数据
mysql> set global sql_log_bin=1;            #开启二进制日志记录
mysql> use allen;                           #切换到"allen"数据库
mysql> show tables;                         #查看数据表已经恢复
+-----------------+
| Tables_in_allen |
+-----------------+
| tab1            |
| tab2            |
+-----------------+
mysql> select * from tab1;                  #查看表内数据也已经彻底恢复
+----+------------+------+--------+
| ID | Name       | Age  | Gender |
+----+------------+------+--------+
|  1 | Zhang WuJi |   26 | M      |
|  2 | Zhao Min   |   24 | F      |
+----+------------+------+--------+
mysql> select * from tab2;
+----+--------------+------+--------+
| ID | Name         | Age  | Gender |
+----+--------------+------+--------+
|  1 | Liang ShanBo |   26 | M      |
|  2 | Zhu YingTai  |   24 | F      |
|  3 | Zhu BaJie    |   26 | M      |
|  4 | Sun WuKong   |   24 | F      |
+----+--------------+------+--------+

注释:若是在生产环境中须要作数据库彻底备份,若是数据库整个系统崩溃,须要另外找一台服务器安装好Mysql服务,初始化并启动,而后使用备份文件与二进制文件进行恢复,因此必定要保存好备份文件与二进制文件


3、使用LVM逻辑卷快照备份

前提:使用LVM逻辑卷来作快照备份的话,须要Mysql的数据目录与二进制日志文件目录都在LVM逻辑卷组上

一、建立LVM逻辑卷 逻辑卷详细介绍点此处

######分区,不作详细介绍
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
p
Partition number (1-4): 1
First cylinder (1-7832, default 1):
Last cylinder, +cylinders or +size{K,M,G} (1-7832, default 7832): +10G
Command (m for help): n
p
Partition number (1-4): 2
First cylinder (1307-7832, default 1307):
Last cylinder, +cylinders or +size{K,M,G} (1307-7832, default 7832): +10G
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Command (m for help): p
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  8e  Linux LVM
/dev/sdb2            1307        2612    10490445   8e  Linux LVM
Command (m for help): w
######让内核从新读取分区表,若是读取不到须要重启
[root@localhost ~]# partx /dev/sdb
######建立逻辑卷并挂载,不作详细介绍
[root@localhost ~]# pvcreate /dev/sdb{1,2}
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# vgcreate myvg /dev/sdb{1,2}
  Volume group "myvg" successfully created
[root@localhost ~]# lvcreate -L +10G -n mylv myvg
  Logical volume "mylv" created
[root@localhost ~]#
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv[root@localhost ~]# mkdir /mydata /backup
[root@localhost ~]# vim /etc/fstab
/dev/myvg/mylv          /mydata                 ext4    defaults        0 0
[root@localhost ~]# mount -a
######建立Mysql数据与二进制日志存放目录并修改权限
[root@localhost ~]# mkdir /mydata/{data,binlog}
[root@localhost ~]# chown -R mysql:mysql /mydata/*

二、修改Mysql主配置文件数据存放目录与二进制文件存放目录并初始化

[root@localhost ~]# vim /etc/my.cnf
datadir = /mydata/data
log-bin=/mydata/binlog/mysql-bin
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@localhost mysql]# service mysqld start
Starting MySQL... SUCCESS!

三、建立数据库并添加数据

mysql> create database allen;
mysql> use allen;
mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');

四、登陆Mysql数据库,请求为全部表加锁,记得必定不要关闭终端,不然表锁将会失效,并滚动日志

mysql> flush tables with read lock;    #为全部表请求加锁
mysql> flush logs;                     #刷新日志
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 |              |                  |
+------------------+----------+--------------+------------------+

五、另外迅速开启一个终端窗口,为逻辑卷建立快照;逻辑卷:"/dev/myvg/mylv"

[root@localhost ~]# lvcreate -L 500M -s -p r -n mylv-snap /dev/myvg/mylv
  Logical volume "mylv-snap" created

六、快照作完后,快速释放读锁

mysql> unlock tables;

七、挂载快照卷,备份出数据,卸载快照卷并删除

[root@localhost ~]# mount /dev/myvg/mylv-snap /mnt/
mount: block device /dev/mapper/myvg-mylv--snap is write-protected, mounting read-only
[root@localhost ~]# cp -rp /mnt/* /backup/
[root@localhost ~]# umount /mnt/
######删除快照卷
[root@localhost ~]# lvremove /dev/myvg/mylv-snap
Do you really want to remove active logical volume mylv-snap? [y/n]: y
  Logical volume "mylv-snap" successfully removed

这样一次完整的LVM彻底备份就算是完成了,下面咱们来测试一下是否能正常使用

8、中止Mysql服务,删除数据目录下的全部文件来模拟数据库损坏;并恢复数据

[root@localhost ~]# service mysqld stop
Shutting down MySQL... SUCCESS!
[root@localhost ~]# rm -rf /mydata/*
######恢复已备份的数据
[root@localhost ~]# cp -rp /backup/* /mydata/
######启动Mysql服务
[root@localhost ~]# service mysqld start
Starting MySQL SUCCESS!
注释:若是不能启动,请检查数据目录权限;属主、属组是否为Mysql用户

九、登陆Mysql服务器,验证数据是否恢复

mysql> select * from allen.tab1;    #数据已经成功恢复
+----+------------+------+--------+
| ID | Name       | Age  | Gender |
+----+------------+------+--------+
|  1 | Zhang WuJi |   26 | M      |
|  2 | Zhao Min   |   24 | F      |
+----+------------+------+--------+

注释:这里就不在演示使用LVM作完完整备份后Mysql出现问题,其操做与恢复流程与使用"mysqldump"备份工具同样,先使用彻底备份恢复,再使用二进制日志进行恢复;使用二进制恢复时,请找好二进制日志到上一次备份的位置,避免没必要要的错误发生;而后使用"mysqlbinlog"导出并使用批处理的方式导入数据库

Mylvmbackup

一、介绍一下Mylvmbackup工具的使用,mylvmbackup是基于LVM逻辑卷快照作的备份,简单的说也就是LVM备份方法的简便版本,配置好主配置文件直接执行提供的脚本文件便可完成备份;此工具只能作备份操做,这里只介绍如何配置安装及备份

二、使用此工具作备份前提固然数据目录必须存放在LVM逻辑卷上,并且须要给快照卷剩余足够的空间作备份;若是须要恢复,解压缩备份文件,恢复操做同上

三、下载并安装mylvmbackup; 软件版本:mylvmbackup-0.14-0.noarch.rpm 点此下载

[root@localhost ~]# yum -y install mylvmbackup-0.14-0.noarch.rpm
[root@localhost ~]# rpm -ql mylvmbackup
/etc/mylvmbackup.conf    #主配置文件
/usr/bin/mylvmbackup     #执行程序

四、主配置文件介绍

[root@localhost ~]# vim /etc/mylvmbackup.conf
[mysql]                #链接数据库配置
user=root
password=root@pass
host=localhost
port=3306
socket=/tmp/mysql.sock
mycnf=/etc/my.cnf
[lvm]                  #LVM逻辑卷的配置
vgname=myvg            #卷组名称
lvname=mylv            #逻辑卷名称
backuplv=mysql_snap    #快照卷名称
lvsize=5G
[fs]                   #文件系统配置
xfs=0
mountdir=/mnt          #挂载目录
backupdir=/backup      #备份目录,也能够备份到行程主机
[misc]                 #定义备份选项
backuptype=tar         #定义备份的类型
backupretention=0
prefix=backup          #定义备份文件名前缀
suffix=_mysql          #定义备份文件名后缀
tararg=cvf             #定义tar参数,默认为cvf
tarfilesuffix=.tar.gz  #定义备份文件后缀名格式
datefmt=%Y%m%d_%H%M%S  #定义备份文件名时间戳格式
keep_snapshot=0        #是否保留snaphot
keep_mount=0           #是否卸载snaphot
quiet=0                #定义记录日志类型
注释:其余配置保持输入便可

五、备份数据库并验证备份文件

[root@localhost ~]# mylvmbackup
######出现如下信息表示备份成功,下面意思是删除快照卷成功
20130906 11:55:33 Info: Running: lvremove -f /dev/myvg/mysql_snap
  Logical volume "mysql_snap" successfully removed
20130906 11:55:34 Info: DONE: Removing snapshot
######查看备份文件,已经成功备份
[root@localhost ~]# ls /backup/
backup-20130906_115532_mysql.tar.gz




4、使用Xtrabackup备份恢复

简介:

Xtrabackup是一个对InnoDB、XtraDB作数据备份的工具,支持在线热备份(备份时不影响数据读写),是一个很好的开源备份恢复工具。xtrabackup能够基于上一次整库备份基础上作增量备份(InnoDB、StraDB);能够以流的形式备份,并直接保存到远程机器上

注释:这里就不在配置环境了,直接接着使用上一次LVM备份恢复的环境

一、下载并安装Xtrabackup工具 软件版本:percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm 点此下载

[root@localhost ~]# yum -y install percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm

二、建立并受权Mysql数据库用户有备份权限

[root@localhost ~]# mysql -uroot -proot@pass
mysql> create user 'backup'@'localhost' identified by 'mypass';     #建立用户并设置密码
mysql> revoke all privileges,grant option from 'backup'@'localhost';#去掉用户的全部默认权限
mysql> grant reload,lock tables,replication client,event on *.* to 'backup'@'localhost';  #从新为用户受权
mysql> flush privileges;   #刷新使其从新受权表
注释: 用户受权规则为最小权限

三、彻底备份:

[root@localhost ~]# innobackupex --user=backup --password=mypass /backup/
######下面表示已经备份成功
innobackupex: Backup created in directory '/backup/2013-09-06_07-47-33'
innobackupex: MySQL binlog position: filename 'mysql-bin.000005', position 744
130906 07:47:36  innobackupex: Connection to database server closed
130906 07:47:36  innobackupex: completed OK!

注释:备份完成后,会在"/backup"目录下生成一个以当前日期时间为名称的目录;使用innobakupex备份时,其会调用xtrabackup备份全部的InnoDB表,复制全部关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。固然在备份时"innobackupex"还会在备份目录中生成一些文件如:

(3.1)、xtrabackup_checkpoints —— 备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;每一个InnoDB页(一般为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的

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

(3.3)、xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position

(3.4)、xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件

(3.5)、backup-my.cnf —— 备份命令用到的配置选项信息

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

四、准备(prepare)一个彻底备份

在备份完成后,数据不能直接用于恢复,由于备份的数据中能够会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务;所以,此时的数据文件仍处于不一致状态,"准备"的工做就是经过回滚未提交的事务及同步已提交的事务到数据文件使用数据文件处于一致性状态

######为防止意外错误,先关闭Mysql服务
[root@localhost ~]# service mysqld stop
Shutting down MySQL. SUCCESS!
######删除数据目录下的全部文件
[root@localhost ~]# rm -rf /mydata/data/*
######准备一个彻底备份
[root@localhost ~]# innobackupex --apply-log /backup/2013-09-06_07-47-33/
######出现如下信息表示已经成功
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
130906  8:26:36  InnoDB: Starting shutdown...
130906  8:26:40  InnoDB: Shutdown completed; log sequence number 1603596
130906 08:26:40  innobackupex: completed OK!
注释:
--apply-log  #做用是把备份时没有提交的事务回滚,已经提交的事务同步的数据文件中

(4.1)、在“准备”的过程当中,innobackupex还可使用"--use-memory"选项来指定其可使用的内存的大小,默认一般为100M。若是有足够的内存可用,能够多划分一些内存给prepare的过程,以提升其完成速度

五、彻底恢复数据库

[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/
######出现如下提示表示已经恢复成功
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-09-06_07-47-33'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130906 08:40:24  innobackupex: completed OK!
注释:
--copy-back    #用于恢复操做,经过复制全部数据相关的文件至Mysql服务器的数据目录来执行恢复过程

六、验证是否已经成功恢复

[root@localhost ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost ~]# mysql -uroot -proot@pass
mysql> select * from allen.tab1;    #已经成功恢复数据
+----+------------+------+--------+
| ID | Name       | Age  | Gender |
+----+------------+------+--------+
|  1 | Zhang WuJi |   26 | M      |
|  2 | Zhao Min   |   24 | F      |
+----+------------+------+--------+
注释:若是启动不成功,请查看数据目录下文件属主、属组权限是否为Mysql用户

七、使用"innobackupex"作增量备份,首先须要添加几条数据到数据库中

[root@localhost ~]# mysql -uroot -proot@pass
mysql> use allen;
mysql> insert into tab1 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F'),('BaJie',500,'M'),('WuKong',800,'M');

八、进行增量备份

######建立增量备份存储目录
[root@localhost ~]# mkdir /incremental
######执行增量备份
[root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/backup/2013-09-06_07-47-33/
######出现如下信息表示已经成功
innobackupex: Backup created in directory '/incremental/2013-09-06_09-08-16'
innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 420
130906 09:08:20  innobackupex: Connection to database server closed
130906 09:08:20  innobackupex: completed OK!
注释:
--incremental             #指定增量备份数据存放目录
--incremental-basedir=DIR #指定上一次备份所在的目录

九、再添加一些数据进行增量备份

[root@localhost ~]# mysql -uroot -proot@pass
mysql> use allen;
mysql> insert into tab1 (Name,Age,Gender) values ('Guan Yin',26,'M'),('Ru Lai',24,'F');
######再次作增量备份是基于上一次增量备份来作
[root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/incremental/2013-09-06_09-08-16/
######增量备份成功
innobackupex: Backup created in directory '/incremental/2013-09-06_09-17-49'
innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 687
130906 09:17:52  innobackupex: Connection to database server closed
130906 09:17:52  innobackupex: completed OK!

注释:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是彻底备份

十、删除数据库文件来模拟数据库损坏,实现对增量备份进行恢复

[root@localhost ~]# service mysqld stop
[root@localhost ~]# rm -rf /mydata/data/*
######准备第一个备份文件为彻底备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/
######准备第二个增量备份文件基于彻底备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-08-16/
######准备第二个增量备份文件基于彻底备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-17-49/
注释:须要在每一个备份(包括彻底和各个增量备份)上,将已经提交的事务进行“重放”,“重放”以后,全部的备份数据将合并到彻底备份上;若是有更多的增量备份文件,依次如此,一个一个的合并到彻底备份上
--redo-only    #做用是备份时提交的但还在事务日志中的应用到数据文件,可是尚未提交的并不回流
--incremental-dir=DIR #指定恢复的增量备份目录,这个选项会使增量备份文件中的数据合并到彻底备份

十一、恢复数据并启动Mysql服务验证

[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/
######恢复成功
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-09-06_07-47-33'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130906 09:53:33  innobackupex: completed OK!
[root@localhost ~]# chown -R mysql:mysql /mydata/data/*
[root@localhost ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost ~]# mysql -uroot -proot@pass
mysql> select * from allen.tab1;     #数据已经成功恢复
+----+--------------+------+--------+
| ID | Name         | Age  | Gender |
+----+--------------+------+--------+
|  1 | Zhang WuJi   |   26 | M      |
|  2 | Zhao Min     |   24 | F      |
|  3 | Liang ShanBo |   26 | M      |
|  4 | Zhu YingTai  |   24 | F      |
|  5 | BaJie        |  255 | M      |
|  6 | WuKong       |  255 | M      |
|  7 | Guan Yin     |   26 | M      |
|  8 | Ru Lai       |   24 | F      |
+----+--------------+------+--------+

这里就不在演示备份完成后Mysql出现问题,其操做与恢复流程与使用"mysqldump"备份工具同样,使用彻底备份+彻底备份后到如今全部的增量备份+最后一次作增量备份到当前时间的二进制日志文件进行恢复;使用二进制恢复时,请找好二进制日志到上一次备份的位置,避免没必要要的错误发生;而后使用"mysqlbinlog"导出并使用批处理的方式导入数据库!!!

相关文章
相关标签/搜索