目录
0 引 言
工作中经常需要在数据库中进行建表操作,无论是使用数据库一些工具或手动建表都比较麻烦,需要用户一个个输入字段进行建立或一个个执行sql脚本,无论是哪种方式都比较费力,影响工作效率,那么有没有一种快速批量执行sql文件的形式进行批量建表的方法呢?这里就需要用shell脚本调用sql文件的形式进行批量建表。本文针对上述问题,探讨了一种批量建立MYSQL数据库表的方法,给出了批量执行sql文件的脚本,并对脚本主要的语法进行分析,该脚本在实验中得到了测试认证,效果良好。
1 基本知识
(1)awk用法
参考链接如下
https://blog.csdn.net/godlovedaniel/article/details/104755897
下面对本脚本使用的语句进行解释
echo $file | awk -F'.' '{print "."$NF}'
输入为: echo $file,为遍历目录后每个文件的名字
awk -F'.' '{print "."$NF}':表示以.号分隔,输入的每一条记录,并且打印最后一个字段,输出以.号输出。NF:表示字段的个数。$NF:就表示最后一个字段。由于每个文件的命名结尾都是sql,所以最终得到的为.sql。
该语句在此的作用就是,获取后缀,进行下一步的条件匹配,对sql文件进行过滤。
(2)read -p
Linux read命令用于从标准输入读取数值。
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
-p 后面跟提示信息,即在输入前打印提示信息。如:
#!/bin/bash
read -p "输入网站名:" website
echo "你输入的网站名是 $website"
exit 0
测试结果为:
输入网站名:https://blog.csdn.net/godlovedaniel/article/details
你输入的网站名是 https://blog.csdn.net/godlovedaniel/article/details
如果 -p后指定的变量在脚本中定义且赋值,则取变量赋值后的值,如果没有赋值,则从控制台中进行输入
(3)连接MYSQL执行sql脚本
mysql -h${host} -u${user} -p${db_pass} -P${port} --default-character-set=utf8 ${db_name} < ${file}
-h:指定连接的主机地址
-u:登录的用户
-p:数据库连接密码
-P:端口
输入为${file}:表示sql脚本,将输入的sql脚本在MYSQL中进行执行。
shell脚本中执行sql脚本的几种种方式:(shell脚本调用sql文件)
注意:sql文件和脚本文件在同一路径下,或不在同一路径下,将sql文件写成绝对路径如:/home/centos/test/test.sql
- mysql -H主机地址 -P 端口号 -u用户名 -p密码 < test.sql (管道符调用sql文件)
- mysql -H主机地址 -P 端口号 -u用户名 -p密码 -e "source test.sql" (命令行调用sql文件)
- mysql -H主机地址 -P 端口号 -u用户名 -p密码 -e "\. test.sql"
- mysql -H主机地址 -P 端口号 -u用户名 -p密码 <<EOF (shell脚本中MySQL提示符下调用SQL)
source 绝对路径下 test.sql;
EOF
exit;
#!/bin/sh
mysql -u root < test.sql (常用)
# mysql -u root -e "source test.sql"
# mysql -u root -e "\. test.sql"
# mysql -uroot -p123456 <<EOF
source /home/centos/test/test.sql;
EOF
exit;
(4)echo -e
echo -e支持转义,用法如下
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
- \a 发出警告声;
- \b 删除前一个字符;
- \c 最后不加上换行符号;
- \f 换行但光标仍旧停留在原来的位置;
- \n 换行且光标移至行首;
- \r 光标移至行首,但不换行;
- \t 插入tab;
- \v 与\f相同;
- \ 插入\字符;
- \nnn 插入nnn(八进制)所代表的ASCII字符;
如下案例所示:
显示换行
echo -e "OK! \n" # -e 开启转义
echo "It is a test"
输出结果:
OK!
It is a test
不显示换行
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
输出结果:
OK! It is a test
echo -n 表示不换行输出
$echo -n "123" $echo "456"
最终输出 123456 而不是 123 456
(5)stty的用法
stty -echo -----------------关闭echo输出显示
2 脚本编写
#!/bin/bash
#Author: dandan
#Time: 20200424
#Describe: Create MYSQL Database Table ,execute all script in specified directory
MYDATE=`date +%F'-'%T'-'%w`
MYSQL_PATH=$1 #指定的目录
LOG_FILE=/tmp/exec_script_${MYDATE}.log
confirm=
db_name=
db_pass=
host=
user='root'
port='3306'
for file in ${MYSQL_PATH}/*
do
if [ -f "$file" ] ; then
postfix=`echo $file | awk -F'.' '{print "."$NF}'`
if [ $postfix = ".sql" ] ; then
if [ ! $host ] ; then #如果没有指定数据库
read -p "请输入数据库名:" host
read -p "你输入的数据名是【$host】,确认继续请输入--yes--: " confirm
fi
if [ ! $db_name ] ; then #如果没有指定数据库
read -p "请输入数据库名:" db_name
read -p "你输入的数据名是【$db_name】,确认继续请输入--yes--: " confirm
fi
if [ "$confirm" = "yes" ] && [ -n $confirm ] ; then
if [ ! $db_pass ] ; then #如果没有设置密码
stty -echo #密码输入保护关闭显示
read -p "请输入数据库密码:" db_pass
echo -e "\n"
stty echo
fi
mysql -h${host} -u${user} -p${db_pass} -P${port} --default-character-set=utf8 ${db_name} < ${file} >& error.log
echo $file
echo -e "\n===========$file=============\n" >>${LOG_FILE}
cat error.log >>${LOG_FILE} #输出执行日志
error=`grep ERROR error.log` #读取错误日志信息
if [ -n "$error" ] ; then #如果有错误就退出程序
echo $error
exit
fi
else
echo "您已经取消操作!"
exit
fi
fi
fi
done
3 实验测试
进入脚本的目录,执行该脚本
[root@bigdata3 TOOLS]# ./create_mysql_table_batch.sh '/home/centos/phm/MYSQL/appv_power'
执行结果如下:
到MYSQL数据库中查看表已经创建 ,如下图所示:
4 小 结
本文研究了一中MYSQL批量建表的方法,给出了具体脚本程序,并对程序中关键点进行了分析,读者可根据自己环境需求对脚本进行稍加改造便可使用,该脚本已在环境中进行测试,结果可靠。
本文主要要点:
- (1)shell脚本中调用sql文件的方法(4种)
- (2)read -p的用法
- (3)echo关闭显示的用法。stty -echo
- (4)echo -e 的用法