MySQL 如何跨机器加载数据(附脚本)?

作者:温开源

近期有同事需要做跨机器将一个数据文件导入到MySQL的需求,所以将以前做的笔记及随带脚本分享一下。

跨机器 load data

若本机有一个文件: /tmp/load.txt,需要导入到远端的 mysqlxxx_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 部分。

  • load_data.sh
#!/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)' 'create table if not exists test_data( hash bigint(20) unsigned, cnt int(10) unsigned, url text, ) ENGINE = MyISAM DEFAULT CHARSET = utf8;'

如果不需要自动创建数据表,最后这个参数可以不要。 如果不指定列名,倒数第二个参数也可以不要。

即下面两种写法都可以:

  ./load_data.sh test_data.txt test_data '(hash, cnt, url)'
  ./load_data.sh test_data.txt test_data

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏窗户

python使用rsa库做公钥解密(网上别处找不到)

  使用RSA公钥解密,用openssl命令就是openssl rsautl -verify -in cipher_text -inkey public.pem...

3049
来自专栏数据和云

数据恢复:隐含参数_minimum_giga_scn被废弃后如何调SCN

崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 在很多数据恢复的场景中,我们可能需要调节SCN,但是一个重要的隐含参数...

27810
来自专栏Java成神之路

Mysql总结_03_mysql常用命令

一、MySQL服务的启动和停止  net stop mysql  net start mysql 二、登陆mysql mysql -u用户名 -p用户密码

582
来自专栏乐沙弥的世界

传统路径导出 VS 直接路径导出(oracle exp direct=y)

      Oracle 传统的Export与Import依旧被保留到11g,而且9i与10g有很多依旧使用Export与Import方式进行备份与恢复的企业。...

663
来自专栏杨建荣的学习笔记

通过shell定制ash脚本(r3笔记第33天)

ash是在10g以来一个很有用的特性,能够作为awr的补充,对于排查一些历史的问题能够提供更加详细和针对性的数据。 当然个人在使用ash的时候感觉最慢的地方就是...

3044
来自专栏琯琯博客

Yii2 开发小技巧

2244
来自专栏Laoqi's Linux运维专列

shell脚本备份mysql数据库

第一种方法: #!/bin/sh # 备份数据库 # Mysql 用户名密码 MYSQL_USER=root MYSQL_PASS=root BACKU...

3454
来自专栏一个会写诗的程序员的博客

INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法INSTALL_FAILED_NO_MATCHING_ABIS

``` 16:31 Failed to finalize session : INSTALL_FAILED_NO_MATCHING_ABIS: Faile...

841
来自专栏乐沙弥的世界

Oracle AWR管理与维护

  AWR是Automatic Workload Repository的简称,中文叫着自动工作量资料档案库。对于AWR的管理,主要是针对快照和基线的管理而言。比...

710
来自专栏linux驱动个人学习

高通平台如何使用QPST抓DUMP

手机系统死机白屏后,使用USB线 连接手机和计算机。打开计算机设备管理器 ,当其中与手机相关的端口只有DIAG 口 项(9006端口)时,表明手机处于DUMP ...

973

扫码关注云+社区