当前位置:首页 > 问答 > 正文

用shell脚本搞定数据库导入,快速又省事儿怎么弄

知乎问答“Shell脚本导入数据库的懒人教程”)

直接说重点:想用shell脚本倒腾数据库,其实就是把一堆手动敲的命令塞进一个文件里,然后让系统自己跑,别想得太复杂,咱们一步步来。

先搞清楚你要干啥
比如你有个SQL文件(就是那种装满数据的大号文本文件),要把它灌进MySQL数据库,手动操作的话,得先登录数据库,再选个库,然后跑source命令,但每次这么搞太麻烦,不如写个脚本自动完成。

脚本里写点啥?
最简单的情况,脚本就三行:

#!/bin/bash
mysql -u用户名 -p密码 数据库名 < 你的sql文件.sql
echo "搞定!"

(来源:CSDN博客《shell一键导入SQL文件》)
注意:-u和-p后面别加空格(比如-uroot不是-u root),不然会报错。

用shell脚本搞定数据库导入,快速又省事儿怎么弄

安全问题咋处理?
把密码明晃晃写在脚本里容易被别人看到,可以改成这样:

#!/bin/bash
read -s -p "输入密码:" password
mysql -u用户名 -p$password 数据库名 < 你的sql文件.sql

(来源:Stack Overflow回答“MySQL password in shell scripts”)
这样运行时会让你手动输密码,输的时候不显示字符,安全多了。

加点儿容错机制
万一数据库没启动或者SQL文件路径错了,脚本会直接崩,可以加点判断:

#!/bin/bash
if [ ! -f "你的sql文件.sql" ]; then
    echo "SQL文件找不到!检查下路径吧"
    exit 1
fi
mysql -u用户名 -p密码 数据库名 < 你的sql文件.sql
if [ $? -eq 0 ]; then
    echo "导入成功!"
else
    echo "出错了,检查下密码或者SQL语法吧"
fi

(来源:博客园文章《Shell脚本实战:数据库备份与导入》)
是上一条命令的退出状态,0表示成功,非0就是出错了。

用shell脚本搞定数据库导入,快速又省事儿怎么弄

对付大文件怎么办?
如果SQL文件好几个G,直接导入可能会卡死,这时候可以用pv命令显示进度(先安装:apt install pv):

pv 你的sql文件.sql | mysql -u用户名 -p密码 数据库名

(来源:运维论坛讨论“大容量SQL导入技巧”)
屏幕上会显示个进度条,能知道还要等多久。

复杂点的例子:分批次导入
有时候需要按日期导入多个文件,

#!/bin/bash
for file in ./data/*.sql
do
    echo "正在导入 $file ..."
    mysql -uroot -p123456 mydb < $file
done

这样会把data文件夹下所有SQL文件按顺序导入。

用shell脚本搞定数据库导入,快速又省事儿怎么弄

别忘了授权
脚本写完后要给它执行权限:

chmod +x 你的脚本名.sh

然后就能用./你的脚本名.sh运行了。

实际案例参考
某用户分享过用脚本处理每日日志入库(来源:V2EX讨论《用shell+crond自动化数据同步》):

  • 先用wget下载远程SQL压缩包
  • gzip -d解压
  • 导入数据库后自动发邮件通知结果
    全程不用人工干预。

常见坑点

  • Windows创建的SQL文件换行符可能是\r\n,Linux下会报错,用dos2unix命令转换一下
  • 如果SQL文件太大,可能需要调整MySQL的max_allowed_packet参数
  • 导csv文件更简单:mysqlimport --local -u用户名 -p密码 数据库名 文件.csv

核心思路就是:把重复操作打包成脚本,下次直接双击(或者命令行运行)就能省下喝杯奶茶的时间,刚开始可能要多调试几次,熟了之后连备份、校验都能一并自动化。