热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[整理]MySql批量数据导入Loaddatainfile解决方案

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

有时候我们需要将大量数据批量写入数据库,直接使用程序语言和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 <= count; 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);

}


引用:

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

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
author-avatar
mmakarlen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有