MySQL备份恢复(十二)

news2024/9/22 7:24:35

文章目录

    • 1. MySQL数据损坏类型
      • 1.1 物理损坏
      • 1.2 逻辑损坏
    • 2. DBA运维人员备份/恢复职责
      • 2.1 设计备份/容灾策略
        • 2.1.1 备份策略
        • 2.1.2 容灾策略
      • 2.2 定期的备份/容灾检查
      • 2.3 定期的故障恢复演练
      • 2.4 数据损坏时的快速准确恢复
      • 2.5 数据迁移工作
    • 3. MySQL常用备份工具
      • 3.1 逻辑备份方式
      • 3.2 物理备份方式
      • 3.3 架构备份方式
    • 4. mysqldump应用
      • 4.1 mysqldump介绍
      • 4.2 mysqldump备份方式
        • 4.2.1 InnoDB表
        • 4.2.2 非InnoDB表
      • 4.3 mysqldump核心参数
        • 4.3.1 mysqldump连接参数
        • 4.3.2 mysqldump备份参数
        • 4.3.3 mysqldump备份高级参数
          • 4.3.3.1 --master-data参数
          • 4.3.3.2 --single-transaction参数
          • 4.3.3.2 -R/-E/--triggers参数
          • 4.3.3.2 --max_allowed_packet参数
    • 5. 基于mysqldump+binlog故障恢复案例
    • 6. mysqldump小结
    • 7. Percona Xtrabackup

1. MySQL数据损坏类型

1.1 物理损坏

磁盘损坏:硬件,磁道坏,dd,格式化
文件损坏:数据文件损坏,redo损坏

1.2 逻辑损坏

drop、delete、truncate、update

2. DBA运维人员备份/恢复职责

2.1 设计备份/容灾策略

2.1.1 备份策略

备份工具原则
备份周期设计
备份监控方法

2.1.2 容灾策略

备份:用什么备份
架构: 高可用,延时从库,灾备库

容灾的好处: 在发生灾难的时候,怎么能快速的恢复业务。可以用备份或高可用的架构

2.2 定期的备份/容灾检查

备份软件 ------> 带库(磁带)
每周 北京 --> 天津 货运

一定要定时的检查数据库的备份情况,以防止自己写的脚本有bug,保证正常备份。

2.3 定期的故障恢复演练

至少每年两次的恢复演练。在测试环境进行恢复演练。

2.4 数据损坏时的快速准确恢复

每个产品数据库出现故障,要快速的恢复数据,把相关命令写清楚,每一种损坏的应对策略。

2.5 数据迁移工作

一般用备份的手段或者主从的手段来进行迁移

3. MySQL常用备份工具

逻辑备份:备份的是sql语句
物理备份:备份的是表空间文件(数据文件)

3.1 逻辑备份方式

mysqldump(MDP) *****
replication(主从方式)
mydumper(自行扩展)
load data in file(自行扩展)

3.2 物理备份方式

MySQL Enterprise Backup(企业版)
Percona Xtrabackup(PBK,XBK)*****

小提示:社区版没有自带的物理备份方式

3.3 架构备份方式

架构备份方式,属于逻辑的一种,比如MySQL主从。

4. mysqldump应用

查看mysqldump的参数帮助:mysqldump --help

4.1 mysqldump介绍

逻辑备份工具。备份的是SQL语句。

4.2 mysqldump备份方式

innodb表,备份的时候不需要锁原来的表的,原来的表该干什么干什么,不受影响。
因为这只是一个优先读的快照,不会影响其他人操作

非innodb表在mysql中基本上都是系统相关的表,系统表要备份,元数据要备份的话,要进行
全局锁表

做全备份的时候,有innodb和非innodb,备份时会有短暂的锁表的情况,尽量避免非innodb锁表的情况

mysql8.0以后,大部分的系统表都被存储到innnodb表中,备份起来性能会更好一些

4.2.1 InnoDB表

可以采用快照备份的方式
开启一个独立的事务,获取当前最新的一致性快照。
将快照数据,放在临时表中,转换成SQL(Create database,Create table,insert),保存到sql文件中

4.2.2 非InnoDB表

需要锁表备份,触发FTWRL,全局锁表。转化成SQL(Create database,Create table,insert),保存到sql文件中

4.3 mysqldump核心参数

4.3.1 mysqldump连接参数

-u 用户名 -p密码 -h IP地址 -P 端口号 -S 套接字文件

mysql也好,mysqldump也好,在你没有指定-S或者配置文件里面也没有-S的时候,也会自动去/tmp里面去找,-S 不指定也行,默认会去找/tmp/mysql.sock,如果mysql.sock在其他地方,那就必须要加-S或者在配置文件加上参数指定mysql.sock的具体位置

避免mysql密码暴露问题:(一般不采用,没有必要)

# 在配置文件中添加这些参数,登录mysql时不需要密码(一般不采用,没有必要)。
vim ~/.my.cnf
[mysql]
user=root
password=123456
[mysqldump]

# 读取mysql配置文件顺序: 后面的参数覆前面的参数
[root@db01 ~]# mysql --help --verbose | grep my.cnf
/etc/my.cnf  /etc/mysql/my.cnf  /usr/local/mysql/etc/my.cnf  ~/.my.cnf

4.3.2 mysqldump备份参数

-A 全备

[root@db01 ~]# mkdir -p /data/backup
[root@db01 ~]# chown -R mysql.mysql /data/*
[root@db01 ~]# mysqldump -uroot -p123456 -S /tmp/mysql.sock -A > /data/backup/full.sql
[root@db01 ~]# vim /data/backup/full.sql

-B 备份单库或多个库(-B后面跟的都是库名)

# 备份world库和test库
[root@db01 ~]# mysqldump -uroot -p123456 -B world test > /data/backup/db.sql

备份单表或多表(固定语法: 数据库 表 表 表,不能写多个库名)

# 备份world库中的city表和coutry表
[root@db01 ~]# mysqldump -uroot -p123456 -S /tmp/mysql.sock world city country > /data/backup/tab.sql

验证一下:以下两个命令的备份结果区别?

mysqldump -uroot -p123456 -B world > /data/backup/db1.sql
# 上面的比下面多出两条sql
create database world;
use world;

# 这条sql备份world库下面的所有表。应用时,world库不存在,需要手工创建,并且use到world库下再恢复。
mysqldump -uroot -p123456    world > /data/backup/db2.sql

对比两个sql文件:vimdiff db1.sql db2.sql

在这里插入图片描述

4.3.3 mysqldump备份高级参数

4.3.3.1 --master-data参数

场景:每周日23:00全备,周1-6进行binlog备份。所有备份时完整的。
周三时,有一个核心运维人员济宁了删库操作。

恢复思路:恢复全备 + 所有需要binlog恢复
痛点:binlog的截取。起点查找比较困难,有两种方法

起点: 一定要找到备份开启时刻准确的position号以及binlog文件名,因为对innodb来说时快照备份,对于myisam是锁表备份,所以全备的那一刻起就必须找到准确起点position号。有两种方法找起点。
方法一:备份开始时,自动记录日志文件信息(有position号) --master-data=2(–master-data=2在备份开始的那个时刻,记录一下当前日志文件的一个状态)常用方法
方法二:备份开始时,切割日志。-F(备份一开始binlog日志就是flush一下,生成一个新的文件,切割一个新的日志出来,-F 备份起始的时候,直接刷新一个新的日志,是有多少个库,刷新多少个。这个参数使用起来不太方便)

终点: drop之前的位置点

–master-data=2 参数详解:

[root@db01 binlog]# mysqldump --help
  --master-data[=#]   This causes the binary log position and filename to be
                      appended to the output. If equal to 1, will print it as a
                      CHANGE MASTER command; if equal to 2, that command will
                      be prefixed with a comment symbol. This option will turn
                      --lock-all-tables on, unless --single-transaction is
                      specified too (in which case a global read lock is only
                      taken a short time at the beginning of the dump; don't
                      forget to read about --single-transaction below). In all
                      cases, any action on logs will happen at the exact moment
                      of the dump. Option automatically turns --lock-tables
                      off.

功能:
(1)备份时自动记录binlog信息
(2)自动锁表和解锁
(3)配合single transaction 可以减少锁表时间

开始实验
确认起点方法一:(生产中使用–master-data=2参数)

[root@db01 backup]# mysqldump -uroot -p123456 -A --master-data=2 > /data/backup/full1.sql;
[root@db01 backup]# mysqldump -uroot -p123456 -A --master-data=1 > /data/backup/full2.sql;

对比 --master-data=2和 --master-data=1备份出来的区别:
vim full1.sql full2.sql
区别:–master-data=2多了主从的命令,但是前面有注释。 --master-data=1没有注释,我们不需要主从的命令,真要使用主从,手动去指定恢复的起点。

在这里插入图片描述

确认起点方法二:(一般不用这种方法,了解即可)

[root@db01 binlog]# ls
mysql-bin.000001  mysql-bin.000003  mysql-bin.000005  mysql-bin.000007
mysql-bin.000002  mysql-bin.000004  mysql-bin.000006  mysql-bin.index
# 这种方法切出来的日志文件比较多而且混乱,不好确定位置点
[root@db01 binlog]# mysqldump -uroot -p123456 -A -F  > /data/backup/full3.sql
[root@db01 binlog]# ls
mysql-bin.000001  mysql-bin.000008  mysql-bin.000015  mysql-bin.000022  mysql-bin.000029
mysql-bin.000002  mysql-bin.000009  mysql-bin.000016  mysql-bin.000023  mysql-bin.000030
mysql-bin.000003  mysql-bin.000010  mysql-bin.000017  mysql-bin.000024  mysql-bin.000031
mysql-bin.000004  mysql-bin.000011  mysql-bin.000018  mysql-bin.000025  mysql-bin.index
mysql-bin.000005  mysql-bin.000012  mysql-bin.000019  mysql-bin.000026
mysql-bin.000006  mysql-bin.000013  mysql-bin.000020  mysql-bin.000027
mysql-bin.000007  mysql-bin.000014  mysql-bin.000021  mysql-bin.000028
4.3.3.2 --single-transaction参数

对于InnoDB引擎表备份时,开启一个独立事务,获取一致性快照,进行备份。

# --master-data=2 --single-transaction生产必加参数
[root@db01 backup]# mysqldump -uroot -p123456 -A --master-data=2 --single-transaction  > /data/backup/full1.sql
[root@db01 binlog]# mysqldump --help
  --single-transaction 
                      Creates a consistent snapshot by dumping all tables in a
                      single transaction. Works ONLY for tables stored in
                      storage engines which support multiversioning (currently
                      only InnoDB does); the dump is NOT guaranteed to be
                      consistent for other storage engines. While a
                      --single-transaction dump is in process, to ensure a
                      valid dump file (correct table contents and binary log
                      position), no other connection should use the following
                      statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
                      TRUNCATE TABLE, as consistent snapshot is not isolated
                      from them. Option automatically turns off --lock-tables.
4.3.3.2 -R/-E/–triggers参数

这一组参数涉及mysql高级变成部分,涉及到的一些对象,可以理解为和表有一定的关系,所以备份时也要加上。

拿Linux系统来通俗的理解这些参数:
-R 类似于自己写的程序脚本,如果之备份linux系统,不备份自己写的脚本程序,那就缺少了功能【备份存储过程和函数,相当于再数据库里开发的一些程序】
-E 类似于计划任务,【备份事件】
–triggers类似于特殊类的脚本,【备份触发器】

# -R -E --triggers生产环境必备的参数
[root@db01 backup]# mysqldump -uroot -p123456 -A --master-data=2 --single-transaction -R -E --triggers  > /data/backup/full1.sql
4.3.3.2 --max_allowed_packet参数

传输包的最大传输大小:--max_allowed_packet=64M

# 调整客户端--max_allowed_packet大小,如果64M还是不够,那就调整128M
[root@db01 backup]# mysqldump -uroot -p123456 -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M > /data/backup/full1.sql

深度解析:
在这里插入图片描述
两种情况:(mysqldump是修改客户端–max_allowed_packet的大小)

(1) mysql发送insert指令是客户端向服务端发送数据,如果报错Got a packet bigger than ‘max_allowed_packet’ bytes,那么就修改服务端–max_allowed_packet的大小。

(2)mysqldump命令指令是服务端向客户端发送数据,如果报错Got a packet bigger than ‘max_allowed_packet’ bytes,那么就修改客户端–max_allowed_packet的大小。

5. 基于mysqldump+binlog故障恢复案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. mysqldump小结

在这里插入图片描述

基于mysqldump+binlog故障恢复案例:
在MySQL中有边缘数据库,有其他边缘业务使用,不敢直接进行全备恢复
从测试库中单库(核心库)导出来,然后再恢复到生产库中

高可用和主从主要解决物理损坏(磁盘或主机坏了),逻辑损坏时没办法解决的

这个栗子可以用binlog也可以恢复,但是假设这个创库创表两年前就有了,用全备+binlog进行恢复
用position号和GTID都可以来截取日志(二选一)

如果开启了GTID,在备份文件里面有
SET @@SESSION.SQL_LOG_BIN=0
临时取消了二进制日志记录,但是没有自动开启

虽然说时使用的position号截取的,但是因为binlog里面开启了GTID,所以依然要加上参数--skip-gtids

gtid号进行恢复
在备份文件中存在gtid的信息
SET @@GLOBAL.GTID_PURGED='XXX:1-16';
GLOBAL.GTID_PURGE这是一个命令,意思是恢复数据的时候把1-16号的GTID给删了,删完了之后再恢复
言外之意是,此备份中已经具备了1-16号gtid信息了,也就是说备份结束的gitd的位置是16号

gtid可以跨文件,position号是不可以跨文件的。这也是gtid的优势所在

没有开启gitd的话也要开启--skip-gtids,因为截取出还是带有gtid的(猜测因该是之前开过gtid,不加也成功的话,因备份文件里面有SET @@GLOBAL.GTID_PURGED='XXX:1-16';,删除了gtid)
建议加上--skip-gtids,标准用法

备份、数据、日志要分开放,别放一个地方
 
使用rm -rf /data/3306/* 故障模拟恢复
1. 需要把原来的实例给kill2. kill完之后把目录清空,重新进行初始化,重新初始之后再按这上面的思路进行恢复

mysqldump小结:
mysqldump恢复是备份两倍以上的时间
mysqldump用压缩工具压缩备份出来的文件的压缩比高(比物理备份要高)

分布式架构(分别备份不同的分片),一个T数据,砍成十份,每份100G,并发的分布式备份。然后就没有这么慢了
如果全备数据量大,但是只想恢复一张表,而这张表只有两M,这时可以从全备中截取单表

7. Percona Xtrabackup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【scl】博图程序的导入和导出

导入或者导出博图文件的方法(也叫移植文件) 目录 前言 ​编辑 ​编辑 前言 本篇文章主要写一下关于博图文件的导入和导出,具体要怎么样才能将写好的程序或者块移植到其他地方,下面我们一起来看! 一、程序块的导入和导…

[软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)

文章目录1. 举例对比形式化方法和欠形式化方法的优缺点。2. 在什么情况下应该使用形式化说明技术?使用形式化说明技术时应遵守哪些准则?3. 一个浮点二进制数的构成是:一个可选的符号(+或-)&…

Seata分布式事务框架-AT模式与TCC模式介绍

Seata分布式事务框架-AT模式介绍 Seata AT事务方案 Seata 的 AT 模式(Automatic Transaction)是一种无侵入的分布式事务解决方案。下面结合具体业务场景来分析其执行的原理。 业务场景 订单系统 当用户下订单时,执行以下三步流程&#x…

【NLP开发】Python实现聊天机器人(Selenium、七嘴八舌)

🍺NLP开发系列相关文章编写如下🍺:1🎈【NLP开发】Python实现词云图🎈2🎈【NLP开发】Python实现图片文字识别🎈3🎈【NLP开发】Python实现中文、英文分词🎈4🎈【…

XSS注入进阶练习篇(二)DOM型XSS注入深入

DOM型XSS注入深入1. SVG 劫持JS执行1.1 DOM树的概念与构建过程1.1.1 什么是DOM树?1.1.2 DOM树的构建过程1.2 探究img失败的原因1.3 svg标签劫持innerhtml2. details标签 特定条件下劫持JS执行2.1 事件触发流程2.2 实例3.DOM clobbering 绕过3.1 什么是DOM clobberin…

Redis内存回收

Redis 内存回收 Redis之所以性能很强&#xff0c;最主要的原因是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时&#xff0c;就…

营销狂人杜国楹的两大顶级思维

“营销狂人”小罐茶 杜国楹两大顶级思维 1.一定要有【参照物思维】 2.一定要有【终局思维】 趣讲大白话&#xff1a;大牛的思考就是不同 *********** 杜国楹对茶行业思考 1.参照咖啡、酒的发展路径 2.中国茶工业化,品牌化是唯一壮大之路 3.龙头企业必须全品 没有参照物思维就没…

Python将内容写入文件的方法总结。

使用Python写入文件是我们coder的日常&#xff0c;本篇带你详细看一下python将内容写入文件的方法以及细节。主要包括write()方法、writelines() 方法、print() 函数、使用 csv 模块、使用 json 模块。 目录 一、write()方法 二、writelines() 方法 三、print() 函数 四、使…

【Java】中的各种锁

Java提供了种类丰富的锁&#xff0c;每种锁因其特性的不同&#xff0c;在适当的场景下能够展现出非常高的效率。 一、Java锁是什么&#xff1f;为什么要用Java锁&#xff1f; 在并发编程中&#xff0c;经常遇到多个线程访问同一个共享资源 &#xff0c;这时候作为开发者必须考…

【汇编】一、环境搭建(一只 Assember 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述汇编环境的搭建过程。 话不多说~我们开始吧&#xff01; 系统环…

Ubuntu下安装 ntfs-3g

目录1.FAT32、NTFS和exFAT2.ubuntu 安装 ntfs-3g2.1 直接安装2.2 源码安装1.FAT32、NTFS和exFAT U盘在格式化的时候都会有三种格式分别是FAT32、NTFS和exFAT。 FAT32格式   FAT32格式硬盘分区的最大容量为2TB&#xff0c;虽然U盘做不到&#xff0c;但是现在1xTB硬盘都有了&…

实现8086虚拟机(三)——指令解码

文章目录中间指令格式解码模块的实现编译器将汇编语句翻译成机器指令&#xff0c;而虚拟机做的工作正好相反&#xff0c;就是将机器指令解码成可以识别的中间形式&#xff0c;然后执行。为什么要这么做&#xff1f;拿 mov 指令举例&#xff0c;看下它的机器指令的格式&#xff…

手动创建 vue2 ssr 开发环境

本文和个人博客同步发表 更多优质文章查看个人博客 前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦&#xff0c;因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用。就拿webpack配置来说&#xff0c;很多前端开发者还是喜欢用webpack-cli脚手架搭建项目。导致…

NCHW - NHWC - CHWN 排列

TensorFlow有两种数据格式NHWC和NCHW,默认的数据格式是NHWC,可以通过参数data_format指定数据格式。这个参数规定了 input Tensor 和 output Tensor 的排列方式。 1、data_format 设置为 “NHWC” 时,排列顺序为 [batch, height, width, channels] 设置为 “NCHW” 时,排…

Linux中常用命令汇总三

Linux中常用命令汇总二地址&#xff1a;https://blog.csdn.net/u011837804/article/details/1289972501、用户组管理类每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同 Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属…

MIPI CSI 进一步理解

CSI&#xff08;Camera Serial Interface&#xff09;定义了摄像头外设与主机控制器之间的接口&#xff0c;旨在确定摄像头与主机控制器在移动应用中的标准。 CSI关键词描述 缩写 解释 CCI Camera Control Interface&#xff08;物理层组件&#xff0c;通常使用I2C或I3C进行通…

显示技术之器件---LED、Mini LED、Micro LED、OLED、LCD、SMD、SMT

显示技术之基础—半导体 1、LED 1.1 LED(Light Emitting Diode) 即发光二极管&#xff0c;是一种半导体固体发光器件&#xff0c;它是利用固体半导体芯片作为发光材料&#xff0c;当两端加上正向电压&#xff0c;半导体中的载流子发生复合引起光子发射而产生光。LED由含镓&a…

基于SpringBoot的卓越导师双选系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

九龙证券|机构密集调研银行业!这些上市银行尤其受捧,关注两大变量

2023年开年以来&#xff0c;组织连续了上一年对上市银行的调研热情。 Wind数据显现&#xff0c;到现在&#xff0c;年内已有9家银行承受637家组织调研&#xff0c;参加调研的组织数较上一年同期添加近一成。 其间&#xff0c;7家被调研银行均处江浙区域。上一年以来&#xff0…

Docker 学习笔记

概述 1. 什么是 Docker&#xff1f; Docker 是一个应用容器平台&#xff0c;管理项目中用到的所有环境&#xff08;MySQL、Redis…&#xff09; 2. Docker 和虚拟机的区别 虚拟机是携带操作系统的&#xff0c;本身很小的应用程序因为携带了操作系统而变得十分笨重&#xff0…