MySQL 逻辑 & 物理备份全攻略:指令大全 + 实战指南

备份导入(恢复)注意事项

(1)参数检查

  • autocommit:必须开启,不然会导致数据库hang住
  • wait_timeout \ interactive_timeout:建议调大,设置过小,且导入时间长,会导致还没 导入完,会话超时断开连接,导致任务失败。
  • set session wait_timeout=28800; \ set session interactive_timeout=28800; max_allowed_packet = 128M #防止包过大而失败

(2)检查 SQL文件中所要 DROP 的表是否是自己预期内的

  • less xxxxx.sql | grep -E "^DROP TABLE IF EXISTS 

(3)使用PV工具监控文件导入过程,精准估算剩余时间及完成时间

#参数说明:

  • #-W:在需要密码输入时有用,可等待密码输出完成,再开启监控进度条
  • #-L:限流,将传输限制在每秒最大字节的范围内(大小可自定义,单位可变) 

 一.mysqldump

非一致性备份(生产不可用)

mysqldump -uroot -p -P3306 test > /data/backup/user_`date +%Y%d%m`_0.s

原理解析
  1. 连接数据库建立 connect
  2. 获取当前 GTID 信息
  3. 查看需要备份的 DB 和 table
  4. 对表加 read lock
  5. show create table 备份表结构和数据(循环至整个 DB 表备份结束)
  6. 释放 read lock
缺陷: 
  1. 备份数据不一致
  2. 备份锁表时间时长和备份内容成正比
  3. 适合非事务引擎的一致性备份 

 ⼀致性备份

mysqldump -uroot -p -P3306 --master-data=2 --single-transaction -B test> /data/backup/test_`date +%Y%d%m`.sql

原理解析
  1. 连接数据库建立 connect
  2. Flush table(无 --master-data 无此步骤):
  3. 检查是否能进行加锁一致性备份,减少 FTWRL 锁表时间。有则等之,无则进行加 FTWRL(确保如果 update 事务执行后立马加锁)。关闭所有打开的表,强制关闭所有正在使用的表,并且将所有更新的数据刷新到磁盘,这个时间不会锁表。
  4. FLUSH TABLES WITH READ LOCK --> 如果不加参数 --master-data 就无此步骤
  5. 执行 flush tables 操作,并且加一个全局读锁。
  6. 设置 RR 事务隔离级别,准备快照一致性读。
  7. START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */:
  8. 开启一个一致性快照的事务,--single-transaction 决定。

备份命令大全 

备份

1. 生产单库备份命令
mysqldump -uroot -P3306 --default-character-set=utf8mb4 --single-transaction --master-data=2 --triggers --events --routines -B test --set-gtid-purged=off >/data/backup/mysql3306_`date +%Y%d%m `-test.sql

2.整实例备份 (不推荐使用)
mysqldump -uroot -P3306 --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF  --all-databases   --master-data=2 --triggers --events --routines >/data/backup/mysql3306_`date +%Y%d%m`-backup_db01.sql

3.备份单表 
mysqldump -uroot  -P3306 --default-character-set=utf8mb4 --single-transaction --master-data=2 --triggers --events --routines -B test --tables test1   --set-gtid-purged=off >/data/backup/test1.sql

4.按条件备份数据库
mysqldump -uroot -P3306 --default-character-set=utf8mb4 --single-transaction --master-data=2 --triggers --events --routines -B test --tables test1 --set-gtid-purged=off --where='id=1' >/data/backup/test1.sql

5.只导出表结构
mysqldump -uroot  -P3306  -d --single-transaction  --set-gtid-purged=OFF  --master-data=2  --triggers --events --routines  test test1 > /data/backup/test.sql

6.只备份数据 
mysqldump -uroot -P3306 --default-character-set=utf8mb4 --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --hex-blob --no-create-info test test1 > /data/backup/test1_only_data.sql

 恢复

1.命令行文件导入
mysql -uroot -p -P3306  test test1 < /data/backup/test1_only_data.sql

2. source导入
source /chj/class/backup/t1.sql;

 

监控恢复进度 

pv -W -L 10K /data/backup/test1.sql| mysql -uroot -P3306 test

#-W:在需要密码输入时有用,可等待密码输出完成,再开启监控进度条
#-L:限流,将传输限制在每秒最大字节的范围内(大小可自定义,单位可变) 

 二.mydumper&myloader

 mysqldump无法并行,这点与Oracle的expdp相比,存在一定的劣势,但是开源的mydumper是一个很好的补充。

原理解析

  1. 主线程 FLUSH TABLES WITH READ LOCK,阻止 DML 语句写入,保证数据的一致性
  2. 读取当前时间点的二进制日志文件名和日志写入的gtid并记录在 metadata 文件中。
  3. n个(线程数能够指定,默认是 4)dump线程开启并启用一致的事务 START TRANSACTION WITH CONSISTENT SNAPSHOT;
  4. dump non-InnoDB tables,首先导出非事务引擎的表(如果指定--trx-consistency-only则忽略)
  5. 主线程 UNLOCK TABLES 非事务引擎备份完成后,释放全局只读锁
  6. dump InnoDB tables,事务备份 InnoDB 表
  7. 事务结束

 1.单库单表备份

mydumper   -P 3306  -u root -t 8 -F 64 --trx-consistency-only -v 3  -G -E -R -B test -T test1  -L /data/backup/test1.log  -o /data/backup/test1

2.数据导入

myloader -P 3306  -u root   -t 8 -L /data/backup/loader.log  -d /data/backup/test1

三.mysqlpump 

MySQL5.7之后多的一个备份工具:mysqlpump。

例子

mysqlpump --exclude-databases=mysql,sys  #备份过滤mysql和sys数据库

mysqlpump --exclude-tables=test1,test2   #备份过滤所有数据库中test1,test2表

mysqlpump -B test --exclude-tables=test1,test2 #备份过滤test库中的test1、test2表

四.select..into outfile,load data & mysqlimport 

 1. 高效读取文本数据到制定库表中

2. 适合异构迁移(可以灵活制定数据导入) 场景:- 大数据结果集导入.- 测试造数

3.工具分类- select .. into outfile导出工具- load data & mysqlimport导入工具

 1.SELECT ... INTO OUTFILE

2. 使用 LOAD DATA INFILE 导入数据

 

3. 使用 mysqlimport 导入数据

五.物理备份Xtrabackup

主要特性:热备,增量备份MySQL,流压缩传输其他服务器,在线移动表,轻易创建主从,备份MySQL服务不会增大服务器负载

备份方式

  • 全量备份:快速恢复数据,占据空间过多,备份时间长
  • 增量备份:基于上次全量或者增量,对数据库修改进行备份,省空间,省备份速度,但是恢复慢,且复杂
  • 日志备份:针对Mysql二进制日志,结合使用,使数据库恢复到任意位置
全量备份原理
  • 首先会启动一个 xtrabackup_log 后台检测的进程,实时检测 MySQL redo 的变化,一旦发现 redo 有新的日志写入,立刻将日志写入到日志文件 xtrabackup_log 中。
  • 复制 InnoDB 的数据文件和系统表空间文件 ibdata1 到对应的以默认时间戳为备份目录的地方。
  • 复制结束后,执行 flush table with read lock 操作。
  • 复制 .frm .myd .myi 文件。
  • 并且在这一时刻获取 binary log 的位置。
  • 将表进行解锁 unlock tables。
  • 停止 xtrabackup_log 进程。
     

增量备份原理

增量备份主要是通过拷贝 InnoDB 中有变更的页(指的是 LSN 大于 xtrabackup_checkpoints 中的 LSN 号)。增量备份是基于全备的,第一次增量备份的数据是基于上一次全备,之后的每一次增量都是基于上一次的增量,最终达到一致性的增备。增备的过程中,和全备很类似,区别在于第二步。

 安装Xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
示例
普通磁盘全备:
xtrabackup --defaults-file=/data/mysql3306/etc/my.cnf  --port=3306 --user root  --backup-lock-timeout=1  --parallel=8 --use-memory=2G --backup --target-dir=/data/backup/xtrabackup/

全量数据恢复: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值