MySQL中导入数据的方法主要有两种: LOAD和SOURCE,下面看看两者的特点.

测试过程中二进制日志格式,和用到的表结构如下:

(root@localhost) [(none)]> SHOW VARIABLES LIKE 'binlog_format';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| binlog_format | ROW  |

+---------------+-------+

1 row in set (0.00 sec)

(root@localhost) [stage]> SHOW CREATE TABLE st1\G

*************************** 1. row***************************

Table: st1

Create Table: CREATE TABLE `st1` (

`a`int(10) unsigned NOT NULL DEFAULT '0',

`b`varchar(4) NOT NULL DEFAULT '',

`c`int(11) NOT NULL DEFAULT '0'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

1 row in set (0.00 sec)

使用LOAD导入数据.

(root@localhost) [stage]> LOAD DATA INFILE '/tmp/st1.txt' INTO TABLE st1;

Query OK, 4 rows affected (0.00 sec)

Records: 4 Deleted: 0  Skipped: 0  Warnings: 0

分析其产生的二进制日志,可以发现LOAD将该过程作为一个事物了.

BEGIN

/*!*/;

# at 193

# at 263

#170904 15:36:07 server id 1683316  end_log_pos 314 CRC32 0xffbd6789       Table_map: `stage`.`st1` mapped to number76

# at 314

#170904 15:36:07 server id 1683316  end_log_pos 397 CRC32 0xb3c288aa     Write_rows: table id 76 flags: STMT_END_F

### INSERT INTO `stage`.`st1`

### SET

###  @1=1

###  @2='aa'

###  @3=2

### INSERT INTO `stage`.`st1`

### SET

###  @1=2

###  @2='bb'

###  @3=4

### INSERT INTO `stage`.`st1`

### SET

###  @1=3

###  @2='cc'

###  @3=6

### INSERT INTO `stage`.`st1`

### SET

###  @1=4

###  @2='dd'

###  @3=8

# at 397

#170904 15:36:07 server id 1683316  end_log_pos 428 CRC32 0x67fed44c      Xid = 29

COMMIT/*!*/;

上面的过程,其实和下面的语句是等价的.

START TRANSACTION;

INSERT INTO st1 VALUES(…);

INSERT INTO st1 VALUES(…);

COMMIT;

若LOAD遇到错误,如数据类型不对,或数据列不匹配等,整个过程就会回滚.下面是实际数据导入中遇到的一个报错:

(root@localhost) [product]> LOAD DATA INFILE '/tmp/pro1.txt' INTO TABLE pro1;

ERROR 1261 (01000): Row 4999999 doesn'tcontain data for all columns

(root@localhost) [product]>system perror 1261;

MySQL error code 1261(ER_WARN_TOO_FEW_RECORDS): Row %ld doesn't contain data for all columns

如上报错,在导入第499999条记录时,遇到错误,整个事物进行了回滚,这样的大事物运行效率很低,即使最后提交成功,在主从复制环境下,也极有可能造成延时.

建议LOAD导入数据时,可先用命令split将数据文件分成若干小文件,然后多次导入;也可借助PT工具pt-fifo-split分割文件,其具体使用见说明文档.

其实上面拆分导入的方式,正是命令SOURCE的思路,其一般导入INSERT语句,格式如INSERT INTO st1 VALUES(…), (…), (…) …

下面是实际数据导入中摘出来的日志:

Query OK, 8690 rows affected (0.19 sec)

Records: 8690  Duplicates: 0 Warnings: 0

Query OK, 8800 rows affected (0.24 sec)

Records: 8800  Duplicates: 0 Warnings: 0

可见SOURCE每8000行记录左右提交一次,也可在二进制日志中得到印证.若某条记录出错,其所在分组会进行回滚.至于为什么是8000,暂且理解为内部机制了.

mysql load source_再说说LOAD和SOURCE相关推荐

  1. MySQL的文本导入之load data local

    MySQL的文本导入load data local 数据文件格式: Aeschylus time as he grows old teaches many lessons Alexander Grah ...

  2. mysql infile ignore_mysql导入数据load data infile用法

    我们常常导入数据!mysql有一个高效导入方法,那就是load data infile 下面来看案例说明 基本语法: load data  [low_priority] [local] infile ...

  3. mysql 远程load data_mysql导入数据load data infile用法整理

    有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间. ...

  4. mysql load data 语法_MySql LOAD DATA 使用

    load的语法 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO ...

  5. VScode-Go can't load package: package .: no buildable Go source files in

    在VScode中调试Go程序时提示: can't load package: package .: no buildable Go source files in d:\my_workspace\go ...

  6. MySQL讲义第 37 讲——LOAD DATA INFILE 命令

    MySQL讲义第 37 讲--LOAD DATA INFILE 命令 文章目录 MySQL讲义第 37 讲--LOAD DATA INFILE 命令 一.LOAD DATA INFILE 命令的格式 ...

  7. 在mysql 8.0.22 运行load data local 从本地文本导入数据

    在mysql 8.0.22 运行load data local 从本地文本导入数据时,报错:"ERROR 3948(42000): Loading local data is disable ...

  8. 解决DevTools failed to load SourceMap Could not load content for .js.map HTTP error code 404 问题

    问题 DevTools failed to load SourceMap: Could not load content for ***.js.map: HTTP error: status code ...

  9. DevTools failed to load SourceMap: Could not load content for... 如何关闭这个控制台警告?

    我遇到的警告是这样的: DevTools failed to load SourceMap: Could not load content for chrome-extension://fheoggk ...

最新文章

  1. Phython 3 笔记2 —— 基础语法
  2. CTR点击率预估干货分享
  3. 通过一个简单的例子,了解如何单步调试 Cypress 代码
  4. java在退出前释放资源_Java中如何通过try优雅地释放资源?
  5. Iphone 手机如何导入/导出通讯录
  6. 正确断开计算机和网络的方法是,网络管理与维护-题库
  7. centos安装--两张光盘
  8. Spring 笔记
  9. Python判断某一天是该年的第几天
  10. shell脚本基础 (一)
  11. python棋盘覆盖_java实现的棋盘覆盖
  12. c++ STL之unordered_map
  13. 车牌号识别系统(carOR)
  14. vue如何设置视频封面_vue制作朋友圈封面视频_朋友圈封面设置视频
  15. C++Pollard_rho分解质因数及其例题—————Prime Test
  16. HelloWorld Detail Earth 3D Engine(一)总体介绍
  17. MATLAB房价,MATLAB实现波士顿房价预测使用BP神经网络
  18. Java中将对象转换成String的三种方法
  19. 掌财社骑士:顾比均线怎么设置?顾比均线的投资技巧介绍
  20. httpqyl.php,php使用base64加密解密图片示例分享_PHP

热门文章

  1. 面试题 35 : 复杂链表的复制
  2. Android退出程序时的再按一次退出实现
  3. 驱动中的C语言----指针与指针初使化
  4. oracle decode函数
  5. Java同步组件之Condition,FutureTask
  6. swift 点击imageView全屏预览(UIview中弹出提示框)
  7. FreeRTOS(五)——heap文件解析
  8. 基于 socket.io 实现实时你画我猜游戏
  9. 安全狗服云PC端V2.5.1发布 助力服务器安全运维
  10. 对CSRF(跨站请求伪造)的理解