前面两篇博客
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