1. 恢復和複製的需要,對innodb鎖機制的影響 mysql 通過binlog文件對增刪除改等更新數據的sql語句,實現資料庫的恢復和主從複製。mysql的恢復機制(複製其實就是在slave mysql不斷做基於binglog的恢復)特點有如下: (1) mysql 的恢復是sql語句級的,也就是 ...
1. 恢復和複製的需要,對innodb鎖機制的影響
mysql 通過binlog文件對增刪除改等更新數據的sql語句,實現資料庫的恢復和主從複製。mysql的恢復機制(複製其實就是在slave mysql不斷做基於binglog的恢復)特點有如下:
(1) mysql 的恢復是sql語句級的,也就是重新執行binlog中的sql語句, oracle資料庫則是基於資料庫文件塊的。
(2) mysql 的binlog是按照事務提交的先後順序記錄的,恢復也是按這個順序進行的。這也與oracle不同,oracle是按照系統更新號(SCN)來恢複數據的。
2. insert into 和create table對於原表也會加共用鎖
下麵演示原表加鎖的例子:
會話1 |
會話2 |
SET autocommit=0; SELECT * FROM city WHERE CityCode='003' city_id country_id cityname CityCode 103 2 杭州 003 |
SET autocommit=0; SELECT * FROM city WHERE CityCode='003' city_id country_id cityname CityCode 103 2 杭州 003 |
INSERT INTO cityNew SELECT * FROM city WHERE CityCode='003' 共 1 行受到影響 |
|
|
UPDATE city SET CityCode='004' WHERE CityCode='003' 等待超時 Lock wait timeout exceeded; try restarting transaction |
Commit; |
|
|
Commit; |
上面的例子中,只是簡單的讀取city表,相當於一個普通的select 語句,在這裡innodb給city表加了共用鎖,並有使用多版本數據一致性技術。原因還是為了保證恢復和複製的正確性,因為不加鎖,上述語句的執行過程中,其他事務對city表做了更新操作,可能導致數據恢復結果錯誤。如需要演示這種可以將系統變數 innodb_locks_unsafe_for_binlog的值設置為"NO"不加共用鎖(set innodb_locks_unsafe_for_binlog='on') 預設是"OFF" 。如果設置上面的值為ON, 可能會使Binlog中記錄的sql執行順序不一致,使用恢復的結果與實際的應用邏輯不符,如果進行複製,就會導致主從資料庫不一致。
如果不想設置為ON,又不希望對源表的併發更新產生影響,可以使用 into outfile 將city表導入到一個txt文件,再使用load data infile 導入到新表。使用這種間接方式不會對源city表加鎖。