设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2337|回复: 7
打印 上一主题 下一主题

利用shell脚本批量导入sql文件到MySQL

[复制链接]
跳转到指定楼层
1#
发表于 2021-5-22 18:28:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
连续忙了两个月的项目,终于要到尾声了。接下来一段时间,我会把项目中一些好玩的东西陆续分享给大家。先说背景:
为了测试效果,我们的项目在前期需要插入大量测试数据。之前试着用python处理,但占用内存较大,700多万行数据,基本处于假死状态。然后改成sql文件导入。但python的两个MySQL包都无法执行多行语句。当然,也可以考虑用pandas的数据框(DataFrame)处理,但得到的是元组,需要进一步处理数据,大致应该是需要嵌套循环。另一种方案,则是开发ORM,利用字典来处理,不过,个人觉得都过于复杂。而且,本身,python对数据大量IO就不是很友好。之前测试的结果是,大量IO导致出错,大约插入20多万行后直接奔溃。

于是,在这这背景之下,开始考虑用MySQL自带的方法来处理。而为了实现自动化,则需要使用shell脚本。因此,有了下面这一段:
-------------------------------------------------------------------
这里是分割线,如果不想看背景,直接从下面开始阅读
-------------------------------------------------------------------
  1. #! /bin/bash
  2. HOSTNAME=10.88.20.147
  3. PORT=3306
  4. USERNAME="root"
  5. PASSWORD="Qwer@0126"
  6. DBNAME="USER_PROFILE"
  7. rm -rf test_data.txt
  8. for i in {35..78}
  9. do
  10. file_name='test_data'$i'.sql'
  11. file_path='source /data/workspace/标签项目/'
  12. insert_sql=$file_path$file_name
  13. mysql -u${USERNAME} -p${PASSWORD} <<EOF
  14. use ${DBNAME};
  15. $insert_sql
  16. exit
  17. EOF
  18. done
复制代码
这里的sql语句应为操作查询语句,比如:
  1. in-sert in-to 表(字段)  values(结果);
复制代码
-------------------------------------------------------------------
(去掉短划线才是正确的语法,别问为啥。此外,多行语句一定要以分号结束。否则会出错)这里是分割线,如果不想看解析,从这里结束
-------------------------------------------------------------------
每一行以分号隔开即可。这里大致讲下这部分语法。“for i in {1..78}”是shell的一种循环语法,和do/done结合使用。do表示开始循环执行某个事件,done则表示循环结束。
值得注意的是,这里是调用MySQL命令,输入用户名密码后,还需要选择数据库才能执行下一步。因此,直接用“mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME} -p${PASSWORD} ${DBNAME} -e  "${insert_sql}" ”这种形式来处理,会报错的。这是之前踩过的坑,希望大家注意。

1、mysql -u${USERNAME} -p${PASSWORD}        ------告诉shell:我要进入MySQL界面。
2、<<EOF                                                        ------告诉shell:我要在MySQL界面上输入命令。
3、use ${DBNAME}                                           ------告诉MySQL,使用这个数据库。
4、$insert_sql                                                   ------将sql文件敲进MySQL界面。
5、exit                                                             ------告诉MySQL:命令运行完之后,我就退出MySQL。
6、EOF                                                            ------告诉shell:我现在可以退出MySQL,回到shell界面了。

能看懂么?看不懂也没关系。会拿来用就好了。最后奉上附件


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2021-5-24 10:48:47 | 只看该作者
看不懂,先收藏 ,不过没找到附件

点击这里给我发消息

3#
发表于 2021-5-24 11:39:52 来自手机 | 只看该作者
不错,赞。
回复

使用道具 举报

点击这里给我发消息

4#
发表于 2021-5-24 11:49:55 来自手机 | 只看该作者
本帖最后由 zpy2 于 2021-5-24 11:51 编辑

rm -rf test_data.txt  
bash linux 下的批处理.
手机一回车就发送了,没法换行~。

标准版可以换行啦,哈哈。

点击这里给我发消息

5#
发表于 2021-5-24 11:54:11 来自手机 | 只看该作者
load data [low_priority] [local] infile 'file_name txt' [replace | ignore] into table tbl_name

这个也不错
6#
发表于 2021-6-7 17:48:22 | 只看该作者
很不错的思路, 谢谢分享.
7#
 楼主| 发表于 2021-7-5 16:13:44 | 只看该作者
tmtony 发表于 2021-5-24 10:48
看不懂,先收藏 ,不过没找到附件

这个你要检讨了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
8#
发表于 2021-10-11 10:15:58 | 只看该作者
看不懂,先收藏 ,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-26 03:09 , Processed in 0.089159 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表