mysql ERROR 1064(42000)

項目線上服務器用的數據庫是騰訊雲的mysql數據庫,每次更新服務器數據庫腳本的流程,都是將測試服已經驗證OK的腳本用heidisql工具導出來然後轉到正式服環境執行,前期需要更新的數據庫少,在heidisql工具裏手動執行下,還OK,等到中後期,需要更新的數據庫有20+,50+,100+。。。。哪效率就直線下降。所以就改成了用mysql的source命令執行,格式大致如下:

mysql  -h $hostname -P$port -u$user -p$pwd $dbname --default-character-set=utf8 -e "source ${sqlfile}"

簡單寫的shell腳本大概長這樣:

#!/bin/bash
beginserver=$1          # 參數1 起始服務器ID
endserver=$2            # 參數2 結束服務器ID
sqlfile=$3              # 參數3 執行SQL文件名
hostname=111.111.111.111
user=test
port=3306
pwd=test
for((i=$beginserver;i<=$endserver;i++))
do
dbname=database${i}
mysql  -h $hostname -P$port -u$user -p$pwd $dbname --default-character-set=utf8 -e "source ${sqlfile}"
echo $dbname is updated;
done

執行數據快了N個數量級,而且簡單方便。

週一日常更新,然後開心的點起腳本自動更新,突然屏幕刷屏的出現錯誤日誌:

ERROR 1064 (42000) at line 138 in file: '20200612.sql': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //CREATE DEFINER=`root`@`%` PROCEDURE `p_xxxxx_log_upd`(
' at line 1
ERROR 1064 (42000) at line 453 in file: '20200612.sql': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END//
DELIMITER ;

DELIMITER //CREATE DEFINER=`root`@`%` PROCEDURE `p_tttt' at line 1
ERROR 1064 (42000) at line 463 in file: '20200612.sql': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END//
DELIMITER ;

DELIMITER //CREATE DEFINER=`root`@`%` PROCEDURE `p_aaaa' at line 1

我靠,平時執行得好好流程,怎麼會,突然報錯,趕緊CTR+C終止執行,很好,終止了循環中得某一個庫執行,下一個還是繼續執行着。尼瑪,一次CTR+C不行,我就來N次,CTR+C.......,我靠,不對,這樣出了問題,一會更難排查,趕緊停止了正在抽筋的左手。。。

跑完了整個腳本,看了下日誌,大概有5,6個庫跳過了執行。看了下報錯信息,是有語法錯誤,打開sql腳本看了半天,沒發現有啥問題啊。趕緊複製到heidisql執行下,居然安靜的跑完,沒報錯!

啥情況?語法沒問題呀,難道格式不對? set ff?下,是dos的,趕緊改咯,再執行下腳本,報錯依舊,尼瑪。。。

回頭再看看報錯的位置,冷靜分析了下,都是再DELIMITER;附近出錯的,附近都有換行符。換行符?回顧下自己sql腳本的流程,貌似有些部分是多個功能分開開發,最後合併再一起的,然後中間習慣性的會敲下換行,便於區分和查看。難道是換行時用的中文輸入法導致的?趕緊替換掉換行符再來一次。居然過了,沒報錯!

搞了半天,自己坑了自己。不過爲啥heidisql可以正常執行呢,想必時heidisql自己做了轉行吧,這波騷操作,不得不服,肯定也是遇到過我這個問題。

重新刷新腳本,備份,更新流程,增加提示。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章