此次就不说不少没有写博客了,由于前几天已经写过了。\^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仍是比较多的。