本文基于mysql(8.0.20)及xtrabackup(8.0.13)最新版本,实现了完整的mysqldump逻辑备份、binlog增量备份、xtrabackup物理备份恢复,帮你快速掌握操作要点

主要内容:

  • 基础环境搭建

  • mysqldump逻辑备份及恢复

    • 数据准备

    • 全量备份

    • 全量恢复

    • 其他备份

  • Xtrabackup物理备份及恢复

    • 程序安装

    • 全量备份及恢复

    • 增量备份及恢复

  • binlog增量备份及恢复

  • 更多说明

    • mysql时区配置

    • 参考资料

基础环境搭建

本文相关环境均基于docker实现,下面是启动一个最基本的mysql数据库:

docker run --name mysql-dump-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=user -d mysql

mysqldump逻辑备份及恢复

在开展备份之前,需要先准备如下的测试数据:

数据准备

create table if not exists t_user1(    id         bigint(20) auto_increment primary key comment '主键',    name       varchar(64) comment '用户名称',    birth_date timestamp comment '生日',    assert     decimal(10, 2) comment '资产') engine = InnoDB  charset utf8mb4 comment '用户表';

insert into t_user1(name, birth_date, assert)values ('zhangsan', now(), 1123000.99);

insert into t_user1(name, birth_date, assert)values ('lisi', now(), 1159000.99);

insert into t_user1(name, birth_date, assert)values ('wangwu', now(), 12341234.00);

如上,创建一张测试表,并插入3条测试数据。

全量备份

全量备份基本模式:

  • 进入到mysql容器中
  • 创建备份目录
  • 通过mysqldump命令,执行数据库逻辑备份操作,将结果输出到 sql文件中。

主要命令如下:

# 级联创建数据备份目录mkdir -p /data/backups/dmp# 实现所有数据库备份mysqldump --opt --single-transaction --master-data=2 --host=localhost --user=root --password=admin --all-databases > /data/backups/dmp/dmp1.sql

mysqldump相关参数说明:

  • --opt 适用于备份大表,同时激活了-add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 命令
  • --single-transaction 开启一个事务,并设置备份事务为可重复读,保持备份数据一致性
  • --master-data=2 表示在备份过程中记录主库的binlog和pos点,并且在dump文件中注释改行
  • --all-databases 导出所有数据库,包括mysql库

全量恢复

通过在上述库中,执行drop table t_user1,删除该表后,开展恢复:

  • 通过mysql命令,即可将 dump sql文件执行到对应的数据库中。
mysql -h localhost -u root -p 

其他备份

1、导出指定数据库的指定表:

  • --databases 指定备份的数据库
  • --tables 指定备份的具体数据库表
mysqldump --opt --single-transaction --master-data=2 --host=localhost --user=root -p --databases user --tables t_user1 > /data/backups/dmp/dmp2.sql

2、只导出建表语句:

  • --no-data 申明不导出数据,只导出表结构
mysqldump --host=localhost --user=root -p --databases user --tables t_user1 --no-data > /data/backups/dmp/dmp3.sql 

3、条件备份:

  • --where 来指定具体的查询条件
  • --no-create-db 申明不导出数据库创建等信息
  • --no-create-info 申明不导出创建表等信息,这样就可以避免数据表被删除
mysqldump --single-transaction --no-create-db --no-create-info --default-character-set=utf8 --host=localhost --user=root --password=admin --databases user --tables t_user1  --where="id >=3" > /data/backups/dmp/dmp4.sql

Xtrabackup物理备份及恢复

当前xtrabackup的8.0.13已经支持 mysql 8.0.20版本(8.0.20版本对innodb的数据文件模式进行了修改)

程序安装

与mysql环境一样,需要将xtrabackup安装到mysql容器中:

  • 在 https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ 中下载二进制包,例如当前docker-mysql容器是 debian的buster系统,则下载对应的文件percona-xtrabackup-80_8.0.13-1.buster_amd64.deb
  • 因为上述文件安装会还会依赖其他库,因此要将 /etc/apt/sources.list内容替换为国内镜像,例如阿里云的。
  • 更多安装说明,参考https://www.percona.com/doc/percona-xtrabackup/8.0/installation/apt_repo.html

原/etc/apt/sources.list文件内容如下:

# deb http://snapshot.debian.org/archive/debian/20200422T000000Z buster maindeb http://deb.debian.org/debian buster main# deb http://snapshot.debian.org/archive/debian-security/20200422T000000Z buster/updates maindeb http://security.debian.org/debian-security buster/updates main# deb http://snapshot.debian.org/archive/debian/20200422T000000Z buster-updates maindeb http://deb.debian.org/debian buster-updates main

将内容全部替换为:

deb http://mirrors.aliyun.com/debian/ buster main non-free contribdeb http://mirrors.aliyun.com/debian-security buster/updates maindeb http://mirrors.aliyun.com/debian/ buster-updates main non-free contribdeb http://mirrors.aliyun.com/debian/ buster-backports main non-free contribb

具体命令操作:

# 将容器中的文件拷贝出来docker cp mysql-dump-test:/etc/apt/sources.list D:\dev2\test\mysqldump# 将修改后的文件覆盖回容器中docker cp D:\dev2\test\mysqldump\sources.list mysql-dump-test:/etc/apt/# 进入容器以后,执行下面命令更新apt信息apt-get update

完成上述准备工作以后,即可开始安装xtrabackup:

  • 将下载好的文件percona-xtrabackup-80_8.0.13-1.buster_amd64.deb,拷贝到容器中
  • 通过dpkg来安装,第一次执行会报错,根据错误提示信息,发现最底部依赖libev4
  • 执行apt install libev4,此时依然会报错,根据提示信息,执行apt --fix-broken install,此时会下载和安装所有依赖包。
  • 上一步执行完成后,再次执行dpkg名称,完成安装

具体命令操作如下:

# 将下载文件拷贝到容器中docker cp D:\dev2\test\mysqldump\percona-xtrabackup-80_8.0.13-1.buster_amd64.deb mysql-dump-test:/data# 执行第一次安装,此时会出现错误提示dpkg -i percona-xtrabackup-80_8.0.13-1.buster_amd64.deb# 执行libev4 安装,也会出错apt install libev4# 执行相关依赖安装apt --fix-broken install# 再次执行,完成安装dpkg -i percona-xtrabackup-80_8.0.13-1.buster_amd64.deb

全量备份及恢复

安装成功后,即可测试全量备份:

  • 提前建立好 /data/backups/ 目录
  • 通过查看用户手册,整个备份及恢复主要是三个过程:backup、prepa、copy-back

具体命令操作如下:

# 启动全量备份xtrabackup --backup --target-dir=/data/backups/base1 --user=root --password=admin# 通过执行drop table t_user1来模拟误操作# 准备全量恢复xtrabackup --prepare --target-dir=/data/backups/base1# 将备份文件同步到mysql数据文件目录中rsync -avrP /data/backups/base1/ /var/lib/mysql/# 退出容器后,执行容器重启,完成恢复docker restart mysql-dump-test

同时,上述rsync也可以用如下命令替代,但需要保证datadir(也即/var/lib/mysql/)是空的:

xtrabackup --copy-back --target-dir=/data/backups/base1

增量备份及恢复

增量备份及恢复过程如下:

  • 先创建全量备份
  • 再在全量备份基础上,执行增量备份
  • 恢复时,先执行全量路径的prepare,再执行增量路径的prepare

备份具体操作:

# 全量备份xtrabackup --backup --target-dir=/data/backups/base2 --user=root --password=admin

# 第一次增量备份xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base2 --user=root --password=admin

# 第二次增量备份xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1 --user=root --password=admin

恢复具体操作:

# 先恢复全量备份xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base2# 逐项恢复增量备份xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base2 --incremental-dir=/data/backups/inc1xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base2 --incremental-dir=/data/backups/inc2# 将恢复文件进行同步rsync -avrP /data/backups/base2/ /var/lib/mysql/# 退出容器后,执行容器重启,完成恢复docker restart mysql-dump-test

binlog增量备份及恢复

binlog增量备份及恢复主要过程:

  • 在全量逻辑备份时,增加--flush-logs,目的是将缓存写入到binlog,并开始一个新的binlog
  • 执行误操作以后,通过定位到对应binlog文件位置,通过mysqlbinlog实现增量恢复

先执行全量备份:

# 执行全量备份mysqldump --opt --single-transaction --master-data=2 --flush-logs --host=localhost --user=root --password=admin --databases user > /data/backups/dmp/dmp3.sql

下面是模拟误操作(新增一条记录后,删除数据表):

insert into t_user1(name, birth_date, assert)values ('maliu', now(), 12341234.00);

drop table t_user1;

接下来是具体binlog定位及分析过程:

1、通过show variables like 'log_bin%'命令,查看binlog路径,具体输出如下:

Variable_name,Valuelog_bin,ONlog_bin_basename,/var/lib/mysql/binloglog_bin_index,/var/lib/mysql/binlog.indexlog_bin_trust_function_creators,OFFlog_bin_use_v1_row_events,OFF

2、通过show master logs,查看当前binlog明细

Log_name,File_size,Encryptedbinlog.000001,3101453,Nobinlog.000002,179,Nobinlog.000003,3382334,Nobinlog.000004,684,No

3、通过show master status查看最新binlog状态

File,Position,Binlog_Do_DB,Binlog_Ignore_DB,Executed_Gtid_Setbinlog.000004,684,"","",""

4、将误操作时binlog备份到执行目录,然后通过全量备份恢复数据

# 备份binlogmkdir -p /data/backups/binlog/cp /var/lib/mysql/binlog.000004 /data/backups/binlog/# 先通过全量备份还原数据mysql -h localhost -u root -p 

5、分析binlog,确定具体误操作位置

mysqlbinlog --base64-output=DECODE-ROWS /data/backups/binlog/binlog.000004 | more

例如,通过上述命令,可查看binlog详情(也可以通过show binlog events in 'binlog.000004'来分析),输出如下:

# at 552#200719 14:48:19 server id 1  end_log_pos 684 CRC32 0x2e00f1bb  Query   thread_id=8     exec_time=0     error_code=0    Xid = 1534use `user`/*!*/;SET TIMESTAMP=1595170099/*!*/;DROP TABLE `t_user1` /* generated by server */

分析后,即可定位到552位置即drop table的时刻

6、通过mysqlbinlog及定位到的位置,实现增量恢复

# 基于备份的binlog,将数据库恢复到552位置mysqlbinlog --stop-position=552 /data/backups/binlog/binlog.000004 | mysql -u root -p

至此,binlog增量备份及恢复就完成了。

更多说明

mysql时区配置

补充一个配置,在mysql8中,默认的binlog_format是row,可通过show variables like “binlog_format”查看,因此就不需要单独,但因为docker默认是标准时区,为了便于后续开发,还是需要配置为+8时区:

  • 将/etc/mysql/my.cnf文件拷贝出来
  • 增加default_time_zone='+8:00'相关配置
  • 将修改后的文件复制回去之后,重启服务即可

修订后的my.cnf文件:

[mysqld]pid-file        = /var/run/mysqld/mysqld.pidsocket          = /var/run/mysqld/mysqld.sockdatadir         = /var/lib/mysqlsecure-file-priv= NULLdefault_time_zone='+8:00'

主要操作命令:

# 将配置文件拷贝出来docker cp mysql-dump-test:/etc/mysql/my.cnf D:\dev2\test\mysqldump# 将修改后的配置文件覆盖回去docker cp D:\dev2\test\mysqldump\my.cnf mysql-dump-test:/etc/mysql# 重启mysql数据库docker restart mysql-dump-test# 查看日志情况docker logs mysql-dump-test

参考资料

欢迎关注我的公众号【技术路漫漫】,反馈相关问题和意见:

更多参考资料:

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

https://www.percona.com/doc/percona-xtrabackup/8.0/index.html

mysql 备份_MySQL数据库备份实操相关推荐

  1. mysql数据库根据引擎备份_MySQL数据库备份的几种方式

    最近一直想写点博客,但是不知道写什么,感觉自己最近的知识没有什么增加,今天想到了一篇可以写的博客.以前试过根据data文件夹备份MySQL,但是从来没有成功过,前几天帮助朋友还原MySQL,终于成功的 ...

  2. mysql 备份表和数据_Mysql数据库备份(一)------数据库备份和表备份

    一.Mysql中的数据备份: Mysql中数据备份使用的命令是:mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中.mysqldump命令的 工作原 ...

  3. Mysql数据库备份(一)------数据库备份和表备份

    一.Mysql中的数据备份: Mysql中数据备份使用的命令是:mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中.mysqldump命令的 工作原 ...

  4. MySQL主从复制原理(原理+实操)

    1.MySQL主从复制原理(原理+实操) 主从复制简介 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」. 比如:在复杂的业务系统中,有一句sql ...

  5. redmine备份_Redmine数据库备份及搬家

    Bitnami Redmine的备份分2种方式: 1.导出数据库 2.整个目录搬家 不管是哪种都想停掉服务,redmine相关的服务有以下5个: redmineApache redmineMySQL ...

  6. mysql 本地备份_MYSQL数据库自动本地/异地双备份/MYSQL增量备份

    构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...

  7. mysql数据库物理备份_MySQL数据库之xtrabackup物理备份(一)

    (1)备份开始时会开启一个后台检测进程,实时检测mysql redo(已提交的事务)的变化,一旦发现redo中有新日志写入,立刻将日志记入后台日志文件xtrabackup_log中, (2)复制Inn ...

  8. mysql异地备份_MySQL数据库异地备份与还原方法

    一.传统的MySQL数据库备份和恢复数据方法: 生成duSQL脚本 在控制zhi台使用mysqldump命令可以用来生成指定数据库的dao脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创 ...

  9. MySQL a库备份恢复为B库_MySQL数据库备份的基础知识_MySQL

    一.数据备份捷径 因为这个方法没有得到官方正式文档的验证,我们暂称为试验吧. 目的:备份hostA主机中一个MySQL数据库备份TestA,并恢复到到hostB机中 试验环境: 操作系统:WinNT4 ...

最新文章

  1. CoolHash数据库引擎压测对比报告
  2. 离散信号处理的基本概念理解(第一章 离散序列和离散系统(全))
  3. c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示
  4. python io多路复用_python实现IO多路复用 --- selector
  5. clickhouse安装_初识ClickHouse——安装与入门
  6. matlab isa函数,使用函数编写简单测试用例
  7. github可以刷星吗_GitHub 没有 star,该写进简历里吗?
  8. C++算法学习(力扣:面试题 16.04. 井字游戏)
  9. Tomcat—HTTPS之生成密钥库文件与配置Tomcat服务器
  10. 垂直跑马灯水平跑马灯
  11. 华硕Chromebox-cn 62+i7-5500 U+HD 5500
  12. 【excel】绘制双纵坐标轴的图表
  13. 关于在word中使用分栏符 出现左边没有填完就开始了右边 然后再是左边 然后再右边的解决
  14. 抖音搬运视频热门技巧 剪辑后会修改视频md5
  15. android 平板怎么截图,平板电脑怎么截图 方法有哪些呢
  16. ADI公司高速PCB布板指南
  17. 推荐算法(一)——FM因式分解机
  18. 大家都是在哪些网站找数据?
  19. 星环科技数据中台解决方案,助力某政府机构建设新型智慧城市
  20. Linux 内核观测技术 eBPF 中文入门指南

热门文章

  1. 在全局中谋一域_谋全局才能谋一域
  2. php.ini文件可以复制吗,php安装完成以后要复制php.ini文件
  3. c 语言 文本处理范例
  4. 今日头条屏幕适配方案落地研究
  5. 【NOIP模拟】T2 管道(状压dp求图的dfs序方案数)
  6. 图片碎片化mask动画
  7. 选中条目android spinner的使用
  8. java——maven依赖版本冲突
  9. Laravel 错误处理
  10. 解释BOM头和去掉方法