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

相关文章

来自专栏乐沙弥的世界

启用 Oracle 10046 调试事件

    Oracle 10046是一个Oracle内部事件。最常用的是在Session级别设置sql_trace(alter session set sql_t...

6220
来自专栏芋道源码1024

数据库中间件 MyCAT 源码分析 —— 【单库单表】查询

本文主要基于 MyCAT 1.6.5 正式版 1. 概述 2. 接收请求,解析 SQL 3. 获得路由结果 4. 获得 MySQL 连接,执行 SQL 5. 响...

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

system表空间不足的问题分析(二) (r8笔记第5天)

今天收到一条不太起眼的报警邮件,大体内容是某个表空间的空间有些紧张了。大体内容如下: Tablesapce: CMBI_SNZG_DATA: 92.2% [W...

35270
来自专栏idba

MySQL 5.7 新特性之三

本系列文章基于5.7.20 版本讲述MySQL的新特性,从安装,文件结构,SQL,优化,复制等几个方面展开介绍5.7 的新特性和功能,同时也建议大家跟踪官方bl...

11020
来自专栏逸鹏说道

程序猿是如何解决SQLServer占CPU100%的

文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句...

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

一个SQL性能问题的优化探索(一)(r11笔记第33天)

今天同事问我一个问题,看起来比较常规,但是仔细分析了一圈,发现实在是有些晕,我隐隐感觉这是一个bug,但是有感觉问题还有很多需要确认和理解的细节。 同事...

35890
来自专栏程序猿

mysql 命令大全

1、连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前...

376110
来自专栏数据库新发现

关于checkpoint cnt和checkpoint scn

SQL> alter session set events 'immediate trace name CONTROLF level 10';

15620
来自专栏互联网杂技

修改数据表(列操作)

前面有介绍数据的增删改查,是针对具体的数据表格里面的数据; 下面是对列的操作; 修改表名 alter table test rename test1; -...

366110
来自专栏乐沙弥的世界

批量迁移Oracle数据文件,日志文件及控制文件

   有些时候需要将Oracle的多个数据文件以及日志文件重定位或者迁移到新的分区或新的位置,比如磁盘空间不足,或因为特殊需求。对于这种情形可以采取批量迁移的方...

14520

扫码关注云+社区

领取腾讯云代金券