MySQL 数据备份


一、数据备份介绍

1、为何要备份

  1. 在生产环境中,服务器的硬件坏了可以维修或者换新,软件崩溃可以修复或重新安装,但是如果数据没了那可就毁了,生产环境中最重要的应该就是数据了,所以,为了在数据丢失之后能够恢复数据,我们就需要定期的备份数据。
  2. 在生产环境中数据库可能会遭遇各种各样的不测从而导致数据丢失,为了以防数据丢失,保证数据的安全性,而进行数据备份。
  3. 常见的数据丢失问题:硬件故障、软件故障、自然灾害、黑客攻击、误操作 (常见的最多的,占比最大)

2、备份的内容

  1. 一般情况下,我们需要备份的数据分为以下几种:
    (1)数据
    (2)二进制日志,InnoDB事务日志
    (3)代码(存储过程、存储函数、触发器、事件调度器)
    (4)服务器配置文件

3、备份的类型

【冷备、温备、热备】

  1. 冷备:停库、停服务来备份
  2. 温备:不停库、不停服务来备份,会(锁表)阻止用户的写入
  3. 热备(建议):不停库、不停服务来备份,也不会(锁表)阻止用户的写入

【物理与逻辑】

  1. 物理备份:直接将底层物理文件备份
  2. 逻辑备份:通过特定的工具从数据库中导出 sql 语句或者数据,可能会丢失数据精度

【全量、差异、增量】

  1. 全量备份/完全备份(Full Backup):备份整个数据集(即整个数据库)
  2. 部分备份:备份部分数据集(例如:只备份一个表的变化),而部分备份又分为:差异备份和增量备份两种
    (1)差异备份(Differential Backup):每次备份都是基于第一次完全备份的内容,只备份有差异的数据(新增的、修改的、删除的),例如:
第一次备份:完全备份
第二次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
第三次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异

(2)增量备份(Incremental Backup):每次备份都是基于上一次备份的内容(注意是上一次,而不是第一次),只备份有差异的数据(新增的、修改的、删除的),所以增量备份的结果是一条链,例如:

第一次备份:完全备份
第二次备份:以当前时间节点的数据为基础,备份与第一次备份内容的差异
第三次备份:以当前时间节点的数据为基础,备份与第二次备份内容的差异

【数据的恢复】

  1. 全量备份的数据恢复:只需找出指定时间点的那一个备份文件即可,即只需要找到一个文件即可
  2. 差异备份的数据恢复:需要先恢复第一次备份的结果,然后再恢复最近一次差异备份的结果,即需要找到两个文件
  3. 增量备份的数据恢复:需要先恢复第一次备份的结果,然后再依次恢复每次增量备份,直到恢复到当前位置,即需要找到一条备份链

二、数据备份策略

1、备份策略的参考值

  1. 能够容忍丢失多少数据
  2. 恢复数据需要多长时间

2、备份策略的应用场景

  1. 如果数据量较小,可以直接复制数据库文件
  2. 如果数据量还行,可以先使用 mysqldump 对数据库进行完全备份,然后定期备份 BINARY LOG 达到增量备份的效果
  3. 如果数据量一般,而又不过分影响业务运行,可以使用 lvm2 的快照对数据文件进行备份,而后定期备份 BINARY LOG 达到增量备份的效果

三、备份实战

1、使用 cp 进行备份

代码如下(示例)

# 对所有表加锁(只能读,不能写)
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)

# 备份数据文件
# 创建数据存放目录
mkdir /home/backup
# 备份数据
cp -a /var/lib/mysql/* /home/backup/

# 模拟数据丢失(删除数据)
rm -rf /var/lib/mysql/*

# 恢复数据
cp -a /home/backup/* /var/lib/mysql

# 重启服务

2、使用 mysqldump 备份

代码如下(示例)

# mysqldump 使用语法:
mysqldump -h 服务器 -u用户名 -p密码 选项与参数 > 备份文件.sql

#参数选项:
-A或--all-databases     #表示所有库
-B或--databases         #表示备份 db1 db2 多个数据库,db1 使用数据库名,db1 t1 t2 db1 数据库的表 t1、t2
-F                      #备份的同时刷新 binlog
-R                      #备份存储过程和函数数据(如果开发写了函数和存储过程,就备,没写就不备)
--triggers              #备份触发器数据(现在都是开发写触发器)
-E或--events            #备份事件调度器
-d                      #仅表结构
-t                      #仅数据
--master-data=1         #备份文件中 change,master 语句是没有注释的,默认为1,用于已经制作好了主从,现在想扩展一个从库的时候使用,如此备份,扩展添加从库时导入备份文件后便不需要再加 mater_pos 了
   change matser to
   master_host='10.0.0.111'
   master_user='rep'
   master_password=123
   master_log_pos=120
   master_log_file='master-bin.000001'
--master-data=2         #备份文件中 change master 语句是被注释的
--lock-all-tables       #提交请求锁定所有数据库中的所有表,以保证数据的一致性,这是一个全局读锁,并且自动关闭
--single-transaction和--lock-tables   #这两个选项,他们是互斥的,于支持事务的表例如 InnoDB 和 BDB,推荐使用 --singletransaction 选项,因为它根本不需要锁定表
--single-transaction    #快照备份(搭配 --master-data 可以做到热备)该选项在导出数据之前提交一个 BEGIN SQL 语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅 InnoDB。本选项和 --lock-tables 选项是互斥的,不能同时存在,因为 LOCK TABLES 会使任何挂起的事务隐含提交

#完整语句的使用
mysqldump -uroot -pXXXXXX -A -R --triggers --master-data=2 --single-transaction > /backup/full.sql

#文件太大时可以压缩 gzip,但是 gzip 不属于 mysql 独有的命令,可以利用管道
mysqldump -uroot -pXXXXXX -A -R --triggers --master-data=2 --single-transaction | gzip > /tmp/full$(date +%F).sql.gz

#导出时压缩了,导入时需要解压,可以使用zcat命令
zcat /backup/full$(date +%F).sql.gz |

总结

以上就是今天要讲的内容,本文仅仅简单介绍了 MySQL 的数据备份,自动备份脚本后续更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值