背景及目的:
數(shù)據(jù)隔離是實現(xiàn)自動化測試用例多線程執(zhí)行的前提。
本文目標是每個測試用例執(zhí)行結(jié)束后账阻,消除數(shù)據(jù)痕跡蒂秘,實現(xiàn)不刪除整個表,回退數(shù)據(jù)庫到測試用例運行前初始狀態(tài)淘太。
步驟:
主要分兩步:
1. 使用binlog跟蹤數(shù)據(jù)變更姻僧。
binlog format類型為3種:ROW,MIXED, STATEMENT;
重啟mysql:
service mysql restart --log-bin=sqlbin --binlog_format='ROW'
1)查看所有二進制日志文件:
mysql>SHOW BINARY LOGS;
2)顯示當前正在使用的二進制日志文件:
mysql>SHOW MASTER STATUS蒲牧;
3.)查看指定二進制日至文件的具體內(nèi)容:
mysql>SHOW BINLOG EVENTS in ‘sqlbin.000001’ FROM POSITION=177;
或
#mysqlbinlog /mydata/mdata/sqlbin.000001
導出到文件:
./mysqlbinlog /var/lib/mysql/sqlbin.000002 --result-file=mysqlbin.000002.sql
2. 利用開源工具解析導出文件撇贺。
使用mysqlbinlog解析出的sql文件不是可以直接執(zhí)行的Sql命令,因此需要如下開源工具冰抢。
開源工具:git@github.com:danfengcao/binlog2sql.git
1)配置mysql下my.cnf:
server_id = 1
log_bin = /var/lib/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
2)重啟:
service mysql start
3)測試:
mysql中執(zhí)行插入操作松嘶,先插入3后插入2:
insert into con_test values(3);
insert into con_test values(2);
4)解析操作:
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -dtest --start-file='mysql-bin.000001'
輸出:
INSERT INTO `test`.`con_test`(`a`) VALUES ('3'); #start 4 end 281 time 2017-02-28 16:34:23
INSERT INTO `test`.`con_test`(`a`) VALUES ('2'); #start 312 end 473 time 2017-02-28 16:35:58
5)解析回滾操作:
python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uroot -p'123456' -dtest --start-file='mysql-bin.000001'
輸出:
DELETE FROM `test`.`con_test` WHERE `a`='2' LIMIT 1; #start 312 end 473 time 2017-02-28 16:35:58
DELETE FROM `test`.`con_test` WHERE `a`='3' LIMIT 1; #start 4 end 281 time 2017-02-28 16:34:23
6)可以看出可以解析結(jié)果正確,順序無誤挎扰!
實際運用中注意事項:
1)需要保存每個測試用例引起的sql變動到文件翠订,文件命名需與case一一對應(yīng)。
2)運行前備份mysql-bin.000001初始化文件mysql-bin.bak遵倦,
3)運行后將變動后的mysql-bin文件替換為mysql-bin.bak即可達到清楚歷史操作的效果蕴轨。
4)不可以直接暴力刪除mysql-bin文件。
FAQ:
1.啟動失敗報錯骇吭,The server quit without updating PID file:
配置文件錯誤導致橙弱,將log_bin = /var/log/mysql/mysql-bin.log改為
log_bin = /var/lib/mysql/mysql-bin.log后,啟動成功燥狰。
參考資料:
mysql binlog工作原理: