文章目录

  • 前言
  • 备份
    • 按备份类型分
      • 冷备
      • 温备
      • 热备
        • 逻辑备份
          • mysqldump工具
          • select ... into outfile
          • others
        • 裸文件备份
          • XtraBackup
    • 按备份内容分
  • 总结

前言

安全管理数据库的关键是定期备份,根据数据量、MySQL服务器的数量和数据库工作负载等情况,选择最适合的备份方式。备份分为以下类型:

  • 冷备:停库,停服,备份
  • 温备:不停库,备份时锁表
  • 热备:不停库,备份时不锁表

备份

按备份类型分

冷备

如果可以关闭 MySQL 服务器,则可以进行物理备份。好处是可以保证数据库的完整性,备份过程简单且恢复速度相对较快。但前提是停掉MySQL服务器意味着系统需要停摆。

冷备过程

  • 停掉 MySQL 服务
  • 复制 InnoDB 数据文件(.ibdata 文件和 .ibd 文件)
  • 复制 InnoDB 日志文件(ib_logfile 文件)
  • 复制所有的 my.cnf 配置文件

温备

温备是指在数据库运行过程中进行的,但是会对当前数据库的操作有所影响。如加一个全局读锁以保证备份数据的一致性。

热备

与冷备相反,热备就是数据库处于运行状态下的备份,不影响现有业务的进行。热备又细分为逻辑备份和裸文件备份。

逻辑备份

逻辑备份是指备份出的文件的内容是可读的,一般是文本文件。内容由一条条SQL语句,或者是表内实际数据组成,这种方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是恢复所需要的时间往往较长。

逻辑备份又有三种常用方法来实现:mysqldump,select … into outfile,mydumper

mysqldump工具

mysqldump 是 MySQL 自带的命令工具,它的备份过程是先从 buffer 中找到需要备份的数据进行备份。如果 buffer 中没有,就去磁盘中查找并调回到 buffer 里再备份,最后形成一个可编辑的备份文件。

备份

# 备份数据库
mysqldump [arguments] > file_name# 其中 [arguments] 如下:
--host(-h)              # 服务器IP地址
--port(-p)              # 服务器端口号
--user(-u)              # MySQL 用户名
--pasword(-p)           # MySQL 密码
--databases         # 指定要备份的数据库
--all-databases     # 备份所有数据库
--databases d1 d2   # 备份指定数据库
--compact           # 压缩模式,产生更少的输出
--comments          # 添加注释信息
--single-transaction test   # 对 test 数据库备份前,执行 start transaction 保证备份一致性
--lock-tables       # 备份前,锁定所有数据库表
--add-locks         # 备份数据库表时锁定数据库表
--force             # 当出现错误时仍然继续备份操作
--default-character-set     # 指定默认字符集

执行备份命令:

mysqldump --single-transaction -uroot -p123456 dbname > file_name

备份成sql文件后,如果使用 docker 部署的 MySQL,将 sql 文件从容器内转移到宿主机,在宿主机上执行如下命令:

docker cp 容器id:容器中sql文件目录 将sql文件转移的宿主机目录

可查看该 SQL 文件内容:

-- MySQL dump 10.13  Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost    Database: fei2_backup
-- ------------------------------------------------------
-- Server version       8.0.26/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;--
-- GTID state at the beginning of the backup
--SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '62cd056a-e9f1-11eb-9218-0242ac110002:1-12';--
-- Table structure for table `tb_class`
--DROP TABLE IF EXISTS `tb_class`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tb_class` (`id` int NOT NULL,`name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `tb_class`
--LOCK TABLES `tb_class` WRITE;
/*!40000 ALTER TABLE `tb_class` DISABLE KEYS */;
INSERT INTO `tb_class` VALUES (1,'zhangsan'),(2,'lisi');
/*!40000 ALTER TABLE `tb_class` ENABLE KEYS */;
UNLOCK TABLES;
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;-- Dump completed on 2021-07-24  1:34:54

恢复

执行此 SQL 文件,在容器中执行命令:

mysql -uroot -p123456 dbname < file_name

select … into outfile

select … into outfile 也是一种逻辑备份方法,它的恢复速度非常快,比 insert 的插入速度要快的多。它跟有许多备份功能的 mysqldump 不同,它只能备份表中的数据,并不能包含表的结构。如果备份完成后,表被 “drop” 了,是无法实现恢复操作的。它把备份出的数据导出到一个文本文件中,通过 load data 的方式,实现恢复还原的操作。

常用语法:

select col1,col2... from table_name into outfile '/path/备份文件名称'

备份

进入 mysql,执行以下命令:

select * from user into outfile '/var/lib/mysql/tt.sql';

其中,输出路径为mysql 指定的路径,用以下命令查询,其中指定的路径才是mysql允许输出的文件路径。

show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

备份成功后,将测试表 user 中的数据清空,使用 load data 的方式导入已备份的数据文件。

恢复

mysql> LOAD DATA INFILE '/var/lib/mysql-files/tt.sql' INTO TABLE test.user;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

load data 与 insert 的插入速度对比,load data 的插入速度约是 insert 插入的 12 倍。

others

以上介绍了两种逻辑备份的方式,逻辑备份还有其他的方式,例如:mydumper,mysqlimport,这两种逻辑备份方式都是 MySQL 自带的工具。

mysqldump 是支持单线程工作的工具,只能逐个表导出,而 mydumper 是一个高性能多线程的备份工具,备份速度远远高于 mysqldump,其备份方式也是逻辑备份。数据还原时使用 myloader 工具,俗称“小钢炮”。

mysqlimport 是 MySQL 提供的一个命令行程序,从本质上说,是 load data infile 的命令接口,而且大多数选项都和 load data infile 语法相同。和 load data infile 不同的是,mysqlimport 可以通过参数 --user-thread 参数实现并发的导入不同的文件。

裸文件备份

裸文件备份是指复制数据库的物理文件,既可以是在数据库运行中的复制,也可以是在数据库停止运行时直接的数据文件复制。由于是在底层复制数据文件的,所以速度上比逻辑备份一条条的插入SQL语句更快。裸文件备份的代表作就是 XtraBackup

XtraBackup

XtraBackup是 Percona 公司的开源项目,特点是备份与恢复过程是速度很快,安全可靠,而且在备份过程中不会锁表,不影响现有业务。但它目前还是不能对表结构文件和其他非事务类型的表进行备份。XtraBackup 包含了两个工具xtrabackup 和 innobackupex:

  • xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表
  • innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份

XtraBackup原理

XtraBackup是基于 InnoDB 的 crash recovery 功能进行备份的,那为什么是 crash recovery 呢?

InnoDB 内部维护了一个 redo log ,包含了 InnoDB 数据的所有更改信息,在 InnoDB 启动时,会先检查 datafile 和 transaction log,前滚所有已提交的事务并且回滚未提交的事务。

XtraBackup备份时并不锁定表,而是一页页的复制 InnoDB 的数据,这样复制出来的数据不一致。要想保证数据一致性,需要在恢复时使用 crash recovery 进行操作,XtraBackup 还有另外一个线程监视着 redo log,由于 redo log 大小是固定的,而且是循环写的方式,写满最后 一个日志后,就会从头开始写。那就可能会覆盖之前的数据信息。所以一旦日志发生变化,就复制变化过的 log pages,在复制全部数据文件完之后,停止复制 redo log

XtraBackup优点

  • 备份速度快,可靠
  • 备份过程不会打断正在执行的事务(无需锁表)
  • 能基于压缩等功能节约磁盘空间和流量
  • 自动备份校验
  • 还原速度快
  • 可以流传将备份传输到另外一台机器上
  • 在不增加服务器负载的情况备份数据

按备份内容分

若按照备份数据库的内容来分,备份又可以分为:

  • 完全备份
  • 增量备份
  • 日志备份

完全备份是指对数据库做全量备份;增量备份是指在上次完全备份的基础上,对于更改的数据进行备份;日志备份主要是指对 MySQL 数据库 binlog 的备份,通过对一个全量备份进行 binlog 的重做(replay) 来完成数据库的 point-in-time 的恢复工作。MySQL 数据库复制的原理就是异步实时的将 binlog 重做传送应用到从数据库。

总结

本文介绍了一些MySQL数据库常用的备份方式,分为:冷备、温备、热备。热备中又包含逻辑备份和裸文件备份,还有根据内容量划分的全备、增备、日志备份。在实际备份中,我们会根据实际情况选择合适的备份工具。而备份策略的指定也可以根据真实的数据量,考虑全备和增备的频率。

MySQL数据备份与恢复机制详解相关推荐

  1. mysql 数据备份与恢复使用详解

    一.前言 对一个运行中的线上系统来说,定期对数据库进行备份是非常重要的,备份不仅可以确保数据的局部完整性,一定程度上也为数据安全性提供了保障,设想如果某种极端的场景下,比如磁盘损坏导致某个时间段数据丢 ...

  2. 摩尔庄园不同服务器账号互通吗,摩尔庄园手游服务器互通吗?不同服务器数据互通机制详解...

    摩尔庄园手游不同的服务器能不能互通?游戏中的服务器互通问题让玩家们一直都在不断的讨论,那么这次小游戏100网就来给大家分享最正确的答案,下面会详细的为大家分享服务器互通的这个问题,有需要了解的都能来看 ...

  3. mysql刷盘机制详解

    目录 刷盘机制总览 log buffer(innodb的,由存储引擎分配) binlog cache(由server分配) buffer pool 自适应刷脏页Adaptive Flushing 刷盘 ...

  4. mysql 数据分组_详解MySQL 数据分组

    创建分组 分组是在select语句中的group by 子句中建立的. 例: select vend_id, count(*) as num_prods from products group by ...

  5. mysql的MVCC机制详解

    文章目录 1. 什么是MVCC机制? 2. MVCC机制底层是怎么实现的 2.1 undo日志版本链 2.2 read view机制 3. undo版本链和read-view的对比规则 4. 结合案例 ...

  6. oracle的mvcc解析,PostgreSQL原理:Oracle 和 MySQL 中MVCC机制详解

    MVCC,Multi-version Concurrency Control ,顾名思义指的是多版本并发控制.在介绍MVCC之前我们先来简单了解下事务的隔离级别: read uncommitted:脏 ...

  7. mysql表锁机制详解

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级. MyISAM和MEMORY存储引擎采用的是表级锁( ...

  8. jquery源码解析:jQuery数据缓存机制详解2

    上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...

  9. MySQL数据操作(DML)详解(小白都能懂欧)

    1.插入语句 1.1插入一行 有两种: 1.以小括号的形式 insert into + 表名(列1,列2...) +values(值1,值2...) 这里注意:如果表名后边不加小括号对应内容,那么默认 ...

最新文章

  1. java如何使用elasticsearch
  2. linux内核环境变量,Linux上安装配置JDK环境变量
  3. why is pc important for university students?
  4. 淘宝Django书籍调研
  5. Halcon: 畸变矫正与标定(1)
  6. 数据库的数据类型及运算符
  7. Vuex在项目中使用
  8. 13. PHP 表数据入口(table data gateway)
  9. ReactJs移动端兼容问题汇总
  10. kubernetes NodeIP、PodIP、ClusterIP的区别和联系
  11. 谷歌浏览器设置新标签页地址的方法
  12. 双线性插值GPU加速
  13. Nuxt判断手机端还是电脑端
  14. Kotlin知识积累——let,with,run,apply,alse的用法
  15. 一句话解释新西兰技术移民
  16. BZOJ 1050: [HAOI2006]旅行comf
  17. 公历与儒略日的相互转化
  18. 通过注册表方式启动和关闭手写输入法(方法适合各种应用)
  19. python32位和64位有什么区别_python32位和64位有什么区别
  20. Hadoop-JAVA编写HDFS客户端进行HDFS操作

热门文章

  1. 人工智能算法之python基础
  2. 虚拟机linux清理空间,虚拟机占用物理磁盘空间不断增大,怎么清理?
  3. .NET-Windows Form创建工资计算器
  4. Highchart单条数据加标签
  5. UIAlertController在iPad上闪退问题
  6. 细说show slave status参数详解(最全)
  7. 一加手机怎么样?来看看这个测评
  8. 树莓派 NOOBS 安装系统
  9. 卫星通信,给手机市场带来了什么?
  10. 两个路由器的无线连接——FAST路由版