zoukankan      html  css  js  c++  java
  • 使用pt-fifo-split 工具往mysql插入海量数据

    《mysql插入/更新数据》这篇文章提到,使用LOAD DATA INFILE语句,可以从一个文件直接加载数据到mysql中,但如果文件非常大,可能还需要对文件进行切割,分多次加载,这种情况下,可以使用pt-fifo-split工具将文件分割成多个数据块(chunks),从而控制每次传输到mysql服务器的数据量大小。

    pt-fifo-split 可以模拟切割文件,并通过管道传递给先入先出队列而不用真正的切割文件。pt-fifo-split 是 percona-toolkit 套件的一部分。

    pt-fifo-split 命令用法:

    pt-fifo-split [options] [FILE ...]

    例如:使用pt-fifo-split分割一个大文件,每次读1000000行:

    pt-fifo-split --lines 1000000 hugefile.txt
    while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done

    pt-fifo-split 默认会在/tmp下面建立一个fifo文件,并读取大文件中的数据写入到fifo文件,每次达到指定行数就往fifo文件中打印一个EOF字符,读取完成以后,关闭掉fifo文件并移走,然后重建fifo文件,打印更多的行。这样可以保证你每次读取的时候都能读取到制定的行数直到读取完成。注意此工具只能工作在类unix操作系统。

    常用选项:

    --fifo /tmp/pt-fifo-split,指定fifo文件的路径;

    --offset 0,如果不打算从第一行开始读,可以设置这个参数;

    --lines 1000,每次读取的行数;

    --force,如果fifo文件已经存在,就先删除它,然后重新创建一个fifo文件;

    下面是一个完整的用法例子:

    FLAT_FILE="/tmp/big_file.txt"
    FIFO_PATH="${FLAT_FILE}.fifo"
    LOAD_FILE="${FLAT_FILE}.load"
    CHUNK_SIZE=100000
    
    # Split the file
    pt-fifo-split --force --lines ${CHUNK_SIZE} ${FLAT_FILE} --fifo ${FIFO_PATH} &
    # Sleep 10 seconds to assure ${FIFO_PATH} exists before entering loop
    sleep 10
    while [ -e ${FIFO_PATH} ]
    do
      # Write chunk to disk
      cat ${FIFO_PATH} > ${LOAD_FILE}
      # Load chunk into table
      mysql --database=test 
       --show-warnings 
       -vve "load data infile '${LOAD_FILE}' into table my_table;"
    done

    关于pt-fifo-split 性能评测可以参考这篇文章

  • 相关阅读:
    MySQL安装失败,提示需安装MicroSoft Visual C++ 2013 Redistributable
    Selinium登录系统cookies的重复使用
    脚本绕开验证码,自动执行的方法
    Firebug显示停用状态
    web自动化测试中绕开验证码登陆的方式
    java使用poi包将数据写入Excel表格
    读取config配置
    定位元素的等待方法
    jxl读取Excel表格数据
    php中的魔术常量
  • 原文地址:https://www.cnblogs.com/chenny7/p/4253337.html
Copyright © 2011-2022 走看看