gnu 并行 mysql 加载数据本地 INFILE
gnu parallel mysql LOAD DATA LOCAL INFILE
我正在尝试使用 GNU parallel 执行多个 LOAD DATA LOCAL INFILE mysql 命令,其中:
{1}
是我从 UNIX find 命令管道获得的文件的名称
{2}
是一个chop.pl
脚本根据一定的规则从文件字符串中打印出一定的token的结果
看来我调用 GNU parallel 的方式是正确的,除了它
在 mysql 命令后不保留双引号
-e
,导致无法正常工作。
例如
find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e "LOAD DATA LOCAL INFILE '{2}' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='{1}', col6='foo'"
它正在尝试的命令,在 -e
之后缺少双引号,如下所示:
mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e LOAD DATA LOCAL INFILE '/my/file/name/yadda_yadda-12345678.txt' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='yadda_yadda', col6='foo'
有什么想法可以在 -e
之后加回双引号吗?
回答我自己的问题,解决方案是转义所有双引号、单引号和括号符号:
find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e \"LOAD DATA LOCAL INFILE \'{2}\' IGNORE INTO TABLE tblname IGNORE 1 LINES \(col1,col2,col3,col4\) set col5=\'{1}\', col6=\'foo\'\"
懒惰而有效的方法:将mysql命令放在一个函数中,然后让parallel
调用它,传递{1}
和{2}
。
并行手册页实际上建议使用函数:
https://www.gnu.org/software/parallel/man.html#QUOTING
我正在尝试使用 GNU parallel 执行多个 LOAD DATA LOCAL INFILE mysql 命令,其中:
{1}
是我从 UNIX find 命令管道获得的文件的名称{2}
是一个chop.pl
脚本根据一定的规则从文件字符串中打印出一定的token的结果
看来我调用 GNU parallel 的方式是正确的,除了它
在 mysql 命令后不保留双引号
-e
,导致无法正常工作。
例如
find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e "LOAD DATA LOCAL INFILE '{2}' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='{1}', col6='foo'"
它正在尝试的命令,在 -e
之后缺少双引号,如下所示:
mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e LOAD DATA LOCAL INFILE '/my/file/name/yadda_yadda-12345678.txt' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='yadda_yadda', col6='foo'
有什么想法可以在 -e
之后加回双引号吗?
回答我自己的问题,解决方案是转义所有双引号、单引号和括号符号:
find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e \"LOAD DATA LOCAL INFILE \'{2}\' IGNORE INTO TABLE tblname IGNORE 1 LINES \(col1,col2,col3,col4\) set col5=\'{1}\', col6=\'foo\'\"
懒惰而有效的方法:将mysql命令放在一个函数中,然后让parallel
调用它,传递{1}
和{2}
。
并行手册页实际上建议使用函数:
https://www.gnu.org/software/parallel/man.html#QUOTING