mysql 备份_MySQL数据库备份实操
本文基于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数据库备份实操相关推荐
- mysql数据库根据引擎备份_MySQL数据库备份的几种方式
最近一直想写点博客,但是不知道写什么,感觉自己最近的知识没有什么增加,今天想到了一篇可以写的博客.以前试过根据data文件夹备份MySQL,但是从来没有成功过,前几天帮助朋友还原MySQL,终于成功的 ...
- mysql 备份表和数据_Mysql数据库备份(一)------数据库备份和表备份
一.Mysql中的数据备份: Mysql中数据备份使用的命令是:mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中.mysqldump命令的 工作原 ...
- Mysql数据库备份(一)------数据库备份和表备份
一.Mysql中的数据备份: Mysql中数据备份使用的命令是:mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中.mysqldump命令的 工作原 ...
- MySQL主从复制原理(原理+实操)
1.MySQL主从复制原理(原理+实操) 主从复制简介 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」. 比如:在复杂的业务系统中,有一句sql ...
- redmine备份_Redmine数据库备份及搬家
Bitnami Redmine的备份分2种方式: 1.导出数据库 2.整个目录搬家 不管是哪种都想停掉服务,redmine相关的服务有以下5个: redmineApache redmineMySQL ...
- mysql 本地备份_MYSQL数据库自动本地/异地双备份/MYSQL增量备份
构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...
- mysql数据库物理备份_MySQL数据库之xtrabackup物理备份(一)
(1)备份开始时会开启一个后台检测进程,实时检测mysql redo(已提交的事务)的变化,一旦发现redo中有新日志写入,立刻将日志记入后台日志文件xtrabackup_log中, (2)复制Inn ...
- mysql异地备份_MySQL数据库异地备份与还原方法
一.传统的MySQL数据库备份和恢复数据方法: 生成duSQL脚本 在控制zhi台使用mysqldump命令可以用来生成指定数据库的dao脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创 ...
- MySQL a库备份恢复为B库_MySQL数据库备份的基础知识_MySQL
一.数据备份捷径 因为这个方法没有得到官方正式文档的验证,我们暂称为试验吧. 目的:备份hostA主机中一个MySQL数据库备份TestA,并恢复到到hostB机中 试验环境: 操作系统:WinNT4 ...
最新文章
- CoolHash数据库引擎压测对比报告
- 离散信号处理的基本概念理解(第一章 离散序列和离散系统(全))
- c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示
- python io多路复用_python实现IO多路复用 --- selector
- clickhouse安装_初识ClickHouse——安装与入门
- matlab isa函数,使用函数编写简单测试用例
- github可以刷星吗_GitHub 没有 star,该写进简历里吗?
- C++算法学习(力扣:面试题 16.04. 井字游戏)
- Tomcat—HTTPS之生成密钥库文件与配置Tomcat服务器
- 垂直跑马灯水平跑马灯
- 华硕Chromebox-cn 62+i7-5500 U+HD 5500
- 【excel】绘制双纵坐标轴的图表
- 关于在word中使用分栏符 出现左边没有填完就开始了右边 然后再是左边 然后再右边的解决
- 抖音搬运视频热门技巧 剪辑后会修改视频md5
- android 平板怎么截图,平板电脑怎么截图 方法有哪些呢
- ADI公司高速PCB布板指南
- 推荐算法(一)——FM因式分解机
- 大家都是在哪些网站找数据?
- 星环科技数据中台解决方案,助力某政府机构建设新型智慧城市
- Linux 内核观测技术 eBPF 中文入门指南