MySQL資料庫Inception工具學習與測試 筆記

来源:https://www.cnblogs.com/xuliuzai/archive/2019/04/29/10785142.html
-Advertisement-
Play Games

MySQL語句的審核,在業界都已經基本被認同了,實際上也是對MySQL語句寫法的統一化,標準化,而之前的人工審核,針對標準這個問題其實是很吃力的,標準越多,DBA越累,開發也越累。 那麼在這個都追求自動化運維的時代,審核也必須要跟上步伐,因此Inception誕生了。而Inception可以做的工作 ...


MySQL語句的審核,在業界都已經基本被認同了,實際上也是對MySQL語句寫法的統一化,標準化,而之前的人工審核,針對標準這個問題其實是很吃力的,標準越多,DBA越累,開發也越累。 那麼在這個都追求自動化運維的時代,審核也必須要跟上步伐,因此Inception誕生了。而Inception可以做的工作遠不止是一個自動化審核工具,同時還具備執行,生成對影響數據的回滾語句(類似閃回的功能),這樣一條龍服務的工具,將會給DBA的工作帶來翻天覆地的變化,DBA從此就從繁重的審核、登上去執行,出錯了很難回滾(如果提前沒有備份的話)的被動局面解放了出來,突然發現,做DBA原來可以這麼輕鬆,工作可以不飽和了,那就有更多的自由時間學習、進一步向自動化運維平臺的實現等更智能化的方向去發展,是具有里程碑意義的。 

1.Inception架構原理

Inception是集審核、執行、回滾於一體的一個自動化運維繫統。它是根據MySQL代碼修改過來的。

相對於應用程式(上層審核流程系統等)而言,它是一個伺服器,在連接時需要指定

2.Inception安裝

2.1 環境配置

安裝依賴項

yum install cmake ncurses-devel gcc gcc-c++ openssl-devel

移除bison較新的版本

yum remove bison –y

http://ftp.gnu.org/gnu/bison/ 路徑,下載 bison-2.6.1.tar.gz 指定版本。下載後,上傳至伺服器。

解壓並安裝bison

tar zxvf bison-2.6.1.tar.gz

cd bison-2.6.1

./configure && make && make install

2.2 下載安裝Inception

下載

 wget https://github.com/qunarcorp/inception/archive/master.zip

解壓

unzip master.zip
cd inception-master
./inception_build.sh debug [Xcode]

指定路徑下創建inc.cnf

touch /data/Inception/inc.cnf

初始化

/data/Inception/inception-master/debug/mysql/bin/Inception --defaults-file=/data/Inception/inc.cnf &

(##Inception 最佳啟動方式是通過nohup後臺啟動

nohup /data/Inception/inception-master/debug/mysql/bin/Inception --defaults-file=/data/Inception/inc.cnf &
) 

2.3 關閉Inception

找到初始化後的Inception

 關閉Inception

kill -9 7927

 2.4 修改增加配置項

[inception]
general_log=1
general_log_file=inc.log
port=6669
socket=/tmp/inc.socket
character-set-client-handshake=0
character-set-server=utf8
inception_remote_system_password=備份庫密碼
inception_remote_system_user=備份庫賬號
inception_remote_backup_port=備份庫實例埠
inception_remote_backup_host=備份庫IP
inception_support_charset=utf8mb4,utf8,latin1
inception_enable_nullable=0
inception_check_primary_key=1
inception_check_column_comment=1
inception_check_table_comment=1
inception_osc_min_table_size=1
inception_osc_bin_dir=/data/temp
inception_osc_chunk_time=0.1
inception_ddl_support=1
inception_enable_blob_type=1
inception_check_column_default_value=1

如果執行 ./inception_build.sh debug [Xcode] 命令報錯,可將inception-master目錄刪除,重新解壓,然後用

./inception_build.sh build linux 替代。當然,此時的可執行文件 在 /data/Inception/inception-master/build/mysql/bin/Inception

更多的安裝知識,可參閱 https://qunarcorp.github.io/inception/install/

2.5 連接驗證

通過mysql 客戶端連接

執行 代碼驗證

 inception get variables;

 

2.6 Inception的選項支持

參數名 是否需要參數 是否可選 功能描述
--host 需要操作的這部分語句塊對應的資料庫地址。指定方式可以是IP地址、機器名或DNS功能變數名稱等,只能唯一解析到這個機器即可。
--port 與上面的--host選項對應,指定機器名,必然要再指定一個MySQL實例的埠。
--user 通過--user指定的用戶名來連接需要操作SQL語句的MySQL實例。
--password 與上面的--user選項對應。
--sleep

這個參數用來指定在執行完每一條語句後,暫停多少毫秒,這樣可以適當控制對線上資料庫的衝擊,特別是針對大量的寫入操作,

單位是毫秒,最小值為0,也就是不暫停,最大值為100秒,也就是100000毫秒。如果設置的值超過了100000毫秒,

Inception會自動將其設置為100000毫秒。這個參數可以和其他參數一起設置,但是只有在--enable-execute為1的情況下,才起作用。

--enable-check

告訴Inception當前要做什麼操作,是審核還是執行,這個參數與下麵的--enable-execute智能指定一個。enable-check就是要告訴Inception,

當前的請求是要做審核操作,審核完成後就返回結果集。

--enable-execute

如果執行的選項是--enable-execute,則Inception在執行前還會做一次實時的審核,這個審核和前面指定的--enable-check時的

審核是基本相同的,這是這次在審核完成後,還會繼續進行。因為相同的語句在不同的時間審核可能會產生不同的審核結果(環境有可能變了),

所以有必要再做一次審核。如果審核發現了錯誤(而不是警告),就不會被執行,此時會提前返回告知錯誤;如果審核發現的是警告,

並且沒有指定--enable-ignore-warnings,則有警告也不會執行。

--enable-ignore-warnings

Inception採取嚴格的分階段處理方式,先對所有的語句進行審核,審核完成之後,會執行所有的語句,之後再會執行所有語句的備份操作。

在三個階段的過渡過程中,如果審核有問題則不會繼續進行,此時如果人為確定想要跳過這些警告,則可以選擇這個參數,

告訴Inception跳過這個警告的檢查,繼續執行。

--enable-force

批量導入時,有可能會報主鍵衝突的問題,而DBA可以確定的是,出現主鍵衝突不是問題,可以繼續執行,那麼此時可以通過選項

--enable-force告訴Inception,在執行過程中碰到一個錯誤時,可以先保存錯誤信息並繼續下一條語句。此參數需謹慎使用。

--enable-remote-back

Inception支持備份並生成對應的回滾語句,這是預設的,但當有些影響行數很多且明確不需要回滾的時候,為了提高執行效率,

可以指定在執行時不做備份,指定方式是通過disable來禁用它,即disable-remote-backup。

--enable-split

這個參數用來拆分要執行的語句塊。如果在語句塊中存在對同一個表的DDL操作和DML操作,那麼在分析Binlog來生成回滾語句時,

由於表結構已經發生改變,會導致Inception沒有辦法處理,所以使用這個參數將這些語句分成多批,然後再分別執行。這是在執行前

必須要做的一個操作,不然可能會產生不可預知的錯誤。當然在執行前的最後一次審核中,如果檢查到這樣的混用情況,

則會返回報錯,而不是警告。

--enable-query-print

這個參數用來列印SQL語句在被Inception分析之後的執行樹結構,已JSON的形式提供,目的是為了可以在Inception的基礎上,

對已經結構化的(JSON)語句再次分析,可以對Inception內置支持的規則進行擴展,做個性化定製,比如使用到哪些列、

哪些語句類型等信息。

2.7 Inception結構集導讀

返回列 詳細描述
ID  用來表示結果集中記錄序號的,也就是被審核的語句在語句塊中的序號,按位置排序,計數從1開始。
stage

 顯示當前語句已經進行到哪一步了,包括四個值:CHECKED、EXECUTED、RERUN和NONE。CHECKED表示這個語句只做審核,而沒有再進行下一步操作;EXECUTED表示已經執行過,

如果執行失敗,也是用這個狀態表示,RERUN表示的是,對於影響上下文的語句,已經執行成功了,但是為了與EXECUTED區分,用RERUN表示,主要是因為在執行過程中,如果某一條語句

執行失敗了,則上層可能需要將沒有執行的語句提取出來,再次執行,那麼影響上下文的語句就是需要加上的,所以用RERUN來表示。Inception目前支持兩種影響上下文的語句,分別是

set names charset 語句和use database語句。NONE表示沒有做過任何處理,有可能前面有語法錯誤直接提前返回。 

errlevel

 總共有三個值,分別是0、1、2。如果為0,則說明當前語句審核沒有任何問題;如果為1,則說明當前語句審核時發現有些寫法不符合Inception定義的內置規則,屬於警告;如果值為2,則說明

當前語句審核時,發現了嚴重錯誤,無論如何都不能通過的。

stagestatus

 該列用來描述當前語句的階段結果,與列stage對應。如果是審核階段,並且完成,則返回Audit completed。如果是執行階段,並且執行成功則返回Execute Successfully,否則返回Execute

failed。如果是備份階段,並且備份成功,則在執行描述信息後面追加Backup successfully,否則追加Backup failed。

errormessage

 用來表示出錯的錯誤信息,這裡包括一條語句中的所有錯誤信息,用換行符分隔,但有時候如果某一個錯誤導致不能繼續分析了,比如表不存在等問題,在這種情況下,如果語句還有其他錯誤,

就不能被審核出來了。如果當前語句沒有任何錯誤,則這個列值為NONE。對於執行及備份操作,因為對於一條語句,這樣的錯誤只會有一次,那麼執行錯誤會在執行後面追加:“execute:具體

的執行錯誤原因”,如果是備份出錯,則在後面追加“backup:具體的錯誤原因”。在執行時,有時候還會出現Warning。

SQL  用來表示當前檢查的是那條SQL語句,這一列存儲的值就是這條SQL語句的文本內容。
affected_rows  審核時,用來表示當前語句預計影響的行數,這個行數一般是通過EXPLAIN來獲取的。在執行時,該列輸出的是執行時真實影響的行數。
sequence  該列與Inception備份功能有關,其實就是與$_$Inception_backup_information$_$表中的列opid_time一一對應,這就為自動化運維平臺針對某一條語句做回滾操作找到了入口。
backup_dbname  該列表示的是當前語句產生的備份信息,存儲在備份伺服器的那個資料庫中。如果是不需要備份的語句,則返回字元串NONE。
excute_time  該列表示當前語句的執行時間,單位是秒,精確到小數點後兩位。列類型是字元串。如果只是審核而不執行,則該列返回的值為0.
SQLSHA1  這一列用來存儲當前這條語句的一個HASH值,用來標識這個語句是否會使用OSC功能,如果返回信息中有值,則表示這條語句在執行時會使用OSC。

 

3.Inception 備份功能

Inception在做DML操作時,具有備份功能。它會將所有當前語句修改的行對應生成回滾語句並備份下來,同時也會將所有操作的任務備份下來,一起存儲到一個指定的庫中。

3.1 配置項中關於備份主要有4個參數

參數 說明
inception_remote_backup_host 指定遠程備份MySQL實例的地址。
inception_remote_backup_port 指定遠程備份MySQL實例的埠。
inception_remote_system_user 備份時,連接備份MySQL實例時所需的用戶名,這個用戶需要有相應的許可權,一般包括Create、Insert和Select許可權。
inception_remote_system_password 備份時,連接備份庫時所需要的用戶對於的密碼。

3.2 備份資料庫命名規則

因為線上機器有很多,而備份機器只有一臺,所以為了防止在備份資料庫實例中存在庫名衝突的問題,備份機器的庫名是將線上機器IP地址的點換成下劃線,再加上埠號及庫名。

例如:

169_169_167_167_3306_testDB.

3.3 備份庫上的表

主要有兩類,一種針對線上每一個表生產一個備份表,即與線上的表是一一對應的,表名相同,但是表結構不一樣。備份表主要用來存儲所有對錶修改的回滾語句。

主要有以下3列:

列名 說明
id 標識列
rollback_statement

當某一行被修改後,生成的對應的回滾語句。因為Binlog必須為Row模式,所以,不管是什麼語句,產生的回滾語句都是針對被修改的行記錄的。

如果一條語句的執行,影響了多行,那麼這裡就會有多條回滾語句。

opid_time

執行SQL語句時獲取的一個序列號。序列號由三部分組成:timestamp(int值,是語句執行的時間點)、線上伺服器執行時所產生的thread_id及

當前這條語句在所有被執行語句塊中的一個序號。序列號在指定的備庫中是唯一的。針對同一條語句影響多行的情況、在產生的多行回滾語句中,

該列的值是相同的。

還有一類表,其實這個表每個庫中只有一個,$_$Inception_backup_information$_$。該表主要用來記錄所有對當前庫的操作,它是為該庫中所有表服務的,對線上這個庫的所有的表的操作,都會被存儲在這裡面。

 

參數 說明
opid_time

該列與上面備份表中的列opid_time是一一對應的,因為這個表中的每一行對應的是線上上執行的實際的一條SQL語句。

opid_time從各個備份表中查找這條語句對應的回滾語句,是一對多的關係。

start_binlog_file

表示執行這條語句前Binlog所在的位置的文件名。這個值是通過 show master status 獲取的,在資料庫併發比較高的情況下,

這個值不一定准確。這個值只能是這條語句產生Binlog前面的某個位置。同理。下麵三個位置信息也是一樣。

start_binlog_pos 該列與上面的列對應,表示的是上面指定文件的位置信息。
end_binlog_file 該列表示的是執行當前語句之後,Binlog所在的文件名。
end_binlog_pos 該列與上面的列對應,表示執行完成後,Binlog在文件end_binlog_file中的偏移位置。
sql_statement 該列存儲的是當前這個被執行的SQL語句。
host 表示線上上的哪個資料庫實例上執行了該語句。
dbname 表示執行當前語句時所處的環境變數,指的是資料庫名。
tablename 表示當前語句影響的表的表名,通過這個名字對應到備份表名。
port 與host對應,表示執行時資料庫的埠號。
time 表示當前語句的執行時間
type 表示操作類型,現在只支持INSERT、UPDATE、DDELETE、CREATEDB、CREATETABLE、ALTERTABLE、DROPTABLE等類型。

 

3.4線上庫表結構與備份庫表結構的對應關係如下圖:

 3.5 通過python腳本驗證

測試環境

類別 ServerIP Port
線上資料庫 XXX.XXX.XXX.9 3306
Inception XXX.XXX.XXX.8 6669
備份資料庫 XXX.XXX.XXX.9 3307

 測試python腳本

#!/usr/bin/python
#-*- coding:utf-8 -*-
import MySQLdb

sql='''/*--user=資料庫賬號;--password=相應密碼;--host=XXX.XXX.XXX.9;--execute=1;--port=3306;*/\
    inception_magic_start;\
    use dbtest;\
    CREATE TABLE table_test(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試';\
    inception_magic_commit;'''
try:
       conn=MySQLdb.connect(host='XXX.XXX.XXX.8',user='',passwd='',db='',port=6669)
       cur=conn.cursor()
       ret=cur.execute(sql)
       result=cur.fetchall()
       num_fields = len(cur.description)
       field_names = [i[0] for i in cur.description]
       print field_names
       for row in result:
                print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|",row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10]
       cur.close()
       conn.close()
except MySQLdb.Error as e:
       print "Mysql Error %d: %s" % (e.args[0], e.args[1])

執行結果如下:

去備份庫上查看,備份情況如下:

3.6 備份所需的條件

如果在測試的過程中,發現沒有實現備份,可以從以下幾個方面去檢查

(1)線上伺服器必須要打開Binlog,在啟動時需要設置參數log_bin、log_bin_index等關於Binlog的參數。不然不會備份及生成回滾語句,因為Inception的生成回滾語句是通過解析Binlog來做的。

 

(2)參數必須binlog_format必須設置為mixed或者row模式。如果是statement模式,則不做備份及回滾語句的生成。可通過語句set global binlog_format=ROW來設置。

(3)將binlog_row_image設置為full ,該配置項預設為 full ,但是如果為了減少binlog的size改成minimal的話,則Inception無法生成回滾語句。

(4)參數server_id必須設置為非0非1,通過語句set global server_id=server_id;來設置,不然在備份時報錯。因為在獲取Binlog時,需要通過server_id在主庫上註冊Inception。

(5)被修改表需要有主鍵:執行時,被影響的表如果沒有主鍵的話,就不會做備份了。這樣更簡單並且備份時間及數據都會少一點,不然回滾語句的where條件就會將所有列寫進去,這樣會影響性能且沒有太大意義,所以在where條件中,只需要主鍵即可。

(6)備份相關的四個參數需要設置好,並且對應的用戶在備份資料庫實例中有足夠的許可權。

3.7 在進行驗證時可能遇到的錯誤。

1執行 Python驗證,報錯信息。

ImportError: No module named MySQLdb

解決方案:

yum install MySQL-python

 2.有時候執行Python腳本報錯:invalid source infomation。

這時候需要去檢查Inception連接資料庫的參數配置。

 4.Inception常見關於審核規範的變數參數

5.Inception統計功能

其數據存儲在備份實例上的inception資料庫上statistic表中,此庫自動生成。

主要欄位的說明如下:

列名 欄位描述
deleting 包括普通的刪除操作及多表刪除操作。
inserting 包括單行插入、多行插入及查詢插入。
updating 包括普通單表更新及多表的更新。
renaming 指的是ALTER table語句中的rename操作。
createindex 指的是ALTER table語句中的add index操作。
dropindex 指的是ALTER table語句中的drop index操作。
alteroption 指的是ALTER table語句中的修改表屬性的操作,比如存儲引擎、自增值及字元集中操作。
alterconvert 指的是ALTER table語句中修改表字元集的操作。

 

 

-----主要內容參考梳理於網路知識和《MySQL運維內參》,此短文僅為學習筆記,在此原創作者感謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天亞馬遜又掛了,為什麼是又呢,因為每年亞馬遜都要掛幾次。 昨天是什麼日子讓亞馬遜又掛了呢?不就是因為清倉促銷嗎……你的驕傲呢,高可用呢,負載均衡呢,分散式呢,三駕馬車怎麼一駕都不管用了呢? 不就是在國內弄個促銷麽……不就是被羊毛黨盯上了麽……至於麽你,一掛就是幾個小時,我反正在下午2點看看是上不去 ...
  • 1、我們可以寫一些簡單的檢查資料庫的檢查腳本 2、然後在命令行視窗執行我們腳本的時候,就會輸出我們預期的查詢結果 3、說明 1》prompt 顯示後面的提示,相當於一般的操作系統命令echo,輸出後面的信息Importing table t_test 2》set feedback off set f ...
  • 今天在工作中,在service中調用分頁查詢列表介面的時候,返回的到頁面的數據中總是存在缺失的數據,還有重覆的數據。後發現是order by導致的 ...
  • MySQL 1054錯誤的情況 在用命令插入數據時提示 1054錯誤的問題: 這種情況下的解決方法: 是因為引號的問題 ‘ ’ 。 字元串應該加上引號,解決問題。如下: ...
  • 1.Oracle中常見的數據類型分類:(A) 1.number(x,y) 數字類型,x表示最大長度,y表示精度對應java中除char外所有基本數據類型(byte、short、int、long、float、double、boolean) 2.varchar2(x) 可變字元串,x表示最大長度。對應j ...
  • 問題描述: storm版本:1.2.2,kafka版本:2.11。 在使用storm去消費kafka中的數據時,發生瞭如下錯誤。 報錯圖示如下: 報錯的意思為:mybolt這個組件,在從kafka_sput組件上消費消息時,它所消費的default數據流是不存在的。 上面的報錯是因為代碼中有地方寫錯 ...
  • 原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5ab798b4732c1a3457d60c53b 本篇介紹一下如何從源碼構建Elasticsearch,構建Elasticse ...
  • 1.概念(C) 數據操縱語言 DML (Data Manipulation Langua)是SQL語言的一個分類,用於對錶的內容或者說數據進行增、刪、改、查等操作。 通過以下幾個關鍵字實現: SELECT(查詢) 、INSERT(插入)、 UPDATE(更新修改)、 DELETE(刪除) 2.ins ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...