3.1 參數(shù)文件
參數(shù)類(lèi)型分為兩類(lèi): 動(dòng)態(tài)(dynamic)和靜態(tài)(static)
動(dòng)態(tài)參數(shù)意味著可以在 MYSQL 實(shí)例運(yùn)行中進(jìn)行更改挡毅, 靜態(tài)參數(shù)說(shuō)明在整個(gè)實(shí)例生命周期內(nèi)都不能進(jìn)行更改诈豌。
對(duì)動(dòng)態(tài)參數(shù)料身,可以用 set@@global|@@session 來(lái)更改。
3.2 日志文件
3.2.1 錯(cuò)誤文件
3.2.2 慢查詢(xún)文件
相關(guān)參數(shù)查看:
mysql>show variables like '%slow%'
設(shè)置 long_query_time 這個(gè)閾值胡, MySQL 會(huì)記錄運(yùn)行時(shí)間超過(guò)該值的所有 SQL 語(yǔ)句, 單運(yùn)行時(shí)間正好等于 long_query_time 的情況并不會(huì)被記錄下。從 Mysql 5.1 開(kāi)始帚屉, long_query_time 開(kāi)始以微秒記錄 SQL 語(yǔ)句運(yùn)行時(shí)間, 之前禁用 秒為單位漾峡。
參數(shù) log_queries_not_using_indexes: 如果運(yùn)行的 SQL 語(yǔ)句沒(méi)有使用索引攻旦, 則 Mysql 數(shù)據(jù)庫(kù)同樣會(huì)將這條 SQL 語(yǔ)句記錄到慢查詢(xún)?nèi)罩疚募?/p>
Mysql 5.6.5 新增 log_throttle_queries_not_using_indexes, 用來(lái)表示每分鐘允許記錄到 slow log 的且未使用索引的 SQL 語(yǔ)句次數(shù)。 默認(rèn)為 0 生逸, 表示沒(méi)有限制牢屋。
Mysql 提供命令 mysqldumpslow 命令,來(lái)分析 慢查詢(xún)文件槽袄。
Mysql 5.1 開(kāi)始烙无, 慢查詢(xún)?nèi)罩居涗浛梢苑湃胍粡埍碇校?是的用戶的查詢(xún)更加方便和直觀。在 mysql 數(shù)據(jù)庫(kù)中的 表 slow_log.?
參數(shù) log_output 指定了慢查詢(xún)輸出格式遍尺, 默認(rèn)為 FILE截酷, 可以將它設(shè)為 table , 然后就可以查詢(xún) slow_log 表乾戏。
查看 slow_log 表的定義會(huì)發(fā)現(xiàn)該表使用的是 CSV 引擎迂苛, 對(duì)大數(shù)據(jù)量下的查詢(xún)效率可能不高。 用戶可以把 slow_log 表的引擎轉(zhuǎn)換為 MyISAM 歧蕉, 并在 start_time 列上添加索引以進(jìn)一步提高查詢(xún)的效率灾部。 但是康铭, 如果已經(jīng)啟動(dòng)了慢查詢(xún)惯退, 將會(huì)提示錯(cuò)誤。
Mysql 增加了對(duì)于邏輯讀取(logical reads)和物理讀却犹佟(physical reads)的統(tǒng)計(jì)催跪。這里的物理讀取時(shí)指從磁盤(pán)進(jìn)行 IO 讀取的次數(shù), 邏輯讀取包含所有的讀取夷野, 不管是磁盤(pán)還是緩沖池懊蒸。
用戶可以通過(guò)額外的參數(shù) long_query_io 將超過(guò)邏輯 IO 次數(shù)的 SQL 語(yǔ)句記錄到 slow log 中, 該值默認(rèn)為 100.
參數(shù) slow_query_tye 表示啟用 show log 的方式悯搔。 // 在 mysql 5.6.33 測(cè)試時(shí)骑丸, 未發(fā)現(xiàn)該參數(shù)。
3.2.3 查詢(xún)?nèi)罩?/h3>
查詢(xún)?nèi)罩居涗浟怂袑?duì) Mysql 數(shù)據(jù)庫(kù)請(qǐng)求的信息,無(wú)論這些請(qǐng)求是否得到了正確的執(zhí)行通危。 默認(rèn)文件名: 主機(jī)名.log
從 mysql 5.1 開(kāi)始铸豁, 可以將查詢(xún)?nèi)罩镜挠涗浄湃?數(shù)據(jù)庫(kù) mysql 下的 general_log 表中, 該表的使用方法和 slow_log 基本一樣菊碟。
3.2.4 二進(jìn)制日志
二進(jìn)制文件(binary log)記錄了對(duì) mysql 數(shù)據(jù)庫(kù)執(zhí)行更改的所有操作节芥, 單不包含 select 和 show 這類(lèi)操作, 因?yàn)檫@類(lèi)操作對(duì)數(shù)據(jù)本身并沒(méi)有修改逆害。
可以通過(guò) show binlog event 查看二進(jìn)制的修改記錄头镊。
二進(jìn)制日志的主要作用:恢復(fù)(recovery), 復(fù)制(replication), 審計(jì)(audit)
參數(shù) max_binlog_size 指定了單個(gè)二進(jìn)制日志文件的最大值魄幕, 如果超過(guò)該值相艇, 則產(chǎn)生新的二進(jìn)制日志文件。 從 Mysql 5.0 開(kāi)始纯陨, 默認(rèn)值 為 1G厂捞。
參數(shù) binlog_cache_size, 默認(rèn)值 32K 。 當(dāng)使用事務(wù)的表存儲(chǔ)引擎(如 Innodb )是队丝, 所有未提交的二進(jìn)制日志會(huì)被記錄到一個(gè)緩存中去靡馁, 等該事務(wù)提交時(shí)直接將該緩沖中的二進(jìn)制日志寫(xiě)入二進(jìn)制日志文件。 當(dāng)一個(gè)線程開(kāi)始一個(gè)事務(wù)時(shí)机久, Mysql 會(huì)自動(dòng)分配一個(gè)大小為 binlog_cache_size 的緩存臭墨, 設(shè)置該值需要相當(dāng)小心。
通過(guò) show global status 查看 binlog_cache_use, binlog_cache_disk_use 的狀態(tài)膘盖, 可判斷當(dāng)前 binlog_cache_size 的設(shè)置是否合適胧弛。
參數(shù) sync_binlog=[N] 表示每寫(xiě)緩沖多少次就同步到磁盤(pán)。默認(rèn)值為 0 侠畔, 如果使用 innodb 進(jìn)行復(fù)制结缚, 并且想得到最大的高可用性, 建議該值設(shè)為 on软棺。
設(shè)為 1 時(shí)红竭, 會(huì)出現(xiàn)一種情況, 一個(gè)事務(wù) commit 之前喘落,會(huì)將二進(jìn)制日志立即寫(xiě)入磁盤(pán)茵宪。 ?如果已經(jīng)寫(xiě)入了日志,但提交還沒(méi)有發(fā)生瘦棋, 此時(shí)發(fā)生了宕機(jī)稀火,在下次啟動(dòng)時(shí), commit 并沒(méi)有發(fā)生赌朋, 事務(wù)會(huì)被回滾凰狞。 但 二進(jìn)制日志已經(jīng)記錄了該事務(wù)信息篇裁, 不能被回滾。 這個(gè)問(wèn)題可通過(guò)參數(shù) innodb_support_xa 設(shè)為 1 來(lái)解決赡若, 雖然 innodb_support_xa 與 XA 事務(wù)有關(guān)茴恰, 單它同時(shí)也確保了二進(jìn)制日志和 innodb 引擎數(shù)據(jù)文件的同步。
參數(shù) binlog-do-db 和 binlog-ignore-db 表示需要寫(xiě)入或忽略那些庫(kù)的日志斩熊。 默認(rèn)為空往枣, 表示需要同步所有庫(kù)的日志到二進(jìn)制日志。
Mysql 5.1 引入了 binlog_format 參數(shù)粉渠, 該參數(shù)可設(shè)的值有 statement, row 和 mixed.
(1) statement . 二進(jìn)制日志文件記錄的是日志的邏輯 sql 語(yǔ)句分冈。
(2) row . 記錄表的行更改情況。statement 的復(fù)制問(wèn)題得到解決霸株。 從 mysql 5.1 開(kāi)始雕沉, 如果設(shè)置了 binlog_format 為row, 可以將 innodb 事務(wù)隔離級(jí)別設(shè)為 read commited ,以獲得更好的并發(fā)性去件。
(3) mixed. 默認(rèn)采用 statement 格式坡椒, 但是在一些情況下回使用 row 格式。?
在通常情況下尤溜, 將參數(shù) binlog_format 設(shè)置為 row 倔叼, 可以為數(shù)據(jù)庫(kù)的恢復(fù)和復(fù)制帶來(lái)更好的可靠性。 的那會(huì)這會(huì)使二進(jìn)制文件大小增加宫莱, 某些情況下丈攒, 會(huì)增大很多。
要查看二進(jìn)制文件的內(nèi)容授霸, 必須通過(guò) mysql 提供的工具 mysqlbinlog .?
[root]#mysqlbinlog --start-position=203 mysql-bin.000184
binlog_format 為 row 時(shí)巡验, 查看需要加上參數(shù) -v 或 -vv 。 -vv 比 -v 多顯示出更新的類(lèi)型碘耳。
3.3 套接字文件
3.4 pid 文件
3.5 表結(jié)構(gòu)定義文件
無(wú)論采用何種存儲(chǔ)引擎显设, mysql 都有一個(gè) 以 frm 為后綴名的文件, 這個(gè)文件記錄了該表的表結(jié)構(gòu)定義辛辨。
3.6 InnoDB 存儲(chǔ)引擎文件
3.6.1 表空間文件
在默認(rèn)配置下會(huì)有一個(gè)初始大小為 10MB捕捂, 名為 ibdata1 的文件。 該文件就是默認(rèn)的表空間文件(table space).
若設(shè)置了參數(shù) innodb_file_per_table, 則用戶可以將每個(gè)基于 Innodb 引擎的表產(chǎn)生一個(gè)獨(dú)立表空間愉阎。 命名規(guī)則為: 表明.ibd绞蹦。
需要注意的是, 這些單獨(dú)的表空間僅存儲(chǔ)該表的數(shù)據(jù)榜旦、索引和插入緩沖 bitmap 等信息, 其余信息還是存在默認(rèn)的表空間中景殷。
3.6.2 重做日志文件
在默認(rèn)情況下溅呢, 在 innodb 存儲(chǔ)引擎的數(shù)據(jù)目錄下會(huì)有兩個(gè)名為 ib_logfile0 和 ib_logfile1 的文件澡屡, 其為重做日志文件(redo log file)。
參數(shù) innodb_log_file_size 指定每個(gè)重做日志文件的大小 咐旧。 innodb 1.2.x 之前驶鹉, 為 4GB. 而 1.2.x 將其擴(kuò)大為 512GB。
參數(shù) innodb_log_files_in_group 指定了日志文件組中重做日志文件的數(shù)量铣墨, 默認(rèn)為 2室埋。 參數(shù) innodb_mirrored_log_groups 制定了日志鏡像文件組的數(shù)量, 默認(rèn)為 1伊约, 表示只有一個(gè)日志文件組姚淆, 沒(méi)有鏡像。
重做日志文件與二進(jìn)制日志文件的區(qū)別:
(1) 二進(jìn)制日志會(huì)記錄所有與 MYSQL 數(shù)據(jù)庫(kù)有關(guān)的日志記錄屡律,包裹 Innodb 腌逢, MYISAM, Heap 等其他存儲(chǔ)引擎的日志。 而 Innodb 重做日志只記錄有關(guān)該存儲(chǔ)引擎本事的事務(wù)日志超埋。
(2) 記錄的內(nèi)容不同搏讶, 無(wú)論用戶將二進(jìn)制文件記錄格式誰(shuí) statement 還是 row 或是 mixed , 其記錄的都是關(guān)于一個(gè)事務(wù)的具體操作內(nèi)容霍殴, 即該日志是邏輯日志媒惕。 而 innodb 村粗引擎的重做日志記錄的是關(guān)于每個(gè)頁(yè)的更改的物理情況。
(3) 寫(xiě)入時(shí)間也不同来庭, 二進(jìn)制日志文件僅在事務(wù)提交前進(jìn)行提交吓笙, 即只寫(xiě)磁盤(pán)一次, 不論這是該事務(wù)多大巾腕。 而在事務(wù)進(jìn)行過(guò)程中面睛, 卻不斷有重做日志文件條目(redo entry) 被寫(xiě)入到重做日志文件中。
從重做日志緩沖往磁盤(pán)寫(xiě)入時(shí)尊搬, 是按 512 個(gè)字節(jié)叁鉴, 也就是一個(gè)扇區(qū)的大小進(jìn)行寫(xiě)入。 因?yàn)樯葏^(qū)是寫(xiě)入的最小單位佛寿, 因此可以保證寫(xiě)入必定是成功的幌墓。 因此在重做日志的寫(xiě)入過(guò)程中不需要有 doule write。(why冀泻?)
日志緩沖寫(xiě)入磁盤(pán)的重做日志文件按一定條件:
(1) 主線程中每秒會(huì)將重做日志緩沖寫(xiě)入磁盤(pán)的重做日志文件中常侣, 無(wú)論事務(wù)是否已經(jīng)提交。?
(2) 通過(guò) 參數(shù) innodb_flush_log_trx_commit 控制弹渔, 表示在提交(commit)時(shí)胳施,處理重做日志的方式。 0 時(shí)不寫(xiě)肢专, 1 同步寫(xiě)舞肆, 2 異步寫(xiě)焦辅。