搜索
首页数据库mysql教程 [整理]MySql批量数据导入Load data infile解决方案

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

add:

[mysqld]

local-infile=1

[mysql]

local-infile=1

客户端和服务端度需要开启,对于客户端也可以在执行命中加上--local-infile=1 参数:

mysql --local-infile=1 -uroot -pyourpwd yourdbname

如:

如:/usr/local/mysql/bin/mysql -uroot -h192.168.0.2 -proot databaseName --local-infile=1 -e "LOAD DATA LOCAL INFILE 'data.txt' into table test(name,sex) "


2, 编码格式注意:

若包含中文,请保证导入文件、连接字符串、导入表都是UTF-8编码。


3,执行

在使用LOAD DATA到MySQL的时候,有2种情况:

(1)在远程客户端(需要添加选项:--local-infile=1)导入远程客户端文本到MySQL,需指定LOCAL(默认就是ignore),加ignore选项会放弃数据,加replace选项会更新数据,都不会出现唯一性约束问题。

[zhuxu@xentest9-vm1 tmp]$mysql -uzhuxu -pzhuxu test -h10.254.5.151 --local-infile=1--show-warnings -v -v -v \

> -e "LOAD DATA LOCAL INFILE '/tmp/2.txt' INTO TABLE tmp_loaddata FIELDS TERMINATED BY ','";

(2)在本地服务器导入本地服务器文本到MySQL,不指定LOACL,出现唯一性约束冲突,会失败回滚,数据导入不进去,这个时候就需要加ignore或者replace来导入数据。

mysql>LOAD DATA INFILE '/home/zhuxu/1.txt' INTO TABLE tmp_loaddata FIELDS TERMINATED BY ',';


4,事务分析

步骤是这样的:

1,开启binlog,设置binlog_format=row,执行reset master;

2,load data infile xxxxx;

3,查看binlog。


可以看出,总共是一个事务,也通过mysqlbinlog查看了binary log,确认中间是被拆分成了多个insert形式。所以load data infile基本上是这样执行的:

begin

insert into values(),(),(),()...

insert into values(),(),(),()...

insert into values(),(),(),()...

...

...

commit

当然,由于row格式的binlog的语句并不是很明显的记录成多值insert语句,它的格式时

insert into table

set @1=

set @2=

...

set @n=

insert into table

set @1=

set @2=

...

set @n=

insert ...

;注意这里有一个分号‘;’,其实前面这一部分就相当于前面说的多值insert形式

然后接下来就重复上面的那种格式,也就是一个load data infile 拆成了多个多值insert语句。

前面说的是row格式记录的load data infile,那么对于statement是怎么样的呢?statement格式的binlog,它是这样记录的,binlog中还是同样的load data语句,但是在记录load data 语句之前,它会先将你master上这个load data 使用到的csv格式的文件拆分成多个部分,然后传到slave上(在mysql的tmpdir下),当然传这些csv格式的文件也会记录binlog event,然后最后真正的SQL语句形式就是load data local infile '/tmp/SQL_X_Y'这种形式(这里假设mysql的tmpdir是默认的/tmp),实际上这样很危险,比如tmpdir空间不够,那就会报错。不过从效率上来说两者可能差不多,因为statement格式的binlog也是拆分成了多个语句。


附:

(1)load data infile 和 load local data infile 在 innodb和MyISAM 同步方面的区别

对MyISAM引擎:

(1)对master服务器进行 ‘load’ 操作,

(2)在master上所操作的load.txt文件,会同步传输到slave上,并在tmp_dir 目录下生成 load.txt文件

master服务器插入了多少,就传给slave多少

(3)当master上的load操作完成后,传给slave的文件也结束时,

即:在slave上生成完整的 load.txt文件

此时,slave才开始从 load.txt 读取数据,并将数据插入到本地的表中


对innodb引擎:

(1)主数据库进行 ‘Load’ 操作

(2)主数据库操作完成后,才开始向slave传输 load.txt文件,

slave接受文件,,并在 tmp_dir 目录下生成 load.txt 文件

接受并生成完整的load.txt 后,才开始读取该文件,并将数据插入到本地表中


异常情况处理:

1)对MyISAM引擎

当数据库执行load,此时如果中断:

Slave端将报错,例如:

####################################################################

Query partially completed on the master (error on master: 1053) and was aborted.

There is a chance that your master is inconsistent at this point.

If you are sure that your master is ok,

run this query manually on the slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

START SLAVE; . Query: 'LOAD DATA INFILE '/tmp/SQL_LOAD-2-1-3.data' IGNORE INTO TABLE `test_1`

FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`id`, `name`, `address`)'

###########################################################################################

按照提示,在slave服务器上:

(1) 使用提示的load命令,将主服务器传输过来的load文件,在从服务器上执行

(2)让从服务器跳过错误。set global sql_slave_skip_counter=1;

(3)开启同步

2)对Innodb引擎

由于innodb是事务型的,所以会把load文件的整个操作当作一个事务来处理,

中途中断load操作,会导致回滚。

与此相关的一些参数:

max_binlog_cache_size----能够使用的最大cache内存大小。

当执行多语句事务时,max_binlog_cache_size如果不够大,

系统可能会报出“Multi-statement

transaction required more than 'max_binlog_cache_size' bytes of storage”的错误。

备注:以load data 来说,如果load的文件大小为512M,在执行load 的过程中,

所有产生的binlog会先写入binlog_cache_size,直到load data 的操作结束后,

最后,再由binlog_cache_size 写入二进制日志,如mysql-bin.0000008等。

所以此参数的大小必须大于所要load 的文件的大小,或者当前所要进行的事务操作的大小。


max_binlog_size------------Binlog最大值,一般设置为512M或1GB,但不能超过1GB。

该设置并不能严格控制Binlog的大小,尤其是Binlog遇到一根比较大事务时,

为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进

当前日志,直到事务结束

备注:有时能看到,binlog生成的大小,超过了设定的1G。这就是因为innodb某个事务的操作比较大,

不能做切换日志操作,就全部写入当前日志,直到事务结束。


(2)C# 批量插入Mysql


public void loadData(Connection connection)

{

long starTime = System.currentTimeMillis();


String sqlString = "load data local infile ? into table test";

PreparedStatement pstmt;

try {

pstmt = connection.prepareStatement(sqlString);


pstmt.setString(1, "tfacts_result");


pstmt.executeUpdate();


pstmt.close();

} catch (SQLException e) {

e.printStackTrace();

}


long endTime = System.currentTimeMillis();


System.out.println("program runs " + (endTime - starTime) + "ms");


}


public static void mysql_batch(string sqlStr,int point)

{

string sql = "insert into test(node1, node2, weight) values(?, ?, ?)";


Connection conn = getConn("mysql");

conn.setAutoCommit(false);

//clear(conn);

try

{

PreparedStatement prest = conn.prepareStatement(sql);

//long a = System.currentTimeMillis();

for (int x = 1; x

{

prest.setInt(1, x);

prest.setString(2, "张三");

prest.addBatch();

if (x % point == 0)

{

prest.executeBatch();

conn.commit();

}

}

prest.close();

//long b = System.currentTimeMillis();

//print("MySql批量插入10万条记录", a, b, point);

}

catch (Exception ex)

{

ex.printStackTrace();

}

finally

{

close(conn);

}


引用:

本文出自 “小何贝贝的技术空间” 博客,请务必保留此出处

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
解释InnoDB缓冲池及其对性能的重要性。解释InnoDB缓冲池及其对性能的重要性。Apr 19, 2025 am 12:24 AM

InnoDBBufferPool通过缓存数据和索引页来减少磁盘I/O,提升数据库性能。其工作原理包括:1.数据读取:从BufferPool中读取数据;2.数据写入:修改数据后写入BufferPool并定期刷新到磁盘;3.缓存管理:使用LRU算法管理缓存页;4.预读机制:提前加载相邻数据页。通过调整BufferPool大小和使用多个实例,可以优化数据库性能。

MySQL与其他编程语言:一种比较MySQL与其他编程语言:一种比较Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。 MySQL以其高性能、可扩展性和跨平台支持着称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

学习MySQL:新用户的分步指南学习MySQL:新用户的分步指南Apr 19, 2025 am 12:19 AM

MySQL值得学习,因为它是强大的开源数据库管理系统,适用于数据存储、管理和分析。1)MySQL是关系型数据库,使用SQL操作数据,适合结构化数据管理。2)SQL语言是与MySQL交互的关键,支持CRUD操作。3)MySQL的工作原理包括客户端/服务器架构、存储引擎和查询优化器。4)基本用法包括创建数据库和表,高级用法涉及使用JOIN连接表。5)常见错误包括语法错误和权限问题,调试技巧包括检查语法和使用EXPLAIN命令。6)性能优化涉及使用索引、优化SQL语句和定期维护数据库。

MySQL:初学者的基本技能MySQL:初学者的基本技能Apr 18, 2025 am 12:24 AM

MySQL适合初学者学习数据库技能。1.安装MySQL服务器和客户端工具。2.理解基本SQL查询,如SELECT。3.掌握数据操作:创建表、插入、更新、删除数据。4.学习高级技巧:子查询和窗口函数。5.调试和优化:检查语法、使用索引、避免SELECT*,并使用LIMIT。

MySQL:结构化数据和关系数据库MySQL:结构化数据和关系数据库Apr 18, 2025 am 12:22 AM

MySQL通过表结构和SQL查询高效管理结构化数据,并通过外键实现表间关系。1.创建表时定义数据格式和类型。2.使用外键建立表间关系。3.通过索引和查询优化提高性能。4.定期备份和监控数据库确保数据安全和性能优化。

MySQL:解释的关键功能和功能MySQL:解释的关键功能和功能Apr 18, 2025 am 12:17 AM

MySQL是一个开源的关系型数据库管理系统,广泛应用于Web开发。它的关键特性包括:1.支持多种存储引擎,如InnoDB和MyISAM,适用于不同场景;2.提供主从复制功能,利于负载均衡和数据备份;3.通过查询优化和索引使用提高查询效率。

SQL的目的:与MySQL数据库进行交互SQL的目的:与MySQL数据库进行交互Apr 18, 2025 am 12:12 AM

SQL用于与MySQL数据库交互,实现数据的增、删、改、查及数据库设计。1)SQL通过SELECT、INSERT、UPDATE、DELETE语句进行数据操作;2)使用CREATE、ALTER、DROP语句进行数据库设计和管理;3)复杂查询和数据分析通过SQL实现,提升业务决策效率。

初学者的MySQL:开始数据库管理初学者的MySQL:开始数据库管理Apr 18, 2025 am 12:10 AM

MySQL的基本操作包括创建数据库、表格,及使用SQL进行数据的CRUD操作。1.创建数据库:CREATEDATABASEmy_first_db;2.创建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入数据:INSERTINTObooks(title,author,published_year)VA

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。