shell腳本,調用存儲過程:
mysql -h *** -u *** -D *** -p*** -e ***
-h ip地址
-u 數據庫用戶
-D 數據庫
-p密碼
-e 調用存儲過程的語句 call haha()
-p和密碼之間沒有空格,請注意!
shell腳本范例:
#ip地址
HOST="xxx"
#端口號
PORT="xxx"
#用戶名
USER="xxx"
#密碼
PASSWORD="xxx"
#數據庫名
DATABASE="xxx"
#路徑,日志所在路徑,
DIR="xxx"
#日志
log="log.txt"
#存儲過程
CALL="call m_user_day()"
#當前時間
cur_dateTime="`date +%Y-%m-%d,%H:%m:%s`"
MAILTO=""
cd ${DIR}
#輸入到日志
SQL="exec mysql -h${HOST} -u${USER} -p${PASSWORD} -D ${DATABASE} --default-character-set=utf8 -e \"${CALL}\""
#
$()是將括號內命令的執行結果賦值給變量
${}和$變量名沒有什么區別,但使用括號語義更明確
echo ${SQL} >> ${log} 2>&1
echo ${cur_dateTime} >> ${log} 2>&1
if mysql -h ${HOST} \
-u ${USER} \
-p${PASSWORD} \
-D ${DATABASE} \
--default-character-set=utf8 \
-e "${CALL}"; then
echo "ok" >> ${log} 2>&1
else
echo "error" >> ${log} 2>&1
fi
exit
shell編寫后,肯定要先測試一下shell腳本是否可以:
一.MAILTO="",禁止發送郵件,定時器執行shell腳本時,會以發送郵件的形式表現,使shell腳本的echo無作用
所以必須禁止發送郵件,
二.如果在shell腳本中需要進行輸出的話,echo並不會起作用,只能將語句輸出到一個日志文件中,
需要 >> 重定向到一個文件中,並在后面加上2>&1 如echo "ok" >> ${log} 2>&1
需要 MAILTO="" >> 2>&1 三者配合才可以將日志輸出到文件中
三.如果腳本語句沒有問題的話,進行執行腳本,腳本執行時,如果超過10秒,那你對數據庫的操作就是失敗的了,
最有可能報的一個錯誤就是 連接不到數據庫,這是一個很籠統的錯誤,錯誤原因很多
1.網絡原因,
ping www.baidu.com 沒有問題
ping 數據庫所在的服務器ip 不通,就是網絡的問題了,
我就是這樣的問題,(雲服務器上執行腳本,操作公司內網服務器上的數據庫),執行腳本時,一直提示mysql連接失敗
所以,先ping ip,看看是否可以連通,如果不可以,就要注意一下了
2.ping ip可以的話,在執行shell腳本,還是提示mysql連接失敗,就有可能是mysql的問題了
有可能是mysql沒有開啟遠程調用權限
解決辦法:1.關閉mysql,在my.ini文件的最后一行加上一句話 skip-grant-tables 開啟mysql
2.更新user表的Host為% update user authentication_String
UPDATE user SET authentication_String=PASSWORD(’newpassword’) where USER=’root’;
注意,mysql的password列有可能變為了authentication_String
FLUSH PRIVILEGES重啟misql
登陸mysql
1、在 bash shell 中,$()是將括號內命令的執行結果賦值給變量:
(base) zeng@zeng-X11DAi-N:~/workspace$ ls a.sh data.sh results.txt #將命令 ls 賦值給變量 a (base) zeng@zeng-X11DAi-N:~/workspace$ a=$(ls) (base) zeng@zeng-X11DAi-N:~/workspace$ echo $a a.sh data.sh results.txt
2、${} 是用來作變量替換。一般情況下,$var 與 ${var} 並沒有啥不一樣。但是用 ${ } 會比較精確的界定變量名稱的范圍:
(base) zeng@zeng-X11DAi-N:~/workspace$ A=B
#目的想打印變量A,然后再加上一個B,結果返回無。
(base) zeng@zeng-X11DAi-N:~/workspace$ echo $AB
#此時,${ }可以較為精確的確定變量的范圍
(base) zeng@zeng-X11DAi-N:~/workspace$ echo ${A}B
BB
(base) zeng@zeng-X11DAi-N:~/workspace$
3、${ } 的一些特殊功能:
假設我們定義了一個變量為:file=/dir1/dir2/dir3/my.file.txt
${file#*/}:拿掉第一條 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最后一條 / 及其左邊的字符串:my.file.txt ${file#*.}:拿掉第一個 . 及其左邊的字符串:file.txt ${file##*.}:拿掉最后一個 . 及其左邊的字符串:txt ${file%/*}:拿掉最后條 / 及其右邊的字符串:/dir1/dir2/dir3 ${file%%/*}:拿掉第一條 / 及其右邊的字符串:(空值) ${file%.*}:拿掉最后一個 . 及其右邊的字符串:/dir1/dir2/dir3/my.file ${file%%.*}:拿掉第一個 . 及其右邊的字符串:/dir1/dir2/dir3/my 記憶的方法為: # 是去掉左邊(在鑒盤上 # 在 $ 之左邊) % 是去掉右邊(在鑒盤上 % 在 $ 之右邊) 單一符號是最小匹配﹔兩個符號是最大匹配。 ${file#/}(不加*號)表示只去掉最左邊的/