一、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 | 主线程设置超时参数,以防止连接超时。 |
| 确保备份过程中不会因为超时而中断连接。 |
2 | 主线程获取全局读锁,以确保备份时数据的一致性。 | FLUSH TABLES WITH READ LOCK | 防止 DML 语句写入,保证备份时数据的一致性。 |
3 | 主线程记录当前二进制日志文件名和位置。 | SHOW MASTER STATUS | 记录备份时的二进制日志信息,以便在恢复时能够从正确的日志位置开始。 |
4 | 主线程启动事务,以确保备份时的快照一致性。 | START TRANSACTION WITH CONSISTENT SNAPSHOT | 保证备份时读取的数据是一致的快照。 |
5 | 主线程判断表的引擎类型,以确定备份策略。 | SHOW TABLE STATUS | 确定哪些表是非事务引擎,需要在全局读锁下备份。 |
6 | 备份线程备份非事务引擎的表。 |
| 备份非事务引擎表的数据和结构。 |
7 | 主线程释放全局读锁,允许业务继续写入。 | UNLOCK TABLES | 释放锁,允许业务继续进行写操作。 |
8 | 备份线程备份事务引擎的表。 |
| 备份事务引擎表的数据和结构。 |
9 | 备份线程备份触发器、存储过程、函数和事件等数据库对象。 |
| 备份数据库对象的定义。 |
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语句来恢复数据。 |
|
恢复阶段 | 处理事务 | myloader会处理事务,确保数据的一致性。在恢复过程中,会开启事务,执行INSERT语句后提交事务,以保证数据的完整性和一致性。 |
|
恢复阶段 | 处理错误 | 如果在恢复过程中遇到错误,如主键冲突、表不存在等,myloader会记录错误信息,并根据配置决定是否继续恢复。 |
|
恢复阶段 | 恢复索引 | 在数据恢复完成后,myloader会重建表的索引,以提高查询性能。 | ALTER TABLE mydatabase.mytable ADD INDEX idx_name (name); |
完成阶段 | 完成恢复 | 恢复完成后,myloader记录恢复完成的信息,包括恢复的时间、恢复的总数据量、恢复的表数量等。 | 无直接SQL语句,主要是myloader输出日志信息 |
八、mydumper恢复原理总结
-
创建多个线程:mydumper支持多线程恢复,通过多个线程并行处理数据,提高恢复效率。
-
进入恢复库中创建表:在恢复过程中,mydumper会根据备份文件中的元数据(metadata)创建目标数据库中的表结构。
-
多个线程开启事务:恢复时,mydumper会启动多个线程,并为每个线程开启事务,以确保数据的一致性。
-
多个线程分别导入不同表的数据:每个线程负责导入不同表的数据,利用多线程并行处理,加快恢复速度。
-
提交事务:在数据导入完成后,mydumper会提交事务,确保数据的完整性和一致性。
-
退出线程,恢复完成:所有线程完成任务后,mydumper会退出线程,恢复过程结束。
此外,mydumper在恢复过程中会利用metadata文件中的信息(如二进制日志文件名和位置),以确保恢复的一致性和完整性。