溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè)

發(fā)布時間:2021-09-28 14:06:23 來源:億速云 閱讀:161 作者:柒染 欄目:MySQL數(shù)據(jù)庫

本篇文章給大家分享的是有關(guān)如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

MySQL自動化運維工具Inception

一、Inception簡介

Inception是集審核、執(zhí)行、回滾于一體的一個自動化運維系統(tǒng),它是根據(jù)MySQL代碼修改過來的,用它可以很明確的,詳細(xì)的,準(zhǔn)確的審核MySQL的SQL語句,它的工作模式和MySQL完全相同,可以直接使用MySQL客戶端來連接,但不需要驗證權(quán)限,它相對應(yīng)用程序(上層審核流程系統(tǒng)等)而言,是一個服務(wù)器,在連接時需要指定服務(wù)器地址及Inception服務(wù)器的端口即可,而它相對要審核或執(zhí)行的語句所對應(yīng)的線上MySQL服務(wù)器來說,是一個客戶端,它在內(nèi)部需要實時的連接數(shù)據(jù)庫服務(wù)器來獲取所需要的信息,或者直接在在線上執(zhí)行相應(yīng)的語句及獲取binlog等,Inception就是一個中間性質(zhì)的服務(wù)。圖1.1所示為Inception的架構(gòu)。

如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè)

Inception提供的功能很豐富,首先,它可以對提交的所有語句的語法分析,如果語法有問題,都會將相應(yīng)的錯誤信息返回給審核者。 還提供語義分析,當(dāng)一個表,庫,列等信息不正確或者不符合規(guī)范的時候報錯,或者使用了一個不存在的對象時報錯等等。 還提供了很多針對SQL規(guī)范性約束的功能,這些DBA都是可以通過系統(tǒng)參數(shù)來配置的。 更高級的功能是,可以輔助DBA分析一條查詢語句的性能,如果沒有使用索引或者某些原因?qū)е虏樵兒苈?,都可以檢查。

還提供SQL語句的執(zhí)行功能,可執(zhí)行的語句類型包括常用的DML及DDL語句及truncate table等操作。 Inception 在執(zhí)行 DML 時還提供生成回滾語句的功能,對應(yīng)的操作記錄及回滾語句會被存儲在備份機器上面,備份機器通過配置Inception參數(shù)來指定。

項目地址:https://github.com/mysql-inception/inception

文檔地址:http://mysql-inception.github.io/inception-document/inception

二、Inception安裝

以下安裝是CentOS系統(tǒng),如果是Ubuntu/Debian請看官方文檔。

2.1 Git下載源碼包

1

$ git clone https://github.com/mysql-inception/inception.git

2.2 安裝依賴包

1

$ yum install gcc gcc-c++ cmake bison openssl-devel ncurses-devel MySQL-python y

2.3 開始編譯安裝

首先就是編譯,在源碼根目錄下面有一個文件inception_build.sh,執(zhí)行命令sh inception_build.sh,會輸出使用方法。 實際上只需要執(zhí)行inception_build.sh debug [Xcode]即可,后面的平臺是可選的,如果不指定就是linux平臺,而如果要指定是Xcode,就后面指定Xcode,而debug是編譯的目錄,編譯之后,所有的生成文件都在這個目錄下面,包括可執(zhí)行文件Inception??蓤?zhí)行文件在debug/sql/Debug/目錄下面(不同平臺有可能不相同)。

1

2

$ cd inception

$ bash inception_build.sh debug [Xcode]

順便強調(diào)說一下,實際上編譯Inception,和編譯MySQL源碼是一樣的,如果有不太了解的同學(xué),可以先在網(wǎng)上看看關(guān)于MySQL源碼的編譯,我想遇到的問題都可以解決。

編譯完成之后,就是使用了,那么需要一個配置文件(inc.cnf):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

$ cat /etc/inc.cnf

[inception]

general_log=1

general_log_file=inception.log

port=6669

socket=/tmp/inc.socket

character-set-client-handshake=0

character-set-server=utf8

inception_remote_system_password=root

inception_remote_system_user=wzf1

inception_remote_backup_port=3306

inception_remote_backup_host=127.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=/data/temp

inception_osc_chunk_time=0.1

inception_enable_blob_type=1

inception_check_column_default_value=1

2.4 啟動Inception程序

啟動方式和MySQL是一樣的。

1

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

注意:因為Inception支持OSC執(zhí)行的功能,是通過調(diào)用pt-online-schema-change工具來做的,但如果Inception后臺啟動(&)的話,可能會導(dǎo)致pt-online-schema-change在執(zhí)行完成之后,長時間不返回,進(jìn)而導(dǎo)致Inception卡死的問題,這個問題官方后面會解決,但現(xiàn)階段請盡量不要使用后臺啟動的方式,或者可以使用nohup Inception &的方式來啟動。

啟動如果不報錯的話,說明已經(jīng)啟動成功了,實際上很難讓它報錯,因為非常輕量級。

啟動成功之后,可以簡單試一下看,通過MySQL客戶端

1

$ mysql -uroot -h227.0.0.1 -P6669

登錄上去之后,再執(zhí)行一個命令:

1

mysql> inception get variables;

輸出了所有的變量,恭喜你,已經(jīng)啟動成功了,都說了非常簡單。

三、Inception使用

Inception實際上是一個服務(wù)程序,那么它應(yīng)該有自己的一套友好的使用方式,必須要具備簡單、高效、易用等特性。那么為了讓Inception具有這些特點,在設(shè)計之初,就規(guī)定了它的使用方式,如下所述。

通過Inception對語句進(jìn)行審核時,必須要告訴Inception這些語句對應(yīng)的數(shù)據(jù)庫地址、數(shù)據(jù)庫端口以及Inception連接數(shù)據(jù)庫時使用的用戶名、密碼等信息,而不能簡單的只是執(zhí)行一條sql語句,所以必須要通過某種方式將這些信息傳達(dá)給Inception。而我們選擇的方式是,為了不影響語句的意義,將這些必要信息都以注釋的方式放在語句最前面,也就是說所有這些信息都是被 /**/括起來的,每一個參數(shù)都是通過分號來分隔,類似的方式為:

1

/*--user=username;--password=xxxx;--host=127.0.0.1;--port=3306;*/

當(dāng)然支持的參數(shù)不止是這幾個,后面還會介紹一些其它的參數(shù)。 Inception要做的是一個語句塊的審核,需要引入一個規(guī)則,將要執(zhí)行的語句包圍起來,Inception規(guī)定,在語句的最開始位置,要加上inception_magic_start;語句,在執(zhí)行語句塊的最后加上inception_magic_commit;語句,這2個語句在 Inception 中都是合法的、具有標(biāo)記性質(zhì)的可被正確解析的 SQL 語句。被包圍起來的所有需要審核或者執(zhí)行的語句都必須要在每條之后加上分號,其實就是批量執(zhí)行SQL語句。(包括 use database語句之后也要加分號,這點與 MySQL 客戶端不同),不然存在語法錯誤。

在具體執(zhí)行時,在沒有解析到inception_magic_start之前如果發(fā)現(xiàn)要執(zhí)行其它的語句,則直接報錯,因為規(guī)則中inception_magic_start是強制的。而如果在執(zhí)行的語句塊最后沒有出現(xiàn)inception_magic_commit,則直接報錯,不會做任何操作。 在前面注釋部分,需要指定一些操作的選項,包括線上用戶名、密碼、數(shù)據(jù)庫地址、檢查/執(zhí)行等。下面是一個簡單的例子:

1

2

3

4

5

6

/*--user=zhufeng;--password=xxxxxxxxxxx;--host=xxxxxxxxxx;

--enable-check;--port=3456;*/  

inception_magic_start;  

use mysql;  

CREATE TABLE adaptive_office(id int);  

inception_magic_commit;

那么上面這一段就是一批正常可以執(zhí)行的SQL語句,目前執(zhí)行只支持通過C/C++接口、Python接口來對Inception訪問,這一段必須是一次性的通過執(zhí)行接口提交給Inception,那么在處理完成之后,Inception會返回一個結(jié)果集,來告訴我們這些語句中存在什么錯誤,或者是完全正常等等。

請不要將下面的SQL語句塊,放到MySQL客戶端中執(zhí)行,因為這是一個自動化運維工具,如果使用交互式的命令行來使用的話沒有意義,只能是通過寫程序來訪問Inception服務(wù)器。

而可以通過MySQL客戶端來執(zhí)行的,只有是Inception命令,請參考<<inception命令集語句>>一節(jié)。

下面是一段執(zhí)行上面語句的Python程序的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!/usr/bin/python

#-\*-coding: utf-8-\*-

import MySQLdb

sql='/*--user=root;--password=123456;--host=172.17.0.2;--execute=1;--port=3306;*/\

inception_magic_start;\

create database if not exists test charset utf8mb4;\

use test;\

CREATE TABLE adaptive_office(id int);\

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,e:

     print "Mysql Error %d: %s" % (e.args[0], e.args[1])

執(zhí)行這段程序之后,返回的結(jié)果如下:

1

2

3

4

5

6

7

8

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']

1 | CHECKED | 0 | Audit completed | None | 2 | CHECKED | 0 | Audit completed | None | 3 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'adaptive_office'.

Set charset to one of 'utf8mb4' for table 'adaptive_office'.

Set comments for table 'adaptive_office'.

Column 'id' in table 'adaptive_office' have no comments.

Column 'id' in table 'adaptive_office' is not allowed to been nullable.

Set Default value for column 'id' in table 'adaptive_office'

Set a primary key for table 'adaptive_office'. |

從返回結(jié)果可以看到,每一行語句的審核及執(zhí)行信息,最前面打印的是field_names,表示Inception的返回結(jié)果集的列名信息,總共包括十個列,下面是每個列對應(yīng)的結(jié)果,因為只有兩個語句,則只有兩行,從結(jié)果集第一個列看到只有序號為1和2的兩行,而對于每一個列的具體含義,這會在<<Inception結(jié)果集>>這一章中講到,這里只看清楚是什么內(nèi)容即可。

另外,Inception支持審核以及執(zhí)行語句,可以自行開啟或關(guān)閉,具體要看<<Inception選項>>。

更詳細(xì)內(nèi)容請看官網(wǎng),最后說一句,在這里感謝inception作者。

四、Yearning介紹

基于Inception的可視化web端sql審核平臺,Yearning SQL審計平臺基于Vue.js與Django的整套sql審核平臺解決方案,提供基于Inception的SQL檢測及執(zhí)行。

源碼地址:https://github.com/cookieY/Yearning

注意:

1,要做數(shù)據(jù)庫初始化  否則500 

python3 manage.py makemigrations && python3 manage.py migrate 初始化數(shù)據(jù)庫
echo "from core.models import Account;Account.objects.create_user(username='admin', password='Yearning_admin', group='admin',is_staff=1)" | python3 manage.py shell 添加初始化用戶

2,要修改配置文件支持pymysql

由于Inception并不支持pymysql,所以需要更改pymysql相關(guān)源碼
修改$ PYTHON_HOME / lib / python3.6 / site-packages / pymysql下
connections.py和cursors.py兩個文件
找到connections.py 1108行
    if int(self.server_version.split('.', 1)[0]) >= 5:            self.client_flag |= CLIENT.MULTI_RESULTS
更改為
    try:        if int(self.server_version.split('.', 1)[0]) >= 5:            self.client_flag |= CLIENT.MULTI_RESULTS    except:        if self.server_version.split('.', 1)[0] >= 'Inception2':            self.client_flag |= CLIENT.MULTI_RESULTS
找到cursors.py 345行
if self._result and (self._result.has_next or not self._result.warning_count):        return
更改為
 if self._result:    return
注:在安裝文件夾下有已經(jīng)修改的connections.py和cursors.py直接替換即可

如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè)

以上就是如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI