Yearning + Inception SQL審覈平臺搭建

Yearning 安裝:html

安裝Nginx
yum install nginx -ypython

按照順序安裝MySQL
mysql-community-common-5.7.22-1.el6.x86_64.rpm
mysql-community-libs-5.7.22-1.el6.x86_64.rpm
mysql-community-client-5.7.22-1.el6.x86_64.rpm
mysql-community-server-5.7.22-1.el6.x86_64.rpmmysql

Python 3.6安裝nginx

解壓
tar -xvf Python-3.6.4.tar.xzc++

建立目錄
mkdir -p /usr/local/python/3.6.4/libgit

編譯
cd Python-3.6.4
./configure --enable-shared --prefix=/usr/local/python/3.6.4 LDFLAGS="-Wl,-rpath /usr/local/python/3.6.4/lib"
make && make installgithub

軟連接
cp /usr/bin/python /usr/bin/python2.6.6
ln -fs /usr/local/python/3.6.4/bin/python3.6 /usr/bin/python
ln -fs /usr/local/python/3.6.4/bin/pip3 /usr/bin/pipweb

yum修改
vi /usr/bin/yum
將頭部 #!/usr/bin/python 修改成 #!/usr/bin/python2.6.6sql

Inception安裝
Inception是集審覈、執行、回滾於一體的一個自動化運維繫統,它是根據MySQL代碼修改過來的,用它能夠很明確的,詳細的,準確的審覈MySQL的SQL語句,它的工做模式和MySQL徹底相同,能夠直接使用MySQL客戶端來鏈接,但不須要驗證權限,它相對應用程序(上層審覈流程系統等)而言,是一個服務器,在鏈接時須要指定服務器地址及Inception服務器的端口便可,而它相對要審覈或執行的語句所對應的線上MySQL服務器來講,是一個客戶端,它在內部須要實時的鏈接數據庫服務器來獲取所須要的信息,或者直接在在線上執行相應的語句及獲取binlog等,Inception就是一箇中間性質的服務。shell

依賴包安裝
yum install gcc gcc-c++ cmake bison openssl-devel ncurses-devel git

下載源碼包
git clone https://github.com/mysql-inception/inception.git(已經閉源,可是網上還能找到閉源以前的包)

編譯安裝Inception
mkdir -p /usr/local/inception

mkdir -p /inception/{data,logs}

unzip master.zip -d /inception

cd /inception/inception-master
cmake -DWITH_DEBUG=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/inception -DMYSQL_DATADIR=/inception/data -DWITH_SSL=yes -DCMAKE_BUILD_TYPE=RELEASE -DWITH_ZLIB=bundled -DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wno-unused-parameter -Woverloaded-virtual" -DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement"

CMake Error: The source "/inception/inception-master/CMakeLists.txt" does not match the source "/opt/inception-master/CMakeLists.txt" used to generate cache

rm -rf CMakeLists.txt再執行

make && make install

建立inception配置文件
--編輯參數文件

vim /etc/inc.cnf

[inception]

general_log=1 #這個參數就是原生的MySQL的參數,用來記錄在Inception服務上執行過哪些語句,用來定位一些問題等

general_log_file=/usr/local/inception/data/inception.log #設置general log寫入的文件路徑

port=6669 #Inception的服務端口

socket=/usr/local/inception/data/inc.socket #Inception的套接字文件存放位置

character-set-server=utf8 #mysql原生參數

#Inception 審覈規則

inception_check_autoincrement_datatype=1 #當建表時自增列的類型不爲int或者bigint時報錯

inception_check_autoincrement_init_value=1 #當建表時自增列的值指定的不爲1,則報錯

inception_check_autoincrement_name=1 #建表時,若是指定的自增列的名字不爲ID,則報錯,說明是有意義的,給提示

inception_check_column_comment=1 #建表時,列沒有註釋時報錯

inception_check_column_default_value=0 #檢查在建表、修改列、新增列時,新的列屬性是否是要有默認值

inception_check_dml_limit=1 #在DML語句中使用了LIMIT時,是否是要報錯

inception_check_dml_orderby=1 #在DML語句中使用了Order By時,是否是要報錯

inception_check_dml_where=1 #在DML語句中沒有WHERE條件時,是否是要報錯

inception_check_identifier=1 #打開與關閉Inception對SQL語句中各類名字的檢查,若是設置爲ON,則若是發現名字中存在除數字、字母、下劃線以外的字符時,會報Identifier "invalidname" is invalid, valid options: [a-z,A-Z,0-9,_].

inception_check_index_prefix=1 #是否是要檢查索引名字前綴爲"idx_",檢查惟一索引前綴是否是"uniq_"

inception_check_insert_field=1 #是否是要檢查插入語句中的列鏈表的存在性

inception_check_primary_key=1 #建表時,若是沒有主鍵,則報錯

inception_check_table_comment=0 #建表時,表沒有註釋時報錯

inception_check_timestamp_default=0 #建表時,若是沒有爲timestamp類型指定默認值,則報錯

inception_enable_autoincrement_unsigned=1 #自增列是否是要爲無符號型

inception_enable_blob_type=0 #檢查是否是支持BLOB字段,包括建表、修改列、新增列操做 默認開啓

inception_enable_column_charset=0 #容許列本身設置字符集

inception_enable_enum_set_bit=0 #是否是支持enum,set,bit數據類型

inception_enable_foreign_key=0 #是否是支持外鍵

inception_enable_identifer_keyword=0 #檢查在SQL語句中,是否是有標識符被寫成MySQL的關鍵字,默認值爲報警。

inception_enable_not_innodb=0 #建表指定的存儲引擎不爲Innodb,不報錯

inception_enable_nullable=0 #建立或者新增列時若是列爲NULL,不報錯

inception_enable_orderby_rand=0 #order by rand時是否是報錯

inception_enable_partition_table=0 #是否是支持分區表

inception_enable_select_star=0 #Select*時是否是要報錯

inception_enable_sql_statistic=1 #設置是否是支持統計Inception執行過的語句中,各類語句分別佔多大比例,若是打開這個參數,則每次執行的狀況都會在備份數據庫實例中的inception庫的statistic表中以一錄存儲此次操做的統計狀況,每次操做對應一條記錄,這條記錄中含有的信息是各類類型的語句執行次數狀況。

inception_max_char_length=16 #當char類型的長度大於這個值時,就提示將其轉換爲VARCHAR

inception_max_key_parts=5 #一個索引中,列的最大個數,超過這個數目則報錯

inception_max_keys=16 #一個表中,最大的索引數目,超過這個數則報錯

inception_max_update_rows=10000 #在一個修改語句中,預計影響的最大行數,超過這個數就報錯

inception_merge_alter_table=1 #在多個改同一個表的語句出現是,報錯,提示合成一個

#inception 支持 OSC 參數

inception_osc_bin_dir=/user/bin #用於指定pt-online-schema-change腳本的位置,不可修改,在配置文件中設置

inception_osc_check_interval=5 #對應OSC參數--check-interval,意義是Sleep time between checks for --max-lag.

inception_osc_chunk_size=1000 #對應OSC參數--chunk-size

inception_osc_chunk_size_limit=4 #對應OSC參數--chunk-size-limit

inception_osc_chunk_time=0.1 #對應OSC參數--chunk-time

inception_osc_critical_thread_connected=1000 #對應參數--critical-load中的thread_connected部分

inception_osc_critical_thread_running=80 #對應參數--critical-load中的thread_running部分

inception_osc_drop_new_table=1 #對應參數--[no]drop-new-table

inception_osc_drop_old_table=1 #對應參數--[no]drop-old-table

inception_osc_max_lag=3 #對應參數--max-lag

inception_osc_max_thread_connected=1000 #對應參數--max-load中的thread_connected部分

inception_osc_max_thread_running=80 #對應參數--max-load中的thread_running部分

inception_osc_min_table_size=0 # 這個參數其實是一個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=0 #一個全局的OSC開關,默認是打開的,若是想要關閉則設置爲OFF,這樣就會直接修改

inception_osc_print_none=1 #用來設置在Inception返回結果集中,對於原來OSC在執行過程的標準輸出信息是否是要打印到結果集對應的錯誤信息列中,若是設置爲1,就不打印,若是設置爲0,就打印。而若是出現錯誤了,則都會打印

inception_osc_print_sql=1 #對應參數--print

#備份服務器信息,注意改爲你的機器.用於回滾。

inception_remote_system_password=P@ssw0rd

inception_remote_system_user=incep_rw

inception_remote_backup_port=3306

inception_remote_backup_host=10.10.3.70

inception_support_charset=utf8 #表示在建表或者建庫時支持的字符集,若是須要多個,則用逗號分隔,影響的範圍是建表、設置會話字符集、修改表字符集屬性等


啓動Inception程序
cd /usr/local/inception/bin

./Inception --defaults-file=/etc/inc.cnf &
[1] 11179
[root@b28-11-92 bin]# 2019-06-21 15:00:31 0 [Note] Welcome to use Inception2.1.50
2019-06-21 15:00:31 11179 [Note] Server hostname (bind-address): '*'; port: 6669
2019-06-21 15:00:31 11179 [Note] IPv6 is available.
2019-06-21 15:00:31 11179 [Note] - '::' resolves to '::';
2019-06-21 15:00:31 11179 [Note] Server socket created on IP: '::'.

查看Inception進程
ps -ef | grep Inception
root 11179 30011 0 15:00 pts/1 00:00:00 ./Inception --defaults-file=/etc/inc.cnf

測試
mysql -uroot -h127.0.0.1 -P6669
鏈接成功後執行 inception get variables;
輸出了全部的變量,表示已經啓動成功了

Yearning 安裝
git clone https://github.com/cookieY/Yearning.git

登陸MySQL建立庫yearning庫
create database Yearning DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

安裝相應python依賴庫
cd Yearning/src
pip install -r requirements.txt
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting Django==2.1.5 (from -r requirements.txt (line 1))
Could not fetch URL https://pypi.python.org/simple/django/: There was a problem confirming the ssl certificate: Can't connect to HTTPS URL because the SSL module is not available. - skipping
Could not find a version that satisfies the requirement Django==2.1.5 (from -r requirements.txt (line 1)) (from versions: )
No matching distribution found for Django==2.1.5 (from -r requirements.txt (line 1))

修改Setup文件
Python-3.6.4/Modules

vim Setup
#Socket module helper for socket(2)
_socket socketmodule.c timemodule.c

#Socket module helper for SSL support; you must comment out the other
#socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

從新編譯
cd Python-3.6.4
./configure --enable-shared --prefix=/usr/local/python/3.6.4 LDFLAGS="-Wl,-rpath /usr/local/python/3.6.4/lib"
make
make install


配置,編輯Yearning/src/deploy.conf文件
[mysql]
db = 所建立的庫名
address = 數據庫地址
port = 數據庫端口
password = 數據庫密碼
username = 數據庫用戶

[host]
ipaddress = 服務器ip地址:端口 (涉及跨域十分重要!!設置不正確將沒法登錄!!)
如 本機地址爲192.168.137.13 nginx設置端口爲80
則應填寫爲 192.168.137.13:80 以後經過該地址訪問平臺。

[Inception]
ip = Inception地址
port = Inception端口
user = Inception用戶名
password = Inception密碼
backupdb = 備份數據庫地址
backupport = 備份數據庫端口
backupuser = 備份數據庫用戶名
backuppassword = 備份數據庫密碼

[LDAP] LDAP相關設置
LDAP_SERVER = LDAP服務地址
LDAP_SCBASE = LDAP dc 設置 如 dc=xxx,dc=com
LDAP_DOMAIN = LDAP域名 如 xxx.com

[email] 郵箱推送相關設置
username = 郵箱發件帳號 如 xxxx@163.com
password = 郵箱發件帳號密碼
smtp_server = 郵箱stmp地址, 具體地址請諮詢對應郵箱提供者

初始化數據庫
python manage.py makemigrations
python manage.py migrate

若報錯ModuleNotFoundError: No module named 'Crypto'
pip install pycrypto
從新初始化數據庫
python manage.py makemigrations

python manage.py migrate




添加初始化用戶
echo "from core.models import Account;Account.objects.create_user(username='admin', password='admin123456', group='admin',is_staff=1)" | python manage.py shell

初始化權限
echo "from core.models import grained;grained.objects.get_or_create(username='admin', permissions={'ddl': '1', 'ddlcon': [], 'dml': '1', 'dmlcon': [], 'dic': '1', 'diccon': [], 'dicedit': '0', 'query': '1', 'querycon': [], 'user': '1', 'base': '1', 'dicexport': '0'})" | python manage.py shell

複製編譯好的靜態文件到nginx html目錄下dist目錄經過npm run build生成
cd Yearning/webpage/dist
cp -rf * /usr/share/nginx/html/

/etc/init.d/nginx restart

啓動django
cd Yearning/src

python manage.py runserver 0.0.0.0:8000

訪問首頁http://192.168.17.77


注意事項:
使用默認帳號: admin 密碼:admin123456登錄便可使用,可能會出現登錄不了的狀況(沒法跳轉頁面),這是因爲跨域的問題,解決這個問題能夠參考:http://blog.csdn.net/apple9005/article/details/54427902

注意事項
默認超級管理員只擁有各個頁面的訪問權限,其餘的權限需自行增長!詳情請查看使用說明用戶管理
因爲Inception 並不原生支持pymysql,因此需更改pymysql相關源碼
修改 $PYTHON_HOME/lib/python3.6/site-packages/pymysql下
connections.py 和 cursors.py 兩個文件

找到 connections.py 786行
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

if self._result and (self._result.has_next or not self._result.warning_count):

return

更改成
if self._result:

return

相關文章
相關標籤/搜索