天天看點

MySQL(3)——日志

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,就是複制二進制日志的。

二進制日志的檢視:

MySQL(3)——日志

 檢視目前正在寫入的二進制日志及位置   

MySQL(3)——日志

檢視二進制日志的内容:

MySQL(3)——日志
MySQL(3)——日志

在shell指令行中檢視二進制日志的方法:

使用二進制日志回複資料庫:

正确删除二進制日志:

    由于二進制日志太重要,一般都不會删除,即使删除,也需要現将其備份後再删除。

    但是在确定做過備份,且二進制日志沒有用的情況下,可以使用purge指令安全删除。

滾動二進制日志:

    造成二進制檔案的滾動的原因有很多,比如重新開機mysql伺服器等,但也可以手動滾動。

繼續閱讀