一、备份恢复概述
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