作者:温开源
近期有同事需要做跨机器将一个数据文件导入到MySQL的需求,所以将以前做的笔记及随带脚本分享一下。
若本机有一个文件: /tmp/load.txt
,需要导入到远端的 mysql
的 xxx_table
里,可以用如下命令:
mysql -hx.x.x.x -uxxxx -pxxxx db -BN --local-infile=1
-e "load data local infile '/tmp/load.txt' into table xxx_table;"
\--local-infile=1
参数: 打开远端服务器的 local-infile
开关,允许 local infile
操作。
SQL 中:local infile
语法不同于 infile
,前者从客户端机器读取文件,后者从服务器读取文件。
官方参考:http://dev.mysql.com/doc/refman/5.7/en/load-data.html如果服务器端(mysqld) 启动时指定了 \--local-infile=0
,则 local infile
中的 local
不会生效,即使在 mysql
命令中指定 \--local-infile=1
,也无用。
这个限制为了避免一些安全问题:http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html
通用的一个脚本,改改其中的这些参数:-uUSER -pPASSWD -hHOST DB
即可使用,load
的文本数据必须是 utf8
编码的,若是其他编码,修改脚本中 sql
中的 CHARACTER SET
部分。
#!/bin/bash
MYSQL='mysql -uUSER -pPASSWD -hHOST DB --default-character-set=utf8 --local-infile=1 '
function LOG()
{
echo "[`date "%Y-%m-%d %H:%M:%S"` $$] $*"
}
if [[ -z "$2" ]]
then
echo "Usage:"
echo " $0 <file> <table> [cols] [create_sql]"
exit 1
fi
FILE=`readlink -m "$1"`
TABLE=$2
COLS=$3
CREATE_SQL=$4
sql="${CREATE_SQL}load data local infile '${FILE}' into table ${TABLE} CHARACTER SET utf8 ${COLS};"
LOG "${sql}"
if ${MYSQL} -e "${sql}"
then
LOG "Load ${FILE} into table ${TABLE} success."
exit 0
else
LOG "Load ${FILE} into table ${TABLE} fail."
exit 1
fi
如果不需要自动创建数据表,最后这个参数可以不要。 如果不指定列名,倒数第二个参数也可以不要。
即下面两种写法都可以:
./load_data.sh test_data.txt test_data '(hash, cnt, url)'
./load_data.sh test_data.txt test_data
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。