錯誤日志:ErrorLog
在mysql資料庫中,錯誤日志功能是預設開啟的。這個錯誤日志存儲在mysql資料庫的資料目錄中。錯誤日志檔案通常的名稱為hostname.err,表示伺服器的主機名。
錯誤日志資訊可以自己進行配置的,錯誤日志所記錄的資訊是可以通過log-error和log-warnings來定義的。其中log-warnings是定義是否将警告資訊也定義至錯誤日志。預設情況下錯誤日志記錄着伺服器啟動和關閉過程中的資訊,伺服器允許過程中的錯誤資訊,事件排程器運作一個事件時産生的資訊,在從伺服器上啟動伺服器程序時産生的資訊。
mysql有很多系統變量可以設定,系統變量設定不同,會導緻系統運作狀态的不同。是以mysql提供檢視系統設定和運作狀态的指令。
檢視系統設定:
show [global | session] variables [link_or_where]
show variables: show the values of mysql system variables
運作狀态
show [global | session] status [like_or_where]
show status: provides server status information
如何修改系統配置
方法一:配置檔案設定my.cnf
binlog_cache_size=1M
方法二:set global binlog_cache_size=1048576
一般而言,日志級别的定義沒有會話變量都隻是在全局級别下定義
show global variables like '%log_error%';
log_error定義為錯誤日志檔案路徑
log_error_verbosity
更改錯誤日志位置可以使用log-error來設定形式
vim /etc/my.cnf
log-error=/usr/local/mysql/data/mysqld.err
檢視mysql錯誤日志
tail /usr/local/mysql/data/mysqld.err
為了友善維護需要,有時候會希望将錯誤日志中的内容做備份并重新開始記錄,就可以利用mysql的flush logs指令來告訴mysql備份舊日志檔案并生成新的日志檔案,備份檔案名以.old結尾。
删除錯誤日志
資料庫管理者可以删除很長時間的之前的錯誤日志,保證mysql伺服器上的硬碟空間。mysql資料庫中,可以使用mysqladmin開啟新的錯誤日志:mysqladmin -u root -p flush-logs也可以登入mysql資料庫中使用flush logs語句來開啟新的錯誤日志。
在5.5.7之後,伺服器将關閉此項功能,隻能使用重命名原來的錯誤日志檔案,手動沖洗日志建立一個新的
二進制日志:binarylog & binary log index
二進制日志,就是binlog。主要用于記錄修改資料或有可能引起資料改變的mysql語句,記錄了語句發送時間,執行時長,操作的資料等。通過二進制日志可以查詢mysql資料庫中進行了哪些變化。一般大小體積上限為1G。
當我們通過log-bin=file_name打開了記錄的功能之後,mysql會将所有修改資料庫資料的query以二進制形式記錄到日志檔案中,日志中并不僅限于query語句這麼簡單,還包括每一條query所執行的時間,所消耗的資源,以及相關的事務資訊。和錯誤日志一樣,binlog記錄功能同樣需要log-bin=file_name參數的顯顯式指定才能開啟,如果未指定file_name,則會在資料目錄下記錄為myslq-bin.******
附加選項參數:
max_binlog_size設定binlog的最大存儲上限,一般設定為512M或1G,一般不能超過1G。當日志到達上限時,mysql會重新建立一個日志開始繼續記錄。為了保證事務安全,mysql不會将同一個事務分開記錄到兩個binlog中。
binlog-do-db=db_name參數明确告訴mysql,需要對某個資料庫記錄binlog,mysql會忽略其他資料庫執行的query,而僅僅記錄針對指定資料庫執行query。
binlog-ignore-db=db_name,顯式指定忽略某個資料庫的binlog記錄,當指定了這個參數之後,mysql會記錄指定資料庫以外所有的資料庫的binlog。
binlog-ignore-db=db_name與binlog-do-db=db_name兩個參數中的db_name不是指query語句更新的資料所在的資料庫,而是執行query的時候目前所處的資料庫。不論更新哪個資料庫的資料,mysql僅僅比較目前連接配接所處的資料庫與參數設定的資料庫名,而不會分析query語句所更新資料所在的資料庫
mysql-bin.index檔案的功能是記錄所有binary log的絕對路徑,保證mysql各種線程能夠順利的根據他找到所需要的binary log檔案。
binlog_cache_size=32768 binglog_cache_size:一個事務,在沒有送出的時候産生的日志記錄到cache中,等到事務送出需要送出的時候,則把日志持久化到磁盤。一般來說,如果我們的資料庫中沒有什麼大事務,2MB-4MB。如果資料庫大事務較多,寫入量大,可與适當調高。我們可以通過binlog_cache_use 以及 binlog_cache_disk_use來分析設定的binlog_cache_size是否足夠,是否有大量的binlog_cache由于記憶體大小不夠而使用臨時檔案(binlog_cache_disk_use)來緩存了。
binglog_stmt_cache_size=32768 當事務事務語句使用二進制日志緩存,但是超出binlog_stmt_cache_size時,使用一個臨時檔案來存放這些語句。
事務表支援将批處理當做一個完整的任務統一送出或復原,即對包含在事務中的多條語句要麼全執行,要麼全不執行。
非事務表則不支援此種操作,批處理的語句如果遇見錯誤,在錯誤錢的語句執行成功,之後的則不執行。
log_bin=mysql-bin指定binlog的位置,預設在資料目錄下。
binlog-format={ROW | statement | mixed}指定二進制日志的類型,預設為MIXED。mysql複制主要有三種方式:基于sql語句的,基于行的複制,混合模式複制。對應的,binlog的格式也有三種:statement,row,mixed。
STATEMENT模式SBR
每一條修改的sql語句會記錄到binlog中,優點是并不需要記錄每一行的資料變化,減少binlog日志量,節約io,提高性能。缺點是在某些情況下會導緻master-slave中的資料不一緻。
ROW模式RBR
不記錄每條sql語句的資訊,僅需要記錄哪條資料被修改了,修改成怎麼樣。缺點是會産生大量的日志,讓日志暴漲
MIXED模式MBR
一般的複制使用STATEMENT模式保持binlog,對于STATEMENT模式無法複制的操作使用ROW模式儲存binlog,mysql會根據執行的sql語句選擇日志保持方式。即交替使用行和語句,有mysql伺服器自行判斷。其中基于行的定義格式資料量會大一些但是可以保證資料的準确性。
sync_binlog=10 設定多久同步一次二進制日志至磁盤檔案中,0表示不同步,任何正數值都表示對二進制每多少次寫操作之後同步一次。當autocammit的值為1時,每條語句的執行都會引起二進制日志同步,否則每個事務的送出會引起二進制日志同步。
max_binlog_cache_size={4096..} 二進制日志緩存空間大小,5.5.9及以後的版本僅應用與事務緩存,其上限由max_binlog_stmt_cache_size決定。
max_binlog_stmt_cache_size 二進制日志緩存空間大小,5.5.9及以後的版本僅應用于事務緩存。
expire_log_days 設定二進制日志的過期天數,超出此天數的二進制日志檔案将被自動删除。預設為0,表示不啟用過期自動删除功能。如果啟用此功能,自動删除工作通常發生在mysql啟動或flush日志時。
通過編輯my.cnf中的log-bin選項可以開啟二進制日志
格式:log-bin [=DIR/[filename]]
其中,DIR參數指定二進制檔案的存儲路徑,filename參數指定二級制檔案的檔案名,其形式為filename.number,numer的形式為000001,000002等,每次重新開機mysql服務或允許mysql > flush logs,都會生成一個新的二進制日志檔案,這些日志檔案的number會不斷地遞增。
檢視二進制日志;
二進制日志的定義方式為二進制格式,使用此格式可以存儲更多的資訊,并且可以使寫入二進制日志的效率更高。但是不能直接使用檢視指令打開并檢視二進制日志。
目前使用的二進制檔案及所處位置:show master status;
檢視二進制日志資訊的指令:show binlog events\G;
檢視指定日志的二進制資訊:
二進制日志的記錄位置:通常為1上一個事件執行結束時間的位置
執行偏移量:show binlog events in
指令檢視二進制日志:
由于無法使用cat等方式直接打開并查找二進制日志,所有必須使用mysqlbinlog指令。當時當正在執行mysql讀寫操作時建議不要使用此打開正在使用的二進制日志檔案,若非要打開可flush logs。
删除二進制日志資訊:
二進制日志會記錄大量的資訊,如果長時間不清理二進制日志,将會浪費很多的磁盤空間。但是删除之後可能導緻資料庫崩潰時無法進行恢複,是以若要删除二進制日志首先将其和資料庫備份一份,其中也隻能删除因為這樣可能會給資料庫帶來錯誤的。若非要删除二進制日志需要導出備份資料庫和二進制日志檔案進行壓縮歸檔存儲。
根據檔案或時間點來删除二進制日志:
purge {binary | master} logs {to 'log_name' | before datetiem_expr}
其中to log_name表示把這個檔案之前的其他檔案都删除掉,也可使用before datetime_expr指定把哪個時間之前的之前的二進制檔案删除了。
删除所有的二進制日志
reset master;
事務日志或稱redo日志
事務日志innodb特有的日志可以幫助提高事務的效率。使用事務日志,存儲引擎在修改表資料時隻需要修改其記憶體拷貝,再把修改行為記錄到持久在硬碟上的事務日志中,而不用每次都将修改的資料本身持久到磁盤,事務日志采用追加的方式,是以寫日志的操作是磁盤上一小塊區域内的順序i/o,而不像随機i/o需要在磁盤的多個地方移動磁頭,是以采用事務日志的方式相對來說快得多。
事務日志持久以後,記憶體中被修改的資料在背景可以慢慢的刷回到磁盤,目前大多數的存儲引擎都是這樣實作的。
如果資料的修改已經記錄到事務日志并持久化,但資料本身還沒有寫回磁盤,此時系統崩潰,存儲引擎在重新開機時能夠自動恢複這部分修改的資料。具有的恢複方式則視存儲引擎而定。
本文轉自 宏強 51CTO部落格,原文連結:http://blog.51cto.com/tanhong/1903108