ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

  • 数据库服务

    • MySQL笔记

      • MySQL介绍与部署
      • MySQL结构与启动配置
      • 数据库SQL语句
      • MySQL元数据与视图
      • MySQL索引及优化方式
      • MySQL存储引擎与事务
      • MySQL二进制日志与慢日志
      • MySQL数据备份
        • 备份相关工作
          • 备份策略的设计
          • 备份策略的实现
        • mysqldump命令
          • 参数
        • 数据备份恢复流程
      • MySQL主从复制
    • ELK笔记

    • Redis笔记

    • MongoDB笔记

    • Git笔记

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 数据库服务
  • MySQL笔记
Hoshinozora
2023-03-21
目录

MySQL数据备份

# 备份相关工作

# 备份策略的设计

  • # 备份周期的规划

    • 全量备份的备份周期可以根据数据量决定。数据量只需要30分钟就能备份完,可以每天一备份,数据量比较大的比如说以T为单位的可以一周一次备份。

    • 增量备份可以在各个时段备份binlog日志,比如半天一备份,一天一备份。

  • # 备份工具的选择

    • mysqldump、mysqlbinlog、percona Xtrabackup(PBK)。
  • # 备份方式的选择

    • 是物理备份还是逻辑备份,逻辑备份就是通过导出数据或者SQL之类的东西进行备份,物理备份就是直接备份数据库在磁盘上的物理文件。
    • 物理备份的全备和增量备份都可以使用PBK。
    • 逻辑备份的全备和增量备份可以使用mysqldump+binlog日志备份。binlog备份就是使用flush刷新一次,然后将除了最后一个的数据文件全部拷贝走。
  • # 备份类型

    • 热备 - 在业务运行时进行备份,对业务影响小,只有InnoDB引擎支持热备,直接通过mysqldump备份即可。另外主从同步实际上也是一个热备。

    • 温备 - 长时间锁表备份,MyISAM引擎支持温备。

    • 冷备 - 业务关闭的情况下备份,任何存储引擎都支持冷备。

# 备份策略的实现

  • # 备份脚本 + crontab定时任务

    • 一周的其中1天执行全备,一周内的每一天执行增量备份。
  • # 检查备份可用性

    • 每天第一件事就是检查数据备份的可用性,然后再去看监控、检查慢日志等。
    • 如果对备份位置不熟悉,可以通过crontab -l找到备份脚本,然后通过脚本找到备份路径。
    • 一般可以通过检查备份脚本的日志、检查备份文件的大小、内容中是否有建库建表语句等。
  • # 定期的恢复演练

    • 只要备份和日志是完整的,就要能快速的恢复到故障之前的时间点。
    • 时间越长,对业务影响越大,所以定期的恢复演练很重要,一般一个季度或半年。

# mysqldump命令

mysqldump是MySQL官方提供给我们的数据导出工具,在日常运维工作当中,我们会频繁的用到mysqldump工具来进行数据备份导出操作。

  • mysqldump [参数] | gzip > [备份文件路径].sql
    • 一般还会先将mysqldump输出的数据进行压缩,然后再重定向到文件。

# 参数

# 连接数据库相关参数

执行mysqldump命令首先需要连接数据库并登录用户,且需要有一定的管理权限才能备份。

  • -u[用户名]
  • -p [密码]
  • 一般会将密码保存在一个文件中,然后权限设为600,在执行备份命令时通过命令读取,而非直接写在脚本文件中。
  • -S [Socket路径]
  • -h 主机IP
  • -P 主机MySQL端口

# 基础备份参数

  • # -A 全部库备份
    • 例如:mysqldump -uroot -p123 -A > [备份文件路径].sql
  • # -B [库名1] [库名2]... - 指定库备份 (分库备份)
    • -B后面跟的都必须全是数据库名。
    • 例如:mysqldump -uroot -p123 -B [库名1] [库名2] [库名3]... > [备份文件路径].sql
  • # [库名] [表名1] [表名2]... - 分库分表备份
    • 库名后面跟的都必须全是表名。
    • 例如:mysqldump -uroot -p123 [库名] [表名1] [表名2]... > [备份文件路径].sql
  • # [库名] - 备份指定数据库下所有表
    • 与-B的区别是,该方式备份的是表。-B多了个建库语句和USE语句,所以库级别的备份用-B,表级别的备份用[库名]。
    • 例如:mysqldump -uroot -p123 [库名] > [备份文件路径].sql

# 特殊备份参数

  • -R - 备份存储过程和函数,如果有则会备份。

  • -E - 备份事件,如果有则会备份。

  • --triggers - 备份触发器,如果有则会备份。

  • --master-data=2 - 在备份文件中记录binlog日志的最后位置信息,最后位置可在以后通过binlog恢复数据时作为起始点。

    • 例如:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000023', MASTER_LOG_POS=194;
    • 等于1时,将会以命令的方式记录 (一般不使用)。
    • 等于2时,将会以注释的方式记录 (一般使用)。
      • 如果不带--single-transaction参数,会自动锁表进行备份 (温备份)。
      • 如果同时带--single-transaction参数,则对于InnoDB引擎的表,会进行不锁表备份 (快照备份)。
  • --single-transaction - 在备份时创建一致性快照进行备份。

    • 对于InnoDB引擎的表会进行一致性快照备份不会锁表,另外因为是快照备份所以只会备份开始备份之前的数据。
  • --set-gtid-purged=auto - 在备份文件中添加gtid信息。

    • 会在备份文件中添加GTID:1-N,表示这个备份中有1-N号事务的数据,在恢复后会告诉mysql已经有1-n号事务了,binlog使用UUID还原时会自动跳过1-n号事务,也可以作为起始点:N+1。
    • 默认是auto,相当于ON,所以可以不添加该参数。

# 扩展参数

  • --max_allowed_packet=128M - 传输的数据包最大大小

    • 备份时如果一个表非常大,传输时超过了数据包最大大小可能就会报错,如果报错超出,就添加该参数进行调整。
  • -F - 备份时滚动binlog日志

    • 指定该参数后,备份时每有一个库就会滚动出一个新的binlog日志,所以不用,会刷出很多binlog文件。
    • 一般可以使用MySQL语句手动滚动flush logs;。

# 数据备份恢复流程

  1. 先则停业务,挂维护页面。
  2. 查找可用备份,先找到全备数据文件内的binlog文件信息和位置信息或GTID信息。
  3. 再通过mysqlbinlog命令加上--base64-output=decode-rows -vvv参数查看binlog文件中的数据,分析出问题故障发生点。最终找到问题故障发生前的数据点,将其位置信息或者GTID信息获取下来。
  4. 然后通过mysqlbinlog --skip-gtids和位置开始结束参数,或者GTID参数对binlog日志文件进行截取导出。
  5. 检查没问题后,就开始恢复,提前准备一个临时库。
  6. 进入数据库中,将log_bin暂时设为0,防止将数据恢复的操作再次记录。
  7. 然后再source导入全备数据和binlog截取的数据。
  8. 这样临时库就恢复到了数据库数据丢失或数据库崩溃以前的状态,然后验证数据。
  9. 最后,要么直接用临时库替换生产库,要么就将丢失数据的库或表导出,然后导入生产库。
#数据库#MySQL#存储引擎#数据备份
MySQL二进制日志与慢日志
MySQL主从复制

← MySQL二进制日志与慢日志 MySQL主从复制→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式