SQL審覈工具goInception示例講解

本文主要對goInception工具作一些簡單介紹,並舉例說明其主要作什麼。mysql

介紹

goInception是一個集審覈、執行、備份及生成回滾語句於一身的MySQL運維工具, 經過對執行SQL的語法解析,返回基於自定義規則的審覈結果,並提供執行和備份及生成回滾語句的功能。git

goInception基於TiDB的語法解析器,和業內有名的inpcetion審覈工具重構。github

面向讀者:該文主要面向於後端開發、DBA或運維小夥伴,經過舉例說明goInception大概作了哪些事,關於安裝和使用等都可以查看 使用文檔github項目首頁。另外,除安裝之外,如今不少inception相關的資料和文章等,都可查閱,不少都是通用的。sql

架構圖:(摘自inception) 數據庫

架構圖

goInception相似於mysql服務,能夠鏈接到服務端口,執行SQL語句。 接下來經過一個示例來講明goInception具體作了哪些操做。後端

審覈示例

在調用goInception時,須要指定要訪問的生產庫地址,因此須要一種特殊語法形式, goInception延用inception的使用方式,在審覈的sql開始前添加註釋來指定遠端服務器,並在sql的先後添加特殊標識以區分待審覈語句,示例以下:服務器

/*--host=127.0.0.1;--port=3306;--user=xxx;--password=xxx;--check=0;*/
inception_magic_start;
use db;
一個或多個sql,支持大多數DDL和DML語法;
inception_magic_commit;
複製代碼

各選項說明

參數 默認值 數據類型 說明
host '' string 線上數據庫IP地址
port 0 int 線上數據庫端口
user '' string 線上數據庫用戶名
password '' string 線上數據庫密碼
check false bool 開啓審覈功能
execute false bool 開啓執行功能
backup false bool 開啓備份功能,僅在執行時生效
ignore_warnings false bool 是否忽略警告,僅在執行時生效。該參數控制有警告時是繼續執行仍是停止

要審覈的語句:微信

create table dbtest.table1(
    id int unsigned auto_increment primary key,
    name varchar(20)
    ) engine = innodb default character set utf8;
insert into dbtest.table1 values(1,'aaa'),(2,'bbb');
複製代碼

那調用時能夠變爲以下形式:架構

/*--host=127.0.0.1;--port=3306;--user=xxx;--password=xxx;--execute=1;--backup=1;--ignore_warnings=1;*/
inception_magic_start;
use dbtest;
create table table1(
    id int unsigned auto_increment primary key,
    name varchar(20)
    ) engine = innodb default character set utf8;
insert into table1 values(1,'aaa'),(2,'bbb');
inception_magic_commit;
複製代碼

其中,運維

  • 爲了方便,能夠經過use切換數據庫,上下文自動保持該數據庫
  • 爲講述更多涉及的功能,咱們開啓了執行和備份參數,此時仍會先進行審覈,只有在審覈經過以後纔會真正執行

goInception內部會進行三個階段的操做,分別是審覈階段,執行階段和備份階段,接下來逐一講解。

審覈階段

  1. goInception在收到sql語句後,先會解析註釋中的遠程數據庫配置,並創建鏈接
  2. 若是開啓了備份功能,則會檢查binlog日誌是否開啓(log_bin=ON)
  3. 判斷語法開始位置,必須以 inception_magic_start 語法開始
  4. 開始逐行解析,並進行語法樹解析,失敗時返回
  5. 解析到use dbtest,會經過show databases判斷數據庫是否存在
  6. 解析到create table table1...,接下來進行建表的校驗
    • 判斷庫、表是否存在
    • 表名、列名長度校驗,關鍵字校驗
    • 存儲引擎校驗,表/列的字符集和註釋校驗
    • 列名重複性校驗
    • 自增列個數校驗,自增列列名校驗,起始值校驗,建議添加unsigned屬性
    • 外鍵校驗,分區表校驗
    • 列類型校驗,部分類型有設置開關,開啓後才能使用,char也會建議改成varchar類型
    • 默認值校驗,日期格式校驗
    • not null約束校驗
    • 索引名校驗,前綴校驗,長度校驗,表索引個數,索引列數,索引列重複性校驗
    • 上面列出了大部分會進行的邏輯校驗,順序上和實際順序會有差別,這些審覈規則大都有開關設置,詳細參數可查看 審覈規則
  7. 解析到insert into table1 ...,接下來進行insert的校驗
    • 判斷表、列是否存在
    • 判斷insert列數和值列表是否一致
    • 檢查不爲null的列,是否指定了null
    • 檢查列是否重複指定
    • 若是使用了insert select語法,會審覈select語法是否有不存在的表或列
  8. 解析到inception_magic_commit,判斷全部的審覈是否成功,若是有錯誤時,直接返回,而有警告時會判斷是否開啓了忽略警告的參數,以判斷是否進行下一步

執行階段

  • 只有在審覈成功時(或有警告但啓用了忽略),纔會進入執行階段
  • 有些語法是不會執行的,其在審覈階段已經執行,好比desc table1;語法

接下來繼續說明執行階段:

  1. 在執行階段,DDL語句和DML語句走不一樣的邏輯,其中DML經過binlog解析實現回滾,而DDL語句根據語法樹規則直接生成逆向SQL便可
  2. DML:在開始執行和執行完成時,記錄binlog位置
  3. DDL和DML:開始執行,並在執行失敗時記錄失敗緣由並結束執行操做,成功時記錄受影響行數
  4. 執行中可能想要執行KILL以停止執行,可查看 KILL操做說明

備份階段

備份功能的詳細說明請查看 備份功能

  1. 到達備份階段有兩種狀況,可能執行成功也可能部分紅功了,此時會進行判斷,只備份執行成功的語句
  2. DDL的備份是保存自動生成的逆向SQL語句
  3. DML的備份是根據執行先後記錄的binlog位置和線程號,模擬從庫的形式獲取binlog信息,並作事件解析
  4. 解析binlog日誌要求binlog格式必須爲ROW模式,該模式也會有備份前檢查和自動設置,所以可能須要SUPER權限
  5. 在解析過binlog後,會生成逆向的SQL語句,並異步批量寫入備份庫
  6. 在回滾語句寫入完成後,全部操做執行完成,並返回結果給客戶端。

交流與反饋

歡迎經過Github Issues提交問題報告與建議

QQ羣: 499262190

微信:

相關文章
相關標籤/搜索