MySQL备份与主备配置

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文详细讲述了如何进行 MySQL 的全量备份、增量备份、主从备份、双主备份以及如何通过 binlog 对误操作数据进行恢复,包含大量代码和截图。

MySQL备份与主备配置

数据备份类型

  • 全量备份:备份整个数据库
  • 增量备份:备份自上一次备份以来(增量或完全)以来变化的数据
  • 差异备份:备份自上一次完全备份以来变化的数据

全量备份

全量备份的方法有 2 种,一种是利用数据库管理工具提供的备份恢复和导入导出功能。

例如:如果使用 Navicat、PHPMyAdmin 之类的可视化工具,可以直接点击转储 SQL 文件,或者导出 SQL 文件之类的功能。

另一种是利用 mysqldump。

导出:

sudo mysqldump -u root -p student > dir/student_backup.sql

导入:

sudo mysqldump-u root -p student < dir/student_backup.sql
source student_backup.sql #要在数据库操作 use student 之后

增量备份

增量备份的 binlog 是一个二进制格式的文件,用于记录用户对数据库更新的 SQL 语句信息,例如更改数据库表和更改内容的 SQL 语句都会记录到 binlog 里,但是对库表等内容的查询不会记录。

在配置文件中,修改配置打开 binlog。通过 show variables like '%log_bin%'; 查看 binlog 是否打开。

1557456890317

可以看到默认是没有打开的。

默认的配置文件可能在 /etc/mysql/my.cnf,如果是使用 XAMPP 等一键安装的,也可能在 /opt/lampp/etc/my.cnf 等位置。

在配置文件找到 log_bin 所在的位置,取消这一行的注释。

1557458584111

重启服务以后,可以看到启用了 binlog。

1557458635561

binlog 的使用格式

show binary logs;
show binlog events in 'mysql-bin.000001';

1557458736273

1557458749349

GTID 的全称是Global Transaction Identifier,也就是全局事务ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。它由两部分组成,格式是:`gtid=server-uuid:gno

server_uuid 是一个实例第一次启动时自动生成的,是一个全局唯一的值。

gno 是一个整数,初始值是 1,每次提交事务的时候分配给这个事务,并加 1。

在 GTID 模式下,每个事务都会跟一个 GTID 一一对应。

这样,每个MySQL 实例都维护了一个GTID 集合,用来对应“这个实例执行过的所有事务”。

下面来测试一下 binlog。

1557458853180

先导入测试数据,然后执行以下语句。

update student set birth = 2019 where id = '100';
insert into student values(200, 'jxtxzzw', '男', 2019, '计算机系', '上海');
delete from student where id = 200;

查看 binlog。

1557458950530

通过以下两条语句可以生成新的 binlog。

flush logs;
show binary logs;

除了 flush logs;,重启 MySQL 服务以及 mysqlbinlog 也可以生成新的 binlog。

通过 binlog 恢复数据

构造场景:

insert into student values(907,'李七','男',1991,'计算机系','上海');
insert into student values(908,'李八','男',1992,'音乐系','上海');
delete from student where id=907;//误删
delete from student where id=908;//误删

如何通过 binlog 恢复这两条数据?

通过查看 binlog 找到了误删的两条数据。

1557459125508

mysqlbinlog --start-position=4183 --stop-position=4592 /opt/lampp/var/mysql/mysql-bin.000001 | mysql -u root -p

在上面这条语句中,首先是设置了起点为 4183、终点为 4592,并指定了 binlog 的文件为 mysql-bin.000001。

1557459226725

1557459678141

输入管理员密码之后,可以重新打开数据库看一下是不是成功。

1557459751519

可以看到恢复成功。

如果想要删除 binlog,删除 binlog 的方法是:

  1. 关闭 MYSQL 主从,关闭 binlog。
  2. 开启 MYSQL 主从,设置 expire_logs_days。
  3. 手动清除 binlog 文件,PURGE MASTER LOGS to ‘mysqld-bin.00001’;(before ‘date’)。
  4. reset master。

练习 1

  1. 删掉 student 库,通过全量备份和 binlog 对其进行恢复。
  2. 尝试了解 binlog 的三种格式。

删掉 student 库的过程非常简单,而通过全量备份恢复只需要导入即可,从略。

下面重点说一下从 binlog 恢复的过程。

1557459828077

需要特别说明的是,命令行下可能不允许使用 delete,这时候可以用 drop table 替换。

删除所有数据以后再次打开数据库,看到表已经是空的了。

1557459890412

然后打开 binlog 看一眼,找到 start position 和 stop position。

1557461599133

然后从起点位置到结束位置执行一次恢复。

1557461570784

可以看到数据已经恢复了。

1557461639511

binlog 的三种格式:

直接转载 卜算 的《使用mysql的binlog恢复误操作(update|delete)的数据》(https://blog.csdn.net/Aeroleo/article/details/77929917)中的内容:

MYSQL binlog复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。

STATEMENT模式(SBR)

每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

ROW模式(RBR)

不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。

MIXED模式(MBR)

以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

MySQL 主备配置

在主库上创建用户 repl,并给他权限。

CREATE USER repl;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123456';

1557463740318

检查在主库 my.cnf 中配置 server-id。发现已经配置了。

1557463809046

然后进配置文件把所有 bind-address=127.0.0.1 的配置行注释掉。

1557464115585

在主库执行 show master status; 记录 binlog 和 pos。

1557464220695

打开 Ubuntu-Server(从库),修改配置文件(/opt/lampp/etc/my.cnf)中的 server-id 为 2,重启 MySQL 服务。

1557464381264

进入数据库,执行:

change master to master_host='主库IP(这里是192.168.23.129)', master_user='主库用户(这里是repl)', master_password='主库用户密码(这里是123456)', master_log_file="主库的binlog(这里是mysql-bin.000003)", master_log_pos=主库的binlog的pos(这里是327);
start slave;
show slave status\G;

1557464651425

然后在 status 可以看到 slave 的状态是 YES。

1557466491120

1557466508070

测试主备。在主库添加一条记录,然后在从库看一下是不是有这条记录。

1557464970121

1557464987238

主库成功添加了这条记录。

从库也出现了这条记录。

特别需要指出的是,从库和主库的同步只能是从同步开始设置的那一刻之后的操作才能同步。

举个例子,主库有 100、200、300 这三个用户,从库有 200、300、500 这三个用户:

  • 在主库添加 400 号用户,则从库自动添加 400 号用户
  • 在主库删除 300 号用户,则从库自动删除 300 号用户
  • 在主库将 200 号用户的编号修改为 233 号,则从库自动将 200 号用户的编号设置为 233。
  • 在主库修改 100 号用户的编号修改为 101,从库没有响应。
  • 在主库修改 100 号用户的编号修改为 500,进一步修改姓名为张三,由于在第一步操作之后,主库的 100 号用户的编号已经修改为 500 了,之后如果用主键来判断修改了哪一条记录,那么将会是“把 500 号用户的姓名修改为张三”,于是,这一修改会体现在从库上,从库的 500 号用户也被改成了张三。

因此,需要说明的是,如果从库一开始就没有 student 这个库,或者没有表,那么,主从备份是不会起作用的。

1557467029314

MySQL 双主结构

目的:A 和 B 双向同步。

刚才的是主从备份,只有主机的修改会被同步到从机,从机的修改不会被同步到主机。

1557467095234

修改两边的配置文件。

在 A 和 B 重复上面主从备份的时候创建 repl 用户的过程,并赋予权限。

create user repl;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@‘%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

测试是否可以连接。

1557467728717

1557467761322

自己连自己、自己连对方,都可以正常访问。

之后的步骤与主从备份是类似的,只是相当于对两台主机都做了一次主从备份,互相做对方的从机。

于是,需要先查看 binlog 的 index 和 pos。

这是在 A 查到的结果,A 的 IP 是 192.168.23.129。

1557467898254

这是在 B 查到的结果, B 的 IP 是 192.168.23.128。

1557468134222

注意这个操作需要在 root 权限下运行,repl 运行不了。

然后在 A 执行:

change master to master_host='192.168.23.128', master_user='repl', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=313;

类似的,在 B 运行:

change master to master_host='192.168.23.129', master_user='repl', master_password='123456', master_log_file='mysql-bin.000005', master_log_pos=327;

1557468531570

之后分别在 A 和 B 上通过 start slave 来运行。

通过 show slave status 可以看到 IO 和 SQL 都是 Running 的。

1557468640189

1557468671526

测试。

INSERT INTO `student` (`id`, `name`, `sex`, `birth`, `department`, `address`) VALUES ('11', 'Added From Desktop', NULL, NULL, NULL, NULL);

之后可以看到 Server 版的数据库出现了这一记录。

1557468735519

在 Server 版修改。

UPDATE `student` SET `address` = 'Modified From Server' WHERE `student`.`id` = 11;

可以看到双向同步了。

1557468786687

主备延迟

最后需要说明的是,主备之间存在一个延迟。

  • 主库 A 执行完成一个事务,写入 binlog,我们把这个时间记为 T1。
  • 之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2。
  • 备库 B 执行完成这个事务,我们把这个时刻记为 T3。

主备延迟即 T3 - T1 的差。

可以在备库上执行 show slave status 查看 seconds_behind_master

1557468868124

但是在我们的测试中,几乎所有的主备延迟都是 0。

这是因为,主备延迟的来源有:

  1. 备库的性能更差
  2. 备库压力较大
  3. 大事务 必须执行完才会写入 binlog,然后传给备库

在试验中并没有遇到这样的情况。

当然可以手动构造大量的数据来做个测试。

练习 2

尝试配置MySQL一主一备及双主结构。

上文已详述。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
118 1
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
97 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
45 3
|
1月前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
141 2
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
90 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
217 0
|
Cloud Native 关系型数据库 分布式数据库
PolarDB-X 1.0-用户指南-私有RDS管理-主备切换
您可以设置主备实例切换,切换后原来的主实例会变成备实例。
205 0
PolarDB-X 1.0-用户指南-私有RDS管理-主备切换
|
13天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
89 15