教做世界美食的網(wǎng)站西安百度快速排名提升
Mysql常見日志
(1)錯(cuò)誤日志:記錄數(shù)據(jù)庫(kù)服務(wù)器啟動(dòng)、停止、運(yùn)行時(shí)存在的問題;
(2)慢查詢?nèi)罩?#xff1a;記錄查詢時(shí)間超過long_query_time的sql語(yǔ)句,其中l(wèi)ong_query_time可配置,且慢查詢?nèi)罩灸J(rèn)關(guān)閉;
(3)一般查詢?nèi)罩?#xff1a;記錄數(shù)據(jù)庫(kù)的連接信息以及所有的sql語(yǔ)句;
(4)二進(jìn)制日志:即bin log,記錄所有修改數(shù)據(jù)庫(kù)狀態(tài)的sql語(yǔ)句及這些sql語(yǔ)句的執(zhí)行時(shí)間,修改數(shù)據(jù)庫(kù)的語(yǔ)句包含了insert、delete、update等操作,該日志屬于邏輯日志,會(huì)記錄MyISAM、InnoDB引擎數(shù)據(jù)庫(kù)的所有修改操作,以便進(jìn)行數(shù)據(jù)恢復(fù)和主從復(fù)制,該日志僅在事務(wù)提交前提交,僅寫磁盤一次。對(duì)于該日志的寫入,是通過追加的方式進(jìn)行的,不會(huì)覆蓋已有的內(nèi)容。
當(dāng)數(shù)據(jù)發(fā)生丟失后,該日志可將數(shù)據(jù)庫(kù)恢復(fù)到特定的時(shí)間點(diǎn);主服務(wù)器上的二進(jìn)制日志可以被從服務(wù)器讀取,從而實(shí)現(xiàn)數(shù)據(jù)同步。該日志包含了二進(jìn)制索引文件和二進(jìn)制日志文件兩部分;
(5)重做日志:即redo log,記錄了每個(gè)對(duì)InnoDB表的寫操作,記錄的是數(shù)據(jù)頁(yè)的物理變化,用來(lái)實(shí)現(xiàn)事務(wù)的持久性。該日志包含了重做日志緩存、重做日志文件兩部分,前者在內(nèi)存中,后者在磁盤中,當(dāng)事務(wù)提交后會(huì)把所有修改信息存儲(chǔ)到重做日志文件中,寫入時(shí)使用循環(huán)寫入和擦除的方式進(jìn)行;
(6)回滾日志:即undo log,用于記錄數(shù)據(jù)被修改前的信息,用于事務(wù)回滾,實(shí)現(xiàn)事務(wù)的原子性和持久性,也是實(shí)現(xiàn)MVCC多版本并發(fā)控制的關(guān)鍵部分,屬于邏輯日志。
當(dāng)delete一條記錄時(shí),undo log中會(huì)記錄一條對(duì)應(yīng)的insert記錄,回滾時(shí)插入這一條被刪除的數(shù)據(jù),反之亦然;當(dāng)update一條記錄時(shí),它記錄一條對(duì)應(yīng)相反的update記錄,回滾時(shí)修改回去。當(dāng)執(zhí)行rollback時(shí),就可以從undo log中的邏輯記錄讀取到相應(yīng)的內(nèi)容并進(jìn)行回滾。
MVCC
MVCC是多版本并發(fā)控制,指維護(hù)一個(gè)數(shù)據(jù)庫(kù)的多個(gè)版本,使得讀寫沒有沖突,解決數(shù)據(jù)的并發(fā)問題。在支持MVCC的數(shù)據(jù)庫(kù)中,當(dāng)多個(gè)用戶訪問數(shù)據(jù)時(shí),每個(gè)用戶都能看到某個(gè)時(shí)間點(diǎn)前的數(shù)據(jù)庫(kù)快照,并能夠無(wú)阻塞、無(wú)干擾地執(zhí)行查詢和修改操作,MVCC主要通過版本鏈和ReadView機(jī)制實(shí)現(xiàn)的。
對(duì)于版本鏈,通過隱藏字段實(shí)現(xiàn)的。每一行數(shù)據(jù)都有3個(gè)隱藏字段:
(1)DB_TRX_ID:保存創(chuàng)建這個(gè)版本的事務(wù)ID,即最后一項(xiàng)修改該記錄或插入該記錄最新版本的事務(wù)ID;
(2)DB_ROLL_PTR:回滾指針,指向這條記錄的上一個(gè)版本,用于配合undo log;
(3)DB_ROW_ID:隱藏主鍵,如果表結(jié)構(gòu)沒有指定主鍵,將會(huì)生成該隱藏字段。
在undo log日志中,存在一個(gè)版本鏈,存儲(chǔ)數(shù)據(jù)的舊版本,當(dāng)更新一行數(shù)據(jù)時(shí),不會(huì)覆蓋原數(shù)據(jù),而是產(chǎn)生一個(gè)新版本的數(shù)據(jù),并更新DB_TRX_ID、DB_ROLL_PTR插入到版本鏈中,使得其指向前一個(gè)版本的數(shù)據(jù),這樣可通過版本鏈找到舊版本的數(shù)據(jù),邏輯圖如下:
ReadView讀視圖機(jī)制用于確定事務(wù)的哪些版本的行記錄是可見的,解決一致性讀問題。當(dāng)事務(wù)創(chuàng)建時(shí),會(huì)為事務(wù)創(chuàng)建一個(gè)ReadView記錄,其中包含4個(gè)信息:
(1)creator_trx_id:創(chuàng)建ReadView的事務(wù)id;
(2)m_ids:活躍的事務(wù)id集合,指的是開始但未提交的事務(wù);
(3)min_trx_id:活躍事務(wù)中最小的事務(wù)id,即m_ids中最小的事務(wù)id;
(4)max_trx_id:事務(wù)ID的最大值加1,即即將創(chuàng)建的事務(wù)id。
當(dāng)一個(gè)事務(wù)讀某條數(shù)據(jù)時(shí),根據(jù)ReadView判斷數(shù)據(jù)的某個(gè)版本是否可見:
(1)若被訪問數(shù)據(jù)的DB_TRX_ID的值小于min_trx_id,則該數(shù)據(jù)對(duì)當(dāng)前事務(wù)可見,因?yàn)樵摪姹緮?shù)據(jù)已被提交;
(2)若被訪問數(shù)據(jù)的DB_TRX_ID的值大于max_trx_id,則該數(shù)據(jù)對(duì)當(dāng)前事務(wù)不可見,創(chuàng)建該數(shù)據(jù)版本的事務(wù)在生成ReadView后開始執(zhí)行的,尚未提交;
(3)DB_TRX_ID在min_trx_id與max_trx_id之間時(shí),若m_ids中未包含DB_TRX_ID,則該版本數(shù)據(jù)對(duì)當(dāng)前事務(wù)可見,因?yàn)樵摂?shù)據(jù)版本的事務(wù)在生成ReadView后已提交;若包含DB_TRX_ID,則該版本數(shù)據(jù)對(duì)當(dāng)前事務(wù)不可見,因?yàn)樵摂?shù)據(jù)版本的事務(wù)仍處于活躍狀態(tài),或在當(dāng)前事務(wù)生成 ReadView后開始。
對(duì)于可重復(fù)讀和讀已提交,生成ReadView有以下區(qū)別:
對(duì)于可重復(fù)讀,在第一次讀取數(shù)據(jù)時(shí)生成一個(gè)ReadView,ReadView一直保持到事務(wù)結(jié)束不發(fā)生變化,這樣可以保證在事務(wù)中多次讀取同一行數(shù)據(jù)時(shí),讀取到的數(shù)據(jù)是一致的。
對(duì)于讀已提交,每次讀取數(shù)據(jù)前都生成一個(gè) ReadView,這樣就能保證每次讀取的數(shù)據(jù)都是最新的。
主從復(fù)制
是一種數(shù)據(jù)同步機(jī)制,將數(shù)據(jù)從一個(gè)主數(shù)據(jù)庫(kù)復(fù)制到多個(gè)從數(shù)據(jù)庫(kù),廣泛用于數(shù)據(jù)恢復(fù)、災(zāi)難恢復(fù)。
主從復(fù)制分為以下幾步:
(1)在主數(shù)據(jù)庫(kù)中,執(zhí)行數(shù)據(jù)庫(kù)修改操作時(shí)(Insert、Updata、Delete等),將這些操作語(yǔ)句寫入到bin log(二進(jìn)制日志),在這些操作完成后,主數(shù)據(jù)庫(kù)的log dump線程將二進(jìn)制日志中的內(nèi)容發(fā)送給從數(shù)據(jù)庫(kù);
(2)從數(shù)據(jù)庫(kù)接收到二進(jìn)制日志的內(nèi)容后,通過IO線程將其寫到從數(shù)據(jù)庫(kù)的中繼日志中(relay log);
(3)從數(shù)據(jù)庫(kù)中的sql線程讀取中繼日志,并在本地?cái)?shù)據(jù)庫(kù)中執(zhí)行讀取到的sql語(yǔ)句,從而改變從數(shù)據(jù)庫(kù)中的數(shù)據(jù),完成同步。