Archery系統(tǒng)集成了my2sql工具,可以通過此功能分析MysQL的binlog,方便SQL回滾,還可以協(xié)助異常分析,定位問題。
優(yōu)化點(diǎn)
解析后沒有SQL語句返回,可能的原因是解析過程中遇到了錯(cuò)誤,而系統(tǒng)沒有捕獲錯(cuò)誤,更沒有將錯(cuò)誤異常返回給操作者。
此處的優(yōu)化,就是解決這一信息黑洞,排除因解析遇錯(cuò)而導(dǎo)致沒有SQL語句。換句話說,優(yōu)化后,當(dāng)解析過程中遇到Error或fatal時(shí),定會(huì)拋出錯(cuò)誤。
代碼位置
優(yōu)化代碼文件:..../sql/binlog.py
方法---def my2sql(request):
step 1 定義捕獲異常的正則表達(dá)式
在以下代碼的后面
# 參數(shù)轉(zhuǎn)換 cmd_args = my2sql.generate_args2cmd(args)
添加正則表達(dá)式
###### 添加個(gè)正則表達(dá)式,去判斷是不是結(jié)果中有fatal 或者 error ######例如[2019/01/12 16:37:51] [fatal] context.go:401 start postion(-start-file -start-pos) must less than stop position(-end-file -end-pos) fatal_pattern = r'^(\[)\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\]\W+\[fatal\]' ######例如[2019/01/12 16:37:51] [error] binlogstreamer.go:77 close sync with err: ERROR 1236 (HY000): A slave with the same server_uuid/server_id as this slave has connected to the master; error_pattern = r'^(\[)\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\]\W+\[error\]' errmsgs = [] ###2024011201
?step 2 通過正則刷選返回的數(shù)據(jù)
改造前的代碼
if n <= num and isinstance(line, str): if line[0:6].upper() in ("INSERT", "DELETE", "UPDATE"): n = n + 1 row_info = {} try: row_info["sql"] = line + ";" except IndexError: row_info["sql"] = line + ";" rows.append(row_info) else: break
改造后的代碼
if n <= num and isinstance(line, str): if line[0:6].upper() in ("INSERT", "DELETE", "UPDATE"): n = n + 1 row_info = {} try: row_info["sql"] = line + ";" except IndexError: row_info["sql"] = line + ";" rows.append(row_info) ### start add 利用正則判斷,篩選有結(jié)果中錯(cuò)誤的行數(shù) elif re.search(fatal_pattern,line) or rs.search(error_pattern,line): n = n + 1 errmsgs.append(line + ';') #err_info = {} ###注釋掉的這段代碼是把錯(cuò)誤信息當(dāng)初SQL信息,打印到前端SQL顯示端 #try: # err_info['sql'] = line + ';' #except IndexError: # err_info['sql'] = line + ';' #errmsgs.append(err_info) ##### end else: break
3.異常捕獲后,返回
修改前
if rows.__len__() == 0: # 判斷是否有異常 stderr = p.stderr.read() if stderr and isinstance(stderr, str): result["status"] = 1 result["msg"] = stderr return HttpResponse(json.dumps(result), content_type="application/json") # 終止子進(jìn)程
修改后文章來源:http://www.zghlxwxcb.cn/news/detail-807282.html
if rows.__len__() == 0: # 判斷是否有異常 stderr = p.stderr.read() if stderr and isinstance(stderr, str): result["status"] = 1 result["msg"] = stderr return HttpResponse(json.dumps(result), content_type="application/json") ###start add 將結(jié)果中錯(cuò)誤信息返回給前端 if errmsgs.__len__() != 0: result['status'] = 1 result['msg'] = errmsgs return HttpResponse(json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True), content_type='application/json') ### end # 終止子進(jìn)程
?文章來源地址http://www.zghlxwxcb.cn/news/detail-807282.html
到了這里,關(guān)于Archery系統(tǒng)調(diào)用my2sql讀取binlog的功能優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!