mysql的又一個讓人捉摸不透的bug?


這次就不說很多沒有寫博客了,因為前幾天已經寫過了。\^o^/

 

昨天我們剛討論了關於自動化運維工作的實現方式,如果批量執行,中間出錯怎么辦?突然有人提出mysql支持--force,可以跳過出錯繼續執行。

那么我就想看看它這個功能是什么樣子的,看看我能不能借鑒一下。

然后我就在一個測試機器上寫入如下命令:

mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "insert into myinfo (1,'asdf');insert into myinfo values(1,'asdf');

然后報錯:

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
看上去是正確的,因為第一條是有語法錯誤,但第二條是正確的,這個表應該多一條數據,但查了幾遍都是沒有,那說明根本就沒有執行,為什么?不是說可以跳過么?

我換一種方法,將上面的語句放到一個sql文件中,因為考慮到這只有是在batch批量執行的時候才出現的,放到文件中肯定是批量的吧?然后執行下面的語句:

mysql -h127.0.0.1 -P3307 -uwzf -pxxxxxxx mysql --force -e "source sql"

結果和上面是一樣的,報錯依舊,數據沒有插入依舊!為什么?

然后又換了一種方式:

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還是比較多的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM