MySQL日誌管理,舊

IT小能手發表於2018-03-16

MySQL日誌管理

查詢有關日誌的變數:show global variables like `%log%` ;
      特別提醒: 如果不明白mysql中的變數請點選 找到其中的  ”mysql伺服器變數“ 部分

所有變數全部可以配置在配置檔案中

A. 錯誤日誌:
     記錄內容: 伺服器啟動和關閉過程中的資訊
           伺服器執行過程中的錯誤資訊
         事件排程器執行一個事件時產生的資訊
           在從伺服器上啟動從伺服器程式時產生的資訊

1. log_error=檔案路徑/檔名 : 定義錯誤日誌檔案,作用範圍為全域性或會話級別 ,可用於配置檔案,屬於非動態變數

2. log_warnings= :設定是否將警告資訊記錄進錯誤日誌,1為啟用(預設),0為禁用,而其值為大於1的數值時表示將新發起連線時產生的”失敗連線”和”拒絕訪問”也記錄進錯誤日誌

B. 一般查詢日誌:
    記錄內容: 每執行一個select 語句,都把相關資訊記錄下來 ,當 log=yes 時(5.6已經棄用) 執行dml語句都會記錄到一般查詢日誌中

1.  general_log={ON|OFF} : 設定是否啟用查詢日誌,預設值為取決於在啟動mysqld時是否使用了–general_log選項。如若啟用此項,其輸出位置則由log_output選項進行定義,如果log_output的值設定為NONE,即使用啟用查詢日誌,其也不會記錄任何日誌資訊。作用範圍為全域性,可用於配置檔案,屬動態變數。

2.  general_log_file=檔案路徑/檔名 : 定義查詢日誌檔案,預設為“hostname.log” 作用範圍為全域性 可用於配置檔案,屬於動態變數

3.  log={YES|NO} : 是否啟用記錄所有語句的日誌資訊於一般查詢日誌中,預設為OFF,5.6已經棄用

4.  log_output={TABLE|FILE|NONE} : 定義一般查詢日誌和慢查詢日誌的儲存方式,可以是TABLE,FILE,NONE也可以是TABLE及FILE的組合(用逗號隔開),預設為TABLE,如果出現了NONE,那麼其他設定都將失效,同時無論是否啟用日誌功能,也不會記錄任何相關資訊。作用範圍為全域性 可用於配置檔案,屬於動態變數

5.  sql_log_off={ON|OFF} : 用於控制是否禁止將一般查詢日誌類資訊記錄進查詢日誌檔案。預設為OFF,表示不禁止記錄功能。使用者可以在會話級別修改此變數的值,但其必須具有SUPER許可權。作用範圍為全域性和會話級別,屬動態變數。

 C.  慢查詢日誌:(慢查詢是指查詢的執行時長超過long_query_time引數所設定時長的事件)

1.  long_query_time= : 查詢時長超過long_query_time指定的時長的就為慢查詢, 這裡的語句執行的時長為實際的執行時間,而非在cpu上的執行時間,預設為10秒鐘,因此,負載較重的伺服器上更容易產生慢查詢。其最小值為0,預設值為10,單位是秒鐘。它也支援毫秒級的解析度。作用範圍為全域性或會話級別,可用於配置檔案,屬動態變數。

2.  log_slow_queries={YES|NO} :是否記錄慢查詢日誌,。 5.6將其該為了 slow_query_log ,作用範圍為全域性級別,可用於配置檔案,屬動態變數

3.  slow_query_log={ON|OFF} : 設定是否啟用慢查詢日誌,0或OFF表示禁用,1或ON 表示啟用,日誌的輸出位置取決於log_output變數的定義,如果其值為NONE即使slow_query_log為ON,也不會記錄任何慢查詢資訊, 作用範圍為全域性 可用於配置檔案,屬於動態變數

4.  slow_query_log_file=檔案路徑/位置 : 設定慢查詢日誌檔案的名稱。預設為hostname-slow.log,但可以通過–slow_query_log_file選項修改。作用範圍為全域性級別,可用於選項檔案,屬動態變數。

5.  log_queries_not_using_indexes  ={ON|OFF} : 設定是否將沒有使用索引的查詢操作記錄到慢查詢日誌。作用範圍為全域性級別,可用於配置檔案,屬動態變數。

 

D.  二進位制日誌:
      記錄內容: 任何引起或可能引起資料庫變化的操作;

      用於複製、即時點恢復;
      只要重啟mysql,二進位制日誌都會滾動

 

二進位制日誌的儲存順序
  首先儲存到快取中(記憶體中)—————>最後同步到二進位制檔案中

二進位制日誌事件格式(在檔案中是怎麼儲存某個事件的):
      事件產生的時間 starttime
      事件相對位置(事件的開始位置是上個事件的結束位置) position

二進位制日誌檔案有兩類:
        索引檔案 : 記錄著能被伺服器找的二進位制檔案
        二進位制日誌檔案

檢視當前正在使用的二進位制日誌檔案: SHOW MASTER STATUS;
檢視二進位制日誌檔案: SHOW BINARY LOGS;
檢視事件:SHOW BINLOG EVENTS IN `二進位制日誌檔名` [FROM 指定開始位置(position)];
刪除指定二進位制檔案之前的日誌檔案 : PURGE BINARY LOGS TO `二進位制日誌檔案`
滾動二進位制日誌或中繼日誌:FLUSH LOGS;
檢視mysql二進位制檔案 :  mysqlbinlog  二進位制檔案 [ [—-start-datetime] [-stop-datetime] ]  [ [–start-position ] [ –stop-position] ]
             –start-datetime  `年-月-日  時:分:秒`   : 指定開始時間 ,時間格式是 
             –stop-datetime : 指定結束時間
             –start-position : 指定開始位置
             –stop-position : 指定結束位置

 

1.  binlog_format={ROW|STATEMENT|MIXED} :   指定二進位制日誌的型別,預設為STATEMENT。如果設定了二進位制日誌的格式,卻沒有啟用二進位制日誌,則MySQL啟動時會產生警告日誌資訊並記錄於錯誤日誌中。作用範圍為全域性或會話,可用於配置檔案,且屬於動態變數。

        二進位制日誌的格式:
          基於語句: statement
          基於行: row
          混合方式: mixed

2.  expire_logs_days={0..99} : 設定二進位制日誌的過期天數,超出此天數的二進位制日誌檔案將被自動刪除。預設為0,表示不啟用過期自動刪除功能。如果啟用此功能,自動刪除工作通常發生在MySQL啟動時或FLUSH日誌時。作用範圍為全域性,可用於配置檔案,屬動態變數。

3. log_bin={YES|NO} : 是否啟用二進位制日誌,設定二進位制檔案的位置(在配置檔案中  log_bin=二進位制檔案的位置 ) ,如果為mysqld設定了–log-bin選項,則其值為ON,否則則為OFF。其僅用於顯示是否啟用了二進位制日誌,並不反應在配置檔案中log-bin的設定值。作用範圍為全域性級別,屬非動態變數。

 4. sql_log_bin={ON|OFF} : 用於控制二進位制日誌資訊是否記錄進二進位制日誌檔案。預設為ON,表示啟用記錄功能。使用者可以在會話級別修改此變數的值,但其必須具有SUPER許可權。作用範圍為全域性和會話級別,屬動態變數。

5.  log_slave_updates : 用於設定複製場景中的從伺服器是否將從主伺服器收到的更新操作記錄進本機的二進位制日誌中。本引數設定的生效需要在從伺服器上啟用二進位制日誌功能。

6. max_binlog_cache_size{4096 .. 18446744073709547520} : 二進定日誌快取空間大小,5.5.9及以後的版本僅應用於事務快取,其上限由max_binlog_stmt_cache_size決定。作用範圍為全域性級別,可用於配置檔案,屬動態變數。

7. sync_binlog=#  設定多久同步一次二進位制日誌至磁碟檔案中(從記憶體中同步到二進位制檔案中),0表示不同步 <-見下文–  sync_binlog=0:表示當事務提交後,不立即將binlog cache中的記錄同步到磁碟,具體何時同步,讓檔案系統自行決定,或者cache滿了之後才同步 —>任何正數值都表示對二進位制每多少次寫操作之後同步一次。當autocommit(事務自動提交)的值為1時,每條語句的執行都會引起二進位制日誌同步,否則,每個事務的提交會引起二進位制日誌同步 <-見下文– sync_binlog=n: 表示事務多少次提交後才將binlog cache中的記錄同步到磁碟—>

8. autocommit={0|1}
 設定MySQL事務是否自動提交,1表示立即提交,0表示需要顯式提交。作用範圍為全域性或會話,可用於配置檔案中(但在5.5.8之前的版本中不可用於配置檔案),屬於動態變數。

9. max_binlog_size={4096 .. 1073741824} : 設定二進位制日誌檔案上限,單位為位元組,最小值為4K,最大值為1G,預設為1G。某事務所產生的日誌資訊只能寫入一個二進位制日誌檔案,因此,實際上的二進位制日誌檔案可能大於這個指定的上限。作用範圍為全域性級別,可用於配置檔案,屬動態變數。

 

 

D.  中繼日誌
從主伺服器的二進位制日誌檔案中複製而來的事件,並儲存為日誌檔案;

 

 

E.  事務日誌:

    記錄 :事務執行過程當中對資料的修改資訊
  
  作用 :只有事務性儲存引擎 用於保證原子性、一致性、隔離性和永續性(ACID);

事務日誌儲存的順序:
  首先儲存快取(記憶體中)——->然後同步到事務日誌檔案中——->最後同步到資料檔案中

mysql奔潰重啟後必須保證( 崩潰恢復)
    已經提交的事務,相關的資料必須從日誌檔案中同步的資料檔案中,
    沒提交的事務,必須撤銷

ACID,將隨機IO轉換為順序IO;

 

1.  innodb_flush_log_at_trx_commit={0|1|2}   :定義如何將快取中的事務日誌同步到事務日誌檔案中  0表示每秒同步,並執行磁碟flush操作; 1(預設)表示每當有事務提交同步,並執行磁碟flush操作; 2: 每當有事務提交,但不執行磁碟flush操作; 

 2.  innodb_log_buffer_size={262144 .. 4294967295} : 設定InnoDB用於輔助完成日誌檔案寫操作的日誌緩衝區(事務日誌的快取區)大小,單位是位元組,預設為8MB。較大的事務可以藉助於更大的日誌緩衝區來避免在事務完成之前將日誌緩衝區的資料寫入日誌檔案,以減少I/O操作進而提升系統效能。因此,在有著較大事務的應用場景中,建議為此變數設定一個更大的值。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

3.  innodb_log_file_size={108576 .. 4294967295} : 設定日誌組(事務日誌組)中每個日誌檔案的大小,單位是位元組,預設值是5MB。較為明智的取值範圍是從1MB到快取池體積的1/n,其中n表示日誌組中日誌檔案的個數。日誌檔案越大,在快取池中需要執行的檢查點刷寫操作就越少,這意味著所需的I/O操作也就越少,然而這也會導致較慢的故障恢復速度。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

4.  innodb_log_files_in_group={2 .. 100} : 設定日誌組(事務日誌組)中日誌檔案的個數。InnoDB以迴圈的方式使用這些日誌檔案。預設值為2。作用範圍為全域性級別,可用於選項檔案,屬非動態變數

5.  innodb_log_group_home_dir=/PATH/TO/DIR :  設定InnoDB重做日誌檔案的儲存目錄。在預設使用InnoDB日誌相關的所有變數時,其預設會在資料目錄中建立兩個大小為5MB的名為ib_logfile0和ib_logfile1的日誌檔案。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

6.innodb_support_xa={TRUE|FLASE}:  用來定義innodb是否支援分散式事務。儲存引擎事務在儲存引擎內部被賦予了ACID屬性,分散式(xa)事務是一種高層的事務,它利用”準備“和”提交“(prepare-then-commit)兩段式的方式將ACID屬性擴充套件到儲存引擎外部,甚至是資料庫外部,然而,”準備“階段會導致額外的磁碟刷寫操作。XA需要事務協調員,它會通知所有參與者準備提交事務(階段1),當協調員從所有參與者哪裡收到”就緒“資訊時,它會指示所有參與者進行真正的”提交“操作,
此變數正是用於定義Innodb是否支援兩段式提交的分散式事務,預設為啟用,事實上,所有啟用了二進位制日誌的並支援多個執行緒同時向二進位制日誌寫入資料的mysql伺服器都需要啟用分散式事務,否則,多個執行緒對二進位制日誌的寫入操作可能會以與原始次序不同的方式完成,這將會在基於二進位制日誌的恢復操作中或者是從伺服器上建立出不同原始資料的結果。因此,除了僅有一個執行緒可以改變資料以外的其它應用場景都不應該禁用此功能。而在僅有一個執行緒可以修改資料的應用中,禁用此功能是安全的並可以提升Innodb表效能。作用範圍是全域性和會話級別

 

 

max_relay_log_size={4096..1073741824} 

設定從伺服器上中繼日誌的體積上限,到達此限度時其會自動進行中繼日誌滾動。此引數值為0時,mysqld將使用max_binlog_size引數同時為二進位制日誌和中繼日誌設定日誌檔案體積上限。作用範圍為全域性級別,可用於配置檔案,屬動態變數。

  log_bin_trust_function_creators={TRUE|FALSE} : 此引數僅在啟用二進位制日誌時有效,用於控制建立儲存函式時如果會導致不安全的事件記錄二進位制日誌條件下是否禁止建立儲存函式。預設值為0,表示除非使用者除了CREATE ROUTING或ALTER ROUTINE許可權外還有SUPER許可權,否則將禁止建立或修改儲存函式,同時,還要求在建立函式時必需為之使用DETERMINISTIC屬性,再不然就是附帶READS SQL DATA或NO SQL屬性。設定其值為1時則不啟用這些限制。作用範圍為全域性級別,可用於配置檔案,屬動態變數。

relay_log=file_name 
設定中繼日誌的檔名稱,預設為host_name-relay-bin。也可以使用絕對路徑,以指定非資料目錄來儲存中繼日誌。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

relay_log_index=file_name 
設定中繼日誌的索引檔名,預設為為資料目錄中的host_name-relay-bin.index。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

relay-log-info-file=file_name 
設定中繼服務用於記錄中繼資訊的檔案,預設為資料目錄中的relay-log.info。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

relay_log_purge={ON|OFF} 
設定對不再需要的中繼日誌是否自動進行清理。預設值為ON。作用範圍為全域性級別,可用於選項檔案,屬動態變數。

relay_log_space_limit=# 
設定用於儲存所有中繼日誌檔案的可用空間大小。預設為0,表示不限定。最大值取決於系統平臺位數。作用範圍為全域性級別,可用於選項檔案,屬非動態變數。

 

 

 

 

 

MyISAM: 
不支援事務 
表鎖 
不支援外來鍵 
B樹索引、FULLTEXT索引、空間索引 
支援表壓縮 
.frm 
.MYD 
.MYI 
InnoDB: 
事務 
行級鎖 
B樹索引、聚簇索引、自適應hash索引 
表空間,raw磁碟裝置; 
.frm 
.ibd

 

 

 

 

 max_allowed_packet=20M   #引數的作用是,用來控制其通訊緩衝區的最大長度

 skip_name_resolve              #這個引數是禁止域名解析的 開啟後 mysql.user表中基於主機名的授權將無法使用 在配置檔案中指定了,無論是skip_name_resolve=off或者skip_name_resolve=0 最後,通過show variables like `%skip_name_resolve%`檢視均顯示ON。將該  引數設定為OFF的唯一辦法是不寫該引數(因為它預設值即為OFF)。

skip_slave_start   #使slave在mysql啟動時不啟動複製程式,mysql起來之後使用 start slave啟動

 

 binlog_format:可選值“MIXED”、“ROW”、“STATEMENT”,在5.6版本之前預設為“STATEMENT”,5.6之後預設為“MIXED”;因為“STATEMENT”方式在處理一些“不確定”性的方法時會造成資料不一致問題,我們建議使用“MIXED”或者“ROW”。<—- binlog_format詳解—->

 

 

 

MySQL binlog日誌優化

 

此部分來自 :https://www.cnblogs.com/jandison/p/4229331.html

 mysql中日誌型別有慢查詢日誌,二進位制日誌,錯誤日誌,預設情況下,系統只開啟錯誤日誌,因為開啟日誌會產生較大的IO效能消耗。

 
一般情況下,生成系統中很少開啟二進位制日誌(bin log),bin log日誌的優化策略:
mysql> show variables like `%binlog%`;
+—————————————–+———————-+
| Variable_name                           | Value                |
+—————————————–+———————-+
| binlog_cache_size                       | 32768                |
| binlog_checksum                         | CRC32                |
| binlog_direct_non_transactional_updates | OFF                  |
| binlog_format                           | ROW                  |
| binlog_max_flush_queue_time             | 0                    |
| binlog_order_commits                    | ON                   |
| binlog_row_image                        | FULL                 |
| binlog_rows_query_log_events            | OFF                  |
| binlog_stmt_cache_size                  | 32768                |
| binlogging_impossible_mode              | IGNORE_ERROR         |
| innodb_api_enable_binlog                | OFF                  |
| innodb_locks_unsafe_for_binlog          | OFF                  |
| max_binlog_cache_size                   | 18446744073709547520 |
| max_binlog_size                         | 1073741824           |
| max_binlog_stmt_cache_size              | 18446744073709547520 |
| sync_binlog                             | 0                    |
+—————————————–+———————-+
 
binlog_cache_size:在事務過程中,用來儲存二進位制SQL語句的快取大小。二進位制日誌快取使用的前提條件是伺服器端使用了支援事務的引擎以及開啟了binlog功能。
該引數為每個客戶端都分配binlog_cache_size大小的快取,如果使用者頻繁使用多語句事務的話,可以增大binlog_cache_size大小,已獲得更好的效能,如何判斷binlog_cache_size
設定的是否合理呢?通過如下兩個狀態可以判斷:<—具體見有道筆記 二進位制日誌 —>
 
mysql> show status like `binlog%`;
+—————————-+——-+
| Variable_name              | Value |
+—————————-+——-+
| Binlog_cache_disk_use      | 1     |
| Binlog_cache_use           | 33    |
+—————————-+——-+
 
max_binlog_size :binlog大小的最大值,一般為512M或1G,但不能超過1G,該大小不能嚴格控制binlog日誌大小,如果在binlog大小臨界點的時候執行了一個大事務,為了保證事務完整性,不能做日誌切換,只能將該事務的所有sql記錄當前日誌中。其實mysql的binlog日誌記錄的是帶來資料改變的DML,DDL操作
 
sync_binlog:該引數用來控制以何種方式將binlog cache中的記錄同步(fsync)到磁碟。以下是它的引數值的說明;
sync_binlog=0: 表示當事務提交後,不立即將binlog cache中的記錄同步到磁碟,具體何時同步,讓檔案系統自行決定,或者cache滿了之後才同步。這種方式效能最好,都是風險也最大,一旦系統當機,binlog cache中所有的記錄都會丟失,如果將sync_binlog值設為1的話,最安全,因為即使系統當機,也只丟失一個事務的操作記錄,都是效能最差,事務每提交一次就會將binlog_cache中的記錄同步到磁碟。
sync_binlog=n: 表示事務多少次提交後才將binlog cache中的記錄同步到磁碟
 
mysql的主從同步就是slave端通過IO執行緒將master端產生的日誌同步到slave端的中繼日誌,然後通過SQL執行緒將中繼日誌在slave端重演。所以master端的日誌量大小,直接影響了salve端同步的效能,通常情況下,master端產生binlog日誌量是無法避免的,但是可以通過設定引數有選擇性地同步哪些資料庫或表產生的binlog日誌來減少binlog日誌同步量。
 
binlog_do_db:設定哪些資料庫需要記錄binlog(master端)
binlog_ignore_db:設定哪些資料庫不需要記錄binlog(master端)
 
replicate_do_db:設定哪些資料庫需要同步binlog,多個資料庫用逗號”,“隔開
replicate_ignore_db:設定哪些資料庫不需要同步binlog,多個資料庫用逗號”,“隔開
replicate_do_table:設定哪些表需要同步binlog
replicate_ignore_table:設定哪些表不需要同步binlog
replicate_wild_do_table:設定哪些表需要同步binlog,與replicate_do_table的區別是可以使用萬用字元的方式來指定表
replicate_wild_ignore_table:設定哪些表不需要同步binlog,與replicate_ignore_table的區別是可以使用萬用字元的方式來指定表
 
如果在master端設定了上面兩個引數。會減少master端binlog日誌的記錄量,降低master端日誌IO量,減少同步到slave端時的網路通訊量,進而降低slave端IO執行緒同步日誌量和SQL執行緒應用relay log量。但是需要注意的是,mysql判斷是否複製某個event不是根據產生該event的query中指定的db名來記錄的,而是根據執行該query時所在的db(即using dbname)是否是binlog_do_db指定的db,若是,則記錄,否則不記錄。考慮如下場景:
有三個資料庫:A,B,C,其中binlog_do_db=B,C
應用登入時預設db是A,現執行如下query:update B.t1 set c1 = xxx;這種情況下,mysql是不記錄binlog的,由於對B庫下的t1表的update操作不記錄binlog,所以無法同步到slave端,進而會導致master與slave資料不一致。
 如果所在db等於binlog_do_db,此時修改了不需要同步的db下的表也會記錄binlog日誌,即該db下所有改變db資料的query都會記錄binlog
即應用登入db是B,執行query:update A.t1 set c1=xxx;此時也會記錄binlog日誌。由於binlog_do_db中沒有A庫,所以slave端不會有A庫,從而導致slave端無法找到A庫而報錯。
 
如果在slave端設定後面六個引數,無論master該複製或不該複製的event都會被同步到slave端,這樣帶來的負面影響是IO,網路的壓力,和slave端IO執行緒寫入relay log的壓力,但是可以減少slave端SQL執行緒應用relay log的日誌量,由於設定了replicate_do_db,replicate_ignore_db會過濾相應的日誌,所以可以規避預設db是否等於binlog_do_db問題。
 
 
 
 
 
 

mysql中binlog_format模式與配置詳解

相關文章