Mysql备份与恢复(1)---物理备份

2019-10-16 11:23:19 浏览数 (1)

数据库对企业来说最重要的莫过于其中的数据,所以做好数据库的备份是一个不可或缺的工作。数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小。所以,本篇文章主要数据库数据备份与恢复进行介绍。由于MyISAM存储引擎中备份数据是将表保存到单独的文件所以比较简单,所以这里我主要针对InnoDB存储引擎介绍备份与恢复机制。

全量备份与增量备份的区别

  • 全量备份:每次备份都进行全量备份,所以如果数据量大的情况下,进行全量备份会消耗较多的时间且对数据库压力比较大,但是由于全量备份每次都是最新的备份,所以恢复数据的时候效率更快。
  • 增量备份:只备份每天增量的日志,所以备份时效率更高对数据库压力也较小,但是恢复回复数据时就需要从全量备份日志加上每天的增量日志去进行恢复数据,所以恢复数据效率比较低。

Mysql数据备份大致分为2类:物理备份与逻辑备份。本篇文章我们先看看物理备份。

物理备份

物理备份分为热备份和冷备份。

冷备份

冷备份是最简单的备份方式,其实就是在备份数据时停掉Mysql服务,然后将data目录下的数据文件拷贝到备份地址进行存储。当Mysql出现宕机时,将备份文件拷贝到data目录替换即可完成数据恢复。但是一般情况下不使用冷备份的方式,因为生产环境下一般都有业务在跑,所以不可能每次备份都停止Mysql服务去进行备份工作。

热备份

快照备份

物理备份一般还有一种方式就是热备份,热备份相比于冷备份的好处在哪呢?热备份可以在Mysql服务开启的情况下执行备份操作,只是在热备份时会添加只读这类型的限制。热备份第一种介绍的备份方式就是快照备份。快照备份其实就是将所有的数据文件放置在同一个分区,然后对这个分区进行快照备份,但是快照备份只能存储在本地磁盘,如果本地磁盘出现故障,则可能出现快照备份数据的丢失。正是由于可能存在磁盘损坏导致数据丢失的情况下,所以生产环境下一般也不会使用热备份去备份数据。

xtrabackup备份

热备份另一种方式就是xtrabackup工具备份。xtrabackup工具2.3版本以下无法备份MyISAM存储引擎,它可以备份5.15.7之间版本的InnoDB存储引擎的数据。xtrabackup工具是基于InnoDB存储引擎的crash-recovery功能,先复制物理文件,再根据log进行恢复,保证数据一致性。接下来我们可以一起看看xtrabackup工具如何进行备份工作。

1. 使用wget下载xtrabackup工具并使用yum命令安装:

2. 使用xtrabackup备份,命令为:

代码语言:javascript复制
xtrabackup --backup --user=root --password='123'  --target-dir=/backups/

3.可以看到,全量备份完成会显示当前备份的lsn号,下次进行增量备份就只会备份lsn大于此页的数据。我们可以查看下我们刚才全量备份的数据:

可以发现目录刚好和我们的数据库一一对应,每个文件夹中实际上就是对应数据库的备份数据。我们可以注意到根目录下还有几个文件,接下来我们来看下这几个文件的具体用途:

  • ibdata1:共享表空间文件,创建数据库时如果开启innodb_file_per_table参数,才可以使用xtrabackup工具备份单个数据库,否则默认都是全部数据库都进行备份。
  • backup-my.cnf:此文件存储一些my.cnf的有关于备份的配置信息。
  • xtrabackup_binlog_info:这个文件是用来记录备份开始时二进制文件的位置。
  • xtrabackup_checkpoints:这个文件记录备份的一些基本信息:比如备份开始和结束的lsn号,是全量备份还是增量备份等信息。
  • xtrabackup_info:这个文件记录备份的概要信息。
  • xtrabackup_logfile:备份的日志。

4. 将经过backup的数据进行prepare得到完整可用的数据,使用命令:

代码语言:javascript复制
xtrabackup --prepare --use-memory=100M --target-dir=/backups

这里对命令几个参数做下解释:

  • --use-memory:该参数不带则默认prepare操作占用100M内存,如果数据量大我们可以将use-memory指定更大的内存加快prepare工作。
  • --target-dir:备份文件所在路径,我是放在/backups/

5. 恢复数据,恢复数据必须保证mysqldata目录不能存在任何数据,否则会报错。恢复数据实际上就是将备份数据拷贝到Mysqldata目录下,恢复数据使用--copy-back参数。使用命令:

代码语言:javascript复制
xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/

这里对命令几个参数做下解释:

  • --datadir--datadir有两个方法进行配置:可以在my.cnf文件中指定,如果my.cnf文件没有指定该参数则恢复文件时必须指定--datadir参数。
  • --target-dir:备份文件所在路径,我是放在/backups/

接下来演示下如何进行数据恢复:

停止数据库服务并且清掉data目录下所有数据:

代码语言:javascript复制
systemctl stop mysqld.service && rm -rf /var/lib/mysql/*

恢复数据:

代码语言:javascript复制
xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/

最后,重启数据库:

代码语言:javascript复制
systemctl start mysqld.service

到这里备份数据就成功进行恢复到数据库中了。当然更常用的备份方式其实是逻辑备份,使用Mysql自带mysqldump工具进行备份操作,关于逻辑备份的知识将在下一篇进行讲解。

0 人点赞