徐老师写的这篇文章《MySQL的备份》给我们介绍了MySQL数据库中备份的一些基础知识,值得了解学习。
数据库备份是DBA的典型任务,可以将数据从一个系统传输到另外一个系统,也可以基于生产系统的特定状态创建一个开发服务器。除此之外,备份还用于数据库恢复,可以将一个发生故障的系统恢复,也可以将系统恢复到发送用户错误之前的特定状态。利用备份的系统可以将其与生产系统分离,在不影响生产系统的性能的前提下,对数据进行审计和分析。
备份的类型
备份的类型影响应用程序与数据库的交互,主要的备份类型包括如下,
-
热备份:允许应用程序完整访问数据。
-
备份可以在数据读取和修改期间进行,系统保留读取和修改数据的能力。在备份期间采用多版本并行控制(MVCC),会使用行锁。
-
冷备份:不允许应用程序访问数据。
-
备份时数据无法被用户访问,通常情况下,服务器需要进入拒绝访问模式或关机。用户在备份期间无法读取和修改任何数据。
-
温备份:允许应用程序进行只读操作,不允许更改数据。
-
备份时允许用户读取数据,无需完全封闭用户,但缺点是备份期间无法修改数据、可能会导致性能问题。
备份方法
备份可以采取不同的方法与技术进行,方法包括如下,
-
逻辑备份:通过文本再现,SQL语句或数据文件使用逗号或制表符分隔的文件、XML文件等。备份的结果中包含SQL语句或用于重构数据库的数据。
-
物理备份:MySQL数据库文件的二进制副本。
-
基于快照(物理备份)
-
基于复制(物理或逻辑备份)
-
增量备份:通过创建和刷新MySQL二进制日志实现
逻辑备份
MySQL的逻辑备份可以通过SQL语句、“mysqldump”,或“mysqlpump”将数据进行转储来实现。数据转储基于一个指定的时间点。逻辑备份的优势在于创建一个SQL脚本,用户可以在MySQL服务器上执行,并可以利用该脚本在不同架构的主机或服务器上重新加载数据。逻辑备份可以备份全部的数据库或其中的一个/部分数据库或表,并且可以备份本地和远程的服务器。其缺点是备份速度慢,默认的情况下需要对表加锁(非innoDB表),以防止用户在备份期间更改数据。此外,备份语句使用的磁盘空间可能会超过实际数据使用的磁盘空间,因为通常情况下,文本数据要比二进制数据消耗更多的磁盘空间,但对于InnoDB而言,由于其在数据页中保存数据,会包含一部分未使用的空间,它所占用的磁盘空间会超过实际数据大小。
逻辑备份的要求
通常情况下逻辑备份属于温备份,使用时有如下要求,
-
创建备份时,要求MySQL服务器必须运行。
-
备份期间应用程序可以执行只读操作。
-
服务器通过读取正在备份的表的结构和内容来创建文件,然后将结构和数据转换为SQL语句或文本文件。
-
利用InnoDB 的MVCC可以实现热备份,使用“REPEATABLE READ”隔离级别实现一致的时间点备份。
逻辑备份的性能
通常情况下,逻辑备份的速度远慢于物理备份,MySQL服务器必须读取表并解释表的内容,之后将其转换为磁盘文件或者发送到一个客户端程序。逻辑备份的恢复慢于物理备份的恢复,原因在于恢复过程中执行的脚本包含独立的创建和插入语句,这些语句在后台创建表,并插入数据。
物理备份
物理备份主要是指复制数据文件。用户可以使用标准的“tar”,“cp”等命令操作,也可以通过物理镜像、块操作,及快照文件等实现。数据恢复时,必须恢复到相同的MySQL版本和存储引擎。物理备份可以跨服务器架构进行恢复,但要求MySQL的存储引擎层文件必须是二进制格式并能够在不同服务器上使用。
物理备份的优势在于执行备份和恢复时远超逻辑备份的速度,其快速的原因是其作为一个文件或文件系统进行复制,这些副本以MySQL本身在磁盘上存储数据库的完全相同的格式保存数据库,备份文件的大小与数据文件的实际大小相同。
物理备份期间,服务器不能修改文件。InnoDB要求服务器关机,MyISAM要求只读。用户可以使用快照、MySQL复制,DRDB等方法在后台分开数据文件,以降低备份对MySQL和应用程序的影响。
在线磁盘复制
用户可以使用RAID镜像,DRDB等技术进行在线磁盘复制。这些技术提供在线或者接近在线的备份能力,可以在硬件发生故障时快速恢复数据,其缺点是因为它具有实时复制的能力,无法利用该技术处理人为或应用程序导致的数据丢失。
基于快照的备份
基于快照的备份等同于创建了一个具有时间点的数据副本,提供了一个逻辑上冻结的文件系统版本。快照无需包含具有一致性的数据库镜像,当利用快照进行恢复时,InnoDB必须执行它自身的恢复过程,以确保完整的事务。
基于快照的备份使用MySQL外部的快照功能,例如,数据文件在Linux的LVM2 逻辑卷,包含一个ext4的文件系统,用户可以创建一个基于快照的备份。基于快照的备份系统适用于支持事务的存储引擎,使用“Copy-on-write”方法来确保它们几乎是瞬时完成的。“Copy-on-write”方法类似于InnoDB的UNDO日志和MVCC,当执行快照时,LVM标记随后更改的所有块,并记录这些块的快照版本。
基于MySQL复制的备份
MySQL支持单向的异步复制,在复制的拓扑中一台服务器作为主服务器,其余的服务器作为从服务器。备份时,主服务器作为生产环境的服务器使用,从服务器用于备份,该方法的优势是可以最大限度减小对生产环境的影响,缺点则是主从之间可能存在延迟、需要额外的服务器存放数据库的副本。
二进制日志备份
二进制日志备份记录了数据的变更,用于在上次完整备份后恢复到最新数据时使用。其优势是记录了完整的数据更改,用户可以安顺序保存应用多个二进制日志备份。其缺点是用户必须按照顺序从上一次的完整备份结束之后保存日志,恢复时间可能会很长。用户可以使用“mysqlbinlog”创建日志流,例如,
mysqlbinlog --read-from-remote-server --host=server_host --raw --stop-never binlog.000101
用户可以在MySQL的会话级别控制二进制日志的开启,例如:
SET SQL_LOG_BIN = 1
进行逻辑或物理备份时,需要刷新二进制日志进行同步,以用于备份。当需要进行增量备份时,需要复制增量部分的二进制日志。此外,二进制日志也适用于时间点恢复,用户可以识别出错的事务,并跳过该事务进行恢复。
备份策略
备份方法对比
备份和恢复的策略取决于数据记录的完整性和备份频率的要求,以及能够承受的系统宕机时长和恢复数据量的要求。
用户可以根据实际的要求选择不同的备份策略,如果有更高的要求,还可以组合不同的备份方法,实现更为复杂的备份策略。
如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,
近期更新的文章:《SELECT查询选择全表扫描不用索引的场景》《如何设计高可用高吞吐可拓展的系统架构?》《沧州客场之旅》《数据备份策略》《MySQL的索引介绍》《How to design a good API?》
近期的热文:《推荐一篇Oracle RAC Cache Fusion的经典论文》
《"红警"游戏开源代码带给我们的震撼》
文章分类和索引:《公众号1400篇文章分类和索引》