shell脚本批量导入mysql数据的方法,用shell脚本处理上百个数据库文件的导入操作
一个项目的sql文件,打开一看是个目录,共中有上百个数据库,每个数据库作为一个单独的文件。 用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,需要删除其中某个数据库下的所有表。
本想用:
SELECT CONCAT('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema='cs_china_111数据库名';
于是还是还是使用上面的shell. 把路径随便换个, 现在先去把需要drop的table的sql给写出来.
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修改为需要删除的数据库名,运行即可。 (责任编辑:IT) |