`
kavy
  • 浏览: 872952 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL批量数据导入Load data infile解决方案

 
阅读更多

转自:http://www.veryphp.cn/datas/2013/1018/9464068748.htm

 

有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间。
假如是从MySql客户端调用,将客户端的文件导入,则需要使用 load local data infile.
LOAD DATA INFILE 语句以很高的速度从一个文本文件中读取行到一个表中。文件名必须是一个文字字符串。
1,开启load local data infile.
假如是Linux下编译安装,
如果使用源码编译的MySQL,在configure的时候,需要添加参数:--enable-local-infile 客户端和服务器端都需要,否则不能使用local参数。
./configure --prefix=/usr/local/mysql --enable-local-infile
make install
若是其它系统,可在配置文件中配置:
在MySql 配置文件My.ini文件中下面项中加入local-infile=1:

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);
}

 

引用:
http://blog.csdn.net/zbszhangbosen/article/details/7947991
http://www.cnblogs.com/zeroone/archive/2013/05/06/3062488.html

分享到:
评论

相关推荐

    mysql load data infile 的用法.docx

    * 导入大规模数据:Load Data Infile 语句可以快速地将大量数据导入到 Mysql 数据库中,非常适合大规模数据导入。 * 导入文本文件:Load Data Infile 语句可以将文本文件中的数据导入到 Mysql 数据库中,非常适合将...

    loadData批量导入以及压缩协议使用指南1

    总的来说,`LOAD DATA INFILE`结合Mycat和MySQL的压缩协议,为大数据量的导入提供了高效的解决方案,尤其是在网络环境不理想的情况下,能够有效减少传输时间,提高整体系统效率。同时,合理配置和使用这些特性,对于...

    mysql遇到load data导入文件数据出现1290错误的解决方案

     执行 “load data infile 文本数据路径 into table tab_load_data” 弹出错误。 #load data (载入数据)语法,要载入数据如下: 1 张三 男 江西 1 2 李四 男 四川 2 3 王五 男 上海 1 4 赵六 女 湖北 3 5 ...

    向MySQL批量导入文本文件

    MySQL提供了一个非常方便的命令`LOAD DATA INFILE`来实现批量导入。以下是一个基本的命令示例: ```sql LOAD DATA INFILE 'path_to_your_file.csv' INTO TABLE my_table FIELDS TERMINATED BY ',' ENCLOSED BY '"'...

    mysql Load Data InFile 的用法

    `LOAD DATA INFILE` 是 MySQL 数据库中一种高效的数据导入工具,它允许用户从外部文本文件快速批量导入数据到数据库的表中。相比于使用 `INSERT INTO` 语句逐条插入,`LOAD DATA INFILE` 在处理大量数据时速度显著更...

    MySQL+数据导入导出+实用技巧

    本文介绍了MySQL数据库中数据的导入导出方法,包括使用SELECT INTO OUTFILE语句将数据导出到文件中,以及使用LOAD DATA INFILE语句将文件中的数据导入到数据库中。同时,还介绍了默认的导入导出格式,即分隔符为制表...

    mysql中将一个表数据批量导入另一表.rar

    如果数据存储在CSV或文本文件中,`LOAD DATA INFILE`是高效的选择。假设数据文件名为`data.csv`,可以这样导入: ```sql LOAD DATA INFILE 'data.csv' INTO TABLE target_table FIELDS TERMINATED BY ',' ...

    mysql数据导入导出php版 mysql数据导入导出php版

    总结,使用PHP进行MySQL数据导入导出涉及到的知识点包括:PHP执行shell命令、PDO和MySQLi扩展的使用、`mysqldump`和`mysqlimport`工具、`SELECT INTO OUTFILE`和`LOAD DATA INFILE` SQL语句、数据分批处理、事务管理...

    Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL

    "Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL" ...使用Java和MYSQL的LOAD DATA LOCAL INFILE语句可以实现高效的大批量导入数据到MySQL,解决了数据交换和导入问题,提高了数据处理效率。

    mysql 的load data infile

    LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。如果指定LOCAL关键词,从客户主机读文件。如果LOCAL没指定,文件必须位于服务器上。(LOCAL在MySQL3.22.6或以后版本中可用。) 为了安全原因,当读取...

    MYSQL数据导入

    `LOAD DATA INFILE` 是MySQL提供的一个高效的数据导入工具,它能够快速地从CSV或其他文本文件中导入数据。例如,如果你有一个名为`data.csv`的文件,你可以使用以下语句: ```sql LOAD DATA INFILE 'data.csv' ...

    MySQL数据导入导出各类型文件

    3. 对于csv文件,可以使用`LOAD DATA INFILE`配合`FIELDS TERMINATED BY`,`ENCLOSED BY` 和 `LINES TERMINATED BY` 来导入。例如: ``` LOAD DATA INFILE 'data.csv' INTO TABLE my_table FIELDS TERMINATED BY ...

    MySQL中由load data语句引起死锁的解决案例

    一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点. 1、背景 ...Load data infile ‘data1.csv' into table tb; Load data infile ‘data2.csv' into table tb; cat Data1.csv

    MySQL数据导入导出方法知识.pdf

    MySQL数据库系统提供了多种...总的来说,MySQL的批处理和`LOAD DATA INFILE`功能提供了高效的数据导入导出解决方案,尤其适合处理大量数据和日志迁移场景。正确利用这些工具,可以极大地提高数据库管理的效率和准确性。

    批量导入数据,大数据导入

    2. **使用LOAD DATA INFILE**:MySQL提供的一种快速导入数据的方法,直接从文件中读取数据并插入表中,适用于CSV或TXT格式的数据文件。 ```sql LOAD DATA INFILE 'data.csv' INTO TABLE table_name FIELDS ...

    mysql load data infile 的用法(40w数据 用了3-5秒导进mysql)

    测试数据的时候,生成txt文件应该快点,再用这种方式导入到mysql 速度上快点。40w数据 用了3-5秒导进mysql,牛逼毁了

    mysql导入txt文本

    总的来说,MySQL的`LOAD DATA INFILE`功能是一个强大的工具,能够有效地将TXT文本数据导入到数据库中。通过理解其工作原理和参数设置,你可以根据自己的需求进行定制,实现高效的数据迁移。在实际操作中,记得始终...

Global site tag (gtag.js) - Google Analytics