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 条评论
登录 后参与评论

相关文章

来自专栏数据库新发现

如何查询redo logfile的使用率

redo logfile的使用,不能通过v$视图查询,但是我们可以通过底层视图得到.

372
来自专栏青枫的专栏

day37_Spring学习笔记_05_CRM_01

CRM : custom releation manager 客户关系管理系统,用于维护客户和公司之间关系。 我们要做的是:学校 和 大家 之间关系。

342
来自专栏数据和云

【合理授权,安全第一】聊一聊Oracle数据库的用户权限

编辑手记:年底大家最关注数据安全,之前我们说过,数据库的风险分为外部风险和内部风险。外部风险无法预估但概率较小,平时发生最多的还是内部操作的风险,因此合理控制权...

2445
来自专栏野路子程序员

整合用户篇—Oauth2理解与构造简单的系统

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

高通平台如何使用QPST抓DUMP

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

603
来自专栏「3306 Pai」社区

MySQL 8.0用户和角色管理

MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理,默认的密码加密方式也做了调整,由之前的sha1改为了sha2,同时加上5.7的禁用用户和用户过...

720
来自专栏IT 指南者专栏

SSM 框架快速整合实例--学生查询

SSM 框架即 Spring 框架、SpringMVC 框架、MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了。...

42214
来自专栏十月梦想

mysql基础命令

键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,然后回车即可进入到mysql中了,mysql的提示符是: mysql>

512
来自专栏沃趣科技

MySQL中的统计信息相关参数介绍

统计信息的作用 上周同事在客户现场遇到了由于统计信息的原因,导致应用数据迁移时间过慢,整个迁移差点失败。关键时刻同事发现测试环境与生产环境SQL语句执行计划不一...

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

关于自动化平台的动态菜单设计

最近几天是马不停蹄的做一些事情,今天计划把通用功能的部分先改进一些,比如说菜单的权限配置。目前使用的方案是用户可以看到所有的菜单,如果没有权限,则返回一个权限不...

3194

扫码关注云+社区