Tips: MySQL数据库使用mysqldump备份恢复时的注意事项背景mysqldump采坑点1. -E, -R, --triggers2. drop table3. --set-gtid-purged4. --single-transaction5. --master-data6. -e, --extended-insert, --skip-extended-insert7. -F, --flush-logs8. 字符集9. 注释10. 其它

背景

mysqldump作为MySQL数据库逻辑备份的常用工具,对于其备份出来的文件,应该进行确认,防止在恢复时误删数据。mmysqldump提供了很多选项,需要确认无误后再进行使用。

MySQL主从和双机为MySQL复制的常见架构,在此类集群中,对于数据的恢复,更需要小心,确认无误后再进行操作。

mysqldump采坑点

1. -E, -R, --triggers

常用的mysqldump的格式为(例如备份wstest.t1):

mysqldump -uroot -p -P 8001 -h 192.168.101.185 -E -R --triggers wstest t1 > wstest_t1.sql

这样既可备份wstest.t1及表上的EVENTS,ROUTINES,TRIGGERS,下文默认加上三者,但是在备份时需要注意,因为若未备份,则在恢复时候虽然数据正确,但是实例运行起来后,会出现问题。

2. drop table

默认情况下,mysqldump备份出来的文件中,在恢复表时候,会先drop table。

按照第一点的命令,备份得到的文件内容

-- MySQL dump 10.13 Distrib 8.0.12, for linux-glibc2.12 (x86_64)

--

-- Host: 192.168.101.185 Database: wstest

-- ------------------------------------------------------

-- Server version 8.0.12

/*!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 */;

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 '+'*/ 'b3e550a7-b009-11e8-aca0-000c299263cc:1-284814';

--

-- Table structure for table `t1`

--

------注意在create表之前,先进行了drop--------

**DROP TABLE IF EXISTS `t1`;**

/*!40101 SET @saved_cs_client = @@character_set_client */;

SET character_set_client = utf8mb4 ;

CREATE TABLE `t1` (

`a` int(11) NOT NULL AUTO_INCREMENT,

`b` int(11) DEFAULT NULL,

`c` int(11) DEFAULT NULL,

PRIMARY KEY (`a`),

UNIQUE KEY `uniq_b` (`b`)

) ENGINE=InnoDB AUTO_INCREMENT=111112 DEFAULT CHARSET=utf8;

/*!40101 SET character_set_client = @saved_cs_client */;

--

-- Dumping data for table `t1`

--

LOCK TABLES `t1` WRITE;

/*!40000 ALTER TABLE `t1` DISABLE KEYS */;

INSERT INTO `t1` VALUES (3,10004,100),(11,10016,30000),(431,12,99),(436,18,33),(111111,23231313,12313131);

/*!40000 ALTER TABLE `t1` ENABLE KEYS */;

UNLOCK TABLES;

--

-- Dumping events for database 'wstest'

--

--

-- Dumping routines for database 'wstest'

--

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 2019-06-11 10:23:09

若环境中已经存在新的数据,则这种方式将会删除表后重建,导致数据丢失。所以,可以在命令中加上**–skip-add-drop-table**:

mysqldump --skip-add-drop-table wstest t1 > wstest_t1.sql

.

从备份文件可以看出,在新建表之后,会使用insert into语句进行数据的插入。为了防止有重复数据中断恢复(恢复大表的时候,花费时间比较长,若中断后排错,又需要重新恢复,耗时较长),还可以使用**–replace**:

mysqldump --skip-add-drop-table --replace wstest t1 > wstest_t1.sql

得到的备份文件的插入数据部分为:

LOCK TABLES `t1` WRITE;

/*!40000 ALTER TABLE `t1` DISABLE KEYS */;

REPLACE INTO `t1` VALUES (3,10004,100),(11,10016,30000),(431,12,99),(436,18,33),(111111,23231313,12313131);

/*!40000 ALTER TABLE `t1` ENABLE KEYS */;

UNLOCK TABLES;

3. --set-gtid-purged

执行第一点的mysqldump命令时,会有一个warning:

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don’t want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.

需要关注**–set-gtid-purged**选项,在上文中备份出来的文件中,有如下两行:

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;

SET @@SESSION.SQL_LOG_BIN= 0;

这两行的意思是:不把恢复产生的sql记录在binlog中。这点尤其重要,因为在MySQL主从,或者MySQL双机的环境,若进行恢复,则会同步到对端,这样就存在一个问题:

若一端正常在数据写入,需要回复另一端的时候,此时,有这两行的话,相对来说就会使恢复过程更安全。 否则,在另一端也会执行备份文件中的内容(若备份文件中有类似drop table的选项,那将是一个删库的结果~)。

若是在一个全新的一个集群环境做恢复,那么可以加上**–set-gtid-purged=OFF**,这样,可在在从库中也收到binlog信息,得到一个数据一致的集群。

4. --single-transaction

备份时创建一致的快照,在单个事务中转储所有表。强烈建议开启,并配合–master-data使用

由于备份是一个阶段式的dump,所以可能出现:A表已经备份,B表关联了A的数据,那么再备份B表时,A表没有相关的记录。就会造成恢复的时候,出现数据逻辑不完整的情况。

5. --master-data

–master-data决定是否将binary log position和filename 信息记录在备份文件中。

=1:直接记录在文件中,恢复时会执行change master to…:

--

-- Position to start replication or point-in-time recovery from

--

CHANGE MASTER TO MASTER_LOG_FILE='mysql8001.000025', MASTER_LOG_POS=159500640;

=2:以注释的方式记录在备份文件:

--

-- Position to start replication or point-in-time recovery from

--

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql8001.000025', MASTER_LOG_POS=159500640;

6. -e, --extended-insert, --skip-extended-insert

加上 -e 或者 –extended-insert,可以使insert语句为一个insert插入多条数据,如上文所示。

加上**–skip-extended-insert**, 则为一条insert插入一条数据:

LOCK TABLES `t1` WRITE;

/*!40000 ALTER TABLE `t1` DISABLE KEYS */;

INSERT INTO `t1` VALUES (3,10004,100);

INSERT INTO `t1` VALUES (11,10016,30000);

INSERT INTO `t1` VALUES (431,12,99);

INSERT INTO `t1` VALUES (436,18,33);

INSERT INTO `t1` VALUES (111111,23231313,12313131);

/*!40000 ALTER TABLE `t1` ENABLE KEYS */;

UNLOCK TABLES;

7. -F, --flush-logs

在进行逻辑备份的全量+增量的恢复时,往往需要找到对应的binlog的position信息,所以在备份时,建议加上**-F**,这样,在dump之前会先flush logs,产生新的binlog文件,便于恢复。建议和–master-data一起使用

Note that if you dump many databases at once (using the option

–databases= or --all-databases), the logs will be

flushed for each database dumped. The exception is when

using --lock-all-tables or --master-data: in this case

the logs will be flushed only once, corresponding to the

moment all tables are locked. So if you want your dump

and the log flush to happen at the same exact moment you

should use --lock-all-tables or --master-data with

–flush-logs.

8. 字符集

可以看到备份出的文件中有SET NAMES utf8mb4 ; 等关于字符集的字样,同样在辈分时候应该注意,防止字符集不一致出现的数据不可用。

9. 注释

对于mysqldump中的注释部分,同样需要进行确认,例如上文中的SQL_MODE,TIME_ZONE等等。

10. 其它

(1) LOCK TABLE

对于表的回复操作,会有LOCK TABLE … WRITE操作,这个在使用时一定要注意,必要时(前提是已经重复确认数据不会产生加锁等相互影响),可以加上**–skip-add-locks ** 选项取消加表锁。

(2) – Dump completed on

备份结束后,可以查看最后一行是否为:– Dump completed on …

mysql数据库备份注意,Tips: MySQL数据库使用mysqldump备份恢复时的注意事项相关推荐

  1. mysql web备份软件_Windows下实现MySQL自动备份的批处理(复制目录或mysqldump备份)

    今天有个需求要在 Windows 下实现数据库自动备份,拼凑了一下解决办法. 实现的特性 可指定多个数据库 按照 年/月/日 的方式组织备份 可选的使用 WinRAR 压缩备份 使用计划任务实现定时备 ...

  2. mysql 备份多个库_使用mysqldump备份多个库

    mysqldump一次备份多个库 一个数据库实例中有20+个库,本次备份需要备份其中的10+个库,使用mysqldump直接进行备份踩到一个warning和一个error. 数据库版本:5.7.26 ...

  3. MySQL导出数据反单引号_使用mysqldump导出数据时对字段中包含的单引号的处理

    最近在做一个日志统计项目,有一个辅助表是在MySQL数据库的,现在要将其迁移到Postgresql,自然是先用mysqldump将MySQL里面的数据导出,然后再导入到Postgresql即可.但在实 ...

  4. 【数据库运维】MYSQL备份恢复管理(上)

    目录 MYSQL备份恢复管理 一,备份类型 二,逻辑备份优缺点 三,MySQL备份内容 四,MySQL备份工具 五,MySQL备份策略 1,策略一:直接拷贝数据库文件 案例:直接拷贝备份数据库comp ...

  5. 如何查看mysql备份的情况_MySQL数据库备份详解(示例代码)

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  6. mysql黑窗口常用命令_mysql数据库常用命令

    1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删除数据库,不提醒 show ...

  7. mysql命令or_常用的MySQL命令大全

    一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...

  8. mysql常用命令orderby_常用mysql命令大全

    一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...

  9. mysql数据库备份方案_MySQL平台数据库备份方案详细说明

    在数据库表丢失或损坏的情况下,备份你的数据库是很重要的.如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态.有时,正是MySQL管理员造成破坏.管理员已经知道表已破坏,用 ...

最新文章

  1. 模块就是一个普通的python程序文件_Python-模块和包
  2. 【阿里云 Linux 服务器】购买 Linux 到项目部署过程中遇到的问题,部署 SpringBoot 项目到服务器上,在手机上安装 Android 程序进行测试
  3. 显微镜自动聚焦原理是什么_什么是共聚焦显微镜?你了解过共聚焦显微镜吗?...
  4. 代码分析 | 单细胞转录组clustering详解
  5. 启用文件系统缓存,提高Tuxera NTFS运作性能
  6. 基于单片机智能药盒控制系统设计(含论文)
  7. 仿微信朋友圈发表图片拖拽和删除功能
  8. 跟随鼠标移动-demo
  9. 红月OD反汇编实时显示坐标,背景色可透明也可以不透明
  10. tensorboard侧视_如何调整侧视/后视镜(以及为什么需要3台显示器)
  11. 特种浓缩分离:中药提取液的澄清过滤技术
  12. 导函数连续、可导、可微、连续、有界、可积的关系,史上最全!一张图搞定!
  13. 用c语言反向输出5ge字符,C语言入门:05.scanf函数
  14. 蛇形字符串、驼峰字符串转换
  15. “知识共享”与智能数学老师
  16. 台达 PLC 浮点数 乘法和除法
  17. 2019经济寒冬,软件定制开发公司的竞争力在哪里??
  18. 求和1+2+......+n
  19. springboot实现读取excel插入数据库
  20. 每一个优秀的人,都有一段默默努力的时光

热门文章

  1. IPv6 带来的反欺诈难题,程序员该如何破解?
  2. 你不是颠覆 IoT,就是被 IoT 颠覆!
  3. 程序员如何解决并发冲突的难题?
  4. 时至今日,百度无人车还好吗?
  5. 鸿蒙将至,安卓安否?
  6. 微软神操作!Web 版 VS Code 来了!
  7. Java 帝国对 Python 的渗透能成功吗?
  8. 华为发布首款5G折叠机,价格一万七;ofo被冻结145万;苹果最早明年放弃英特尔 | 极客头条...
  9. 佩奇扑街、外星人疯狂!Python 告诉你大年初一应该看哪部电影?
  10. 10 亿元赌约“揭盅”!董明珠与雷军这五年变得更像对方了