您好,登錄后才能下訂單哦!
開源地址 https://github.com/mysql-inception/inception
文檔地址 http://mysql-inception.github.io/inception-document/
]$wget https://github.com/mysql-inception/inception.git
]$pwd
/inception
]$unzip inception-master.zip
]$ cd /inception/inception-master/
#執(zhí)行如下命令,可以看到安裝幫助
]$ sh inception_build.sh
Usage: inception_build.sh builddir [platform(linux:Xcode)]
EXAPMLE: inception_build.sh debug [Xcode]
#安裝到./yk目錄
]$ sh inception_build.sh yk
#說明:
1.inception_build.sh實(shí)際上封裝了cmake && make && make install編譯安裝的步驟
2.buliddir是安裝目錄,platform是所在平臺(tái)(默認(rèn)linux)
3.每次如果出錯(cuò)之后,需要把編譯目錄刪除掉,重新執(zhí)行,不然會(huì)執(zhí)行出錯(cuò)。
4.編譯過程沒有err那說明安裝成功了
#與MySQL類型,可以指定一個(gè)cnf配置文件
]$ vim /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
。。。。。。。
#此處只是簡單的配置為了啟動(dòng)Inception服務(wù),更多的配置選項(xiàng)請(qǐng)參考文檔
]$ cd /inception/inception-master/yk/mysql/bin
]$ nohup /Inception --defaults-file=/etc/inc.cnf &
]$ netstat -antpl|grep 6669
tcp 0 0 0.0.0.0:6669 0.0.0.0:* LISTEN 4598/Inception
至此,可以看到inception的6669端口已經(jīng)運(yùn)行
]$ mysql -h227.0.0.1 -P6669
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: Inception2.1.23 1
……………………..
mysql> inception get variables; #獲取inception所有的變量和值
+------------------------------------------+----------------------------------------------------------+
| Variable_name | Value |
+------------------------------------------+----------------------------------------------------------+
| autocommit | OFF |
| bind_address | * |
| character_set_system | utf8 |
………………..
1、 Inception規(guī)定,在語句的最開始位置,要加上inception_magic_start;語句,在執(zhí)行語句塊的最后加上inception_magic_commit;語句,這2個(gè)語句在 Inception 中都是合法的、具有標(biāo)記性質(zhì)的可被正確解析的 SQL 語句。被包圍起來的所有需要審核或者執(zhí)行的語句都必須要在每條之后加上分號(hào),其實(shí)就是批量執(zhí)行SQL語句。(包括use database語句之后也要加分號(hào),這點(diǎn)與 MySQL 客戶端不同),不然存在語法錯(cuò)誤
2、 目前執(zhí)行只支持通過C/C++接口、Python接口來對(duì)Inception訪問,這一段必須是一次性的通過執(zhí)行接口提交給Inception,那么在處理完成之后,Inception會(huì)返回一個(gè)結(jié)果集,來告訴我們這些語句中存在什么錯(cuò)誤,或者是完全正常等等
/*--user=yujx;--password=xxxxxxxxxxx;--host=127.0.0.1;--enable-check;--port=3306;*/
inception_magic_start;
use test;
CREATE TABLE yujx(id int);
inception_magic_commit;
]$ cat inc-mysql.py
#!/usr/bin/env python
#coding=utf8
import MySQLdb
sql='''/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\
inception_magic_start;\
use test;\
CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測(cè)試';\
inception_magic_commit;'''
#print sql
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])
]$ python inc-mysql.py
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | CHECKED | 0 | Audit completed | None | use test | 0 | '0_0_0' | None | 0 |
2 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'yujx'.
Set charset to one of 'utf8mb4' for table 'yujx'.
Set comments for table 'yujx'.
Column 'id' in table 'yujx' have no comments.
Column 'id' in table 'yujx' is not allowed to been nullable.
Set Default value for column 'id' in table 'yujx'
Set a primary key for table 'yujx'. | CREATE TABLE yujx(id int) | 0 | '0_0_1' | 127_0_0_1_3306_test | 0 |
]$ python inc-mysql.py
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | CHECKED | 0 | Audit completed | None | use test | 0 | '0_0_0' | None | 0 |
2 | CHECKED | 1 | Audit completed | Set charset to one of 'utf8mb4' for table 'yujx'.
Set comments for table 'yujx'.
Column 'id' in table 'yujx' have no comments.
Column 'id' in table 'yujx' is not allowed to been nullable.
Set Default value for column 'id' in table 'yujx'
Set a primary key for table 'yujx'. | CREATE TABLE yujx(id int) engine=innodb | 0 | '0_0_1' | 127_0_0_1_3306_test | 0 |
以此類推,直到如下完整的創(chuàng)建語句時(shí),終于成功
]$ python inc-mysql.py
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | RERUN | 0 | Execute Successfully | None | use test | 0 | '1464252128_35_0' | None | 0.000 |
2 | EXECUTED | 0 | Execute Successfully | None | CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測(cè)試' | 0 | '1464252128_35_1' | 127_0_0_1_3306_test | 0.010 |
如上,是默認(rèn)的inception審核規(guī)則,用戶可以根據(jù)自己的實(shí)際情況來自定義某些規(guī)則
]$ tail -f /inception/inception-master/yk/mysql/bin/inception.log
24 Query /*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/ inception_magic_start; use test; CREATE TABLE yujx(id int) engine=innodb; inception_magic_commit
160526 16:42:08 25 Query set autocommit=0
25 Query /*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/ inception_magic_start; use test; CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測(cè)試'; inception_magic_commit
160526 17:13:50 26 Query select @@version_comment limit 1
160526 17:13:54 26 Query inception get variables
參考:http://mysql-inception.github.io/inception-document/variables/
Inception在做DML操作時(shí),具有備份功能,它會(huì)將所有當(dāng)前語句修改的行備份下來,存儲(chǔ)到一個(gè)指定的庫中,這些庫的指定需要通過幾個(gè)參數(shù),它們分別是:
inception_remote_backup_host //遠(yuǎn)程備份庫的host
inception_remote_backup_port //遠(yuǎn)程備份庫的port
inception_remote_system_user //遠(yuǎn)程備份庫的一個(gè)用戶
inception_remote_system_password //上面用戶的密碼
1.這些參數(shù)可以直接在命令行中指定,也可以在inc.cnf配置文件中指定。修改這些參數(shù)需要重啟inception服務(wù)。
2.Inception默認(rèn)是開啟備份功能的,可以使用參數(shù)--disable-remote-backup=1來關(guān)閉備份功能
3.被影響的表如果沒有主鍵的話,就不會(huì)做備份
4.Inception備份用戶必須要具備CREATE、INSERT。CREATE權(quán)限用于創(chuàng)建表或者庫的,INSERT權(quán)限用于插入備份數(shù)據(jù)的,其它的權(quán)限不需要(也許是暫時(shí)的)
5.備份數(shù)據(jù)在備份機(jī)器的存儲(chǔ),是與線上被修改庫一對(duì)一的。但因?yàn)闄C(jī)器的多(線上機(jī)器有很多)對(duì)一(備份機(jī)器只有一臺(tái)),所以為了防止庫名的沖突,備份機(jī)器的庫名組成是由線上機(jī)器的 IP 地址的點(diǎn)換成下劃線,再加上端口號(hào),再加上庫名三部分,這三部分也是通過下劃線連接起來的,如:10_103_11_242_3306_test
6.對(duì)線上配置需求
線上服務(wù)器必須要打開 binlog,在啟動(dòng)時(shí)需要設(shè)置參數(shù)log_bin、log_bin_index等關(guān)于 binlog 的參數(shù)。不然不會(huì)備份及生成回滾語句。
參數(shù)binlog_format必須要設(shè)置為 mixed 或者 row 模式,通過語句: set global binlog_format=mixed/row 來設(shè)置,如果是 statement 模式,則不做備份及回滾語句的生成。
參數(shù) server_id 必須要設(shè)置為非0及非1,通過語句:set global server_id=server_id;來設(shè)置,不然在備份時(shí)會(huì)報(bào)錯(cuò)。
線上服務(wù)器一定要有指定用戶名的權(quán)限,這個(gè)是在語句前面的注釋中指定的,做什么操作就要有什么權(quán)限,否則還是會(huì)報(bào)錯(cuò),如果需要執(zhí)行的功能,則要有線上執(zhí)行語句的權(quán)限,比如DDL及DML,同時(shí)如果要執(zhí)行inception show 等遠(yuǎn)程命令的話,有些語句是需要特殊權(quán)限的,這些權(quán)限也是需要授予的,關(guān)于權(quán)限這個(gè)問題,因?yàn)橐话?span lang="EN-US">Inception是運(yùn)行在一臺(tái)固定機(jī)器上面的,那么在選項(xiàng)中指定的用戶名密碼,實(shí)際上是Inception機(jī)器對(duì)線上數(shù)據(jù)庫訪問的權(quán)限,所以建議在使用過程中,使用專門固定的帳號(hào)來讓Inception使用,最好是一個(gè)只讀一個(gè)可寫的即可,這樣在執(zhí)行時(shí)用可寫,審核或者查看線上狀態(tài)或者表庫結(jié)果時(shí)用只讀即可,這樣更安全。
需要額外注意的點(diǎn)
在執(zhí)行時(shí),不能將 DML 語句及 DDL 語句放在一起執(zhí)行,否則會(huì)因?yàn)閭浞萁馕?span lang="EN-US">binlog時(shí)由于表結(jié)構(gòu)的變化出現(xiàn)不可預(yù)知的錯(cuò)誤,如果要有同時(shí)執(zhí)行 DML 及 DDL,則請(qǐng)分開多個(gè)語句塊兒來執(zhí)行,如果真的這樣做了,Inception 會(huì)報(bào)錯(cuò),不會(huì)去執(zhí)行。
#由于測(cè)試環(huán)境就開all權(quán)限了
mysql> grant all on *.* to 'backup'@'%' identified by 'backup';
mysql> flush privileges;
]$ grep remote /etc/inc.cnf
inception_remote_system_password=backup
inception_remote_system_user=backup
inception_remote_backup_port=3306
inception_remote_backup_host=10.10.69.241
]$Kill -9 inception_pid
]$ nohup /Inception --defaults-file=/etc/inc.cnf &
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
]$ python inc-mysql.py
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | RERUN | 0 | Execute Successfully | None | use test | 0 | '1464320865_11_0' | None | 0.000 |
2 | EXECUTED | 0 | Execute Successfully
Backup successfully | None | CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測(cè)試' | 0 | '1464320865_11_1' | 127_0_0_1_3306_test | 0.010 |
#如下,備份庫多出了2個(gè)db:inception和IP_PORT_DBNAME
mysql> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| 127_0_0_1_3306_test |
| inception |
| mysql |
| performance_schema |
| test |
+---------------------+
#inception.statistic表存儲(chǔ)的就是SQL執(zhí)行數(shù)目的統(tǒng)計(jì)數(shù)據(jù)
參考:http://mysql-inception.github.io/inception-document/statistic/
#IP_PORT_dbname庫下表中記錄了對(duì)應(yīng)的rollback操作
除了與原庫中的表一一對(duì)應(yīng)之外,每個(gè)備份庫中還有另外一個(gè)表:$_$Inception_backup_information$_$,這就是表名,非常難看,主要是為了防止與原線上庫中的表名發(fā)生沖突。這個(gè)表是用來存儲(chǔ)所有對(duì)當(dāng)前庫操作的操作記錄的,它是公用的,對(duì)線上這個(gè)庫的所有表操作記錄都存儲(chǔ)在這里面
參考鏈接:http://mysql-inception.github.io/inception-document/backup/
參考:http://mysql-inception.github.io/inception-document/osc/
]$ which pt-online-schema-change
/usr/bin/pt-online-schema-change
]$ grep bin_dir /etc/inc.cnf
inception_osc_bin_dir=/usr/bin/pt-online-schema-change
]$ grep osc inc-mysql-osc.py
inception set session inception_osc_recursion_method=none;
inception set session inception_osc_alter_foreign_keys_method=0;
inception set session inception_osc_min_table_size=1; #設(shè)置表大小超過此參數(shù)的值時(shí),inception調(diào)用osc工具alter表
]$ python inc-mysql-osc.py
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | RERUN | 0 | Execute Successfully | None | use test | 0 | '1464335578_270_0' | None | 0.000 |
2 | EXECUTED | 0 | Execute Successfully
Backup successfully | None | alter table test add a int not null default 0 comment 'a字段' | 1 | '1464335727_270_1' | 127_0_0_1_3306_test | 149.880 | *8388D07BAD14866D80DD45CD1521F4F0D17C20CE
#查看osc列表
mysql> inception get osc processlist;
#由上面的processlist可以看到正在執(zhí)行的osc任務(wù)對(duì)應(yīng)的SQLSHA1值,然后使用下方命令可以查看指定的一條osc任務(wù)進(jìn)度
mysql> inception get osc_percent '*8388D07BAD14866D80DD45CD1521F4F0D17C20CE';
+--------+-----------+-------------------------------------------+---------+------------+-----------------------------------
| DBNAME | TABLENAME | SQLSHA1 | PERCENT | REMAINTIME | INFOMATION
+--------+-----------+-------------------------------------------+---------+------------+----------------------------------------------------------------------------------------| test | test | *8388D07BAD14866D80DD45CD1521F4F0D17C20CE | 92 | 00:11 | Operation, tries, wait:
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
No foreign keys reference `test`.`test`; ignoring --alter-foreign-keys-method.
Altering `test`.`test`...
Creating new table...
CREATE TABLE `test`.`_test_new` ( `x` int(11) DEFAULT NULL,
`y` int(11) DEFAULT NULL,
`z` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`z`)
) ENGINE=InnoDB AUTO_INCREMENT=6488605 DEFAULT CHARSET=latin1
Created new table test._test_new OK.
Altering new table...
ALTER TABLE `test`.`_test_new` add a int not null default 0 comment 'a?-???μ'
Altered `test`.`_test_new` OK.
Creating triggers...
CREATE TRIGGER `pt_osc_test_test_del` AFTER DELETE ON `test`.`test` FOR EACH ROW DELETE IGNORE FROM `test`.`_test_new` WHERE `test`.`_test_new`.`z` <=> OLD.`z`
CREATE TRIGGER `pt_osc_test_test_upd` AFTER UPDATE ON `test`.`test` FOR EACH ROW REPLACE INTO `test`.`_test_new` (`x`, `y`, `z`) VALUES (NEW.`x`, NEW.`y`, NEW.`z`)
CREATE TRIGGER `pt_osc_test_test_ins` AFTER INSERT ON `test`.`test` FOR EACH ROW REPLACE INTO `test`.`_test_new` (`x`, `y`, `z`) VALUES (NEW.`x`, NEW.`y`, NEW.`z`)
Created triggers OK.
INSERT LOW_PRIORITY IGNORE INTO `test`.`_test_new` (`x`, `y`, `z`) SELECT `x`, `y`, `z` FROM `test`.`test` FORCE INDEX(`PRIMARY`) WHERE ((`z` >= ?)) AND ((`z` <= ?)) LOCK IN SHARE MODE /*pt-online-schema-change 12934 copy nibble*/
SELECT /*!40001 SQL_NO_CACHE */ `z` FROM `test`.`test` FORCE INDEX(`PRIMARY`) WHERE ((`z` >= ?)) ORDER BY `z` LIMIT ?, 2 /*next chunk boundary*/
mysql> desc test;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| x | int(11) | YES | | NULL | |
| y | int(11) | YES | | NULL | |
| z | int(11) | NO | PRI | NULL | auto_increment |
| a | int(11) | NO | | 0 | | #添加成功
+-------+---------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
參考http://mysql-inception.github.io/inception-document/rules/
下面所列出來的規(guī)則,不一定能覆蓋所有Inception當(dāng)前已經(jīng)實(shí)現(xiàn)的功能,具體包括什么規(guī)則,還需要在使用過程中總結(jié),發(fā)現(xiàn),同時(shí)可以結(jié)合配置參數(shù)來詳細(xì)了解這些規(guī)則。
l use db:此時(shí)會(huì)檢查這個(gè)庫是不是存在,需要連接到線上服務(wù)器來判斷。
l set option:現(xiàn)在只需要支持set names charset,設(shè)置其它變量時(shí)都報(bào)錯(cuò)不支持。
l 創(chuàng)建數(shù)據(jù)庫語句
l 插入語句(包括多值插入)
l 查詢插入語句
l 刪除語句(包括多表刪除)
l 更新語句(包括多表更新)
l 創(chuàng)建表語句
l 刪除表語句
l 修改表語句
l Truncate表語句
l inception命令集語句(包括管理命令)
l 表是否存在
l 必須指定插入列表,也就是要對(duì)哪幾個(gè)列指定插入值,如insert into t (id,id2) values(...),(可配置)
l 必須指定值列表,與上面對(duì)應(yīng)的列,插入的值是什么,必須要指定。
l 插入列列表與值列表個(gè)數(shù)相同,上面二者的個(gè)數(shù)需要相同,如果沒有指定列列表(因?yàn)榭膳渲茫?,則值列表長度要與表列數(shù)相同。
l 不為null的列,如果插入的值是null,報(bào)錯(cuò)(可配置)
l 插入指定的列名對(duì)應(yīng)的列必須是存在的。
l 插入指定的列列表中,同一個(gè)列不能出現(xiàn)多次。
l 插入值列表中的簡單表達(dá)式會(huì)做檢查,但具體包括什么不一一指定
l 表是否存在
l 必須有where條件(可配置)
l delete語句不能有limit條件(可配置)
l 不能有order by語句(可配置)
l 影響行數(shù)大于10000條,則報(bào)警(數(shù)目可配置)
l 對(duì)WHERE條件這個(gè)表達(dá)式做簡單檢查,具體包括什么不一一指定
l 對(duì)更新列的值列表表達(dá)式做簡單檢查,具體不一一指定
l 對(duì)更新列對(duì)象做簡單檢查,主要檢查列是不是存在等
l 多表更新、刪除時(shí),每個(gè)表必須要存在
l 這個(gè)表不存在
l 對(duì)于create table like,會(huì)檢查like的老表是不是存在。
l 對(duì)于create table db.table,會(huì)檢查db這個(gè)數(shù)據(jù)庫是不是存在
l 表名、列名、索引名的長度不大于64個(gè)字節(jié)
l 如果建立的是臨時(shí)表,則必須要以tmp為前綴
l 必須要指定建立innodb的存儲(chǔ)引擎(可配置)
l 必須要指定utf8的字符集(字符串可配置,指定支持哪些字符集)
l 表必須要有注釋(可配置)
l 表不能建立為分區(qū)表(可配置)
l 只能有一個(gè)自增列
l 索引名字不能是Primay
l 不支持Foreign key(可配置)
l 建表時(shí),如果指定auto_increment的值不為1,報(bào)錯(cuò)(可配置)
l 如果自增列的名字不為id,說明有可能是有意義的,MySQL這樣使用比較危險(xiǎn),所以報(bào)警(可配置)
l 不能設(shè)置列的字符集(可配置)
l 列的類型不能使用集合、枚舉、位圖類型。(可配置)
l 列必須要有注釋(可配置)
l char長度大于20的時(shí)候需要改為varchar(長度可配置)
l 列的類型不能是BLOB/TEXT。(可配置)
l 每個(gè)列都使用not null(可配置)
l 如果列為BLOB/TEXT類型的,則這個(gè)列不能設(shè)置為NOT NULL。
l 如何是自增列,則使用無符號(hào)類型(可配置)
l 如果自增列,則長度必須要大于等于4個(gè)字節(jié)(可配置)
l 如果是timestamp類型的,則要必須指定默認(rèn)值。
l 對(duì)于MySQL5.5版本(包含)以下的數(shù)據(jù)庫,不能同時(shí)有兩個(gè)TIMESTAMP類型的列,如果是DATETIME類型,則不能定義成DATETIME DEFAULT CURRENT_TIMESTAMP及ON UPDATE CURRENT_TIMESTAMP等語句。
l 每個(gè)列都需要定義默認(rèn)值,除了自增列、主鍵列及大字段列之外(可配置)
l 不能有重復(fù)的列名
l 索引必須要有名字
l 不能有外鍵(可配置)
l Unique索引必須要以uniq_為前綴(可配置)
l 普通索引必須要以idx_為前綴(可配置)
l 索引的列數(shù)不能超過5個(gè)(數(shù)目可以配置)
l 表必須要有一個(gè)主鍵(可配置)
l 最多有5個(gè)索引(數(shù)目可配置)
l 建索引時(shí),指定的列必須存在。
l 索引中的列,不能重復(fù)
l BLOB列不能建做KEY
l 索引長度不能超過766
l 不能有重復(fù)的索引,名字及內(nèi)容
l BLOB/TEXT類型的列,不能有非NULL的默認(rèn)值
l MySQL5.5以下(含)的版本,對(duì)于DATETIME類型的列,不能有函數(shù)NOW()的默認(rèn)值。
l 如果設(shè)置默認(rèn)值為函數(shù),則只能是NOW()。
l 如果默認(rèn)值為NULL,但列類型為NOT NULL,或者是主鍵列,或者定義為自增列,則報(bào)錯(cuò)。
l 自增列不能設(shè)置默認(rèn)值。
l 修改表語句檢查項(xiàng)
l 表是不是存在
l 同上面創(chuàng)建表中的索引檢查項(xiàng)
l 同上面創(chuàng)建表中的列檢查項(xiàng)
l 表是不是存在
l 如果語句塊中存在多條對(duì)同一個(gè)表的修改語句,則建議合并成一個(gè)ALTER語句
l 列是否存在
l 剩下的同上面創(chuàng)建表,創(chuàng)建索引,創(chuàng)建列,默認(rèn)值等檢查項(xiàng)一樣
l 表是不是存在
l 檢查索引是不是存在
l 同默認(rèn)值檢查項(xiàng)
l 表屬性只支持對(duì)存儲(chǔ)引擎、表注釋、自增值及默認(rèn)字符集的修改操作。
l 修改存儲(chǔ)引擎時(shí)檢查是不是Innodb(可配置)。
l 字符集修改檢查是不是屬于設(shè)置參數(shù)的值(支持字符集可配置)。
l 字符集修改檢查是不是屬于設(shè)置參數(shù)的值(支持字符集可配置)。
針對(duì)線上MySQL服務(wù)器是不是5.6以上(包含)版本,有不同的處理策略,比如在預(yù)估影響行數(shù)時(shí),5.6可以直接對(duì)任何DML語句做EXPLAIN操作,而在5.5版本中,只支持對(duì)SELECT語句執(zhí)行EXPLAIN操作,而在5.5版本中,有些DML語句是不容易直接轉(zhuǎn)換為SELECT語句去做EXPLAIN,這樣導(dǎo)致預(yù)估行數(shù)為0。
還是針對(duì)5.6以上版本與5.5版本的不同,DATETIME、TIMESTAMP系列類型在執(zhí)行時(shí),5.5的限制比較多,而5.6基本通用,所以這上面的處理可能在5.6及5.5版本上,相同語句返回的結(jié)果集是不同的(規(guī)則是在5.5中以在執(zhí)行時(shí)報(bào)的錯(cuò)誤信息為準(zhǔn)),這與線上版本有關(guān)系。
]$ cat inc-mysql.py
#!/usr/bin/env python
#coding=utf8
import MySQLdb
sql='''/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\
inception_magic_start;\
use test;\
CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測(cè)試';\
inception_magic_commit;'''
#print sql
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])
]$ cat inc-mysql-insert.py
#!/usr/bin/env python
#coding=utf8
import MySQLdb
sql='''/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\
inception_magic_start;\
use test;\
insert into yujx(id) value(1);\
inception_magic_commit;'''
#print sql
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])
]$ cat inc-mysql-osc.py
#!/usr/bin/env python
#coding=utf8
import MySQLdb
sql='''
inception set session inception_osc_recursion_method=none;
inception set session inception_osc_alter_foreign_keys_method=0;
inception set session inception_osc_min_table_size=1;
/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\
inception_magic_start;\
use test;\
alter table test add b int not null default 0 comment 'b字段';\
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])
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。