此次就不說不少沒有寫博客了,由於前幾天已經寫過了。\^o^/
mysql
昨天咱們剛討論了關於自動化運維工做的實現方式,若是批量執行,中間出錯怎麼辦?忽然有人提出mysql支持--force,能夠跳過出錯繼續執行。sql
那麼我就想看看它這個功能是什麼樣子的,看看我能不能借鑑一下。運維
而後我就在一個測試機器上寫入以下命令:測試
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf');字體
而後報錯:ui
ERROR 1064 (42000) at line 1: 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 '' at line 1
看上去是正確的,由於第一條是有語法錯誤,但第二條是正確的,這個表應該多一條數據,但查了幾遍都是沒有,那說明根本就沒有執行,爲何?不是說能夠跳過麼?this
我換一種方法,將上面的語句放到一個sql文件中,由於考慮到這隻有是在batch批量執行的時候纔出現的,放到文件中確定是批量的吧?而後執行下面的語句:spa
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "source sql"orm
結果和上面是同樣的,報錯依舊,數據沒有插入依舊!爲何?server
而後又換了一種方式:
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force < sql
啊?用這種方式,報錯依舊,查了一次表,發現好像多了一條?爲何這樣能夠執行成功,經過-e方式指定就不能?
不行,我得看看代碼
對於--force的參數解析,它將全局變量ignore_errors設置爲1,表示忽略全部的錯誤。
發現對-e的解析是下面的代碼:
case 'e':
status.batch= 1;
status.add_to_history= 0;
if (!status.line_buff)
ignore_errors= 0; // do it for the first -e only
if (!(status.line_buff= batch_readline_command(status.line_buff, argument)))
return 1;
break;
這裏能夠看到,處理-e時可能會將變量ignore_errors設置爲0,這是在status.line_buff=NULL的狀況下,但看了一下代碼,若是有-e,則藍色字體是設置status.line_buff的最先位置,那說明上面的ignore_errors確定會被設置爲0啊!!!
這麼說來,我在命令中必需要將--force放到-e後面去?將上面出錯的命令中--force放在-e後面重試一下?
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf'); --force
mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql -e "source sql" --force
此時執行發錯,報錯依舊,但正確的插入語句執行成功了!!!難道這是個bug?
忽然又想到,這是否是故意這樣子,而我才疏學淺不知道?那我看看文檔怎麼寫的:
• --execute=statement [237], -e statement
Execute the statement and quit. The default output format is like that produced with --
batch [235]. See Section 4.2.3.1, 「Using Options on the Command Line」, for some examples.
With this option, mysql does not use the history file.
• --force [237], -f
Continue even if an SQL error occurs.
這徹底沒有說啊!!
隨便提一個改法啊,這是隨便提的,沒有深刻研究,別批我就行了
if (!status.line_buff)
ignore_errors= 0; // do it for the first -e only
if (!(status.line_buff= batch_readline_command(status.line_buff, argument)))
return 1;
將上面4行中的前面2行放到後面2行以後去,換一下位置,這樣先初始化status.line_buff就不會出現這個問題了。
mysql代碼的bug仍是比較多的。