【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)(一)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)

MySQL数据库备份

MySQL的数据库备份主要分为两种:全量备份和增量备份。全量备份是指对整个数据库进行完全备份,包括所有的数据和对象。这种备份方法适用于数据库规模较小或者对备份恢复速度要求较高的情况。



而增量备份是指在全量备份的基础上,只备份发生了变化的数据和对象。这种备份方法可以大大减少备份的时间和存储空间,适用于数据库规模较大或者对备份频率要求较高的情况。增量备份可以通过记录修改日志或者使用数据库的存储引擎来实现。

无论是全量备份还是增量备份,都可以提供可靠的数据保护,并在系统故障或数据损坏时进行快速恢复。因此,在进行数据库备份时,需要根据实际情况选择适合的备份策略,并确保备份文件的安全存储和定期测试恢复的可行性。

全量备份

全量备份是对数据库进行完全备份的过程,包括所有表、记录和对象。在MySQL中,可以使用不同的命令进行全量备份。

以使用InnoDB引擎的数据库为例,备份所有库中的全部数据的命令如下:

sql

复制代码

mysqldump -B --master-data=2 --single-transaction -A | gzip > /opt/backup.sql.gz

备份一个名为dadong的库中的所有数据的命令如下:

sql

复制代码

mysqldump -B --master-data=2 --single-transaction dadong | gzip > /opt/backup.sql.gz

在执行备份命令时,常用的选项包括--master-data=2和--single-transaction。--master-data=2会在备份文件中添加主从复制所需的信息,以便在恢复时进行主从同步。--single-transaction使用事务来确保备份数据的一致性。

为了提高备份效率和减少备份文件的大小,可以对备份文件进行压缩,如使用gzip命令将备份文件压缩至/opt/all.sql.gz。

全量备份是一种重要的数据保护手段,但也需要注意备份文件的安全存储和定期测试恢复的可行性,以确保在系统故障或数据损坏的情况下能够快速恢复数据。

全量备份应用场景



  1. 数据库迁移或升级:使用全量备份可以将原数据库的完整数据备份到目标服务器,确保数据的完整性和一致性。
  2. 增加从库:通过全量备份将主库的数据备份到从库,建立数据一致性和冗余备份,提高数据库的可用性和容错性。
  3. 数据库数据破坏时:如果执行DDL或DML语句破坏了数据完整性,主从库无法正常工作。可以使用全量备份将数据库还原到执行DDL或DML语句之前的状态,恢复数据完整性。
  4. 跨机房灾备:当数据库所在的机房遭受灾难或故障时,为了保证数据的安全和可用性,可使用全量备份将数据库的完整数据复制到具备异地容灾条件的机房,实现跨机房的数据备份和灾难恢复。
  5. 硬件故障或删除物理文件导致的数据故障处理:在这种情况下,可以关闭主库,配置从库的VIP等相关设置,然后启动从库提供服务,无需使用备份数据进行恢复。

增量备份

增量数据:指在上一次全量备份数据之后到下一次全备份之间的数据库更新数据。在使用mysqldump命令进行全量备份时,增量数据就是MySQL的二进制日志(binlog)。

在进行全量备份后,如果数据库发生了更新操作,比如插入、更新或删除记录,这些操作将被记录在binlog中。二进制日志包含了对数据库的逐个修改操作,通过解析二进制日志,可以提取出这些增量数据。这些增量数据可以用来恢复数据库到最新的状态,或者用于在备份之间复制数据以保持数据的一致性。

简而言之,增量数据就是在全量备份之后进行的数据更新操作所产生的数据库变化记录,通过解析和应用这些记录,可以实现数据库的增量恢复和数据同步。

binlog

binlog是二进制日志的简称,是MySQL数据库引擎用于记录数据库更新操作的一种日志文件格式。binlog文件记录了用户对数据库进行的更新操作,例如插入、修改、删除表记录等SQL语句信息,但不记录对数据库的查询操作。

binlog以二进制格式存储,不能通过查看文本工具(如cat、vi等)直接查看,需要使用mysqlbinlog工具进行解析和查看。

简而言之,binlog是MySQL数据库引擎用于记录用户对数据库进行的更新操作的二进制日志文件,它能够记录数据变化的SQL语句信息,但不包括查询语句。要查看binlog内容,需要使用专门的工具mysqlbinlog进行解析。

binlog主要作用

binlog的作用主要是用于数据库的主从复制和数据的增量恢复,它记录了数据库的新增、删除和修改操作,可以实现数据的备份、负载均衡和故障恢复等功能。

binlog的作用主要有两个方面



  • 主从复制:在数据库主从复制中,主数据库将生成的binlog文件传输给从数据库,从数据库通过解析和应用binlog文件中记录的SQL语句,保持与主数据库的数据一致性。这样可以实现数据的备份、负载均衡和故障恢复等功能。
  • 数据恢复:当数据库发生故障时,可以使用binlog日志进行数据的增量恢复。通过解析binlog文件中的SQL语句,可以重新执行这些操作,将数据恢复到故障发生之前的状态,保证数据的完整性。

开启binlog日志功能

MySQL的配置文件my.cnf中,可以通过增加log_bin参数来开启binlog日志,并可以通过赋值来指定binlog日志的文件名。

要开启MySQL的binlog日志步骤
  1. 打开MySQL的配置文件my.cnf(路径通常为/etc/my.cnf或/etc/mysql/my.cnf)。
  2. 在文件中找到或添加以下行:

shell

复制代码

log_bin = /path/to/binlog/file

/path/to/binlog/file替换为你希望保存binlog日志的文件路径和名称。确保所指定的路径存在,并具有适当的权限。

  1. 保存并关闭my.cnf文件。
  2. 重启MySQL服务器,使配置生效。可以使用以下命令重启MySQL服务:

复制代码

sudo service mysql restart

5.  确认binlog日志已成功开启。可以使用以下命令登录到MySQL控制台:

css

复制代码

mysql -u <username> -p

注意要替换为你的MySQL用户名。

  1. 在MySQL控制台中,运行以下命令查看binlog配置信息:

sql

复制代码

SHOW VARIABLES LIKE 'log_bin';

如果输出结果中的Value字段显示为ON,则表示binlog日志已成功开启。

mysqlbinlog

mysqlbinlog是MySQL数据库中的一个命令行工具,用于解析和展示binlog文件中的日志事件。

使用mysqlbinlog可以完成以下任务:

  1. 查看binlog内容:可以通过mysqlbinlog命令直接读取和展示binlog文件中的日志事件,包括数据库的更改操作。
  2. 数据恢复:可以使用mysqlbinlog将binlog文件中的日志事件应用到数据库中,从而实现数据的恢复和还原。
  3. 数据审计和分析:可以通过解析binlog文件并将其输出为可读的文本格式,用于数据审计、故障排查和性能分析等。
  4. 数据同步和复制:可以使用mysqlbinlog将binlog文件中的日志事件传输到另一个MySQL实例,实现数据库之间的数据同步和复制。

mysqlbinlog提供了丰富的参数选项,使其可以适应各种场景和需求。例如,可以指定要解析的binlog文件、指定输出格式、指定时间范围等。

参数 说明
-d, --database=name 根据指定库拆分binlog(拆分单表binlog可通过SQL关键字过滤)
-r, --result-file=name 指定解析binlog输出SQL语句的文件
-R, --read-from-remote-server 从mysql服务器读取binlog日志,是下面参数的别名
-j, --start-position=# 读取binlog的起始位置点,#号是具体的位置点
--stop-position=# 读取binlog的停止位置点,#号是具体的位置点
--start-datetime=name 读取binlog的起始位置点,name是具体的时间,格式为:2004-12-25 11:25:26
--stop-datetime=name 读取binlog的停止位置点,name是具体的时间,格式为:2004-12-25 11:25:26
--base64-output=decode-rows 解析row级别binlog日志的方法,例如:mysqlbinlog --base64-output=decode-rows -v mysqlbin.000016

mysqlbinlog的使用案例

bash

复制代码

mysqlbinlog -d rdbTest rdbTest-bin.000001 rdbTest-bin.000002 -r bin.log

这个例子展示了如何利用mysqlbinlog命令将binlog文件解析到bin.log文件中。

mysqlbinlog命令可以通过使用

-d:来指定要解析的数据库,例如指定解析dadong数据库。

-r:用于将解析后的binlog输出成SQL语句,并指定生成的文件名为bin.log。

使用mysqlbinlog的-d参数可以实现按数据库导出binlog的功能。需要注意的是,如果使用了-d参数,更新数据时必须在SQL语句中包含use库名的语句,这样才能正确分出指定数据库的binlog。

例如,插入数据的语句应采用以下格式:

bash

复制代码

use rdbTest;
insert into test values(1, 'e');

全量备份与增量备份结合

下面以mysqldump命令和binlog日志增量数据为例,讲解企业中按天全备和按周全备的方法。



按天全备与增量备份

周一00点全量备份 周二00点全量备份 周三00点全量备份
文件 01.sql.gz 02.sql.gz 03.sql.gz
增量数据 周一增量数据 周二增量数据 周三增量数据
binlog oldboy-bin.000024 oldboy-bin.000037 oldboy-bin.000045
oldboy-bin.000025 oldboy-bin.000038 oldboy-bin.000046
oldboy-bin.000026 oldboy-bin.000039 oldboy-bin.000047
oldboy-bin.index oldboy-bin.index oldboy-bin.index

对于按天全备,可以使用mysqldump命令来导出整个数据库的备份。下面是一个示例命令:

bash

复制代码

mysqldump -u username -p password --all-databases > backup.sql

这个命令会导出所有数据库的备份,并保存到backup.sql文件中。你需要将usernamepassword替换为实际的MySQL数据库的用户名和密码。

对于按周全备,可以使用mysqldump命令结合binlog日志的增量备份。首先,执行全备份命令:

bash

复制代码

mysqldump -u username -p password --all-databases > backup.sql

然后,使用mysqlbinlog命令将binlog日志解析出增量数据,追加到全备份文件中:

bash

复制代码

mysqlbinlog binlog-file | mysql -u username -p password

这个命令会将binlog日志文件解析为SQL语句,并通过管道传递给mysql命令执行。你需要将binlog-file替换为实际的binlog日志文件路径。

通过以上方法,可以实现按天全备和按周全备的数据库备份。这样可以确保数据备份的完整性和及时性,以应对潜在的数据丢失和灾难恢复情况。

按天全备的特点

优点:
  • 恢复数据时所需的数据文件数量较少,因此恢复时间较短。
  • 维护成本较低,不需要频繁处理差异数据。
缺点:
  • 每天进行全备份,占用大量存储空间。
  • 备份过程会消耗系统资源,可能会对用户体验造成影响。

对于中小型企业而言,按天全备是最常用的备份策略。根据存储空间的情况,可以保留一定数量的全量备份,例如仅保留最近7天的备份数据。对于重要的企业数据,还可以考虑使用磁带机等设备将备份数据存档至一年以上。

针对binlog增量数据的清理,可以在my.cnf配置文件中通过设置"过期清理天数"相关参数(例如expire_logs_days=7)来实现。这样可以保留最近7天的binlog日志。理论上,如果每天进行全备份,那么只需保留一天的binlog日志即可满足需求

按周全备与增量备份

备份类型 文件名
每周一00全量备份 01.sql.gz
周一增量数据 oldboy-bin.000024
周二增量数据 oldboy-bin.000037
周三增量数据 oldboy-bin.000045
... ...
下周日增量数据 oldboy-bin.000047
oldboy-bin索引 oldboy-bin索引
oldboy-bin索引 oldboy-bin索引
oldboy-bin索引 oldboy-bin索引
oldboy-bin索引 oldboy-bin索引

按周全备特点

优点:
  • 每周仅有一个完整备份,因此占用磁盘总空间大小较小。
  • 备份次数较少,占用系统资源较少,提供更好的用户体验。
缺点:
  • 恢复时需要处理的数据文件较多,增加了恢复的复杂度。
  • 维护成本较高,恢复时间可能较长。

对于大型企业来说,由于数据量特大,每天进行全备可能需要很长时间。因此,采用按周全备的策略可以节省数据存储空间,并且不会对用户访问数据库的体验产生太大的影响。


【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)(二)https://developer.aliyun.com/article/1471056

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
5月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1080 152
|
5月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
671 5
|
6月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
6月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
454 158
|
6月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
842 156
|
6月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
454 156
|
6月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
542 161

推荐镜像

更多