shell脚本批量导入mysql数据

发布时间:2020-07-31编辑:脚本学堂
shell脚本批量导入mysql数据的方法,用shell脚本处理上百个数据库文件的导入操作,需要的朋友参考下。

一个项目的sql文件,打开一看是个目录,共中有上百个数据库,每个数据库作为一个单独的文件。
每个sql文件中都有:
CREATE DATABASE IF NOT EXISTS `XXXX`
USE `XXXX`;
可以直接用mysql_workbench 6以上的版本直接导入文件夹的方式来导入多个sql文件。
但是在服务器上不可能为了批量导这个sql单独装个GUI的workbench.

shell/ target=_blank class=infotextkey>shell脚本修改其中的host,username和password为对应的就可以了。

dbname这里,默认是sample, mysql中sample表。实际数据不是导入到这里面的, 因为要导入的sql文件里面都已经有了创建db。

如果是要导入到某一个数据库的多个表,可以修改dbname为对应的数据库名:
 

复制代码 代码示例:
#!/bin/bash
#author     rainysia <rainysia@gmail.com>
#date       2014-11-14 10:26:27
 
set -e
LC_ALL=C
LANG=C
unset TZ
TZBase=$(LC_ALL=C TZ=UTC0 date -R)
UTdate=$(LC_ALL=C TZ=UTC0 date -d "$TZBase")
TZdate=$(unset TZ ; LANG=C date -d "$TZBase")
 
file_path="/home/db/test/"              #要导入的sql文件夹
host="192.168.85.123"                   #要导入的mysql主机
username="dbroot"                       #mysql的用户名
password="db1t#2w$3r@4#t"               #mysql的密码
dbname="sample"                         #mysql的数据库名
now=$(date "+%s")                       #计时
 
mysql_source(){
    for file_name in `ls -A $1`
    do
        seg_start_time=$(date "+%s")
        if [ -f "$1$file_name" ];then
            command="source $1$file_name"
            mysql -h${host} -u${username} -p${password} ${dbname} -e "$command"
            echo "source:" "$1$file_name" "is ok, It takes " `expr $(date "+%s") - ${seg_start_time}` " seconds"
        fi
    done
 
    echo "All sql is done! Total cost: " `expr $(date "+%s") - ${now}` " seconds"
}
echo "Universal Time is now:  $UTdate."
echo "Local time is now:      $TZdate."
mysql_source $file_path

测试:
 

复制代码 代码示例:
root@debian:/home/sh# ./mysql_source.sh
Universal Time is now:  Fri Nov 14 03:10:49 UTC 2014.
Local time is now:      Fri Nov 14 11:10:49 CST 2014.
source: "/home/db/test/hml2.sql" is ok, It takes  18  seconds
source: "/home/db/test/hml3.sql" is ok, It takes  19  seconds
source: "/home/db/test/hml4.sql" is ok, It takes  18  seconds
All sql is done! Total costs:  55  seconds

可以导入了,然后同事又需要重装某个app,需要删除其中某个数据库下的所有表。
因为她权限不够,不能够直接删除数据库,只能一个一个手动drop table. 但是有2000多个table.

本想用:
 

SELECT CONCAT('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema='cs_china_111数据库名';


的方式来删除所有table,无效。

于是还是还是使用上面的shell. 把路径随便换个, 现在先去把需要drop的table的sql给写出来.
先去导出这个数据库,在终端下使用mysqldump dbroot是我的数据库用户名,cs_china_1111是我要导出的数据库, -d -add-drop-table 是不导出数据只导出结构。

sql语句
 

#mysqldump -udbroot -p cs_china_1111 -d --add-drop-table  > cs_china_1111.sql

然后,使用grep来过滤一次, 因为导出的sql中包含drop table:
 

#find ./ -name "cs_china_1111.sql" | xargs grep "DROP TABLE IF" > cs_china_1111_drop_table.sql

然后,用之前的shell把dbname修改为需要删除的数据库名,运行即可。