mysqldump的一点使用总结(r12笔记第81天)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介:   MySQL里的mysqldump无疑是大家使用最为广泛的备份恢复工具了。这样一个工具使用起来功能非常丰富,很多功能几个参数组合起来就能够轻松实现了,我就简单列举几个不错的点。

  MySQL里的mysqldump无疑是大家使用最为广泛的备份恢复工具了。这样一个工具使用起来功能非常丰富,很多功能几个参数组合起来就能够轻松实现了,我就简单列举几个不错的点。


--master-data

这个选项在搭建主从的时候经常需要考虑,而有了GTID,这个工作一下子轻松了很多,如果需要使用我们总是会使用maser-data=2来导出,1和2是什么区别,简单来看,区别不大,但是差别很明显。

2的情况
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000033', MASTER_LOG_POS=943935226;
1的情况
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000033', MASTER_LOG_POS=943935226;


--order-by-primary

这个选项属于MySQL很有特色的一个功能,能够根据主键值来进行排序,这样得到的数据看起来就更加规整了。


----skip-extended-insert

如果要得到一行数据对应一条insert语句的形式,使用这个选项就可以搞定。默认是使用insert into xxx values(xx)(xx)的形式。

INSERT INTO `test` VALUES (1,'1');
INSERT INTO `test` VALUES (2,'2');
INSERT INTO `test` VALUES (3,'3');
INSERT INTO `test` VALUES (5,'5');


--add-drop-database
如果在数据恢复的时候,数据库已经存在则删除重建的情况,使用这个选项就很有用,而在表级默认就不需要了,因为默认是打开了--add-drop-table选项。

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----
all-databases                     FALSE
all-tablespaces                   FALSE
no-tablespaces                    FALSE
add-drop-database                 FALSE
add-drop-table                    TRUE

当然对于这个选项,我们得多说说,在最后来引申一个bug。


--replace

这个选项可以生成replace语句而非insert语句,在一些特定的场景中尤其有用。如果出现了数据冲突的情况,需要merge数据,使用replace选项就是一个很不错的选择,而我们也承上启下,比如想一行数据生辰过一条replace语句,那么就可以结合--skip-extended-insert来完成,这样一来就会生成若干条replace语句。

REPLACE INTO `test` VALUES (1,'aa');
REPLACE INTO `test` VALUES (2,'bb');


--complete-insert

这个选项简直台酸爽了,可以生成一个完整的列值映射关系。

INSERT INTO `test` (`id`, `name`) VALUES (1,'aa'),(2,'bb');

或者结合--skip-extended-insert生成多条语句。

INSERT INTO `test` (`id`, `name`) VALUES (1,'aa');
INSERT INTO `test` (`id`, `name`) VALUES (2,'bb');


一个bug

其实mysqldump导出数据的过程还是比较清晰的,只是多了一些更加丰富的功能来修饰。但是也在测试的过程汇总发现了--add-drop-database的一个bug,说起来关系就一下子很微妙了。

  如果你需要把某个数据库的数据恢复到指定的备份,如果是全部数据的恢复,包括数据字典数据等,那么使用mysqldump的时候--add-drop-database选项就尤其关键了。

我在使用mysqldup --all-databases --add-drop-database的方式导出数据,导入恢复的时候,收到一个错误信息。

ERROR 1580 (HY000): You cannot 'DROP' a log table if logging is enabled

  这样一个问题,看起来很诡异,如果是使用source的方式来执行,基本上会淹没在大批量的日志中。而使用管道的方式也好不到哪里,因为这个错误是完全相同的。

   为什么会有这个问题呢,是在mysql这个数据库中存在两个表slow_log,general_log(它们的存储引擎是csv的)。我们的数据库基本都开启了慢日志选项slow_query_log,在启用的时候,如果尝试drop这个表就会抛出错误,这一点上来看,这个处理确实有些别扭,而查找mysql的bug库还真有一个匹配的bug

https://bugs.mysql.com/bug.php?id=69953

  而目前的解决方案就有很多了,如果想尽可能平滑实现这个功能,那就是修改导出的sql文件,把drop database if exists mysql这句给去掉,听起来比较笨重,或者修改mysqldump.c,相当于在代码层面加一层过滤。可以参考丁奇的一篇博客。

https://m.aliyun.com/yunqi/articles/8721

  而如果你使用一点小技巧,比如导入数据前,关掉slow_log,导入后开启,那么导入后就开启不了了,会提示表不存在,无法开启,这样看来,你还得单独再对此做一个备份,想想都头疼。

  0


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
`mysqldump` 和 `mysqlimport`
`mysqldump` 和 `mysqlimport`
36 5
|
21天前
|
SQL 关系型数据库 MySQL
mysqldump
mysqldump
13 1
|
关系型数据库 MySQL 数据库
MySQL实战基础知识入门(6):mysql使用mysqldump导出数据出错的解决方案
MySQL实战基础知识入门(6):mysql使用mysqldump导出数据出错的解决方案
174 0
|
SQL 存储 关系型数据库
Navicat for MySQL资源分享和下载以及SQL文件的导入导出
Navicat for MySQL资源分享和下载以及SQL文件的导入导出
513 0
Navicat for MySQL资源分享和下载以及SQL文件的导入导出
|
关系型数据库 MySQL
mysqldump命令
mysqldump命令
|
SQL 关系型数据库 MySQL
mysqldump的简单使用
背景 需要搞mysql数据同步,从一台服务器把数据库同步到另外一台服务器上,如果折腾过的话,就知道有个这玩意--mysqldump,其实就是mysql自带的一个命令而已 操作步骤 1. 认识mysqldump 一般都是mysql安装目录/bin/下,命令也简单可以通过mysqldump --help 查看下 2.
846 0
|
SQL 关系型数据库 数据库
|
关系型数据库 存储
|
关系型数据库 MySQL