• 使用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 性能评测可以参考这篇文章

  • 相关阅读:
    Ruby能否成为第二个Java
    攻防实践:一次入侵兼反入侵的实例
    微型PHP木马的探讨
    破解Session cookie的方法
    ASP马免杀工具—ASP万能溶剂
    微型PHP木马的探讨
    Ubuntu 8.04公布带给我们的商机
    Root logins are not allowed 的标题操持
    若何安装vixta之一若何哄骗Nero将vixta刻录成ISO光盘
    如何安排vixta之三Installing来源劈脸安排
  • 原文地址:https://www.cnblogs.com/chenny7/p/4253337.html
Copyright © 2020-2023  润新知