Inception使用詳解

Rangle發表於2017-12-29

一、Inception簡介
一款用於MySQL語句的稽核的開源工具,不但具備自動化稽核功能,同時還具備執行、生成對影響資料的回滾語句功能。

基本架構:

 

 

二、Inception安裝

1、軟體下載

下載連結:https://github.com/mysql-inception/inception
文件連結:http://mysql-inception.github.io/inception-document/
2、安裝
(1)依賴包安裝

inception相關指令碼基於python2,所以我門最好安裝python2.X版本,本文是通過python2.6操作

yum -y install cmake  libncurses5-dev libssl-dev g++ bison openssl-devel.x86_64 

(2)編譯

[root@node1 ~]# unzip inception-master.zip 
[root@node1 ~]# cd inception-master
[root@node1 ~]# sh inception_build.sh install_dir [Xcode]

##輸入引數有兩個,第一個是軟體編譯安裝目錄,第二個是平臺程式碼,Xcode表示Linux平臺,不填表示預設Linux平臺

mv  install_dir /usr/local/inception
ln -s /usr/local/inception/mysql/Inception  /usr/bin/inception

(3)inception配置檔案

/etc/inc.cnf

[inception]
general_log=1
general_log_file=/usr/local/inception/log/inception.log
port=6669
socket=/usr/local/inception/inc.socket
character-set-client-handshake=0
character-set-server=utf8
inception_remote_system_user=root
inception_remote_system_password=root123
inception_remote_backup_port=3306
inception_remote_backup_host=10.0.0.1
inception_support_charset=utf8mb4
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=/usr/local/inception/data
inception_osc_chunk_time=0.1
inception_enable_blob_type=1
inception_check_column_default_value=1

##特別引數解釋

inception_remote_system_user=root          ##遠端備份資料庫使用者名稱
inception_remote_system_password=root123      ##遠端備份資料庫使用者密碼
inception_remote_backup_port=3306          ##遠端備份資料庫埠
inception_remote_backup_host=10.xx.xx.xx      ##遠端備份資料庫IP地址,本次演示例如10.0.0.1
inception_support_charset=utf8mb4,utf8,latin1   ##建表、建庫MYSQL支援的字符集型別

##其他配置參考附錄

(4)啟動
a.啟動方式01

inception --defaults-file=/etc/inc.cnf
##最佳啟動方式是通過nohup後臺啟動
nohup inception --defaults-file=/etc/inc.cnf &

b.啟動方式02

inception --port=6669

 

注意: 因為Inception支援OSC執行的功能,是通過呼叫pt-online-schema-change工具來做的,但如果Inception後臺啟動(&)的話,可能會導致pt-online-schema-change在執行完成之後,長時間不返回,進而導致Inception卡死的問題,這個問題後面會解決,但現階段請儘量不要使用後臺啟動的方式,或者可以使用nohup Inception啟動命令 &的方式來啟動。

(5)登陸校驗
啟動成功之後,可以簡單試一下看,通過MySQL客戶端

mysql -uroot -h127.0.0.1 -P6669

登入上去之後,再執行一個命令:

inception get variables;
輸出了所有的變數,恭喜你,已經啟動成功了,都說了非常簡單。

三、Inception使用

本次業務目標庫IP採用10.0.0.2

1、資料庫DDL操作

(1)建庫

需要指定字符集,不會產生回滾

#!/usr/bin/env python
#--*--coding=utf8--*--

import MySQLdb

sql='''/*--user=root;--password=123456;--host=10.0.0.2;--execute=1;--port=3306;*/\
    inception_magic_start;\
    create database  dbtest01 DEFAULT CHARACTER SET utf8mb4;\
    inception_magic_commit;'''
try:
       conn=MySQLdb.connect(host='127.0.0.1',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]) 

 

(2)建表

建表操作檢查項如下:
表屬性的檢查項
    這個表不存在
    對於create table like,會檢查like的老表是不是存在。
    對於create table db.table,會檢查db這個資料庫是不是存在
    表名、列名、索引名的長度不大於64個位元組
    如果建立的是臨時表,則必須要以tmp為字首
    必須要指定建立innodb的儲存引擎(可配置)
    必須要指定utf8的字符集(字串可配置,指定支援哪些字符集)
    表必須要有註釋(可配置)
    表不能建立為分割槽表(可配置)
    只能有一個自增列
    索引名字不能是Primay
    不支援Foreign key(可配置)
    建表時,如果指定auto_increment的值不為1,報錯(可配置)
    如果自增列的名字不為id,說明有可能是有意義的,MySQL這樣使用比較危險,所以報警(可配置)
列屬性的檢查項
    不能設定列的字符集(可配置)
    列的型別不能使用集合、列舉、點陣圖型別。(可配置)
    列必須要有註釋(可配置)
    char長度大於20的時候需要改為varchar(長度可配置)
    列的型別不能是BLOB/TEXT。(可配置)
    每個列都使用not null(可配置)
    如果列為BLOB/TEXT型別的,則這個列不能設定為NOT NULL。
    如何是自增列,則使用無符號型別(可配置)
    如果自增列,則長度必須要大於等於4個位元組(可配置)
    如果是timestamp型別的,則要必須指定預設值。
    對於MySQL5.5版本(包含)以下的資料庫,不能同時有兩個TIMESTAMP型別的列,如果是DATETIME型別,則不能定義成DATETIME DEFAULT CURRENT_TIMESTAMP及ON UPDATE CURRENT_TIMESTAMP等語句。
    每個列都需要定義預設值,除了自增列、主鍵列及大欄位列之外(可配置)
    不能有重複的列名
索引屬性檢查項
    索引必須要有名字
    不能有外來鍵(可配置)
    Unique索引必須要以uniq_為字首(可配置)
    普通索引必須要以idx_為字首(可配置)
    索引的列數不能超過5個(數目可以配置)
    表必須要有一個主鍵(可配置)
    最多有5個索引(數目可配置)
    建索引時,指定的列必須存在。
    索引中的列,不能重複
    BLOB列不能建做KEY
    索引長度不能超過766
    不能有重複的索引,名字及內容
預設值檢查項
    BLOB/TEXT型別的列,不能有非NULL的預設值
    MySQL5.5以下(含)的版本,對於DATETIME型別的列,不能有函式NOW()的預設值。
    如果設定預設值為函式,則只能是NOW()。
    如果預設值為NULL,但列型別為NOT NULL,或者是主鍵列,或者定義為自增列,則報錯。
    自增列不能設定預設值。

python指令碼如下

#!/usr/bin/env python
# -*- UTF-8 -*-

import MySQLdb

sql='''/*--user=root;--password=123456;--host=10.0.0.2;--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='127.0.0.1',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])

執行結果如下:

[root@node1 ~]# python a.py 
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | RERUN | 0 | Execute Successfully | None | use dbtest | 0 | '1514535958_11_0' | None | 0.000 | 
2 | EXECUTED | 0 | Execute Successfully
Backup successfully | None | CREATE TABLE table_test(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試' | 0 | '1514535958_11_1' | 10_129_128_97_3306_dbtest | 0.010 | 

檢查備份庫:(10.0.0.1)

##會增加兩個資料庫,分別是IP_埠_業務庫命名的資料庫,用以存放回滾記錄、SQL操作日誌;庫inception,用於儲存操作影響行數、時間等

(root:localhost:Fri Dec 29 15:41:46 2017)[(none)]>show databases;
+---------------------------+
| Database                  |
+---------------------------+
| information_schema        |
| 10_0_0_1_3306_dbtest |
| inception                 |
| mysql                     |
| performance_schema        |
| sys                       |
+---------------------------+

(root:localhost:Fri Dec 29 15:46:27 2017)[(none)]>show tables from 10_0_0_1_3306_dbtest;
+-------------------------------------+
| Tables_in_10_0_0_1_3306_dbtest |
+-------------------------------------+
| $_$Inception_backup_information$_$  |
| table_test                          |
+-------------------------------------+
2 rows in set (0.00 sec)

(root:localhost:Fri Dec 29 15:47:08 2017)[(none)]>show tables from inception ;               
+---------------------+
| Tables_in_inception |
+---------------------+
| statistic           |
+---------------------+
1 row in set (0.00 sec)

##10_0_0_1_3306_dbtest庫下表$_$Inception_backup_information$_$ 儲存內容如下:  
##10_0_0_1_3306_dbtest庫下表table_test 儲存內容如下:
 
##inception庫下表statistic儲存內容如下:

 id optime usedb deleting inserting updating selecting altertable renaming createindex dropindex addcolumn dropcolumn changecolumn alteroption alterconvert createtable droptable createdb truncating
 1 2017/12/29 15:42:37 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0



 檢查目標庫:(10.0.0.2)

 


(3) DROP/TRUNCE

 

(4)ALTER

修改表操作檢查項如下:
    表是不是存在
建立索引檢查項
    同上面建立表中的索引檢查項
加列檢查項
    同上面建立表中的列檢查項
修改表檢查項
    表是不是存在
    如果語句塊中存在多條對同一個表的修改語句,則建議合併成一個ALTER語句
    列是否存在
    剩下的同上面建立表,建立索引,建立列,預設值等檢查項一樣
刪除索引檢查項
    表是不是存在
    檢查索引是不是存在
修改列的預設值檢查項
    同預設值檢查項
修改表屬性
    表屬性只支援對儲存引擎、表註釋、自增值及預設字符集的修改操作。
    修改儲存引擎時檢查是不是Innodb(可配置)。
    字符集修改檢查是不是屬於設定引數的值(支援字符集可配置)。
轉換表字符集
    字符集修改檢查是不是屬於設定引數的值(支援字符集可配置)。

(5)儲存過程

 不支援儲存過程呼叫 

2、資料庫DML操作

a.插入操作

插入語句檢查項如下:
    表是否存在
    必須指定插入列表,也就是要對哪幾個列指定插入值,如insert into t (id,id2) values(...),(可配置)
    必須指定值列表,與上面對應的列,插入的值是什麼,必須要指定。
    插入列列表與值列表個數相同,上面二者的個數需要相同,如果沒有指定列列表(因為可配置),則值列表長度要與表列數相同。
    不為null的列,如果插入的值是null,報錯(可配置)
    插入指定的列名對應的列必須是存在的。
    插入指定的列列表中,同一個列不能出現多次。
    插入值列表中的簡單表示式會做檢查,但具體包括什麼不一一指定

 b.更新操作

更新操作檢查項如下:
    表是否存在
    必須有where條件(可配置)
    delete語句不能有limit條件(可配置)
    不能有order by語句(可配置)
    影響行數大於10000條,則報警(數目可配置)
    對WHERE條件這個表示式做簡單檢查,具體包括什麼不一一指定
    對更新列的值列表表示式做簡單檢查,具體不一一指定
    對更新列物件做簡單檢查,主要檢查列是不是存在等
    多表更新、刪除時,每個表必須要存在

 c.刪除操作 

刪除操作檢查項如下:
    表是否存在
    必須有where條件(可配置)
    delete語句不能有limit條件(可配置)
    不能有order by語句(可配置)
    影響行數大於10000條,則報警(數目可配置)
    對WHERE條件這個表示式做簡單檢查,具體包括什麼不一一指定
    對更新列的值列表表示式做簡單檢查,具體不一一指定
    對更新列物件做簡單檢查,主要檢查列是不是存在等
    多表更新、刪除時,每個表必須要存在

 3、資料庫SELECT操作

select操作檢查項如下:
    物件是否存在(表、列)
    是否是select * (預設不允許select * )
    

 

4、資料庫DCL操作

 

5、遠端變數獲取

#!/usr/bin/env python
#--*--coding=utf8--*--

import MySQLdb

sql='''/*--user=root;--password=123456;--host=10.129.128.97;--execute=1;--port=3306;*/\
    inception_magic_start;\
    inception show variables like "read%";
    inception_magic_commit;'''
try:
       conn=MySQLdb.connect(host='127.0.0.1',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]) 

6、OSC操作

OSC進度檢視:
inception get osc_percent '當前執行的SQL語句以及一些基本資訊生成的SHA1雜湊值';

輸出內容解釋如下:
  • TABLENAME:當前被修改的表名;
  • DBNAME:當前被修改表所在的庫名;
  • SQLSHA1:當前要查詢的語句的SHA1字串;
  • PERCENT:當前修改已經完成的百分比,這個值是0到100的值。
  • REMAINTIME:當前修改語句還需要多久才能完成,如03:55表示還需要三分55秒,01:33:44表示還需要1小時33分44秒。
  • INFOMATION:顯示當前OSC執行時的狀態資訊,內容為OSC當前所有的輸出資訊,不包括百分比資訊,百分比還是由上面的列來顯示,這個方便在使用時隨時檢視執行到哪一步了,可以更加清楚的瞭解到執行進度。

  OSC操作終止:(需等觸發器建立、完成之後)

  inception stop alter '當前執行的SQL語句以及一些基本資訊生成的SHA1雜湊值' ;

  檢視所有OSC操作:

  inception get osc processlist;

7、檢視inception processlist操作

檢視processlist
(1:127.0.0.1:Fri Dec 29 21:21:47 2017)[(none)]>inception get processlist;
+----+-----------+-----------+-----------+-----------+---------+----------+------+---------------------------+-----------------+
| Id | Dest_User | Dest_Host | Dest_Port | From_Host | Command | STATE    | Time | Info                      | Current_Execute |
+----+-----------+-----------+-----------+-----------+---------+----------+------+---------------------------+-----------------+
| 20 |           |           |         0 | localhost | LOCAL   | CHECKING |    0 | inception get processlist | NULL            |
+----+-----------+-----------+-----------+-----------+---------+----------+------+---------------------------+-----------------+

  1. id:一個簡單的計數。
  2. dest_user:表示當前執行語句訪問資料庫時所用的使用者名稱。
  3. dest_host:表示當前執行語句要訪問的資料庫地址。
  4. dest_port:表示當前執行語句要訪問的資料庫的埠。
  5. from_host:表示當前執行語句是從機器上發起的。
  6. command:表示當前執行的是什麼操作,包括CHECK(簡單稽核),EXECUTE(執行),SPLIT(拆分),PRINT(列印計劃樹),LOCAL(本地命令)。
  7. state:表示在當前命令下,執行的狀態是什麼,狀態包括INIT(初始階段),CHECKING(正在稽核),EXECUTING(正在執行),DEINIT(退出),BACKUP(正在備份)。
  8. time:表示當前語句執行所用時間。
  9. info:顯示當前正在執行的語句。

 

8、結果集解釋

ID:用來表示檢查的sql序號的,每次檢查都是從1開始。
stage:這個列顯示當前語句已經進行到哪一步了,包括CHECKED、EXECUTED、RERUN、NONE,NONE表示沒有做過任何處理,有可能前面有語法錯誤直接就提前返回了, CHECKED表示這個語句只做過稽核,而沒有再進行下一步操作,EXECUTED表示已經執行過,如果執行失敗,也是用這個狀態表示,RERUN表示的是,對於影響上下文的語句,已經執行成功,但為了與EXECUTED區分,用RERUN表示,主要是因為在執行過程中,如果某一條語句執行失敗了,則上層可能需要將沒有執行的語句提取出來,再次執行,那麼影響上下文的語句是需要加上的,所以用RERUN來表示。影響上下文的語句一般包括set names和use db這兩種,而當前Inception支援的只有這兩種。
errlevel:返回值為非0的情況下,說明是有錯的。1表示警告,不影響執行,2表示嚴重錯誤,必須修改。
stagestatus:用來表示檢查及執行的過程是成功還是失敗,如果稽核成功,則返回 Audit completed。如果執行成功則返回Execute Successfully,否則返回Execute failed,如果備份成功,則在後面追加Backup successfully,否則追加Backup failed,這個列的返回資訊是為了將結果集直接輸出而設定的,如果在具體使用過程中,為了更友好的顯示,可以在這基礎上再做加工處理。
errormessage:用來表示出錯錯誤資訊,這裡包括一條語句中所有的錯誤資訊,用換行符分隔,但有時候如果某一個錯誤導致不能繼續分析了,則後面的錯誤就不能顯示出來。如果沒有出錯,則用顯示為None。而對於執行及備份錯誤,因為對於一條語句,這樣的錯誤只會有一次,那麼執行錯誤會在後面追加“execute:具體的執行錯誤原因”,如果是備份出錯,則在後面追加“backup:具體的備份錯誤原因”,而在執行時,有時候會出現Warnings,比如插入資料時字串被截斷啥的,此時會輸出這些warnings:#1 Execute(Warning, Code errno):warning message,#號後面的數字表示第幾個警告,因為有時候執行一個語句會產生多個警告。
SQL:用來表示當前檢查的是哪條sql語句。如果某一條sql語句在檢查時有語法錯誤,則這裡面會包括從出錯語句開始到後面所有的語句,因為語法出錯後實在是真的不能再繼續分析了,也就不能將後面的每條語句分開了,這個列還會有一個特別的地方,如果當前語句是inception show xxxx命令集中的第一種情況(<<Inception命令集>>中會做具體介紹)。
affected_rows:用來表示當前語句執行時預計影響的行數,在執行時顯示的是真實影響行數。
sequence:這個列與上面說的備份功能有關係,其實就是對應$$Inception_backup_information$$表中的 opid_time 這個列,一一對應,這就為前端應用在針對某一操作回滾找到了入口,每次執行都會產生一個序號,如果要回滾,則就使用這個值從備份表中找到對應的回滾語句執行即可。
backup_dbname:這個列表示的是當前語句產生的備份資訊,儲存在備份伺服器的哪個資料庫中,這是一個字串型別的值,只針對需要備份的語句,資料庫名由IP地址、埠、源資料庫名組成,由下劃線連線,而如果是不需要備份的語句,則返回字串None。
execute_time:這個列表示當前語句執行時間,單位為秒,精確到小數點後兩位。列型別為字串,使用時可能需要轉換成DOUBLE型別的值,如果只是稽核而不執行,則這個列返回的值為0。
SQLSHA1:這個列用來儲存當前這個語句的一個HASH值,這是用來標識這個語句是不是會使用OSC功能,如果返回資訊中有值,則表示這個語句在執行的時候會使用OSC,因為在執行前,會有一次單獨的稽核操作,此時上層已經可以拿到這個值,稽核通過之後,語句是不會改變的,當然這個值也不會改變,那麼在執行時就可以使用這個值來檢視OSC執行的進度等資訊,這個值一般長的樣子如下:D0210DFF35F0BC0A7C95CD98F5BCD4D9B0CA8154*

 

四、Inception附錄
1、適用場景 

a.支援的SQL操作
use db:此時會檢查這個庫是不是存在,需要連線到線上伺服器來判斷。
set option:現在只需要支援set names charset,設定其它變數時都報錯不支援。
建立資料庫語句
插入語句(包括多值插入)
查詢插入語句
刪除語句(包括多表刪除)
更新語句(包括多表更新)
建立表語句
刪除表語句
修改表語句
Truncate表語句
inception命令集語句(包括管理命令)
b.線上伺服器必須要開啟 binlog,在啟動時需要設定引數log_bin、log_bin_index等關於 binlog 的引數。不然不會備份及生成回滾語句。
c.引數binlog_format必須要設定為 mixed 或者 row 模式,通過語句: set global binlog_format=mixed/row 來設定,如果是 statement 模式,則不做備份及回滾語句的生成。
d.引數 server_id 必須要設定為非0及非1,通過語句:set global server_id=server_id;來設定,不然在備份時會報錯。
e.線上伺服器一定要有指定使用者名稱的許可權,這個是在語句前面的註釋中指定的,做什麼操作就要有什麼許可權,否則還是會報錯,如果需要執行的功能,則要有線上執行語句的許可權,比如DDL及DML,同時如果要執行inception show 等遠端命令的話,有些語句是需要特殊許可權的,這些許可權也是需要授予的,關於許可權這個問題,因為一般Inception是執行在一臺固定機器上面的,那麼在選項中指定的使用者名稱密碼,實際上是Inception機器對線上資料庫訪問的許可權,所以建議在使用過程中,使用專門固定的帳號來讓Inception使用,最好是一個只讀一個可寫的即可,這樣在執行時用可寫,稽核或者檢視線上狀態或者表庫結果時用只讀即可,這樣更安全。
f.在執行時,不能將 DML 語句及 DDL 語句放在一起執行,否則會因為備份解析binlog時由於表結構的變化出現不可預知的錯誤,如果要有同時執行 DML 及 DDL,則請分開多個語句塊兒來執行,如果真的這樣做了,Inception 會報錯,不會去執行。

 

2、優缺點
(1)優點:

a.支援強大的語法分析檢查,同時可根據自己需求調整稽核、執行操作語句

b.支援稽核、回滾、OSC

c.

(2)缺點:
a.只支援MYSQL資料庫的稽核工作

b.面對很多複雜的子查詢、表示式等是不容易檢查到的,所以有些就直接忽略了

c.不支援DDL和DML同時存在的SQL操作

d.python2.X配置,MySQLdb安裝,OSC安裝

f.檢查規則固定,結果集固定

3、安裝錯誤

(1)錯誤示例01
錯誤日誌:

[ 30%] Generating include/probes_mysql_dtrace.h, include/probes_mysql_nodtrace.h
File "/usr/bin/dtrace", line 170
print _("Usage ") + sys.argv[0] + " [--help] [-h | -G] [-C [-I<Path>]] -s File.d [-o <File>]"
^
SyntaxError: invalid syntax
make[2]: *** [include/probes_mysql_dtrace.h] Error 1
make[1]: *** [CMakeFiles/gen_dtrace_header.dir/all] Error 2
make: *** [all] Error 2

解決方案:

yum install dtrace systemtap-sdt-devel -y

(2)錯誤示例02

錯誤日誌:

[ 61%] Building CXX object libmysql/CMakeFiles/libmysql.dir/libmysql_exports_file.cc.o
make[2]: *** No rule to make target `probes_mysql.o', needed by `libmysql/libmysqlclient.so.18.0.0'. Stop.
make[1]: *** [libmysql/CMakeFiles/libmysql.dir/all] Error 2
make: *** [all] Error 2

解決方案:

刪除編譯檔案,並做相關庫檔案軟連結
ln -s /usr/local/mysql/lib/libperconaserverclient.so.18.1.0  /usr/lib64/libmysqlclient.so.18.0.0
如依舊報錯,可做其他類似的軟連結到/usr/lib64/下

4、inception支援的引數變數

通過inception get variables;可以檢視所有引數變數設定值

通過inception get variables 'variable_name';獲取指定引數值

通過inception set variable_name=value;設定引數值

數名字可選引數預設值功能說明
inception_check_insert_field ON/OFF ON 是不是要檢查插入語句中的列連結串列的存在性
inception_check_dml_where ON/OFF ON 在DML語句中沒有WHERE條件時,是不是要報錯
inception_check_dml_limit ON/OFF ON 在DML語句中使用了LIMIT時,是不是要報錯
inception_check_dml_orderby ON/OFF ON 在DML語句中使用了Order By時,是不是要報錯
inception_enable_select_star ON/OFF ON Select*時是不是要報錯
inception_enable_orderby_rand ON/OFF ON order by rand時是不是報錯
inception_enable_nullable ON/OFF ON 建立或者新增列時如果列為NULL,是不是報錯
inception_enable_foreign_key ON/OFF ON 是不是支援外來鍵
inception_max_key_parts 1-64 5 一個索引中,列的最大個數,超過這個數目則報錯
inception_max_update_rows 1-MAX 10000 在一個修改語句中,預計影響的最大行數,超過這個數就報錯
inception_max_keys 1-1024 16 一個表中,最大的索引數目,超過這個數則報錯
inception_enable_not_innodb ON/OFF OFF 建表指定的儲存引擎不為Innodb,不報錯
inception_support_charset MySQL支援字符集 "utf8mb4" 表示在建表或者建庫時支援的字符集,如果需要多個,則用逗號分隔,影響的範圍是建表、設定會話字符集、修改表字符集屬性等
inception_check_table_comment ON/OFF ON 建表時,表沒有註釋時報錯
inception_check_column_comment ON/OFF ON 建表時,列沒有註釋時報錯
inception_check_primary_key ON/OFF On 建表時,如果沒有主鍵,則報錯
inception_enable_partition_table ON/OFF OFF 是不是支援分割槽表
inception_enable_enum_set_bit ON/OFF OFF 是不是支援enum,set,bit資料型別
inception_check_index_prefix ON/OFF ON 是不是要檢查索引名字字首為"idx_",檢查唯一索引字首是不是"uniq_"
inception_enable_autoincrement_unsigned ON/OFF ON 自增列是不是要為無符號型
inception_max_char_length 1-MAX 16 當char型別的長度大於這個值時,就提示將其轉換為VARCHAR
inception_check_autoincrement_init_value ON/OFF ON 當建表時自增列的值指定的不為1,則報錯
inception_check_autoincrement_datatype ON/OFF ON 當建表時自增列的型別不為int或者bigint時報錯
inception_check_timestamp_default ON/OFF ON 建表時,如果沒有為timestamp型別指定預設值,則報錯
inception_enable_column_charset ON/OFF OFF 允許列自己設定字符集
inception_check_autoincrement_name ON/OFF ON 建表時,如果指定的自增列的名字不為ID,則報錯,說明是有意義的,給提示
inception_merge_alter_table ON/OFF ON 在多個改同一個表的語句出現是,報錯,提示合成一個
inception_check_column_default_value ON/OFF ON 檢查在建表、修改列、新增列時,新的列屬性是不是要有預設值
inception_enable_blob_type ON/OFF ON 檢查是不是支援BLOB欄位,包括建表、修改列、新增列操作
inception_enable_identifer_keyword ON/OFF OFF 檢查在SQL語句中,是不是有識別符號被寫成MySQL的關鍵字,預設值為報警。
auto_commit ON/OFF OFF 這個引數的作用是為了匹配Python客戶端每次自動設定auto_commit=0的,如果取消則會報錯,針對Inception本身沒有實際意義
bind_address string * 這個引數實際上就是MySQL資料庫原來的引數,因為Incpetion沒有許可權驗證過程,那麼為了實現更安全的訪問,可以給Inception伺服器的這個引數設定某臺機器(Inception上層的應用程式)不地址,這樣其它非法程式是不可訪問的,那麼再加上Inception執行的選項中的使用者名稱密碼,對MySQL就更加安全
general_log ON/OFF ON 這個引數就是原生的MySQL的引數,用來記錄在Inception服務上執行過哪些語句,用來定位一些問題等
general_log_file string inception.log 設定general log寫入的檔案路徑
inception_user string empty 這個使用者名稱在配置之後,在連線Inception的選項中可以不指定user,這樣線上資料庫的使用者名稱及密碼就可以不暴露了,可以做為臨時使用的一種方式,但這個使用者現在只能是用來稽核,也就是說,即使在選項中指定--enable-execute,也不能執行,這個是隻能用來稽核的帳號。
inception_password string empty 與上面的引數是一對,這個引數對應的是選項中的password,設定這個引數之後,可以在選項中不指定password
inception_enable_sql_statistic ON/OFF ON 設定是不是支援統計Inception執行過的語句中,各種語句分別佔多大比例,如果開啟這個引數,則每次執行的情況都會在備份資料庫例項中的inception庫的statistic表中以一條記錄儲存這次操作的統計情況,每次操作對應一條記錄,這條記錄中含有的資訊是各種型別的語句執行次數情況,具體的資訊需要參考後面一章<<Inception 的統計功能>>
inception_read_only ON/OFF OFF 設定當前Inception伺服器是不是隻讀的,這是為了防止一些人具有修改許可權的帳號時,通過Inception誤修改一些資料,如果inception_read_only設定為ON,則即使開了enable-execute,同時又有執行許可權,也不會去執行,稽核完成即返回
inception_check_identifier ON/OFF ON 開啟與關閉Inception對SQL語句中各種名字的檢查,如果設定為ON,則如果發現名字中存在除數字、字母、下劃線之外的字元時,會報Identifier "invalidname" is invalid, valid options: [a-z,A-Z,0-9,_].

5、inception支援的選項

主要是在執行sql的時候指定的sql='''/*--user=root;--password=123456;--host=10.0.0.2;--execute=1;--port=3306;*/

引數名字是否需要引數引數是否可選功能描述
--host 指定將要執行/稽核這部分語句塊的資料庫地址。
--port 指定將要執行這部分語句塊的資料庫埠。
--password 指定Inception連線資料庫的密碼。
--user 指定Inception連線資料庫的使用者名稱。
--sleep 這個引數用來指定在執行完每一條語句之後,暫停多少毫秒,這樣可以適當控制對線上資料庫的衝擊,特別是針對大量寫入的操作,單位為毫秒,最小值為0,也就是不暫停,最大值為100秒,也就是100000毫秒。如果設定得超過100000毫秒,Inception會自動將其設定為100000毫秒。這個引數可以和其它引數一起設定,但是隻有在--enable-execute為1的情況下,才起作用。
--enable-check 告訴Inception當前要做什麼操作,是稽核還是執行,這個引數與下面的--enable-execute只能指定一個。
--enable-execute 告訴Inception當前要做什麼操作,是稽核還是執行,這個引數與上面的--enable-check只能指定一個, 如果指定的是這個引數,則Inception在執行前還會做一次實時的稽核,那麼這個稽核和前面指定--enable-check時的稽核基本是相同的,因為相同的語句在不同的時間稽核產生不同的結果是有可能的(環境有可能變了),所以再做一次稽核是有必要的,如果稽核發現錯誤(而不是警告)就不會被執行,當然如果沒有指定--enable-ignore-warnings的話,有警告也是不會執行的,但有錯誤的話,肯定是不會被執行。
--enable-force 告訴Inception,當在執行過程中碰到一個錯誤時,是中止執行還是儲存錯誤資訊繼續執行下一個語句,這個引數要謹慎使用。
--enable-ignore-warnings Inception採取嚴格的分階段處理,如果稽核有問題則不能執行,那麼針對一些特殊問題並且稽核有警告不通過,但人工稽核沒問題確定可以執行時,可以選擇這個引數,告訴Inception跳過這個警告的檢查,繼續執行。
--enable-remote-backup 指定在執行時是不是要備份,這個引數預設是開啟的,如果不想備份,則指定引數--disable-remote-backup,這個選項所支援的備份,實際上是對當前所執行的操作的備份及被修改資料的回滾語句的儲存,關於備份的具體內容,在後面章節中專門介紹。
--enable-split 這個引數是用來拆分要執行的語句塊的,如果在語句塊中存在對同一個表的DDL操作及DML操作,那麼在備份及生成回滾語句分析binlog時,由於表結構已經發生改變,會導致inception沒法處理,所以使用這個引數將這些語句分成多批,然後再分別執行,這是在執行前必須要做的一個操作,不然可能產生不可預知的錯誤,當然在執行前的最後一次稽核中,如果檢查到有這樣的混用情況,會報錯返回,而不是警告。這個引數指定之後,除了前面四個引數之外,其它引數都被忽略,也可以不指定。
--enable-query-print 這個引數用來列印提供SQL語句在被MySQL分析之後的執行樹結構,以Json的形式提供,目的是為了可以在Inception的基礎上,對已經結構化的(Json)被分析之後的語句做再次分析,比如使用到哪些列、語句型別等資訊,目前支援的語句型別有:插入、刪除、更新及查詢,具體詳情請參考<<Inception語法樹列印>>一節。

6.OSC引數

引數名稱作用域預設值說明
inception_osc_bin_dir GLOBAL 用於指定pt-online-schema-change指令碼的位置,不可修改,在配置檔案中設定
inception_osc_check_interval SESSION 5秒 對應引數--check-interval,意義是Sleep time between checks for --max-lag.
inception_osc_chunk_size SESSION 1000 對應引數--chunk-size
inception_osc_chunk_size_limit SESSION 4 對應引數--chunk-size-limit
inception_osc_chunk_time SESSION 1 對應引數--chunk-time
inception_osc_critical_thread_connected SESSION 1000 對應引數--critical-load中的thread_connected部分
inception_osc_critical_thread_running SESSION 80 對應引數--critical-load中的thread_running部分
inception_osc_drop_new_table SESSION 1 對應引數--[no]drop-new-table
inception_osc_drop_old_table SESSION 1 對應引數--[no]drop-old-table
inception_osc_check_replication_filters SESSION 1 對應引數--[no]check-replication-filters
inception_osc_check_alter SESSION 1 對應引數--[no]check-alter
inception_osc_max_lag SESSION 3 對應引數--max-lag
inception_osc_max_thread_connected SESSION 1000 對應引數--max-load中的thread_connected部分
inception_osc_max_thread_running SESSION 80 對應引數--max-load中的thread_running部分
inception_osc_recursion_method SESSION processlist 對應OSC引數recursion_method,具體意義可以參考OSC官方手冊
inception_osc_alter_foreign_keys_method SESSION none 對應OSC引數alter-foreign-keys-method,具體意義可以參考OSC官方手冊
inception_osc_min_table_size SESSION 16 這個引數實際上是一個OSC的開關,如果設定為0,則全部ALTER語句都走OSC,如果設定為非0,則當這個表佔用空間大小大於這個值時才使用OSC方式。單位為M,這個表大小的計算方式是通過語句: "select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = 'dbname' and table_name = 'tablename'"來實現的。
inception_osc_on GLOBAL 1 一個全域性的OSC開關,預設是開啟的,如果想要關閉則設定為OFF,這樣就會直接修改
inception_osc_print_sql GLOBAL 1 對應引數--print
inception_osc_print_none GLOBAL 1 用來設定在Inception返回結果集中,對於原來OSC在執行過程的標準輸出資訊是不是要列印到結果集對應的錯誤資訊列中,如果設定為1,就不列印,如果設定為0,就列印。而如果出現錯誤了,則都會列印