mysqldump 备份 part 1


文章目录

      • 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 备份

认识备份的重要性及备份场景

备份重要性

重要性:

  1. 备份是DBA的救命稻草
  2. 没有备份,就没有复活的机会
  3. 备份可以让数据回档到某一个时刻

误区:

  1. 备份占用太多资源,也不能促进生产
  2. 可以考虑利用备份恢复生产,提高应用的可用性
  3. 备份可以随便找个地方存放,丟了也无所谓
备份场景
  1. 功能开发环境配置类型库
  2. 测试环境
    性能监控相关的数据
  3. 生产环境
    几乎全备(每天一个全备 + binlog 的备份)
  4. 其它
涉及到的技术:
  1. 备份工具 mysqldump mydumper xtrabackup
  2. 备份存储归档
    • 商业软件
    • 开源的:ceph(1.2~1.5份);HDFS(要求数据最少存储两份)
  3. 控制速度

利用 mysqldump 备份

mysqldump 是什么?

mysqldump 是一个逻辑备份工具, 复制原始的数据库对象定义和表数据产生一组可执行的SQL语句。 默认情况下, 生成 insert 语句,也能生成其它分隔符的输出或XML格式的文件。

mysqldump 能做什么?
  • 使用 mysqldump 命令创建 SQL 格式的转储文件来备份数据库。
  • 数据导出后做数据迁移,搭建主从。
常见用法 (详情请参考 9.1 mysqldump 数据导出命令详解
备份所有的数据库
mysqldump -uroot -p -S /tmp/mysql3308.sock --master-data=2 --single-transaction -A > dbname_$port_`date +%Y%m%d`.sql`
  • 备整个库
mysqldump --master-data=2,--single-transaction db_name > dbname_$port_`date +%Y%m%d`.sql 
  • 备份指定的表:
mysqldump db_name tb_name >db_name_$port_tb_name`date +%Y%m%d`.sql
还原备份文件
  • 还原 dump 出来的备份
mysql  db_name < db_name_$port_`date +%Y%m%d`.sql 

注意事项

需要一致性的话加上两个参数--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 备份恢复的形式

  • 在线基于逻辑备份
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备份通过SQL与数据库交互,最终产生一个备份,因此可在开启 general log 后,执行备份命令,查看 general log 可观察整个备份过程

  • 开启 general log
set global general_log = 1;
  • 备份命令
#time mysqldump --single-transaction --master-data=2 -A -uroot -p -S /tmp/mysql3306.sock > /data/backup_mysql/db_$port_`date +%Y%m%d_%H%M%S`.sql
  • 备份过程

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 的缺点:

  1. 单进程 dump
  2. 所有结果保存在一个文件中,提取单个表比较困难

第一种方式

mysqldump --single-transaction --master-data=2 -A -uroot -p -S /tmp/mysql3306.sock > /data/backup_mysql/$dbname_$port_`date +%Y%m%d_%H%M%S`.sql

第二种方式

mysqldump --single-transaction --master-data=2 -A -uroot -p -S /tmp/mysql3306.sock |gzip > /data/backup_mysql/$dbname_$port_`date +%Y%m%d_%H%M%S`.sql

推荐

  • 数据压缩:pigz 或者 zstd 替换 gzip
  • mydumper 替换 mysqldump
mysqldump 备份从4点开始,6点结束,问备份出来的文件中的数据是4点时的数据还是6点时的数据?

答:4点时数据。准确时间应为实例加上 FTWRL LOCK 的时间 ,而该过程大约只花费 1s 左右的时间。

mysqldump 重要参数

若表中有触发器,存储过程,那么在备份时需要注意什么?

mysqldump 的Tips

一般有触发器和存储过程时,建议将每个部分单独备份一份,备份时也要加上这两个参数--single-transaction --master-data=2,减小对数据库的影响

  1. 表结构
  2. 数据
  3. 存储过程
  4. 触发器
  5. event
  • --triggers
    Dump triggers for each dumped table. (Defaults to on; use --skip-triggers to disable.)

  • -d --no-data
    No row information

    mysqldump -d --triggers=false
    
  • -t --no-create-info
    Don’t write table creation info.

  • -n, --no-create-db
    Suppress the CREATE DATABASE … IF EXISTS statement that normally is output for each dumped database if --all-databases or --databases is given.

  • -R, --routines
    Dump stored routines (functions and procedures).

  • -E, --events
    Dump events.

  • -B, --databases
    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.

  • --tables
    Overrides option --databases (-B).

  • -w --where=name
    Dump only selected records. Quotes are mandatory.

应用案例:快速测试对一个上百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备份过程
  1. 主线程 FLUSH TABLES WITH READ LOCK,施加全局只读锁,以阻止DML语句写入,保证数据的一致性
  2. 读取当前时间点的二逬制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用
  3. N个(线程数可以指定,默认是4) dump线程START TRANSACTION WITH CONSISTENT SNAPSHOT;幵启读一致的事务
  4. dump non-InnoDB tables,首先导出非事务引擎表
  5. 主线程UNLOCK TABLES,非事务引擎表备份完后,释放全局只读锁 ;
  6. dump InnoDB tables,基于事务导出 InnoDB
  7. 事务结束

思考

如何从一个mysqldump文件中提取其中一个单表
使用 sed (该方法速度十分缓慢)
sed -n -e '/CREATE TABLE.*'tb_name'/,/UNLOCK TABLES/p' db_bak.sql> tb_nane.sql
  1. 使用 mydumper (文件拆分成单表存储)
有一个需求,把 test 库下的表,都 dump 成单表存储,如:t1.sql, t2.sql... 如何实现

使用 mydumper备份数据

如何从 mysqldump 备份出来的文件中恢复单表

思路:

使用权限,给某用户只授权该表的权限,使用参数-f忽略报错导入数据

假设要恢复的表为 db1.t2

  1. 创建tb_recovery数据库, 用来存放要恢复的单表
create database tb_recovery;
  1. 创建用户 '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;
  1. 使用 -f 选项导入备份文件
mysql -f -uuser_tb_recovery -puser_tb_recovery -h db_host -P db_port tb_recovery </backup_path/db_backup.sql
  1. 若原表db1.t2还存在,则将其改名为db1.t2_bak,待恢复确认无误后删除。
rename table db1.t2 to db1.t2_bak;
  1. 将步骤 3 恢复出来的表 tb_recovery.t2 移到 db1 库下
rename table tb_recovery.t2 to db1.t2;

需掌握知识点
  1. 学会利用 mysqldump 怎么拿到一致性备份
  2. 学会利用 mysqldump 只备份需要的数据
    --where="add_time >= xxx and add_time <= xxx"
  3. (重点)知道 mysqldump 原理获取及解读,讲解出来
  4. mydumper 下载编译一下,并行导出导入,动手做一下,知道 mydumper 原理获取及解读,讲解出来

Thinking

  1. zstd, pigz, gzip 压缩算法的比较,比较维度:1. 压缩耗费时间 2. 压缩比
    • zstd 和 pigz 可利用多核,gzip 只能用单核

你可能感兴趣的:(MySQL,mysql,mysqldump,逻辑备份)