理解Mysql备份与恢复

mysql作为关系型数据库在Web开发或其它领域都有着非常重要的作用,掌握SQL语句是基本使用mysql的提前,理解mysql执行计划和掌握索引优化以及缓存的调优是高效使用mysql的核心,而熟练掌握mysql备份和恢复是安全、防灾使用mysql的关键。

本文主要讲解基于Mysql InnoDB的备份和恢复概念。

 

备份价值

备份有什么意义,一种更好的方式是反过来思考,如果不为mysql做备份会有什么问题。下面列出就个人能想到的:

1、mysql所在服务器硬件发生故障,导致数据损坏

2、mysql所在服务器的机房发生自然灾害(所以最好要考虑备份到其它机房)

3、误操作

4、被不法分子攻击,加密数据以邮件方式向你发起解密勒索

 

不用列太多,如果发生以上任何一条在没有备份的情况下都是千金难买,悔不当初的氛围。

备份方式

mysql的备份方式从不同的角度有不同的定义,从备份性质方面区分为物理备份和逻辑备份,从备份粒度方面区分为全量备份、增量备份、差异备份,从备份影响可用性方面区分为冷备份、温备份、热备份。下面分别对这些名词进行简单解释。

物理备份

物理备份一般是指直接复制mysql的数据文件(大到整个工作目录小到某个二进制文件),可用工具有

cp,tar: 直接复制文件,压缩后发送到备份目的地

LVM快照:先加锁,做快照后解锁,几乎热备;借助文件系统工具进行备份

XtrabackupPercona提供支持对InnoDB做热备(物理备份)的工具,支持全备份、增量备份

物理备份优点:

1、备份和恢复操作比较简单

2、备份和恢复速度快

物理备份缺点:

1、相对于逻辑备份,物理备份通常更大,需要更多磁盘空间

2、由于是复制文件的方式,所以对跨平台支持不友好

3、复制出来的备份在恢复后不一定100%可用,制定方案时可以结合逻辑备份

逻辑备份

逻辑备份一般是指通过导出的方式进行备份,一般可以通过mysqldumpmysqlbinlogmysqldumperselect into outfile 进行实现。逻辑备份不能在冷备停机情况下实现,因为需要mysql服务器解析导出语句。在温备情况下一般需要先给表或数据库施加全局读锁(MDL)来保证一致性,热备则需要结合binlog增量备份来实现。

逻辑备份优点:

1、逻辑备份由于导出的一般是SQL语句或符号分隔文本,可以很方便查看和操作

2、通过一条命令即可恢复,例如sourcemysql

3、可以通过网络远程备份和恢复

4、可以确保备份时磁盘驱动器是OK的,否则会报错,这样能够保证备份时磁盘没有损坏也是OK

5、逻辑备份的典型代表是mysqldump,通过这个命令导出一般可以支持不同存储引擎,对跨平台支持比较好

 

逻辑备份缺点:

1、生成备份或恢复时,如果数据量大,会很慢,几小时或几天都有可能。尤其在恢复时候,需要加载和解释语句,重建索引

2、逻辑备份需要mysql服务在线,所以只支持温备、热备

3、生成备份或恢复时,耗数据库CPU,对数据库性能有一定的影响

4、能够顺利导出,但不一定能够顺利导入(没有完整保存浮点精度)

5、备份的结果为ASCII文件所以可能某些部分比原数据文件要大。类如整型InnoDB保存4个字节,但ASCII文件可能需要12个字符。

6、一般需要对数据库或表施加读锁,只能读不能写。mysqldump速度慢会加重写业务的影响范围。

全量备份

顾名思义,全量备份就是把整个数据库或整个mysql工作目录copy一份。

增量备份

备份自从上次任意类型的备份后所有修改的数据

差异备份

备份自从上次全量备份后所有改变的数据

冷备

冷备就是关闭Mysql服务进行任意类型的备份

温备

温备是指在备份期间不停机,通过给数据库或表施加全局读锁来实现,温备期间mysql服务可读不可写。温备一般需要对数据库施加读锁来获取一致性。对于innodb存储引擎而言,在使用mysqldump获取一致性备份时,我们经常会使用两个参数,--single-transaction--master-data,前者保证innodb表的数据一致性,后者保证获取与数据备份匹配的一致性位点,主要用于搭建复制。对于myisam,就需要通过--lock-all-tables参数和--master-data来达到同样的目的

热备

热备是指在备份期间数据库服务可读写。通常使用文件系统快照(LVM/SAN)方式或Percona XtraBackup开源工具来实现热备。

备份对象

1、数据

2、数据库和表结构

3、代码:存储过程、存储函数、触发器

4、中继日志(如果备份备库)

5、InnoDB事务日志

6、服务器配置文件

7、二进制日志

备份思想

1、备库不能当备份用,至少不能实现回退误操作,但使用备库进行备份确实有意义的

2、生产环境物理备份是必须的,建议使用开源Percona XtraBackupLVM的文件快照方式

3、为了防止物理备份文件损坏的可能,定时一次逻辑备份也是需要的,建议基于二进制增量逻辑备份的方式

4、LVM快照不能当备份,快照方式只是减少持有锁的时间,它是在创建点之后的写时复制,并没有真实存储创建点之前的数据

5、考虑简便性,尽量做全备不做增备,不管如何,一周一次全备是必须的,但是,不做增备时,就要考虑几天一次全备而不是一周

6、定期对备份进行恢复测试,保证备份是可用的,知道恢复需要的时间

7、开启二进制日志是备份必要的前提工作

8、不要忘记备份对象不止数据和结构,还有代码(存储过程)和配置文件

9、尽可能不同地方、机架保存多份备份集

10、根据可容忍丢失数据的程度制定备份频率,一般来说,能承受的数据丢失越多,备份越简单,容忍度越低,增量备份二进制日志作用越大,因为二进制很方便频繁备份。

11、关闭Mysql服务做备份时最简单和安全的,但一般生产环境避免用这种方式

12、当数据量不大时使用mysqldump定时逻辑备份完全可以胜任,但要考虑数据量增长速度,以及恢复速度。数据量很大时,mysqldump会慢到不可接受

13、mysqldumper工具是mysqldump多线程升级版,不过安全和一致性不一定比mysqldump

14、考虑针对恢复时间点进行恢复的需求,一般需要对二进制进行物理备份,通过mysqlbinloggrep等命令从备份中找到还原位置,建议对二进制日志文件至少一天一次备份。

15、制定生产备份方案时尽量选择热备和几乎热备的方式,温备需要施加全局读锁,冷备通常不推荐

16、如果使用mysqldump进行InnoDB表逻辑备份(温、热备)时,必须加上--single-transaction --flush-logs --master-data=2 这单个选项

17、基于二进制日志进行备份,最好备份前执行flush logs命令,这样会在锁住后备份前创建新的日志文件,这样每次备份都是单个文件,不用从某个日志文件中间开始备份

18、差异备份只适合变化少的场景

19、网上看到很多文章认为执行完flush logs命名滚动下二进制日志文件就算增量备份好了,请注意,此时还差一次移动文件到其它服务器或机房的操作

20、根据制定好的备份方案合理规划备份目录层级和结构、备份命名

21、如果一个mysql实例包含多个数据库,最好全量备份一次整个mysql工作目录,定时备份对应数据库目录

22、二进制日志和其它mysql日志跟数据目录不在同一个目录下,则每次需要从不同目录备份数据,建议可以考虑将各自日志文件放到数据目录下,方便备份

23、不能通过rm命令手动删除任何二进制文件

 

恢复思想

除了需要细心制定好备份方案外,一定不要忘记根据制定好的备份设计响应的恢复方案,并且把恢复方案流程文档化。定时按文档演练恢复以验证备份的可用性和恢复的可行性。

需要恢复的场景:

1、恢复整个备份

2、恢复到某个时间点

3、还原某个操作

 

恢复整个备份:

1、停止Mysql服务,物理恢复一般停机,逻辑恢复一般关闭对外服务但不停机,一般可以通过配置skip-networking实现,后面我们会发现不管如何,在完全恢复成功前都要配置skip-networking来禁止外部访问

2、先备份损坏的数据目录到其它地方,然后删除损坏目录,最后复制最新的物理全备到损坏的数据目录

3、检查修改恢复的数据目录权限,一般以root复制过去需要chown mysql:mysql xxxx,假定使用的是mysql用户

4、修改配置文件,使数据库不让外部访问(配置skip-networking),然后启动mysql服务

5、观察mysql错误日志,如果成功启动,再执行show table status命令再次检测

6、载入逻辑全量备份(非必须,如果观察物理恢复后数据没问题可以不执行这步)

7、检查和重放二进制日志(增量备份的二进制日志)

8、检查恢复的数据是否完好

9、还原配置访问权限,重启mysql服务

 

恢复到某个时间点:

1、停止Mysql服务

2、从物理备份的二进制文件找到时间点(通过时间和执行语句很容易可以找到)

3、通过mysqlbinlog命令配合下面选项执行基于时间点恢复

--start-position        从哪个位置开始做增量备份

--stop-position        增量备份到哪个位置结束

--start-datetime=    从哪个时间点开始做增量备份

-stop-datetime=     增量备份到哪个时间点结束

4、修改配置文件,使数据库不让外部访问(配置skip-networking),然后启动mysql服务

5、观察mysql错误日志,如果成功启动,再执行show table status命令再次检测

6、检查恢复的数据是否完好

7、还原配置访问权限,重启mysql服务

还原某个操作:

还原某个操作可以完全参考上面恢复到某个时间点的流程

你可能感兴趣的:(理解Mysql备份与恢复)