精华内容
下载资源
问答
  • MySQL批量导入数据

    千次阅读 2019-06-29 09:42:51
    MySQL提供的批量导入数据的命令是: Load Data InFile 'e:/hetongtxt' Into Table `合同` fields terminated by ' ' lines terminated by '\r\n'; fileds terminated by '',表示字段之间的间隔符,lines ...

    MySQL提供的批量导入数据的命令是:

    Load Data InFile 'e:/hetongtxt' Into Table `合同` fields terminated by '  ' lines terminated by '\r\n';

    fileds terminated by '',表示字段之间的间隔符,lines terminated by ''表示换行符,Windows下用'\r\n',注意文件名和路径最好都是英文的,数据库的字符集和txt的保存编码要一致。

    对于导入整个表的数据还是很好用的,但是怎么实现导入到特定列的数据呢,还有怎么导入包含空格的数据呢

    要导入到数据库的特定字段的方法其实很简单,在 into table table_name(property1, property2[,...]) ..就可以了

    转载于:https://www.cnblogs.com/kiwi/archive/2012/11/29/2793974.html

    展开全文
  • mysql批量导入数据遇到的问题

    千次阅读 2017-07-28 16:41:52
    最近项目中有一个需求,需要把大概150W条数据导入mysql数据库中,一共六张表,数据最多的表大概有100W条数据。 因为是一次性导入,不会经常使用,因此计划写成一个小程序,使用原生JDBC,打成jar包,放到服务器上...

    最近项目中有一个需求,需要把大概150W条数据导入mysql数据库中,一共六张表,数据最多的表大概有100W条数据。
    因为是一次性导入,不会经常使用,因此计划写成一个小程序,使用原生JDBC,打成jar包,放到服务器上运行。

    第一次写完,用maven打jar包,打出的jar包不包含mysql驱动等第三方jar,并且java -jar 时没有程序入口,需要在pom.xml文件中加入如下plugin:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.5</version>
        <configuration>
          <archive>
            <manifest><!--指定jar包主类-->
              <mainClass>com.jd.TransferData</mainClass>
            </manifest>
          </archive>
          <descriptorRefs><!--打jar时打入依赖-->
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>

    程序很短,如下:

    public class TransferData{
        public static void main(String[] args) throws Exception {
            Properties p = readProperties();
            Connection connection = getConnection(p);
            insertTable(connection,"table1");
          /*insertTable(connection,"table2");
            insertTable(connection,"table3");
            insertTable(connection,"table4");
            insertTable(connection,"table5");
            insertTable(connection,"table6");*/
            connection.close();
        }
    
        public static void insertTable(Connection connection, String tableName) throws Exception{
            InputStream inputStream = TransferDataCopy.class.getResourceAsStream("/"+tableName+".txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = reader.readLine()) != null){
                StringBuilder sb = new StringBuilder(100).append("insert into ").append(tableName).append(" values (").append(line).append(")");
                PreparedStatement preparedStatement = connection.prepareStatement(sb.toString());
                preparedStatement.executeUpdate();
                connection.commit();
            }
            reader.close();
        }
    
        public static Properties readProperties() throws Exception {
            Properties properties = new Properties();
            properties.load(TransferDataCopy.class.getResourceAsStream("/jdbc.properties"));
            //properties.list(System.out);
            return properties;
        }
    
        public static Connection getConnection(Properties p) throws Exception{
            Class.forName(p.getProperty("jdbc.driverClass"));
            Connection connection = DriverManager.getConnection(p.getProperty("jdbc.jdbcUrl"),p.getProperty("jdbc.username") ,p.getProperty("jdbc.password"));
            connection.setAutoCommit(false);
            return connection;
        }
    }

    首先从properties文件中读取jdbc配置,根据配置创建一个connection连接,然后将每个表的数据文件读到内存,然后一条一条插入。最大的文件大概140M,我预估把它一次性全部读入内存也没有什么压力。一百多万条数据也不算很多,没有选择批量插入,我觉得再慢几个小时也就完事了吧。

    不过放到服务器上,使用预发环境数据库,运行了2分钟左右,程序莫名其妙被kill掉了,试了好几次都是这样,问了下运维,运维说刚才docker容器内存被打满了,程序被操作系统杀了:

    这里写图片描述

    很意外,不知道怎么内存就被干满了,到底发生了什么导致jvm这么贪婪的申请内存。后来听运维的建议,限制一下jvm内存:

    java  -Xms400m -Xmx400m -jar transferdata-1.0-SNAPSHOT-jar-with-dependencies.jar 

    果然不会被kill了,执行了一个多小时后发现数据只导入了二十多万,之后越来越慢,一秒只能插入10来条。数据库表并没有建索引。

    这么慢不知道要导到猴年马月,网上查阅资料,百万级的插入对于mysql应该是小case,我程序肯定是有问题。于是把程序在我本地运行了一下。

    用jconsole连接了一下程序进程,观察了一下堆内存使用情况:

    这里写图片描述

    发现随着时间的推移,堆大小在不断的增长,不过在我本地并没有被操作系统杀掉(可能是win和linux操作系统不同的原因,也有可能是docker的原因)。很好奇堆里面到底堆积了些什么玩意儿。

    用jmap dump出内存快照:

    jmap -dump:format=b,file= 文件名 [pid]

    用jvisualvm分析一下dump文件:

    这里写图片描述

    发现很多关于jdbc的对象,JDBC42PreparedStatement、JDBC42ResultSet等,实例数加起来有几百万个…

    应该是我使用jdbc出问题了,请教了下部门的架构师,终于知道问题在哪了:

    1.我创建了太多PreparedStatement,每次while循环创建一个,而且一个都不一样,之后也没有close过,connection从始至终都是一个,因此随着程序执行时间越来越长,while循环执行次数越来越多,在内存中缓存的PreparedStatement越来越多,因此内存占用越来越大。不仅数据库客户端(也就是此程序)会缓存大量PreparedStatement,数据库server也有自己的缓存机制,对于如此多的PerparedStatement,server压力也会很大。另外,根据jconsole的堆内存变化情况,heap抖动次数非常频繁,且幅度较大,说明jvm频繁发生gc,在一定程度上gc线程抢占了我的程序的时间片,这也是程序插入越来越慢的一个原因。
    2.我没有利用上PreparedStatement的特性,PreparedStatement是一个预编译语句,它把?占位符放到参数的位置,每次查询时只需把参数set到指定位置即可,这样一个PreparedStatement可以使用多次;

    An object that represents a precompiled SQL statement.A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

    3.使用jdbc批量插入接口,理论上比每次插入一条效率高很多。

    public static void insertTable(Properties p, String tableName) throws Exception{
        Connection connection = getConnection(p);
        InputStream inputStream = TransferData.class.getResourceAsStream("/"+tableName+".txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        PreparedStatement preparedStatement = connection.prepareStatement(table_quote.get(tableName));
        String line;
    
        int linecount = 1;
        String[] params = null;
        try {
        while ((line = reader.readLine()) != null){
            params = line.replaceAll("'","").split(",");
            for(int i=0;i<params.length;i++) {
                preparedStatement.setObject(i+1,params[i].trim());
            }
            preparedStatement.addBatch();
            if (linecount % 1000 == 0) {
                preparedStatement.executeBatch();
                connection.commit();
            }
            linecount++;
    
        }
        preparedStatement.executeBatch();
        connection.commit();
        preparedStatement.close();
        connection.close();
        inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    改造完成的程序,运行在服务器,大概两分钟左右就把数据全部导入完毕了。

    注:

    把所有的java进程杀掉(只能杀当前用户启动的进程)
    ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill
    
    运行java进程后即使ctrl+c退出,也不会停掉程序的运行 nohup java  -Xms400m -Xmx400m -jar transferdata-1.0-SNAPSHOT-jar-with-dependencies.jar &  
    展开全文
  • Mysql批量导入数据

    2017-07-17 10:04:45
    大量数据操作到时候,使用原生jdbc操作时会有更新速度慢的情况,解决到方法是在数据库中建立索引,速度明显快了好多倍
    大量数据操作到时候,使用原生jdbc操作时会有更新速度慢的情况,解决到方法是在数据库中建立索引,速度明显快了好多倍
    
    展开全文
  • 使用LOAD DATA 比一行一行insert的效率要高,另外...mysql -u root -p --execute=&quot;LOAD DATA LOCAL INFILE 'xxx文件名' INTO TABLE 库名.表名 FIELDS TERMINATED BY ',' IGNORE 1 LINES; SHOW WARNINGS...

    使用LOAD DATA 比一行一行insert的效率要高,另外mysqlimport也是封装了LOAD DATA的
    直接在命令行下执行:
    mysql -u root -p --execute="LOAD DATA LOCAL INFILE 'xxx文件名' INTO TABLE 库名.表名 FIELDS TERMINATED BY ',' IGNORE 1 LINES; SHOW WARNINGS
    稍微解释一下:

    • LOCAL :如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。
    • FIELDS TERMINATED BY: 用来指定分隔符
    • IGNORE xxx LINES : 用来指定忽略的行数
    • 最后面的SHOW WARNINGS可以用来显示警告信息。
    展开全文
  • 前言 数据分析中离不开数据,而数据来源包括自身平台的数据流、项目中的日志文件、必要的数据爬取...此博文举例介绍了SQLyog批量导入csv文件,并解决其中中文乱码问题。 准备工作 确保数据库中表的字段与字段...
  • 本地导入数据出现MYSQL server has gone away错误时:问题分析首先度娘:mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了。 造成这样的原因一般是...
  • 1、查看net_read_timeout... show variables like '%timeout'; 默认是30s和60s,分别加大数值 发现依然会报错。...2、查看max_allowed_packet参数 ...show variables like '%max_allowed_packet';...发现将近有一个G...
  • load data local infile 'd:\aa.txt' replace into table e_voidcard FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' ignore 1 lines(cardnetwork,cardid,cardstatus,cardtype,validflag,int
  • MySQL批量导入Excel数据

    万次阅读 2018-01-12 17:03:34
    1、确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序;(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名称一致,方便需要导入多张表数据时一一对应)) ...
  • mysql批量导入excel数据

    2020-08-15 17:56:01
    那么如何从把excel中的数据批量导入到数据库的表里呢? 在导入之前,我们需要准备一些工作: 1.首先要准备excel中的数据,注意:这里面的列名的数量要跟数据库表里的列的数量一直,但是excel里不要使用表的列名,...
  • load data infile 命令 高速向数据库中做批量导入 首先:生成txt数据文件,将值全部弄好,不同值之间用,分隔; 然后:把生成的文件放到数据库对应的数据存储目录,命令登录mysql,用load data命令去导入; 注意...
  • Mysql批量导入功能

    2020-05-25 11:02:07
    Mysql批量导入功能
  • MySQL批量导入文本文件向MySQL批量导入文本文件向MySQL批量导入文本文件向MySQL批量导入文本文件
  • shell 批量导入数据

    千次阅读 2017-04-26 16:49:28
    shell实现mysql批量导入数据
  • Django向Mysql批量导入数据

    千次阅读 2017-01-10 14:32:52
    怎么批量导入数据呢?我首先尝试了用navicat这个工具向数据库中导入,但是发现不行,不知道明确的原因,我猜是因为Django中的数据库有自己的形式,所以不能用第三方直接插入。那么就得在我们的工程里面用脚本实现:...
  • 不知道是我安装的office不对还是MySQL不对,极少数情况下可以成功导入数据,所以感觉这种直接导入的方法会受到office版本等因素的诸多限制,所以今天向大家介绍从txt批量导入数据MySQL的方法,当然首先介绍的是...
  • 不知道是我安装的office不对还是MySQL不对,极少数情况下可以成功导入数据,所以感觉这种直接导入的方法会受到office版本等因素的诸多限制,所以今天向大家介绍从txt批量导入数据MySQL的方法,当然首先介绍的是...
  • mysql批量导入1亿数据

    2017-09-14 11:13:42
    1.max_allowed_packet=1024M ...重启mysql 2. 在终端执行 load data infile "/var/lib/mysql-files/label9.txt" replace into table label character set utf8 fields terminated by '&' lines terminated b
  • 利用Excel向MySQL批量导入数据

    千次阅读 2016-09-26 20:47:01
    利用Excel向MySQL批量导入数据  因项目中一张表中有进100个字段,不得不使用Excel批量导入,之前ctr+c和ctr+v手撸进两个小时。。。。我日,记一下,防止自己忘了。  贴出核心公式: =("INSERT INTO rest_api_...
  • Mac使用MySQL Workbench批量导入Excel数据 首先新建一个表(在MySQL里新建,列名最好用英文),然后打开你要导入的文件(不要用中文表头) 选择另存为 CSV UTF-8(逗号分隔).csv 格式 再以文本文件形式打开 再...
  • mybatis 批量导入数据mysql返回批量Id1、首先mybatis版本必需是3.3.1或以上2、mapper配置文件中&lt;insert id="insertOrderBatch" parameterType="java.util.List" useGeneratedKeys=&...
  • 首先添加引用 Mysql.Data /// <... /// Mysql 数据批量导入数据库 2020年4月30日12:55:16 Dennyhui /// </summary> /// <param name="_mySqlConnection">mysql连接字符串</p...
  • mysql批量导入txt文件数据

    千次阅读 2013-07-29 15:04:03
    1、用java代码造好数据,这里就用1000条 package Utils; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class CreateMysqlData { /** * @param ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,099
精华内容 12,439
关键字:

mysql批量导入数据

mysql 订阅