MySQL 备份总结

  • 一、BinLog 二进制日志
    • 1.BinLog 日志内容
    • 2.BinLog 日志文件的表现形式
    • 3.BinLog 日志文件查看相关 MySQL 命令
    • 4.MySQL 二进制文件读取工具
    • 5.二进制日志格式
    • 6.备份类型
    • 7.根据备份整个数据还是变化数据
    • 8.MySQL 最常用的三种备份工具
  • 二、使用 LVM-Snapshot 工具备份
    • 1.准备 LVM 卷,并将 MySQL 数据迁移到 LVM 卷上
  • 三、使用 XtraBackup 工具备份
    • 1.原理
    • 2.安装 XtraBackup 工具
    • 2.完全备份与恢复
    • 3.增量备份与恢复

一、BinLog 二进制日志

1.BinLog 日志内容

  1. 引起 MySQL 服务器改变的任何操作(增 删 改)
  2. 复制功能依赖于此日志(MySQL 主从)
  3. Slave 服务器通过 Master 服务器的二进制日志完成主从复制,在执行之前保持于中继日志 relay log 中。
  4. Slave 服务器通常可以关闭二进制日志以提升性能。

2.BinLog 日志文件的表现形式

1)默认在 /usr/local/mysql/data/ 目录下,存在 mysql-bin.000001 mysql-bin.000002 的二进制文件

[root@MySQL ~]# sed -i '/\[mysqld]/a log-bin=mysql-bin' /etc/my.cnf
[root@MySQL ~]# sed -i '/\[mysqld]/a server-id=1' /etc/my.cnf
[root@MySQL ~]# head -3 /etc/my.cnf


什么时候二进制日志会重新生成:

  1. 重启 MySQL 服务:systemctl restart mysqld
  2. 在 MySQL 数据库中:flush logs;
  3. 根据 max_binlog_size 设置 MySQL 二进制文件最大值,达到最高值会自动创建。
[root@MySQL ~]# systemctl restart mysqld
[root@MySQL ~]# ls -l /usr/local/mysql/data/ | grep 'mysql-bin'

  • 注意:如果需要删除二进制日志时,切勿直接删除二进制文件,这样会使 MySQL 管理混乱。

3.BinLog 日志文件查看相关 MySQL 命令

1)查看正在使用的二进制日志文件

mysql> show master status;


2)手动滚动二进制日志文件

mysql> flush logs;


3)显示所有的二进制日志文件

mysql> show binary logs;

4.MySQL 二进制文件读取工具

格式:mysqlbinlog [参数] log-files

有以下四种参数选择:

  • --start-position:用来指定二进制日志文件的起始位置;--stop-position:用来指定二进制日志文件的结束位置。
  • --start-datetime:用来指定二进制日志文件的起始日期;--stop-datetime:用来指定二进制日志文件的结束日期。

使用 mysqlbinlog 工具来对 MySQL 进行增量备份:MySQL 增量备份与恢复

5.二进制日志格式

  • bin_log_format={ statement | row | mixed } 定义(5.7 版本之前是 statement5.7 版本之后是 row

1)statement

  • 基于语句,记录生成数据的语句。
  • 缺点:如果当插入信息为函数时,有可能不同时间点执行结果不一样。如 insert into test values(CURRENT_DATE())

2)row

  • 基于行数据,缺点在于,有时候数据量会过大。

3)mixed

  • 混合模式,由 MySQL 自行决定何时使用 statementrow 模式。

查看当前二进制日志记录格式

mysql> show variables like 'binlog_format';

  • 如果想要永久修改需:sed -i '/\[mysqld]/a binlog_format=模式' /etc/my.cnf 来进行修改。

6.备份类型

1)根据备份时,MySQL 服务是否在线

  • 冷备:停掉 MySQL 这个服务,读写操作都不能进行。
  • 温备:全局施加共享锁,只能读不能写。
  • 热备:不停掉 MySQL 这个服务,读写照样进行。

2)根据备份时的接口

  • 物理备份(Physical Backup):直接复制数据文件,打包归档。简单来说就是对 MySQL 的数据存放路径进行打包。
  • 逻辑备份(Logical Backup):把数据抽取出来保存在 SQL 脚本中,mysqldump 就属于逻辑备份。

各自特点:

  • 物理:不需要额外工具,直接归档命令即可,但是跨平台能力比较差;如果数据量超过几十个 G,则适用于物理备份。
  • 逻辑:导入方便,直接读取 SQL 语句即可;逻辑备份恢复时间慢,占用空间大;无法保证浮点数的精度;恢复完数据库后需要重建索引。

7.根据备份整个数据还是变化数据

1)完全备份:每次对数据进行完整的备份,即对整个数据库的备份(是差异备份与增量备份的基础)

  • 优点:备份与恢复操作简单方便。
  • 缺点:数据存在大量的重复;占用大量的空间;备份与恢复时间长。

2)差异备份

  • 备份那些自从上次完全备份之后被修改过的所有文件,备份的时间起点是从上次完全备份起,备份数据量越来越大。
  • 恢复数据时,只需要恢复上次的完全备份与最近的一次差异备份。

3)增量备份:只有那些在上次完全备份或增量备份后被修改的文件才会被备份。

  • 优点:占用空间小,备份速度快。
  • 缺点:如果中间某次的备份数据损坏,将导致数据丢失。

8.MySQL 最常用的三种备份工具

1)mysqldump:通常为数据小的情况下备份;单线程恢复比较慢。

  • InnoDB:热备,温备。
  • MyISAM,Aria:温备。

2)xtrabackup(通常用 innobackupex 工具):备份 MySQL 大数据;属于物理备份,速度快。

  • InnoDB:热备,增量备份。
  • MyISAM:温备,不支持增量备份,只有完全备份。

3)lvm-snapshot:接近于热备的工具,因为要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁;

  • 使用 cp tar 等工具进行物理备份;
  • 备份和恢复速度较快。
  • 很难实现增量备份,并且请求全局需要等待一段时间,在繁忙的服务器上尤其如此。

两者对比如下:

工具名称 mysqldump xtrabackup
备份方式 逻辑备份 物理备份
数据保存方式 SQL 脚本 二进制文件
是否支持热备份
是否支持增量备份
备份过程 会锁表 不锁表
是否影响正常业务 影响较大 影响较小
备份和恢复性能 耗时较长 耗时较短
占用空间 占用空间小 占用空间大

二、使用 LVM-Snapshot 工具备份

基于快照备份注意事项:

  1. 事务日志跟数据日志必须在同一个卷上。
  2. 创建快照卷之前,要请求 MySQL 的全局锁;在快照创建完成之后释放锁。
  3. 请求全局锁完成之后,做一次日志滚动;做二进制日志文件及位置标记(手动进行)

1.准备 LVM 卷,并将 MySQL 数据迁移到 LVM 卷上

1)创建分区

[root@localhost ~]# fdisk -l /dev/sdb


2)创建 PV、VG、LVM,并格式化

[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
[root@localhost ~]# vgcreate test /dev/sdb1 /dev/sdb2 /dev/sdb3
[root@localhost ~]# lvcreate -L +10G -n zhangsan test
[root@localhost ~]# mkfs.xfs /dev/test/zhangsan


3)创建目录,并挂载逻辑磁盘

[root@localhost ~]# mkdir /var/zhangsan
[root@localhost ~]# mount /dev/test/zhangsan /var/zhangsan/
[root@localhost ~]# df -hT


4)确认服务处于关闭状态,然后将数据迁移到 /var/zhangsan

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# tar -cf - . | tar xf - -C /var/zhangsan/

5)重新挂载 zhangsan 到 MySQL 数据库的主目录 /usr/local/mysql/data

[root@localhost ~]# umount /var/zhangsan/
[root@localhost ~]# mount /dev/test/zhangsan /usr/local/mysql/data/

6)审核权限并启动服务

[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -p123123
mysql> show master status\G
mysql> flush logs;
mysql> flush tables with read lock;
[root@localhost ~]# lvcreate -L +4G -s -n mysql /dev/test/zhangsan
[root@localhost ~]# mysql -uroot -p123123 -e "unlock tables;"

7)开启 MySQL 的二进制日志,并重启 MySQL 服务

[root@localhost ~]# sed -i '/\[mysqld]/a log-bin=mysql-bin' /etc/my.cnf
[root@localhost ~]# sed -i '/\[mysqld]/a server-id=1' /etc/my.cnf
[root@localhost ~]# systemctl restart mysqld
mysql> create database Coco;
mysql> use Coco;
mysql> create table test(ID int);
mysql> insert into test values(1),(2),(3);
[root@localhost ~]# cp /usr/local/mysql/data/mysql-bin.000001 /opt/

模拟数据库故障

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# umount /dev/test/zhangsan

恢复

[root@localhost ~]# mount /dev/test/zhangsan /usr/local/mysql/data/
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -p123123 -e "select * from Coco.test;"

三、使用 XtraBackup 工具备份

Percona XtraBackup(简称 PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQL、Percona Server 和 MariaDB,并且全部开源。

1.原理

  • 通信方式:2 个工具之间的交互和协调是通过控制文件的创建和删除来实现的。
  • 主要文件有:xtrabackup_suspended_1 xtrabackup_suspended_2 xtrabackup_log_copied

备份时 xtrabackup_suspended_2 协调这两个工具进程过程如下:

  1. ib 在启动 xb 进程后,会一直等 xb 备份完 InnoDB 文件,方式就是等待 xb_suspended_2 这个文件被创建出来。
  2. xb 在备完 InnoDB 数据后,就在指定目录下创建出这个文件,然后等这个文件被 ib 删除。
  3. ib 检测到文件 xb_suspended_2 被创建出来后,就继续往下走。
  4. ib 在备份完非 InnoDB 表后,删除 xb_suspended_2 这个文件,这样就通知 xb 可以继续了,然后等待 xb_log_copied 被创建。
  5. xb 检测到 xb_suspended_2 文件删除后,就可以继续往下了。

备份过程:

  • innobackupex 在启动后,会先 fork 一个进程,来启动 xtrabackup 进程,然后等待 xtrabackup 备份完 InnoDB 数据文件;
  • xtrabackup 备份完时,会通过创建文件来通知 innobackupex 进程,接着 innobackupex 进程会去备份非 InnoDB 数据文件。

  • Redo 文件:是存储引擎层(InnoDB)生成的日志,主要为了保证数据的可靠性。
  • Ibd 文件:InnoDB 引擎开启的表空间,用来存储表的数据和索引。

2.安装 XtraBackup 工具

[root@MySQL ~]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5
[root@MySQL ~]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm
[root@MySQL ~]# tar xf percona-xtrabackup2.4.5-Linux-x86_64.tar.gz -C /usr/src/
[root@MySQL ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
[root@MySQL percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/

XtraBackup 中主要包含两个工具:

xtrabackupPerl 脚本):

  • 用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互。

innobackupexC/C++ 编译的二进制):

  • 用来备份非 InnoDB 表的,同时会调用 xtrabackup 命令来备份 InnoDB 表;
  • 还会和 MySQL Server 发送命令来进行交互,如加读锁 ftwrl、获取位点 show slave status 等。

简单来说就是 innobackupexxtrabackup 之上做了一层封装。

常用选项 作用
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录

2.完全备份与恢复

[root@MySQL ~]# innobackupex --user=root --password=123123 /backups

查看备份数据

[root@MySQL ~]# ls /backups/
[root@MySQL ~]# ls -l /backups/2021-05-19_22-31-36/


注解:

  • backup-my.cnf:备份用到的配置选项信息文件。
  • xtrabackup_binlog_info:MySQL 当前正在使用的二进制日志文件和此时二进制日志文件时间的位置信息文件。
  • xtrabackup_checkpoints:备份的类型、状态和 LSN 状态信息文件。
  • xtrabackup_logfile:备份的日志文件。

删除原有的数据

[root@MySQL ~]# rm -rf /usr/local/mysql/data/*

合并数据,使数据文件处于一致性的状态

[root@MySQL ~]# innobackupex --apply-log /backups/2021-05-19_22-31-36/

恢复数据

[root@MySQL ~]# innobackupex --copy-back /backups/2021-05-19_22-31-36/
[root@MySQL ~]# ls -l /usr/local/mysql/data/
[root@MySQL ~]# chown -R mysql:mysql /usr/local/mysql/data/


总结:

  1. innobackupex 完全备份,并指定备份目录路径。
  2. 在恢复前,需要使用 --apply-log 参数先进行合并数据文件,确保数据的一致性要求。
  3. 在恢复时,直接使用 --copy-back 参数进行恢复,需要注意的是,在 my.cnf 中要指定数据文件目录的路径。

3.增量备份与恢复

[root@MySQL ~]# innobackupex --user=root --password=123123 /backups
  • 注意:增量备份前提是需要有完全备份(因为上面已经做过了,所以不再配置)
[root@MySQL ~]# mysql -uroot -p123123
mysql> create database Coco;
mysql> use Coco;
mysql> create table test(ID int);
mysql> insert into test values(1),(2),(3);

使用 innobackupex 进行增量备份

[root@MySQL ~]# innobackupex --user=root --password=123123 \
--incremental /backups/ \
--incremental-basedir=/backups/2021-05-19_23-00-37/

查看备份数据

[root@MySQL ~]# ll /backups/
[root@MySQL ~]# cat /backups/2021-05-19_23-00-37/xtrabackup_checkpoints
[root@MySQL ~]# cat /backups/2021-05-19_23-23-45/xtrabackup_checkpoints


删除数据库中所有数据

[root@MySQL ~]# rm -rf /usr/local/mysql/data/*

合并全备数据目录,确保数据的一致性

[root@MySQL ~]# innobackupex --apply-log --redo-only /backups/2021-05-19_23-00-37/

将增量备份数据合并到全备数据目录当中

[root@MySQL ~]# innobackupex --apply-log --redo-only /backups/2021-05-19_23-00-37/ \
--incremental-dir=/backups/2021-05-19_23-23-45/


恢复数据

[root@MySQL ~]# innobackupex --copy-back /backups/2021-05-19_23-00-37/
[root@MySQL ~]# chown -R mysql:mysql /usr/local/mysql/data/
[root@MySQL ~]# mysql -uroot -p123123 -e "select * from Coco.test;"


总结:

  1. 增量备份需要使用 --incremental 参数来指定需要备份到哪个目录,使用 incremental-dir 参数来指定全备目录。
  2. 进行数据备份时,需要使用 --apply-log redo-only 参数来先合并全备数据目录数据,确保全备数据目录的一致性。
  3. 再将增量备份数据使用 --incremental-dir 参数来合并到全备数据当中。
  4. 最后通过全备数据来进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

MySQL 备份总结相关推荐

  1. php mysql备份脚本_MySQL备份脚本,mysql脚本

    MySQL备份脚本,mysql脚本 mysqlbackup.php: php//备份mysql set_time_limit(0); date_default_timezone_set('PRC'); ...

  2. MySQL 备份和恢复策略

    在数据库表丢失或损坏的情况下,备份你的数据库是很重要的.如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态.本文主要对MyISAM表做备份恢复. 备份策略一:直接拷贝数据 ...

  3. Mysql备份与还原及优化方法

    Mysql备份一般采用mysqldump命令,命令形式一般如下: $ mysqldump –hhostname –uuser –ppassword–Pport db_name > db_name ...

  4. Centos 6.4下MySQL备份及还原详情介绍

    我们前面文中中介绍了centos 6.4下MySQL的安装及配置,安装后为了保证数据的安全性所以我们同样也要学会备份及还原,备份及还原操作在我们的真实工作环境中是必不可少的,由于是对数据库数据备份,所 ...

  5. mysql备份psd文件没有数据_两套mysql备份脚本

    数据备份其重要性无需多言,再细想一步,我们至少需要两种备份:一种逻辑备份(mysqldump生成sql文件):一种物理备份(xtrabackup可很好完成).逻辑备份在出问题时能提供更细粒度的恢复和对 ...

  6. 小记mysql备份同库中一张表的历史记录

    mysql备份同库中一张表的历史记录 insert into -select 需求 如今有个这么一个需求.mysql中有个表.数据增长的非常快.可是呢这个数据有效期也就是1个月,一个月曾经的记录不太重 ...

  7. MariaDB/MySQL备份和恢复(三):xtrabackup用法和原理详述

    MariaDB/MySQL备份恢复系列: 备份和恢复(一):mysqldump工具用法详述 备份和恢复(二):导入.导出表数据 备份和恢复(三):xtrabackup用法和原理详述 xtrabacku ...

  8. 关系型数据库之Mysql备份(五)

    二进制日志简要: 二进制日志通常作为备份的重要资源,所以再说备份之前我们来回顾下前面专题讲过的二进制日志内容. 1.二进制日志内容 引起mysql服务器改变的任何操作. 复制功能依赖于此日志. 从服务 ...

  9. mysql备份恢复实验

    内容大纲: 一 mysqldump备份 二 sql语句备份 三 mysqlbinlog备份恢复 一 mysqldump数据文件备份恢复 mysql> use cw_d; Database cha ...

  10. c mysql备份还原数据库_如何备份和还原MySQL数据库?

    MySQL是一个永久存储数据的数据库服务器.如果使用MySQLServer,那么需要创建数据库备份以便从崩溃中恢复.mysql提供了一个用于备份的实用程序mysqldump.在本文中,将介绍关注与.s ...

最新文章

  1. 2019北京智源大会完整议程重磅揭晓!
  2. SAP S/4HANA CDS View的访问控制实现:DCL介绍
  3. 数据库的完整性和安全性
  4. 罗马音平假名片假名转换器_记不住五十音的你,你肯定需要这套日语五十音谐音巧记法...
  5. Spring : SpringBootConfiguration 注解
  6. 中国体声波器件市场趋势报告、技术动态创新及市场预测
  7. 曼秀雷敦搜索引擎营销方案_搜索引擎营销——被严重低估的互联网营销途径
  8. 还不会回答Spring Boot和Spring MVC的关系?大厂Java高级面试官告诉你答案!
  9. some tools
  10. vbs进阶——常用函数之inputbox篇(末尾有彩蛋)
  11. 面向对象程序设计中对抽象的理解
  12. Linux内核之misc框架
  13. 如何在计算机里查找最新文件,在电脑上怎么查找目标文件
  14. 2048小游戏项目总结
  15. '.'和'..'还有'./'和'../'
  16. Flutter自定义Decoration实现特殊的背景框
  17. rust 模块/文件/project
  18. pdf.net sod oracle,SOD: 原PDF.NET框架将成为一个全功能的企业开发框架,而 SOD框架将是PDF.NET开发框架下面的 “数据开发框架...
  19. 根据当前ip地址获取地理位置
  20. js 获取某一年第多少天是周几

热门文章

  1. ModelMap的用法
  2. java获取项目绝对路径_如何获取项目绝对路径?
  3. iPhone升级iOS 15后无法正常开机,怎么解决?
  4. 如何调整竖屏视频为橫屏的最快捷的方法
  5. mtk 调试方法总结
  6. 萌宠大作战服务器维护,庆典活动—萌宠大作战
  7. 2022-2027年中国花岗岩石材市场规模现状及投资规划建议报告
  8. IMF首席经济学家:2018年中国经济增速符合预期
  9. byte字节流和bitmap互相转换
  10. 花了整整一天,总结了C语言所有常用的文件操作