一囚企、 錯(cuò)誤日志
??沒(méi)做特殊說(shuō)明畜伐,所有配置都在my.cnf文件下的 [mysqld] 域下
??包含了當(dāng)mysqld啟動(dòng)和停止時(shí)馍惹,以及服務(wù)器在運(yùn)行過(guò)程中發(fā)生任何嚴(yán)重錯(cuò)誤時(shí)的相關(guān)信息。如果沒(méi)有配置此選項(xiàng)玛界,mysqld 使用錯(cuò)誤日志名{host_name}.err并在數(shù)據(jù)目錄寫(xiě)入日志文件万矾。
log-error = /var/lib/mysql/mysql-error.log
二、二進(jìn)制日志
??二進(jìn)制日志包含了所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)(例如慎框,沒(méi)有匹配任何行的一個(gè)DELETE)的所有語(yǔ)句良狈。語(yǔ)句以“ 事件” 的形式保存,它描述數(shù)據(jù)更改文件位置和格式笨枯。如果配置文件未配置long-bin
的值薪丁, 默認(rèn)名為{hostname}-bin.log遇西。如果給出了文件名,但沒(méi)有包含路徑严嗜,則文件被寫(xiě)入數(shù)據(jù)目錄粱檀。
server_id = 1 # server_id 唯一
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 14 # 日志過(guò)期時(shí)間
??二進(jìn)制日志相關(guān)操作
RESET MASTER;//刪除所有binlog日志,新日志編號(hào)從頭開(kāi)始
PURGE MASTER LOGS TO 'mysql-bin.010';//刪除mysql-bin.010之前所有日志
PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';// 刪除2003-04-02 22:46:26之前產(chǎn)生的所有日志
??相關(guān)選項(xiàng)
binlog-do-db = db_name1 # 指定要保存二進(jìn)制日志的數(shù)據(jù)庫(kù)漫玄,要保存多個(gè)的話(huà)寫(xiě)多條
binlog-do-db = db_name2
sync-binlog = 1 # 每寫(xiě)多少次日志同步磁盤(pán)
expire-logs-days = 14 # 二進(jìn)制日志保留14天茄蚯,過(guò)期自動(dòng)刪除
max_binlog_size = 100M # 每個(gè)二進(jìn)制日志文件的大小
三、二進(jìn)制日志記錄模式
?1. ROW 模式
??日志文件會(huì)記錄成每一行數(shù)據(jù)被修改的形式称近,然后在Slave端再對(duì)相同的數(shù)據(jù)進(jìn)行修改第队。如果修改了表的結(jié)構(gòu),那么binlog日志記錄的是重新創(chuàng)建表刨秆,在插入字段凳谦、update等操作語(yǔ)句,而不是的alter的動(dòng)作衡未。
??優(yōu)點(diǎn):日志文件可以不記錄執(zhí)行的Query語(yǔ)句的上下文相關(guān)信息尸执,只要記錄哪一行修改了,修改成什么樣子缓醋。Row 模式會(huì)詳細(xì)的記錄下每一行數(shù)據(jù)的修改細(xì)節(jié)如失,而且不會(huì)出現(xiàn)某個(gè)特定情況下的存儲(chǔ)過(guò)程,或函數(shù)送粱,以及Trigger的調(diào)用和觸發(fā)無(wú)法被正確復(fù)制問(wèn)題褪贵。
??缺點(diǎn):所有的執(zhí)行的語(yǔ)句當(dāng)記錄到日志中的時(shí)候,都將以每行記錄的修改來(lái)記錄抗俄,這樣可能會(huì)產(chǎn)生大量的日志內(nèi)容,比如一條update語(yǔ)句脆丁,修改多條記錄,則binlog中每一條修改都會(huì)有記錄动雹,這樣造成binlog日志量會(huì)很大槽卫,特別是當(dāng)執(zhí)行alter table之類(lèi)的語(yǔ)句的時(shí)候,由于表結(jié)構(gòu)修改胰蝠,每條記錄都發(fā)生改變歼培,那么該表每一條記錄都會(huì)記錄到日志中。
?2. Statment 模式
??每一條修改的SQL語(yǔ)句都會(huì)記錄到Master的Binnary中茸塞。Slave端在復(fù)制的時(shí)候躲庄,SQL線(xiàn)程會(huì)解析成和原來(lái)Master端執(zhí)行過(guò)相同的SQL語(yǔ)句,并再次執(zhí)行翔横。
??優(yōu)點(diǎn):不須要記錄每一行的數(shù)據(jù)變化读跷,減少了Binnary Log日志量,節(jié)約了IO成本禾唁,提高了性能效览。
??缺點(diǎn):由于它是記錄的執(zhí)行語(yǔ)句,為了讓這些語(yǔ)句在Slave端也能正確執(zhí)行荡短。那么它還必須記錄每條語(yǔ)句在執(zhí)行時(shí)的一些相關(guān)信息丐枉,即上下文信息,以保證所有語(yǔ)句在Slave端被執(zhí)行的時(shí)候能夠得到和在Master端執(zhí)行時(shí)相同的結(jié)果掘托。另外瘦锹,由于MySQL發(fā)展比較快,很多新功能不斷加入闪盔,使得MySQL復(fù)制遇到了不小的挑戰(zhàn)弯院,復(fù)制時(shí)設(shè)計(jì)的內(nèi)容越復(fù)雜,越容易出bug泪掀。在Statement 模式下听绳,目前已發(fā)現(xiàn)不少的情況下會(huì)造成MySQL的復(fù)制問(wèn)題。主要是在修改數(shù)據(jù)使用了某些特定的函數(shù)貨功能后异赫,出現(xiàn)椅挣,比如:Sleep()函數(shù)在有些版本中就不能正確的復(fù)制,在存儲(chǔ)過(guò)程中使用了last_insert_id()函數(shù)塔拳,可能會(huì)使Slave和Master的到不一致的ID鼠证,等等。
使用以下函數(shù)的語(yǔ)句也無(wú)法被復(fù)制:
* LOAD_FILE()
* UUID()
* USER()
* FOUND_ROWS()
* SYSDATE() (除非啟動(dòng)時(shí)啟用了 --sysdate-is-now 選項(xiàng))
同時(shí)在INSERT ...SELECT 會(huì)產(chǎn)生比 RBR 更多的行級(jí)鎖
?3. mixed 模式(以上兩種模式混合使用)
??一般的語(yǔ)句修改使用 Statment 格式保存 binlog靠抑,如一些函數(shù)量九,Statement 無(wú)法完成主從復(fù)制的操作,則采用 Row 格式保存 binlog颂碧,MySQL 會(huì)根據(jù)執(zhí)行的每一條具體的 SQL 語(yǔ)句來(lái)區(qū)分對(duì)待記錄的日志形式荠列,也就是在 Statement 和 Row 之間選擇一種.新版本的 MySQL 中隊(duì) Row 模式也被做了優(yōu)化,并不是所有的修改都會(huì)以 Row 模式來(lái)記錄稚伍,像遇到表結(jié)構(gòu)變更的時(shí)候就會(huì)以 Statement 模式來(lái)記錄弯予。至于 Update 或者 Delete 等修改數(shù)據(jù)的語(yǔ)句,還是會(huì)記錄所有行的變更个曙。除了 MySQL 認(rèn)為通過(guò) Statement 方式可能造成復(fù)制過(guò)程中 Master 和 Slave 之間產(chǎn)生不一致數(shù)據(jù)锈嫩。(如特殊 Procedure 和 Funtion 的使用,UUID() 函數(shù)的使用等特殊情況)時(shí)垦搬,它會(huì)選擇 Row 的模式來(lái)記錄變更之外呼寸,都會(huì)使用Statement方式。
binlog_format = MIXED
四猴贰、慢查詢(xún)?nèi)罩?/h4>
??記錄包含所有執(zhí)行時(shí)間超過(guò)long_query_time秒的SQL語(yǔ)句的日志文件对雪。獲得初使表鎖定的時(shí)間不算作執(zhí)行時(shí)間。
log-queries-not-using-indexes = 1 # 把沒(méi)有使用索引的查詢(xún)語(yǔ)句也記錄到慢查詢(xún)?nèi)罩局?slow-query-log = 1 # 記錄慢查詢(xún)?nèi)罩?long_query_time = 2 # 設(shè)定慢查詢(xún)時(shí)間(秒)
slow-query-log-file = /var/lib/mysql/mysql-slow.log # 慢查詢(xún)?nèi)罩疚恢?