多线程逻辑备份工具mydumper的备份和恢复原理

一、mydumper的特点

  • 多线程备份:支持多线程技术,可以同时备份多个表,充分利用系统资源,显著提高备份速度,尤其适用于大规模数据集的备份。

  • 数据与建表语句分离:备份产生的文件中,建库、建表、表数据等都分别在不同文件中,便于管理和恢复。

  • 事务一致性:通过使用GTID和锁机制,确保备份数据的一致性。在备份过程中,它只会在备份的开始和结束时锁定表,而在备份过程中允许其他操作,减少了对生产环境的干扰

二、安装mydumper 

wget https://github.com/mydumper/mydumper/releases/download/v0.14.5-2/mydumper-0.14.5-2.el7.x86_64.rpm

yum install mydumper-0.14.5-2.el7.x86_64.rpm -y
yum install compat-openssl10 -y

mydumper --help

三、备份

mydumper -u 'ccj' -p 'ccj1' -S /tmp/mysql.sock -B test_db -o /root

四、查看备份文件

文件名文件内容用途
metadata包含备份时的元数据信息,如备份时间、版本号、备份选项等。用于记录备份的元数据,帮助恢复时验证备份的完整性和一致性。
db_name-schema-create.sql包含创建数据库的SQL语句。用于在恢复时重新创建数据库。
db_name.tb_name-schema.sql包含表的结构定义(如CREATE TABLE语句)、索引、约束等。用于在恢复时重新创建表结构。
db_name.tb_name.sql包含表中的数据,以SQL插入语句(INSERT INTO)的形式存储。用于在恢复时将数据重新插入到表中。
db_name.tb_name.sql.gz如果启用了压缩选项(-c),则备份文件会被压缩成.gz格式。减少存储空间,便于传输和存储。
db_name.proc.sql包含存储过程、函数的定义。用于在恢复时重新创建存储过程和函数。
db_name.event.sql包含事件(EVENT)的定义。用于在恢复时重新创建事件。
db_name.view.sql包含视图(VIEW)的定义。用于在恢复时重新创建视图。
db_name-schema-triggers.sql包含数据库级别的触发器定义。用于在恢复时重新创建数据库级别的触发器。

五、查看备份过程的General Log

步骤描述对应的 SQL 语句目的
1主线程设置超时参数,以防止连接超时。

SET SESSION WAIT_TIMEOUT = 2147483

SET SESSION NET_WRITE_TIMEOUT = 2147483

确保备份过程中不会因为超时而中断连接。
2主线程获取全局读锁,以确保备份时数据的一致性。FLUSH TABLES WITH READ LOCK防止 DML 语句写入,保证备份时数据的一致性。
3主线程记录当前二进制日志文件名和位置。SHOW MASTER STATUS记录备份时的二进制日志信息,以便在恢复时能够从正确的日志位置开始。
4主线程启动事务,以确保备份时的快照一致性。START TRANSACTION WITH CONSISTENT SNAPSHOT保证备份时读取的数据是一致的快照。
5主线程判断表的引擎类型,以确定备份策略。SHOW TABLE STATUS确定哪些表是非事务引擎,需要在全局读锁下备份。
6备份线程备份非事务引擎的表。

SELECT * FROM table_name

SHOW CREATE TABLE table_name

备份非事务引擎表的数据和结构。
7主线程释放全局读锁,允许业务继续写入。UNLOCK TABLES释放锁,允许业务继续进行写操作。
8备份线程备份事务引擎的表。

SELECT * FROM table_name

SHOW CREATE TABLE table_name

备份事务引擎表的数据和结构。
9备份线程备份触发器、存储过程、函数和事件等数据库对象。

SHOW TRIGGERS

SHOW CREATE PROCEDURE procedure_name

SHOW CREATE FUNCTION function_name

SHOW EVENTS

备份数据库对象的定义。
10备份线程记录元数据,包括备份开始和结束时间、二进制日志位置等。INSERT INTO metadata VALUES (...)记录备份的元数据信息,以便在恢复时使用。
11备份线程结束事务。COMMIT确保所有备份操作已经完成并提交。

 六、mydumper备份原理总结

1. 将所有当前打开的表刷新到磁盘上

  • 操作mydumper 会执行 FLUSH TABLES 命令,将所有当前打开的表刷新到磁盘上。

  • 目的:确保所有表的数据已经写入磁盘,避免数据丢失或不一致。

  • SQL 语句FLUSH TABLES;

2. 主线程给所有的表加全局读锁

  • 操作mydumper 会执行 FLUSH TABLES WITH READ LOCK 命令,对所有表施加全局只读锁。

  • 目的:防止 DML(插入、更新、删除)操作对表进行写入,确保备份时数据的一致性。

  • SQL 语句FLUSH TABLES WITH READ LOCK;

  • 注意事项:全局读锁会阻塞写操作,但不会阻塞读操作。为了减少对生产环境的影响,mydumper 会在备份非事务型表后尽快释放锁。

3. 创建多个线程,隔离级别设置为 RR,都开启事务

  • 操作mydumper 会创建多个备份线程,每个线程都会设置事务隔离级别为 REPEATABLE READ(RR),并开启事务。

  • 目的:确保每个线程在备份时看到的数据是一致的快照,防止其他事务的写操作影响备份数据。

  • SQL 语句

    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    START TRANSACTION WITH CONSISTENT SNAPSHOT;
  • 多线程备份mydumper 通过多线程并行备份,提高备份效率,尤其适合大规模数据库。

4. 查看位点,GTID 信息

  • 操作mydumper 会执行 SHOW MASTER STATUS 命令,记录当前二进制日志文件的名称和写入位置(位点),并保存在 metadata 文件中。

  • 目的:用于恢复操作时,确保备份数据的一致性和完整性。

  • SQL 语句SHOW MASTER STATUS;

  • GTID 信息:如果启用了 GTID(全局事务标识符),mydumper 也会记录 GTID 信息,以便在恢复时能够从正确的事务位置开始。

  • SQL 语句SHOW GLOBAL VARIABLES LIKE 'gtid_mode';SHOW MASTER STATUS;

5. 查看建库语句

  • 操作mydumper 会执行 SHOW CREATE DATABASE 命令,获取每个数据库的创建语句。

  • 目的:用于在恢复时重新创建数据库。

  • SQL 语句SHOW CREATE DATABASE db_name;

6. 获取表结构

  • 操作mydumper 会执行 SHOW CREATE TABLE 命令,获取每个表的结构定义。

  • 目的:用于在恢复时重新创建表结构。

  • SQL 语句SHOW CREATE TABLE db_name.tb_name;

7. 通过 SELECT * 的方式获取数据

  • 操作mydumper 会使用 SELECT * FROM table_name 命令,将表中的数据导出到备份文件中。

  • 目的:将表中的实际数据备份到文件中,以便在恢复时重新插入到表中。

  • SQL 语句SELECT * FROM db_name.tb_name;

  • 优化mydumper 会根据表的大小和配置,选择是否使用压缩或分批导出数据。

8. 解锁

  • 操作mydumper 会执行 UNLOCK TABLES 命令,释放全局只读锁。

  • 目的:允许数据库恢复正常的写操作。

  • SQL 语句UNLOCK TABLES;

9. 退出所有线程、备份完成

  • 操作:所有备份线程完成任务后,mydumper 会退出所有线程,并记录备份完成的时间和状态。

  • 目的:确保备份操作完全结束,并释放所有资源。

  • 元数据记录mydumper 会记录备份的元数据(如备份开始和结束时间、二进制日志位置等),以便在恢复时使用。

七、恢复

myloader -u 'ccj' -p 'ccj1' -S /tmp/mysql.sock -B test_db2 -d /root

八、查看恢复过程的General Log

阶段操作说明SQL示例
准备阶段解析备份文件myloader解析备份目录中的备份文件,确定需要恢复的数据库和表。无直接SQL语句,主要是myloader内部逻辑处理
准备阶段创建数据库如果目标数据库不存在,myloader会根据备份文件中的信息创建数据库。CREATE DATABASE IF NOT EXISTS mydatabase;
准备阶段创建表结构根据备份文件中的表结构定义,myloader创建表结构。CREATE TABLE IF NOT EXISTS mydatabase.mytable (id INT PRIMARY KEY, name VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB;
恢复阶段恢复表数据myloader逐个恢复表的数据,可以设置线程数来提高恢复效率。myloader会根据备份文件中的数据内容,执行相应的INSERT语句来恢复数据。

INSERT INTO mydatabase.mytable (id, name) VALUES (1, 'Alice');

INSERT INTO mydatabase.mytable (id, name) VALUES (2, 'Bob');

INSERT INTO mydatabase.mytable (id, name) VALUES (3, 'Charlie');

恢复阶段处理事务myloader会处理事务,确保数据的一致性。在恢复过程中,会开启事务,执行INSERT语句后提交事务,以保证数据的完整性和一致性。

START TRANSACTION;

INSERT INTO mydatabase.mytable (id, name) VALUES (4, 'David');

INSERT INTO mydatabase.mytable (id, name) VALUES (5, 'Eve');

COMMIT;

恢复阶段处理错误如果在恢复过程中遇到错误,如主键冲突、表不存在等,myloader会记录错误信息,并根据配置决定是否继续恢复。

-- 错误示例:主键冲突

INSERT INTO mydatabase.mytable (id, name) VALUES (1, 'Alice');

-- 错误信息:Duplicate entry '1' for key 'PRIMARY'

-- 可能的解决方法:忽略错误或更新现有记录

INSERT IGNORE INTO mydatabase.mytable (id, name) VALUES (1, 'Alice');

恢复阶段恢复索引在数据恢复完成后,myloader会重建表的索引,以提高查询性能。ALTER TABLE mydatabase.mytable ADD INDEX idx_name (name);
完成阶段完成恢复恢复完成后,myloader记录恢复完成的信息,包括恢复的时间、恢复的总数据量、恢复的表数量等。无直接SQL语句,主要是myloader输出日志信息

 八、mydumper恢复原理总结

  1. 创建多个线程:mydumper支持多线程恢复,通过多个线程并行处理数据,提高恢复效率。

  2. 进入恢复库中创建表:在恢复过程中,mydumper会根据备份文件中的元数据(metadata)创建目标数据库中的表结构。

  3. 多个线程开启事务:恢复时,mydumper会启动多个线程,并为每个线程开启事务,以确保数据的一致性。

  4. 多个线程分别导入不同表的数据:每个线程负责导入不同表的数据,利用多线程并行处理,加快恢复速度。

  5. 提交事务:在数据导入完成后,mydumper会提交事务,确保数据的完整性和一致性。

  6. 退出线程,恢复完成:所有线程完成任务后,mydumper会退出线程,恢复过程结束。

此外,mydumper在恢复过程中会利用metadata文件中的信息(如二进制日志文件名和位置),以确保恢复的一致性和完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值