zoukankan      html  css  js  c++  java
  • 使用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.
  • 相关阅读:
    矩阵快速幂
    BITSET
    不再以讹传讹,GET和POST的真正区别(转)
    Anaconda 镜像
    Anaconda常用命令大全
    如何使用抓包工具fiddler对app进行接口分析
    windows10搭建django1.10.3+Apache2.4
    如何用jenkins实现自动化构建新版本和二维码下载
    解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题
    Macaca开源--阿里的移动自动化测试框架
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/15487847.html
Copyright © 2011-2022 走看看