一、备份恢复概述

  1.备份原因

          灾难恢复:硬件故障、软件故障、自然灾害、******、人为误操作;

          测试:测试环境使用

还原测试,用于测试备份的可用性

还原演练,分工演练数据恢复还原过程

    注意要点备份考虑因素

可容忍丢失多少数据恢复需要在多长时间内完成需要恢复什么数据

持锁的时长备份过程时长备份产生的负载恢复过程时长

 

  2.备份类型:不同的划分标准

    (1)完全备份,部分备份:备份的数据集来划分

完全备份:备份整个数据集

部分备份:只备份数据子集,备份其中的一张表或多张表;

    (2)完全备份,增量备份,差异备份:时间轴上的变化量划分

完全备份:时间长,占用的空间大

增量备份:仅备份从上次完全备份或增量备份之后变化的数据部分;指明周期的方式进行备份

增量备份还原起来很麻烦

差异备份:仅备份最近一次完全备份以来变化的数据

差异备份比增量备份更浪费空间,但是在恢复起来方便

    (3)备份时是否在线:热备份、温备份和冷备份

 热备份:在线备份,读写操作可执行;

 温备份:在线备份,读操作可继续进行,但写操作不允许;

当数据集(库或者表)很大时候,执行一次全局读锁可能会需要很长的时间

 冷备份:离线备份,数据库服务器离线,备份期间不能为业务提供读写服务;

       注意:MyISAM: 支持温备,不支持热备;InnoDB: 支持热备

    (4)物理备份和逻辑备份:

物理备份:直接复制数据文件进行的备份;

逻辑备份:从数据库中“导出”数据另存而进行的备份;可能更占用空间,但时所存储的数据可进行压缩

逻辑备份:与存储引擎无关,备份后的数据文件可以还原成其他的存储引擎

 

  3.备份工具

    (1)mysqldump

          逻辑备份工具,适用于所有存储引擎,温备;完全备份,部分备份;对InnoDB存储引擎支持热备(启动一个大事务,但时会造成资源竞争)

    (2)cp, tar等复制归档工具

           物理备份工具,适用于所有存储引擎;冷备;完全备份,部分备份;

    (3)lvm2快照功能

           可以实现几乎热备;请求全局锁,生成快照,再借助于文件系统工具实现物理备份;

    (4)mysqlhotcopy

          实现几乎冷备;仅适用于MyISAM存储引擎;

 

  4.备份策略

    (1)备份内容

        数据、额外的数据(二进制日志和InnoDB的事务日志)、代码(存储过程和存储函数、触发器、事件调度器等)、服务器配置文件

    (2)设计备份方案

数据集:完全备份+增量备份

备份手段:物理、逻辑

    (3)备份方案之备份工具的选择:

mysqldump+binlog:

mysqldump:完全备份,通过备份二进制日志实现增量备份;

复制binlog中指定时间范围的event:增量备份;

lvm2快照+binlog:几乎热备,物理备份

lvm2快照:使用cphuotar等做物理备份;完全备份;

复制binlog中指定时间范围的event:增量备份;

xtrabackup:

Percona提供的支持对InnoDB做热备(物理备份)的工具;实现完全备份和增量备份;开源

对InnoDB:热备,支持完全备份和增量备份

对MyISAM引擎:温备,只支持完全备份                

    (4)逻辑备份工具

            mysqldump, mydumper(并行逻辑备份), phpMyAdmin(图形界面下接口可以实现逻辑备份)

 

 

 

二、mysqldump备份

  1.概述

    (1)mysqldump客户端命令支持,通过mysql协议远程连接至mysqld;

    (2)默认输出到标准输出,要结合重定向使用;

    (3)适用于数据量较小的时候(GB级别以下)

 

  2.使用格式

       mysqldump [OPTIONS]  [db-name [tb1-name ...]]

-u:指明连接到登录的mysql授权用户

-h:指明登录的mysql地址

-p:指明用户密码,可直接明文追加,也可以为空回车后密文输入

-A, --all-databases:备份所有数据库

-B--databases  db_name,… ...  指明具体需要备份的数据库,备份多个数据库数据库名称用逗号隔开

-B, --databases db_name1 db_name2 ...:备份指定的数据库

-C, --compress:压缩传输;

 -x, --lock-all-tables:锁定所有库的所有表,添加读锁(可读不可写)

 -l, --lock-tables:对于每个单独的数据库,在启动备份之前锁定该库的所有表

--single-transaction:InnoDB实现热备操作时,启动一个大的单一事务实现备份

-E, --events:备份指定库相关的所有事件调度器;

-R, --routines:备份指定库相关的所有存储过程和存储函数;

--triggers:备份表相关的所有触发器

--master-data[=#]:导出的.sql文件中记录下来此时在二进制日志文件中完成事件结束位置

1:记录CHANGE MASTER TO语句;此语句未被注释;

2:记录为注释CHANGE MASTER TO语句,一般使用改选项

--flush-logs, -F:锁定表之后执行刷新日志到硬盘,从而保证日志滚动

 

   实例,命令的语法格式:

       ~]# mysqldump [OPTIONS] database [tables]:备份单个库,或库指定的一个或多个表;不会生成creat database语句

       ~]# mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]:备份一个或多个库

       ~]# mysqldump [OPTIONS] --all-databases 备份所有库

 

  注意:

       1)MyISAM,InnoDB:实现温备操作时;锁定备份库,而后启动备份操作

       2)在对线上业务施加此操作会导致所有事务阻塞,当数据库很大时候会导致数据库一直锁住,所以要注意备份时长

       3)二进制日志文件与数据文件不应该放置于同一磁盘

 

 

 

三、数据恢复

  1.mysql的恢复方法

      ~]# mysql < DB_NAME.sql

  2.从二进制日志做时间点还原

    (1)当崩溃之后,导入之前的最近时间点的所有备份数据

    (2)在这个点之后的数据改变可以通过查看二进制的日志;用mysqlbinlog指明时间戳将其重定向保存在一个.sql文件中,再导入即可

  注意:

        1) 二进制文件记录的实际上就是每一条执行的SQL语句,使用二进制的形式保存下来的日志

        2) 生产中二进制日志文件和数据文件,一般需要分开存放在不同的磁盘,且做冗余。因为一方面两者都十分的重要,二进制日志文件记录的是对表中数据操作的整个过程;另一方面数据的读写和二进制的写操作会造成大量的磁盘IO放在同一目录下会造成整个系统性能的下降

 

 

 

四、备份脚本

增量备份是完全基于bin-log日志来进行的。

全备脚本:

#/bin/bash

Mysql="/usr/local/mysql5.5.32/bin/mysql"

MysqlDump="/usr/local/mysql5.5.32/bin/mysqldump"

User="root"

PassWord="*******"

DataBaseName="test"

WbBackup="/backup/mysql/Wb"

Now=`date +%Y-%m-%d`

mkdir $Backup/$DataBaseName$Now

$Mysql -u$User -p$PassWord -e "FLUSH TABLES;"

$MysqlDump -u$User -p$PassWord --single-transaction --all-databases  --flush-logs >$WbBackup/Wb-$Now.sql

 

增量备份脚本:

#/bin/bash

MysqlAdmin="/usr/local/mysql5.5.32/bin/mysqladmin"

MysqlDump="/usr/local/mysql5.5.32/bin/mysqldump"

ZlBackup="/backup/mysql"

DataBaseName="test"

User="root"

PassWord="*******"

Now=`date +%Y-%m-%d`

$MysqlAdmin -u$User -p$PassWord flush-logs