鎖機制與實現主從複製
鎖機制
因資源共享,而造成的併發問題。
例子:
買最後一件衣服, 商品加鎖 -》 流程 -》商品解鎖
鎖分類:
1、操作型別:
① 讀鎖(共享鎖)
多個讀同時進行,互不干擾
②寫鎖(互斥鎖)
如果當前寫操作沒有完畢,則無法進行讀操作和寫操作
2、操作範圍
表鎖
myISAN一次性對一個表整體加鎖(開銷小,加鎖快,無死鎖,範圍大,容易發生鎖操作,併發度低)
行鎖
innoDB一次對一條資料加鎖,開銷大,加鎖慢,容易出現死鎖;鎖範圍小,不易發生鎖衝突,併發度高:髒讀,幻讀
頁鎖
例子:
locak table 表名 reade/writer ,..... show open tables;檢視加鎖的表
讀:select 寫:insert。update
–如果某一個會話,對A表進行讀操作、不能進行寫操作
對其它表讀寫都不可以。
–總結,如果會話0對a表加了鎖,其它會話操作,可以對其它表進行讀寫操作。對a表可以讀,寫需要等待釋放鎖
釋放鎖:unlock table;
寫鎖:
會話0:
當前回話可以對加了寫鎖的表進行(讀寫操作),但是不能操作其它表
其它會話:
對會話0加寫鎖的表,可以對進行(增刪改查),但是要等待釋放鎖。
mysql表級鎖,
myisan select 前加讀鎖
inser、updata、delete 加寫鎖
分析表鎖定:
檢視哪些表加了鎖: show open tables; 分析表鎖定的嚴重程度 show statis like 'table%' Table_locks_immediate 可能獲取到的鎖數 Table_locks_waited : 需要等待的表鎖數,越大鎖競爭越大 >5000 選擇Innodb 否則用 myisan
分析行鎖(InnoDB)
自動增加commit,oracle不會自動提交
關閉自動提交
set autocommit = 0;
插入一行,兩個回話進行爭奪
提交的作用?
沒提交時在快取裡面,沒有入庫
行鎖小結:
1.如果會話x對某條資料a進行DML操作,其它會話需要等待
2.行鎖通過事務解鎖rollback,commit
3.不同行操作不影響
注意:如果沒有索引,行鎖自動變成表鎖
--資料被阻塞,索引類出現型別轉換,行鎖升級為表鎖。
行鎖的高特殊情況,間隙鎖,值在範圍內,但卻不存在。
1-9,沒有7的時候,給7加一個間隙鎖(行鎖),無法訪問。
行鎖:InnoDB
效能損耗大,高併發用,效率高
行鎖分析: 一些引數對比
查詢行鎖: 查詢的時候,別人不能修改
begin;事務自動提交關閉
主從複製(叢集)
資料庫複製為多個請求分流;
負載均衡、失敗遷移。
設定主從資料庫;兩個資料庫資料同步,讀寫分離
難點(資料同步)
window : 主
linux : 從
刪除:mysql隱藏檔案,mysql快取檔案;登錄檔刪除
–重啟計算機
再進行安裝MySQL;允許遠端訪問和執行;
連線遠端 linux ipconfig地址
需要授權遠端訪問,linux裡面授權遠端訪問:防火牆關閉
主從同步原理:
二進位制日誌檔案 binary log (資料庫操作的備份)
主資料庫改變記錄到二進位制檔案
從資料庫開啟時讀寫主資料庫二進位制檔案。
io執行緒,獲取到二進位制檔案新增資料放到從資料庫 relay log(中繼日誌檔案)
中繼日誌事件,將中繼日誌檔案拷貝到資料庫中。
主從複製是非同步的,序列化,有延遲的
一個主,從有多個。
主機配置:
windows: my.ini
配置之前,將許可權、防火牆關閉。允許遠端連結(一個sql語句)
主機裡面開啟配置檔案:[mysqld] server-id =1
log-bin=“mysql/data/mysql-bin”
–錯誤記錄檔案
log-error=“mysql/data/mysql-error”
–主從同步時,忽略資料庫
binlog-ignore-db=mysql
–指定主從同步時,同步哪些資料庫
binlog-do-db = test
sql–授權哪臺計算機是自己的從計算機(配置ip)
GRANT REPLICATION slave,reload,super ON . TO ‘root’@‘192.168.2.%’ IDENTIFIED BY ‘root’;
flush privilegs;
–檢視主計算機狀態(檔名和pocition【磁碟道】)
show master status
從機配置
linux : my.cnf
關閉防火牆:service ip tables stop
[mysqld] server-id =2
log-bin=“mysql/data/mysql-bin”
–錯誤記錄檔案
log-error=“mysql/data/mysql-error”
replicate-do-db = test --同步哪些資料庫
–設定主機,授權
CHANGE MASETER TO
MASTER_HOST = ‘192.168.2.2’,
MASTER_USER = ‘root’,
MASTER_PASSWORD = ‘root’,
MASTER_PORT =3306,
master_log_file = ‘mysql-bin.000001’,
master_log_pos = 107; --position 的值
--STOP SLAVE;再次執行(報錯)
–開啟主從同步
從計算機
show slave status \G
–檢視slave_IO_running,slave_SQL_running 確保都是yes
–檢查日誌報錯, 查的時候是_,配置的時候是-;
從計算機設定id的時候是有bug的,版本相容
set變數進行修改
演示:
主資料庫建立表,檢視從資料庫是否同步。