Mysql必知必会:物理备份与恢复测试

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  1. 事务日志数据(Transaction Log):维持事务一致性和完整性,以及恢复过程中所需要的事务信息。

不论是通过停机冷备份,还是通过 NDB Cluster 自行提供的在线联机备份工具,或者是第三方备份软件来进行备份,都需要备份以上三种物理文件才能构成一个完整有效的备份集。当然,相关的配置文件,尤其是管理节点上面的配置信息,同样也需要备份。

三、各存储引擎常用物理备份方法

由于不同存储引擎所需要备份的物理对象(文件)并不一样,且每个存储引擎对数据文件的一致性要求也不一样所以各个存储引擎在进行物理备份的时候所使用的备份方法也有区别。当然,如果我们是要做冷备份(停掉数据库之后的备份),我们所需要做的事情都很简单,那就是直接 copy 所有数据文件和日志文件到备份集需要存放的位置即可,不管是何种存储引擎都可以这样做。由于冷备份方法简单,实现容易,所以这里就不详细说明了。

在我们的实际应用环境中,是很少有能够让我们可以停机做日常备份的情况的,我们只能在数据库提供服务的情况下来完成数据库备份。这也就是我们俗称的热物理备份了。下面我们就针对各个存储引擎单独说明各自最常用的在线(热)物理备份方法。

①MyISAM 存储引擎

上面我们介绍了 MyISAM 存储引擎文件的物理文件比较集中,而且不支持事务没有 redo 和 undo 日志,对数据一致性的要求也并不是特别的高,所以 MyISAM 存储引擎表的物理备份也比较简单,只要将 MyISAM 的物理文件 copy 出来即可。但是,虽然 MyISAM 存储引擎没有事务支持,对数据文件的一致性要求没有 Innodb 之类的存储引擎那么严格,但是 MyISAM 存储引擎的同一个表的数据文件和索引文件之间是有一致性要求的。当 MyISAM 存储引擎发现某个表的数据文件和索引文件不一致的时候,会标记该表处于不可用状态,并要求你进行修复动作,当然,一般情况下的修复都会比较容易。但是,即使数据库存储引擎本身对数据文件的一致性要求并不是很苛刻,我们的应用也允许数据不一致吗?我想答案肯定是否定的,所以我们自己必须至少保证数据库在备份时候的数据是处于某一个时间点的,这样就要求我们必须做到在备份 MyISAM 数据库的物理文件的时候让 MyISAM 存储引擎停止写操作,仅仅提供读服务,其根本实质就是给数据库表加锁来阻止写操作。

MySQL 自己提供了一个使用程序 mysqlhotcopy,这个程序就是专门用来备份 MyISAM 存储引擎的。不过如果你有除了 MyISAM 之外的其他非事务性存储引擎,也可以通过合适的参数设置,或者微调该备份脚本,也都能通过 mysqlhotcopy 程序来完成相应的备份任务,基本用法如下:

mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]

从上面的基本使用方法我们可以看到,mysqlhotcopy 出了可以备份整个数据库,指定的某个表,还可以通过正则表达式来匹配某些表名来针对性的备份某些表。备份结果就是指定数据库的文件夹下包括所有指定的表的相应物理文件。

mysqlhotcopy 是一个用 perl 编写的使用程序,其主要实现原理实际上就是通过先 LOCK 住表,然后执行 FLUSH TABLES 动作,该正常关闭的表正常关闭,将该 fsync 的数据都 fsync,然后通过执行 OS 级别的复制(cp 等)命令,将需要备份的表或者数据库的所有物理文件都复制到指定的备份集位置。

此外,我们也可以通过登录数据库中手工加锁,然后再通过操作系统的命令来复制相关文件执行热物理备份,且在完成文件 copy 之前,不能退出加锁的 session(因为退出会自动解锁),如下:

root@localhost : test 08:36:35> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

不退出 mysql,在新的终端下做如下备份:

mysql@sky:/data/mysql/mydata$ cp -R test /tmp/backup/test
mysql@sky:/data/mysql/mydata$ ls -l /tmp/backup/
total 4
drwxr-xr-x 2 mysql mysql 4096 2008-10-19 21:57 test
mysql@sky:/data/mysql/mydata$ ls -l /tmp/backup/test
total 39268
-rw-r----- 1 mysql mysql 8658 2008-10-19 21:57 hotcopy_his.frm
-rw-r----- 1 mysql mysql 36 2008-10-19 21:57 hotcopy_his.MYD
-rw-r----- 1 mysql mysql 1024 2008-10-19 21:57 hotcopy_his.MYI
-rw-r----- 1 mysql mysql 8586 2008-10-19 21:57 memo_test.frm
… …
-rw-rw---- 1 mysql mysql 8554 2008-10-19 22:01 test_csv.frm
-rw-rw---- 1 mysql mysql 0 2008-10-19 22:01 test_csv.MYD
-rw-rw---- 1 mysql mysql 1024 2008-10-19 22:01 test_csv.MYI
-rw-r----- 1 mysql mysql 8638 2008-10-19 21:57 test_myisam.frm
-rw-r----- 1 mysql mysql 20999600 2008-10-19 21:57 test_myisam.MYD
-rw-r----- 1 mysql mysql 10792960 2008-10-19 21:57 test_myisam.MYI
-rw-r----- 1 mysql mysql 8638 2008-10-19 21:57 test_outfile.frm
-rw-r----- 1 mysql mysql 2400 2008-10-19 21:57 test_outfile.MYD
-rw-r----- 1 mysql mysql 1024 2008-10-19 21:57 test_outfile.MYI
… …

然后再在之前的执行锁定命令的 session 中解锁

root@localhost : test 10:00:57> unlock tables;
Query OK, 0 rows affected (0.00 sec)

这样就完成了一次物理备份,而且大家也从文件列表中看到了,备份中还有 CSV 存储引擎的表。

②Innodb 存储引擎

Innodb 存储引擎由于是事务性存储引擎,有 redo 日志和相关的 undo 信息,而且对数据的一致性和完整性的要求也比 MyISAM 要严格很多,所以 Innodb 的在线(热)物理备份要 比 MyISAM 复杂很多,一般很难简单的通过几个手工命令来完成,大都是通过专门的 Innodb 在线物理备份软件来完成。

Innodb 存储引擎的开发者(Innobase 公司)开发了一款名为 ibbackup 的商业备份软件 ,专门实现 Innodb 存储引擎数据的在线物理备份功能。该软件可以在 MySQL 在线运行的状态下,对数据库中使用 Innodb 存储引擎的表进行备份,不过仅限于使用 Innodb 存储引擎的表。

由于这款软件并不是开源免费的产品,我个人也很少使用,主要也是下载的试用版试用而已,所以这里就不详细介绍了,各位读者朋友可以通过 Innobase 公司官方网站获取详细的使用手册进行试用

③NDB Cluster 存储引擎

NDB Cluster 存储引擎也是一款事务性存储引擎,和 Innodb 一样也有 redo 日志。NDB Cluter 存储引擎自己提供了备份功能,可以通过相关的命令实现。当然,停机冷备的方法也是有效的。

在线联机备份步骤如下:

  1. 连接上管理服务器;
  2. 在管理节点上面执行 “START BACKUP” 命令;
  3. 在管理节点上发出备份指令之后,管理节点会通知所有数据节点开始进行备份,并反馈通知结果。
  4. 管理节点在通知发出备份指令之前会生成一个备份号来唯一定位这次备份所产生的备份集。当各数据节点收到备份指令之后,就会开始进行备份操作。
  5. 当所有数据节点都完成备份之后,管理节点才会反馈“备份完成”的信息给客户端 。

由于 NDB Cluster 的备份,备份指令是从管理节点发起,且并不会等待备份完成就会返回,所以也没办法直接通过 “Ctrl + c” 或者其他方式来中断备份进程,所以 NDB Cluster 提供了相应的命令来中断当前正在进行的备份操作,如下:

  1. 登录管理节点
  2. 执行 “ABORT BACKUP backup_id”,命令中的 backup_id 即之前发起备份命令的时候所产生的备份号。
  3. 管理结带你上会用消息“放弃指示的备份 backup_id”确认放弃请求,注意,则时候其实并没有收到数据节点对请求的实际回应。
  4. 然后管理节点才会将中断备份的指令发送到所有数据节点上面,然后当各个数据节点都中断备份并删除了当前产生的备份文件之后,才会返回“备份 backup_id 因***而放弃”。至此,中断备份操作完成。

通过 NDB Cluster 存储引擎自己的备份命令来进行备份之后,会将前面所提到的三种文件存放在参与备份的节点上面,且被存放在三个不同的文件中,类似如下:

  • BACKUP-backup_id.node_id.ctl,内容包含相关的控制信息和元数据的控制文件。每个节点均会将相同的表定义(对于 Cluster 中的所有表)保存在自己的该文件中。

  • BACKUP-backup_id-n.node_id.data,数据备份文件,被分成多个不同的片段来保存,在备份过程中,不同的节点将保存不同的备份数据所产生的片段,每个节点保存的文件都会有信息指明数据所属表的部分,且在备份片段文件最后还包含了最后的校验信息,以确保备份能够正确恢复。

  • BACKUP-backup_id.node_id.log,事务日志备份文件中仅包含已提交事务的相关信息,且仅保存已在备份中保存的表上的事务,各个阶段所保存的日志信息也不一样,因为仅仅针对各节点所包含的数据记录相关的日志信息。

上面的备份文件命名规则中,backup_id 是指备份号,不同的备份集会针对有一个不同的备份号,node_id 则是指明该备份文件属于哪个数据节点,而在数据文件的备份文件中 的 n 则是指明片段号。

各存储引擎常用物理备份恢复方法

和之前逻辑备份一样,光有备份是没有意义的,还需要能够将备份有效的恢复才行。物理备份和逻辑备份相比最大的优势就是恢复速度快,因为主要是物理文件的拷贝,将备份文件拷贝到需要恢复的位置,然后进行简单的才做即可。

①MyISAM 存储引擎

MyISAM 存储引擎由于其特性,物理备份的恢复也比较简单。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

cs/618631832)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值