文章目录
-
-
- mysqldump 备份
-
- 认识备份的重要性及备份场景
-
- 备份重要性
- 备份场景
- 涉及到的技术:
- 利用 mysqldump 备份
-
- mysqldump 是什么?
- mysqldump 能做什么?
- 常见用法 (详情请参考 [9.1 mysqldump 数据导出命令详解](http://note.youdao.com/noteshare?id=7d26b38d719c71faf701e36e3868d150&sub=5F8A5EEAB99547888A3B35AC62E8AE45)
-
- 备份所有的数据库
- 还原备份文件
- 利用select into outfile + awk实现临时备份
- 生产中 `MySQL` 备份恢复的形式
- mysqldump 备份原理
-
- mysqldump 关键参数含义
- 观察 `mysqldump` 备份过程
- mysqldump 最佳实践
-
- mysqldump 备份从4点开始,6点结束,问备份出来的文件中的数据是4点时的数据还是6点时的数据?
- mysqldump 重要参数
- mydumper 介绍
-
- mydumper备份过程
- 思考
-
- 如何从一个`mysqldump`文件中提取其中一个单表
-
- 使用 `sed` (该方法速度十分缓慢)
- 有一个需求,把 test 库下的表,都 dump 成单表存储,如:`t1.sql, t2.sql...` 如何实现
- 如何从 mysqldump 备份出来的文件中恢复单表
- 需掌握知识点
- Thinking
-
mysqldump 备份
认识备份的重要性及备份场景
备份重要性
重要性:
- 备份是DBA的救命稻草
- 没有备份,就没有复活的机会
- 备份可以让数据回档到某一个时刻
误区:
- 备份占用太多资源,也不能促进生产
- 可以考虑利用备份恢复生产,提高应用的可用性
- 备份可以随便找个地方存放,丟了也无所谓
备份场景
- 功能开发环境配置类型库
-
测试环境
性能监控相关的数据
-
生产环境
几乎全备(每天一个全备 +
的备份)binlog
- 其它
涉及到的技术:
- 备份工具
mysqldump mydumper xtrabackup
- 备份存储归档
- 商业软件
- 开源的:ceph(1.2~1.5份);HDFS(要求数据最少存储两份)
- 控制速度
利用 mysqldump 备份
mysqldump 是什么?
mysqldump
是一个逻辑备份工具, 复制原始的数据库对象定义和表数据产生一组可执行的
SQL
语句。 默认情况下, 生成
insert
语句,也能生成其它分隔符的输出或
XML
格式的文件。
mysqldump 能做什么?
- 使用
命令创建mysqldump
格式的转储文件来备份数据库。SQL
- 数据导出后做数据迁移,搭建主从。
常见用法 (详情请参考 9.1 mysqldump 数据导出命令详解
备份所有的数据库
- 备整个库
- 备份指定的表:
还原备份文件
- 还原 dump 出来的备份
注意事项
需要一致性的话加上两个参数 --master-data=2 --single-transaction
利用select into outfile + awk实现临时备份
select id, col1 from zst01.tb1 where id < 1000 into outfile /tmp/zst01_tb1.sql’;
update zst01.tb1 set col1='abc' where id < 1000;
cat zst01_tb1.sql |awk '{print "update zst01.tb1 set col1 ="$2", where id="$1";"}' >roll_zst01_tb1.sql
mysql zst01 <roll_zst01_tb1.sql
生产中 MySQL
备份恢复的形式
MySQL
- 在线基于逻辑备份
mysqldump & mydumper
mydumper 在 MySQL 5.7 中对 JSON 格式的数据备份不太友好
- 在线物理备份
xtrabackup
- 增量备份
mysql binary log
优点是数据可还原到任一时间点
mysqldump 备份原理
mysqldump 5.7版本,
--master-data=2 single-transaction
对非事务表的备份是不安全的。要获得非事务表的一致性快照需加上选项
--lock-tables
,该选项会对业务产生一定的影响(备份期间锁住所有表,无法写入数据),而
--master-data=2 single-transaction
选项对业务的影响很小(1s左右)
mysqldump 关键参数含义
--single-transaction
在一个单独的事务中通过创建所有表的一致性快照来备份所有表,只对存储引擎支持多版本读(当前仅支持)的表有效;此备份不能够保证其他存储引擎表中数据的一致性,当一个
InnoDB
备份正在运行时,需确保备份是有效的(正确的表数据和日志位置),没有其他连接使用以下语句:
--single-transaction
,因为一致性快照与此相互关联。选项
ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE
自动关闭
--lock-tables
--master-data=2
该选项会将二进制日志文件名和位置追加到转储文件中。若,将以
--master-data=1
命令的形式输出,若
CHANGE MASTER
,该命令将会被注释掉。除非同时指定选项
--master-data=2
,否则
--single-transaction
选项将导致选项
--master-data
默认打开,无论在哪种情况下,备份时肯定会更新日志。选项
--lock-all-tables
自动关闭。
--lock-tables
观察 mysqldump
备份过程
mysqldump
mysqldump
备份通过
SQL
与数据库交互,最终产生一个备份,因此可在开启
general log
后,执行备份命令,查看
general log
可观察整个备份过程
- 开启
general log
- 备份命令
- 备份过程
mysqldump
备份原理示意图
time | command(session 1) |
---|---|
t0 | flush tables |
t1 | FTWRL |
t2 | set session ios_lation rr |
t3 | start trx |
t4 | show master status |
t5 | get gtid |
t6 | unlock tables |
t7 | savepoint sp |
t8 | rollback to savepoint sp |
t9 | unlock tables |
general log
日志记录
# flush tables 操作关闭所有已打开的表,强制关闭所有正在使用的表,并刷新 prepare 语句缓存
# 该操作可以防止 mysqldump 时实例上没有发生以下几种情况: a. 表结构修改操作 b. 大事务 c. 较长时间的 select 查询。即有这些操作时,flsuh tables 会被阻塞,从而阻止备份数据
1.flush tables;
# FTWRL 关闭所有已经打开的表,并使用全局读锁来锁住所有数据库中的所有表,从而使实例处于只读状态,无法写入
2.flush tables with read lock;
#设置会话隔离级别为 RR,防止幻读、不可重复读
3.set session transaction isolation level repeatable read
#开启一致性快照事务
4.start transaction /*!40100 with consistent snapshot*/
#若是 GTID 环境,
5.SHOW VARIABLES LIKE 'gtid\_mode'
#获取当前已执行的 GTID
5.select @@global.gtid_executed
#获取 binlog 文件名及相关位置
6.show master status;
#释放 FTWRL LOCK, 释放后事务仍旧继续
7.unlock tables;
8.show databases;
9.show create database if not exists 'dbname';
#事务保存点,备份每张表的起始时间都是从同一个事务点开始的
10.savepoint sp;
11.show create table 'tb_xx';
12.select /!40100 $QL_NO_CACHE*/ * from tb_xx;
13.rollback to savepoint sp;
14....
15.rollback to savepoint sp;
16.RELEASE SAVEPOINT sp;
#断开连接,原事务自动停止
17.quit
mysqldump 最佳实践
mysqldump
的缺点:
- 单进程 dump
- 所有结果保存在一个文件中,提取单个表比较困难
第一种方式
第二种方式
推荐
- 数据压缩:
或者pigz
替换zstd
gzip
-
替换mydumper
mysqldump
mysqldump 备份从4点开始,6点结束,问备份出来的文件中的数据是4点时的数据还是6点时的数据?
答:4点时数据。准确时间应为实例加上
FTWRL LOCK
的时间 ,而该过程大约只花费 1s 左右的时间。
mysqldump 重要参数
若表中有触发器,存储过程,那么在备份时需要注意什么?
mysqldump 的Tips
一般有触发器和存储过程时,建议将每个部分单独备份一份,备份时也要加上这两个参数
--single-transaction --master-data=2
,减小对数据库的影响
- 表结构
- 数据
- 存储过程
- 触发器
- event
-
Dump triggers for each dumped table. (Defaults to on; use --skip-triggers to disable.)--triggers
-
No row information-d --no-data
-
Don’t write table creation info.-t --no-create-info
-
Suppress the CREATE DATABASE … IF EXISTS statement that normally is output for each dumped database if --all-databases or --databases is given.-n, --no-create-db
-
Dump stored routines (functions and procedures).-R, --routines
-
Dump events.-E, --events
-
Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. ‘USE db_name;’ will be included in the output.-B, --databases
-
Overrides option --databases (-B).--tables
-
Dump only selected records. Quotes are mandatory.-w --where=name
应用案例:快速测试对一个上百
G
的库作字符集转码可能造成的影响
mysqldump --where="1=1 limit 1000" db1 >db1_1000.sql
相当于
Select * from tb where 1=1 limit 1OOO;
mydumper 介绍
mysqldump 是单线程进行数据库备份的工具,在数据量比较大时,备份速度下降十分严重,mydumper 支持并行备份,从而提高备份速度,缩小备份耗费时间。
参考文章
MySQL 多线程备份工具 Mydumper详解
项目地址
特性:
- 并行,高性能的 MySQL 逻辑导入导出工具
- 非常方便管理导出的文件(文件拆分成单表存储, metadata 信息)
- 导入时支持正则表达式
mydumper
备份原理示意图
time | master_thread | worker_thread |
---|---|---|
t1 | flush tables | |
t2 | FTWRL | |
t3 | set session ios_lation rr | |
t4 | get gtid | |
t5 | show master status | |
t6 | set session ios_lation rr | |
t7 | start trx | |
t8 | unlock tables |
mydumper备份过程
- 主线程
,施加全局只读锁,以阻止FLUSH TABLES WITH READ LOCK
语句写入,保证数据的一致性DML
- 读取当前时间点的二逬制日志文件名和日志写入的位置并记录在
文件中,以供即使点恢复使用metadata
- N个(线程数可以指定,默认是4) dump线程
;幵启读一致的事务START TRANSACTION WITH CONSISTENT SNAPSHOT
-
,首先导出非事务引擎表dump non-InnoDB tables
- 主线程
,非事务引擎表备份完后,释放全局只读锁 ;UNLOCK TABLES
-
,基于事务导出dump InnoDB tables
表InnoDB
- 事务结束
思考
如何从一个 mysqldump
文件中提取其中一个单表
mysqldump
使用
sed
(该方法速度十分缓慢)
- 使用 mydumper (文件拆分成单表存储)
有一个需求,把 test 库下的表,都 dump 成单表存储,如: t1.sql, t2.sql...
如何实现
t1.sql, t2.sql...
使用
mydumper
备份数据
如何从 mysqldump 备份出来的文件中恢复单表
思路:
使用权限,给某用户只授权该表的权限,使用参数
-f
忽略报错导入数据
假设要恢复的表为
db1.t2
- 创建
数据库, 用来存放要恢复的单表tb_recovery
- 创建用户
,并只对其赋予'user_tb_recovery'@'%'
表的所有权限tb_recovery.t2
create user 'user_tb_recovery'@'%' identified by 'user_tb_recovery';
grant all privileges on tb_recovery.t2 to 'user_tb_recovery'@'%';
flush privileges;
- 使用
选项导入备份文件-f
- 若原表
还存在,则将其改名为db1.t2
,待恢复确认无误后删除。db1.t2_bak
- 将步骤 3 恢复出来的表
移到tb_recovery.t2
库下db1
需掌握知识点
- 学会利用
怎么拿到一致性备份mysqldump
- 学会利用
只备份需要的数据mysqldump
--where="add_time >= xxx and add_time <= xxx"
- (重点)知道
原理获取及解读,讲解出来mysqldump
-
下载编译一下,并行导出导入,动手做一下,知道mydumper
原理获取及解读,讲解出来mydumper
Thinking
- zstd, pigz, gzip 压缩算法的比较,比较维度:1. 压缩耗费时间 2. 压缩比
- zstd 和 pigz 可利用多核,gzip 只能用单核