Office中国论坛/Access中国论坛
标题:
利用shell脚本批量导入sql文件到MySQL
[打印本页]
作者:
roych
时间:
2021-5-22 18:28
标题:
利用shell脚本批量导入sql文件到MySQL
连续忙了两个月的项目,终于要到尾声了。接下来一段时间,我会把项目中一些好玩的东西陆续分享给大家。先说背景:
为了测试效果,我们的项目在前期需要插入大量测试数据。之前试着用python处理,但占用内存较大,700多万行数据,基本处于假死状态。然后改成sql文件导入。但python的两个MySQL包都无法执行多行语句。当然,也可以考虑用pandas的数据框(DataFrame)处理,但得到的是元组,需要进一步处理数据,大致应该是需要嵌套循环。另一种方案,则是开发ORM,利用字典来处理,不过,个人觉得都过于复杂。而且,本身,python对数据大量IO就不是很友好。之前测试的结果是,大量IO导致出错,大约插入20多万行后直接奔溃。
于是,在这这背景之下,开始考虑用MySQL自带的方法来处理。而为了实现自动化,则需要使用shell脚本。因此,有了下面这一段:
-------------------------------------------------------------------
这里是分割线,如果不想看背景,直接从下面开始阅读
-------------------------------------------------------------------
#! /bin/bash
HOSTNAME=10.88.20.147
PORT=3306
USERNAME="root"
PASSWORD="Qwer@0126"
DBNAME="USER_PROFILE"
rm -rf test_data.txt
for i in {35..78}
do
file_name='test_data'$i'.sql'
file_path='source /data/workspace/标签项目/'
insert_sql=$file_path$file_name
mysql -u${USERNAME} -p${PASSWORD} <<EOF
use ${DBNAME};
$insert_sql
exit
EOF
done
复制代码
这里的sql语句应为操作查询语句,比如:
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界面了。
能看懂么?看不懂也没关系。会拿来用就好了。
最后奉上附件
[attach]64059[/attach]
作者:
tmtony
时间:
2021-5-24 10:48
看不懂,先收藏 ,不过没找到附件
作者:
zpy2
时间:
2021-5-24 11:39
不错,赞。
作者:
zpy2
时间:
2021-5-24 11:49
本帖最后由 zpy2 于 2021-5-24 11:51 编辑
rm -rf test_data.txt
bash linux 下的批处理.
手机一回车就发送了,没法换行~。
标准版可以换行啦,哈哈。
作者:
zpy2
时间:
2021-5-24 11:54
load data [low_priority] [local] infile 'file_name txt' [replace | ignore] into table tbl_name
这个也不错
作者:
方漠
时间:
2021-6-7 17:48
很不错的思路, 谢谢分享.
作者:
roych
时间:
2021-7-5 16:13
tmtony 发表于 2021-5-24 10:48
看不懂,先收藏 ,不过没找到附件
这个你要检讨了。
[attach]64097[/attach]
作者:
GOODWIN
时间:
2021-10-11 10:15
看不懂,先收藏 ,
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3