目錄
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 的用法