热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

CentOS下Mysql备份恢复

为什么要备份:备份的几个重要理由:灾难恢复、需求改变、审计、测试等;如"测试"定期用最新的生产环境中的数据更新到测试环境服务器需要考虑的问题:1、在不导致严重后果的情况下,可以容忍丢失多少数据?需要故障恢复,还是可以接受自从上次日常备份后所有的数据丢失?2、恢复需要在多长时间内完成?哪种类型的宕机是可以接受的?哪种影响是应用和用户可以接受的?当情况发生时,又该怎样持续提供服

为什么要备份:

备份的几个重要理由:

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

需要考虑的问题:

1、在不导致严重后果的情况下,可以容忍丢失多少数据?需要故障恢复,还是可以接受自从上次日常备份后所有的数据丢失?

2、恢复需要在多长时间内完成?哪种类型的宕机是可以接受的?哪种影响是应用和用户可以接受的?当情况发生时,又该怎样持续提供服务等?

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

备份类型:

根据数据库是否需要在线备份还是离线备份,可分为以下几点:

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

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

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

备份方式:

完全备份:full backup备份全部数据集

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

差异备份:differentialbackup 上次完全备份以来改变的数据

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

完全+增量备份方式

需要完全备份+增量备份+二进制文件

完全+差异备份方式

需要完全备份+差异备份+二进制文件

逻辑备份还是物理备份:

逻辑备份:

优点:

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

恢复非常简单

比较灵活

与存储引擎无关

有助于避免数据损坏

缺点:

必须由数据库服务器完成逻辑备份工作,因此需要使用服务器更多资源

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

浮点数可能会丢失精度

数据还原之后,索引需要重建

物理备份:

优点:

备份与恢复数据比较简单

InnoDB与MyISAM的物理备份容易跨平台、操作系统和Mysql版本

恢复速度比较快,不需要重新构建索引

缺点:

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

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

备份的对象:

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

计划Mysql备份方案:

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

2、保留多个备份集

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

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

5、如果不借助于备份工具备份,需要验证备份是否正常

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

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



使用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
注释: 如果想清理此前的编译所生成的文件,则需要使用如下命令
makeclean
rmCMakeCache.txt

2、为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

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



[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

4、修改Mysql主配置文件



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

5、为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 *


6、初始化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'


7、创建测试数据库与表并插入数据


[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');

二、使用Mysqldump备份工具备份


1、使用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手册

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


[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





3、在"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 |              |                  |
+------------------+----------+--------------+------------------+

4、做增量备份,基于上一次完全备份到目前日志所处的位置




######查看数据库备份的二进制日志
[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      #指定到哪个时间结束

5、向"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 |              |                  |
+------------------+----------+--------------+------------------+

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


######查看二进制文件,下面可以看出删除操作是在"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> setglobal 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> setglobal 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服务,初始化并启动,然后使用备份文件与二进制文件进行恢复,所以一定要保存好备份文件与二进制文件


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

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

1、创建LVM逻辑卷 逻辑卷详细介绍点此处


######分区,不做详细介绍
[root@localhost ~]# fdisk /dev/sdb
Command (m forhelp): 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 forhelp): 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 forhelp): t
Partition number (1-4): 1
Hex code (typeL to list codes): 8e
Command (m forhelp): t
Partition number (1-4): 2
Hex code (typeL to list codes): 8e
Command (m forhelp): p
Device Boot      Start         End      Blocks   Id  System
/dev/sdb11        1306    10490413+  8e  Linux LVM
/dev/sdb21307        2612    10490445   8e  Linux LVM
Command (m forhelp): 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/mydataext4    defaults        0 0
[root@localhost ~]# mount -a
######创建Mysql数据与二进制日志存放目录并修改权限
[root@localhost ~]# mkdir /mydata/{data,binlog}
[root@localhost ~]# chown -R mysql:mysql /mydata/*

2、修改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!

3、创建数据库并添加数据


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');

4、登录Mysql数据库,请求为所有表加锁,记得一定不要关闭终端,否则表锁将会失效,并滚动日志


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

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


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

6、快照做完后,快速释放读锁


mysql> unlock tables;

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


[root@localhost ~]# mount /dev/myvg/mylv-snap /mnt/
mount: block device /dev/mapper/myvg-mylv--snapis 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用户

9、登录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


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

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

3、下载并安装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#执行程序

4、主配置文件介绍


[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                #定义记录日志类型
注释:其他配置保持输入即可

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


[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




四、使用Xtrabackup备份恢复

简介:

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

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

1、下载并安装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

2、创建并授权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;   #刷新使其重新授权表
注释: 用户授权规则为最小权限

3、完全备份:


[root@localhost ~]# innobackupex --user=backup --password=mypass /backup/
######下面表示已经备份成功
innobackupex: Backup created indirectory '/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目录来存储备份数据

4、准备(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 shutdownwith 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的过程,以提高其完成速度

5、完全恢复数据库


[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服务器的数据目录来执行恢复过程

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


[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用户

7、使用"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');

8、进行增量备份


######创建增量备份存储目录
[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 indirectory '/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 #指定上一次备份所在的目录

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


[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 indirectory '/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表而言,执行增量备份时其实进行的是完全备份

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


[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 #指定恢复的增量备份目录,这个选项会使增量备份文件中的数据合并到完全备份

11、恢复数据并启动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"导出并使用批处理的方式导入数据库!!!



本文出自 “ALLEN” 博客,请务必保留此出处http://502245466.blog.51cto.com/7559397/1291913



推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
author-avatar
梦想不被束缚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有