MySQL資料庫的并發性與鎖有很大的關系:
讀鎖:
是共享鎖,施加後,其他人可以讀,但是不能寫。
寫鎖:
是獨占鎖,施加後,其他人不能寫、也不能讀。
由于資料庫的讀量大于寫量,是以當讀鎖源源不斷時,寫鎖就不能施加。是以可能采用讀5個,寫1個的政策施加鎖就可以解決問題(具體的情況視各自的"鎖政策"而定)
鎖粒度:
當鎖是鎖定整個表的時候,那麼即使"鎖政策"再好,也不會有很好的性能。是以我們可以考慮隻鎖定我們需要資料所在的那幾個資料塊。甚至隻鎖定我們需要那一行資料。
鎖粒度越低,并發性越好,但是需要維護的成本也越大。
表級鎖:鎖定整個表
頁 鎖:鎖定需要的資料塊
行 鎖:維護成本高,容易發生死鎖:也就是A、B使用者同時到來。A是先鎖定第1行,再鎖定第5行;B是先鎖定第5行,再鎖定第1行。他們都進行到第二步時,就會各自等待,這就是死鎖。一般解鎖的政策是讓資源占用最少的解鎖,具體的實作要視不同的政策、不同的公司而定。
MySQL的工作模型:
一個線程響應一個使用者,而且這個線程會長期線上,直到使用者退出。但是如果使用API就可能瞬間建立,瞬間退出。
由于涉及到AAA的安全問題,是以MySQL不能一個線程響應多個使用者。但是線程的銷毀、建立、授權也是需要很長的時間的,是以MySQL采用的是線程池複用的機制。也就是當使用者退出後,其使用的線程不會被銷毀,而隻是快速清空上一個使用者的資料庫,等待下一個使用者的連接配接。
SQL:
DML:CRUD(insert、update、delete、select),資料庫操作語言
DDL:create、drop、alter,資料庫定義語言。用來操作資料庫對象的,比如表、索引、遊标等
DCL:grant revoke,權限管理語言。
事務的ACID特性:
原子性:一般指一組DML(DDL無法實作)語句要麼都執行完成,要麼都不執行。如果隻執行一部分,就復原。
一緻性:資料庫的總量保持不變,比如銀行的轉賬操作,A減去1000,B就得加1000.
隔離性:多個事務(SQL語句)不能同時操作一個資料。有4個隔離級别:
讀未送出:READ UNCOMMITED
讀 提 交:READ COMMITED 大多數資料庫的預設
可 重 讀:REPEATABLE READ MySQL的預設,較嚴格
可串行化:SERIABLIZABLE
持久性:隻要事務一送出,那麼資料庫的狀态一定是改變的,不能被斷電情況影響。它也有級别之分
1、隻要事務一送出就從記憶體同步到事務日志,同時也會1秒同步一次,這樣大的事務不會丢失
2、隻有在事務送出時才會同步到事務日志,沒有其他同步。
MySQL日志:
mysql> SHOW [GLOBAL|SESSION] VARIABLES LIKE '%log%';
這樣子可以看到所有關于日志的變量:
錯誤日志、查詢日志、慢查詢日志、事務日志
錯誤日志:
預設開啟,且在datadir的根目錄下,檔案名是"HOSTNAME.err"
可以在/etc/my.cnf中定義
log_error=/path/to/NAME.err,
log_warnings = {1|0}警告資訊是否一并記錄到錯誤日志
記錄内容如下:
1、MySQL啟動、關閉過程中的資訊,未必是錯誤資訊。
會包含sock檔案找不到、MySQL未初始化
還比如會反解0.0.0.0到本地失敗的資訊
2、伺服器運作過程中的錯誤資訊
3、時間排程器運作一個時間時産生的資訊
4、在從伺服器上啟動從伺服器程序時産生的資訊。
查詢日志:
預設不啟用,因為會嚴重降低性能。
慢查詢日志:
它記錄了一組DML的SQL語句從啟動到執行完成的操作時長,包含了由于鎖問題被阻塞的時間,用來定位問題。有的資料叫做牆上的挂鐘時間。一般開啟,對性能影響不大。
事務日志:
記錄DML語句本身到一個具有連續磁盤塊且固定大小的檔案上。
它不是曆史日志,具有幂等性,也就是多次操作後的結果都是一樣的。
由于事務日志沒有寫入磁盤,當下一個操作需要用到上一個操作的結果時,事務日志就必須能夠生成一個視圖給使用者查詢。
事務日志能夠容納一段時間内的事務即可,檔案越大,并發性越好,但伺服器當機恢複時間越長。
事務日志有2個或多個,寫完一個再寫另一個。
事務日志在非陣列存儲的情況下,必須不能和資料庫檔案放到同一個磁盤上,因為會影響性能。
二進制日志:
用途:用來記錄修改表資料,或有可能引起表資料改變的SQL語句、發生時間、執行時長等,當不會保留隻用來查詢的SELECT語句。而且對于slave,就是複制二進制日志的。
二進制日志的檢視:

檢視目前正在寫入的二進制日志及位置
檢視二進制日志的内容:
在shell指令行中檢視二進制日志的方法:
使用二進制日志回複資料庫:
正确删除二進制日志:
由于二進制日志太重要,一般都不會删除,即使删除,也需要現将其備份後再删除。
但是在确定做過備份,且二進制日志沒有用的情況下,可以使用purge指令安全删除。
滾動二進制日志:
造成二進制檔案的滾動的原因有很多,比如重新開機mysql伺服器等,但也可以手動滾動。