使用mysqldump 导出数据时的常用选项

前面两篇博客
MySQL导入导出数据库
mysqldump 如何导出表的部分数据

已经介绍了mysqldump的基本用法。

本文主要介绍在使用mysqldump时常用的选项。

--single-transaction

该选项保证数据导出的一致性:

--single-transaction 

这里的一致性是指在导出过程中读到的数据是一个快照。

该选项会将隔离级别设置为REPEATABLE READ,随后执行START TRANSACTION开启一个事务,让整个数据在dump过程中保证数据的一致性。这个操作不会锁表,适用于支持事务的数据库引擎,例如InnoDB等,但是这个不能保证MyISAM表和MEMORY表的数据一致性。

为了确保使用--single-transaction命令时,保证dump文件的有效性。
需没有下列语句LTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因为一致性读不能隔离上述语句。

--set-gtid-purged=OFF

加了这个选项,导出SQL文件中会多出几行,关于binlog记录的:

SET @@SESSION.SQL_LOG_BIN=0;
SET @@GLOBAL.GTID_PURGED='';

当在新主库上执行刚才导出的SQL文件时,不记录binlog,不记录GTID,是不利于主从复制的。也就是说,这个数据只会导入到主库,

下面对加不加这个参数的差别进行测试。

以下测试中MySQL GTID是打开的:

mysql> set global ENFORCE_GTID_CONSISTENCY=on;
Query OK, 0 rows affected (0.00 sec)

mysql> set global gtid_mode=OFF_PERMISSIVE;
Query OK, 0 rows affected (0.00 sec)

mysql> set global gtid_mode=ON_PERMISSIVE;
Query OK, 0 rows affected (0.00 sec)

mysql> set global gtid_mode=ON;
Query OK, 0 rows affected (0.00 sec)

不加 --set-gtid-purged=OFF

导出数据:

mysqldump -u root -pAa123456 --single-transaction test test5 >test5.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
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.

导出的test5.sql文件:

-- MySQL dump 10.13  Distrib 5.7.23, for macos10.13 (x86_64)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version	5.7.23

/*!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 */;
/*!40101 SET NAMES utf8 */;
/*!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='';

--
-- Table structure for table `test5`
--

DROP TABLE IF EXISTS `test5`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test5` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `age` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:yes, -1:no',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `test5`
--

LOCK TABLES `test5` WRITE;
/*!40000 ALTER TABLE `test5` DISABLE KEYS */;
INSERT INTO `test5` VALUES (1,'John',3),(7,'Alex',2),(8,'Bob',3),(9,'Kirk',12),(10,'Kim',11),(11,'Sam',12),(12,'Mark',13);
/*!40000 ALTER TABLE `test5` 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-10-30 22:11:36

加上 --set-gtid-purged=OFF

导出命令:

mysqldump -u root -pAa123456 --single-transaction --set-gtid-purged=OFF test test5 >test5_gtid_purged.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

导出的文件test5_gtid_purged.sql

-- MySQL dump 10.13  Distrib 5.7.23, for macos10.13 (x86_64)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version	5.7.23

/*!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 */;
/*!40101 SET NAMES utf8 */;
/*!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 */;

--
-- Table structure for table `test5`
--

DROP TABLE IF EXISTS `test5`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test5` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `age` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:yes, -1:no',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `test5`
--

LOCK TABLES `test5` WRITE;
/*!40000 ALTER TABLE `test5` DISABLE KEYS */;
INSERT INTO `test5` VALUES (1,'John',3),(7,'Alex',2),(8,'Bob',3),(9,'Kirk',12),(10,'Kim',11),(11,'Sam',12),(12,'Mark',13);
/*!40000 ALTER TABLE `test5` ENABLE KEYS */;
UNLOCK TABLES;
/*!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-10-30 22:18:43

对比下这两个文件,可以看出差别:
在这里插入图片描述

左边是不加的,右边的加的。

不加选项的,会多出两行:

SET @@SESSION.SQL_LOG_BIN=0;
SET @@GLOBAL.GTID_PURGED='';

其他常用选项

--max_allowed_packet=xxx

服务器发送和接受的最大包长度。
例如,1G

--default-character-set=xxx

设置默认字符集,默认值为utf8。
例如,utf8mb4

--net_buffer_length=xxx

client/server通信的初始缓存大小,单位字节。
例如,1024

mysqldump常用方式

mysqldump -h xxxx -u xx -p xxx --single-transaction  --max_allowed_packet=1G  --default-character-set=utf8mb4  --set-gtid-purged=OFF --net_buffer_length=16535  cmdb   > cmdb.sql

参考

mysqldump — A Database Backup Program

Just try, don't shy.
原文地址:https://www.cnblogs.com/lanyangsh/p/15487847.html