5. MySQL 服務管理... 1
5.1 The Mysql Server1
5.2 Mysql 服務日志... 1
5.2.1 選擇General query log和slow query log 的輸出方式... 1
5.2.2 Error Log. 1
5.2.3 General Query Log. 1
5.2.4 Binary Log. 1
5.2.4.1 binary log日志記錄方式... 1
5.2.4.2設置binary log格式... 1
5.2.4.3混合binary log模式... 1
5.2.4.4 mysql數據庫的log format1
5.2.5 Slow Query Log. 1
5.2.6 服務日志維護... 1
5.3 一個設備運行多個實例... 1
5.4 使用DTrace跟蹤mysqld.. 1
5.4.1 mysqld DTrace Probe 說明... 1
略
Mysql有5類日志:
error log:mysql執行時的一些信息(和mssql的錯誤日志類似)
General query log:從客戶端上過來的語句和連接
Binary log:修改數據庫的日志(類似mssql的事務日志)
Relay log:從復制的master服務器傳過來的日志
Slow query log:查詢超過long_query_time的查詢
默認是不啟動什麼日志的。並且默認當日志啟動的時候,都是放在數據文件夾下。日志的刷新使用命令FLUSH LOGS當然還有別的比如通過mysqladmin,mysqldump等。當binary log超過max_bing_size的時候,也會自動刷新日志。刷新日志是關閉現在的日志並重新打開。
可以在運行時設置general query log 和slow query log,可以在服務啟動的狀態下,啟動關閉,配置日志路徑。
general query log 和 slow query log的輸出方式為文件或者表(slow_log,general_log),寫入表比寫入文件負荷要高,可以使用—log-output命令行參數或者log-output變量。
log-output取值有3個:.FILE,存到文件中,.TABLE,存到表中,.NONE,不存,默認為FILE。
general_log:設置是否啟動general log和slow_query_log 類似
general_log_file指定輸出文件和slow_query_log_file類似
任意日志啟動後,都會在日志文件上寫入服務啟動信息,但是後續的數據是否寫入到日志文件中由log-output決定。
另外sql_log_off控制所在session生成的sql是否寫入到general log。
日志數據寫入到表的好處:
1.一個標准的格式(格式固定)
2.可以通過sql 訪問日志數據
3.可以遠程訪問
日志表實現有一下幾個特點:
1.日志表是為了看如何運行,而不是為了干涉運行
2.create table,alter table,drop table 可以應用在日志表上,alter table和drop table 會堵塞日志表。
3.默認日志表示CSV的,如果要換成myisam要先停止日志。
4.停止日志之後就可以alter table 或者drop table
5.可以truncate table 日志表
6.可以rename table 日志表
7.可以check table 日志表
8.lock table不能使用
9.insert,delete,update不能操作
10.flush tables with read lock或者read_only變量無效。
11.日志表上的更改不會寫入binary log,不能用於復制
12.刷新日志表或日志文件分別使用 FLUSH TABLES或者FLUSH LOGS
13.不能使用表分區
14.在5.6.6之前不能mysqldump導出日志表,As of 5.6.6, the dump includes statements to recreate those tables so that they are not missing after reloading the dump file. Log table contents are not dumped.(測試之後 5.6.19可以用mysqldump,需要加--skip-lock-tables,10.0.10-MariaDB-log也一樣。)
error log中包含了從mysqld從啟動到結束所有主要錯誤。一些平台下面,當mysqld掛了的時候,會把mysqld的堆棧dump到error log中。error log的位置由—log-error指定。若沒有,那麼默認使用host_name.err。可以使用flush logs來刷新error log。mysqld會關閉日志並重新打開。
如果要rename,先mv掉,然後flush logs。
shell> mv host_name.err host_name.err-old
shell> mysqladmin flush-logs
shell> mv host_name.err-old backup-directory
如果是使用mysqld_safe來啟動的mysqld。異常退出,會寫入通知到error log需要重啟mysqld。
log-warnings等於1啟動寫入warning到error log,如果大於1,會把非法種植的連接和拒絕的訪問寫入到log-warnings。
general query log記錄了mysqld需要做些什麼。當想要知道客戶端發送什麼到mysqld 的時候這個日志非常有用。mysqld根據收到語句的順序寫入到日志中。和bin log不同,bin log是在語句執行完成,但是鎖釋放前(提交前)寫入bin log的。
默認general log是關閉的,可以設置general-log變量或者—general-log命令行配置。
使用—general_log_file指定日志路徑,使用—log-output指定日志輸出方式。
如果的日志名為host_name.log。設計到general log的日志都有對應的變量可以設置。
服務重啟或者flush logs並不會引起創建一個新的general log,如果要創建一個新的,應該先mv,然後flush logs。
shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> mv host_name-old.log backup-directory
變量sql_log_off可以設置session級別的是否寫入general log。
Binary Log其實是數據修改的“事件”的日志。binary log主要有2個目的:
1.用於復制,master上的binary log發送給slave服務。
2.數據恢復操作需要用到binary log。
binary log不記錄select或者show語句。
開啟binary log會讓性能稍微降低。
啟動binary log可以設置命令行配置—log-bin[=base_name]默認名稱為,pid-file選項的名稱。pid-file選項默認為設備的host,然後加上-bin。如果在指定log-bin的時候加了後綴,那麼會被自動忽略。
每次flush logs的時候,會重新創建一個新的日志文件。binlog文件超過了max_binlog_size的時候,也會重新創建一個新的日志文件。當出現大事務的時候,因為一個事務要放在一個binlog上,所以也可能出現大於max_binlog_size。
所有的binary log被記錄在binary log index文件裡面,這個文件可以由—log-bin-index修改。默認為bin_log.index。最好不要手動去修改,會讓mysqld產生混亂。
如果客戶端有SUPER權限,可以通過set sql_log_bin=0來禁止該session的語句寫入到binary log。
binary log默認在寫入日志的時候,服務會寫入“事件”長度。然後在讀取binary log的時候會根據長度來驗證binary log。
可以使用binlog-checksum變量來指定bin log 寫入checksum,在讀的時候使用master_verify_checksum來指定使用使用checksum驗證。slave i/o線程也可以使用chunksum來驗證relay log過來的日志,slave_sql_verify_checksum。
“事件”被記錄在binary log的時候有2中模式:1.行模式,2.語句模式。
--binlog-do-db和--binlog-ignore-db來忽略對某些db的binary log和—replicate-do-db,--replicate-ignore-db類似。
slave服務一般不把數據修改寫入到binary log中,只有啟動了—log-slave-update和—log-bin之後才會寫入,一般用來做復制鏈
可以使用RESET MASTER或者PURGE BINARY LOGS來清空binary log。如果有復制那麼句不應該在沒有恢復完之前刪除binary log。
binary log 的內容可以通過mysqlbinlog工具查看裡面的內容。
binary log的寫入是語句執行完之後,在釋放鎖之前(提交前)寫入。沒事務性表,會在執行完之後馬上插入到binary log。
若是未提交事務,所有的寫入事務表都會被緩存,直到接收commit,這個時候寫入到binary log,然後再執行commit。
非事務表是不能回滾的,所以當一個事務如果包含了非事務性表的操作,回滾的時候,會在binary log上 ROLLBACK,這樣非事務性表的修改就能夠被復制。
binlog_cache_szie用來緩存binlog,如果操作會使用臨時文件保存。
binlog_cache_use狀態變量,顯示了緩存的事務個數。binlog_cache_disk_use狀態變量顯示了緩存的事務存在臨時文件的個數。可以使用上面2個狀態變量來調整binlog_cache_size。
max_binlog_cache_size系統變量(默認4gb)可以用來限制所有緩存事務的大小。如果一個事務超過了這個值,就會報錯回滾。最小值為4096。
默認binary log不是同步寫入到磁盤的,如果系統或者設備crash,可能會照成binary log數據丟失。可以通過sync_binlog來控制經過N個寫入之後,然後寫入到磁盤。sync_binlog為1的時候最安全,但是也是最慢的。而且不能保證不丟失數據,當在發出commit命令後,寫入binary log然後提交事務,如果出現在 寫入binary log 和提交事務之間。那麼事務會被回滾,但是還是會存在在binary log內。可以使用—innodb_support_xa來保證事務一致性。但是發布於支持XA事務的innodb。
該選項提供了更高的安全性,mysql服務也要同步的寫入binlog,並且在innodb上提交事務前要寫入日志到磁盤。innodb日志默認是同步的,sync_binlog=1也可以用來同步binary log。該選項主要是在crash restart的時候,如果回滾會剪切binary log中的innodb事務,這樣就保證了slave和master的一致性。
如果mysql服務crash restart,發現binary log比預期的要短,就會出錯:
The binary log
file_name
is shorter than its expected size
.
以下session value會被寫入到binary log,被應用在slave解析binary log階段:
· sql_mode
(except that the NO_DIR_IN_CREATE
mode is not replicated; see Section 17.4.1.34, “Replication and Variables”)
· foreign_key_checks
· unique_checks
· character_set_client
· collation_connection
· collation_database
· collation_server
· sql_auto_is_null
binary log格式體現在變量binlog_format中有3方式:
1.語句模式(--binlog-format=STATEMENT),記錄發送的語句。(默認)
2.行模式(--binlog-format=ROW),記錄發生修改的行。
3.混合模式(--binlog-format=MIXED),即混合了語句模式和行模式
如果復制是基於語句模式的binary log會發送非確定性的語句,導致master和slave出現不一致性。mysql會保證語句是否可以復制到slave的一致性,如果保證不了會有一個警告:
Statement may not be safe to log in statement format.
可以使用命令行參數—binlog-format=type設置,type有3個值:STATEMENT(默認),ROW,MIXED。適用范圍是:global,session。
Command-Line Format
--binlog-format=format
Option-File Format
binlog-format
System Variable Name
binlog_format
Variable Scope
Global, Session
Dynamic Variable
Yes
Permitted Values
Type
enumeration
Default
STATEMENT
Valid Values
ROW
STATEMENT
MIXED
修改binlog_format的值必須要有 SUPER
權限。
當發生服務是運行在STATEMENT或者MIXED模式下,但是寫入日志使用了ROW的日志方式。這個事件在slave中會被臨時切換到ROW模式。
session變量設置原因:
1.session,修改只影響了很少的行,可以使用ROW
2.session,修改影響了很多行,使用STATEMENT
3.session,在master上執行時間很差,但是只修了一些行,可以使用ROW
一下情況下不能切換復制模式(切換會報錯):
1.在存儲過程或者觸發器內
2.使用了NDBCLUSTER存儲引擎
3.session在ROW復制模式(replication format,我認為是和binary log模式一樣的東西)下,並且已經打開了臨時表
當存在臨時表的時候建議不要修改復制方式,因為臨時表只有在語句模式下才會被記錄。
在binary log模式為ROW情況下很多修改都是以行方式記錄,但是DDL都是以語句方式記錄。
--binlog-row-event-max-size選項,應用在有基於行的復制下,行保存的大小不能超過這個選項的大小。這個值必須是256的倍數,默認是1024。
如果使用混合模式,在以下條件下,會把 statement-base切換為row-base:
Ÿ 當一個包含函數UUID()
Ÿ 當一個或者多個表有auto-increment列被更新,並且觸發器或者存儲方法被調用。
Ÿ 調用了視圖,視圖體的語句需要row-base。
Ÿ 調用了UDF,用戶自定義函數。
Ÿ 非事務表上執行了INSERT DELAYED。
Ÿ 如果會話使用了臨時表,那麼之後都會以row-base保存。
Ÿ 當FOUND_ROWS()或者ROW_COUNT()函數被使用的時候。
Ÿ 當USER(),CURRENT_USER(),CURRENT_USER被使用的時候。
Ÿ 當語句使用了系統變量的時候。
一下系統變量,在session級別使用,不會影響日志模式的切換:
Ÿ auto_increment_increment
Ÿ auto_increment_offset
Ÿ character_set_client
Ÿ character_set_connection
Ÿ character_set_database
Ÿ character_set_server
Ÿ collation_connection
Ÿ collation_database
Ÿ collation_server
Ÿ foreign_key_checks
Ÿ identity
Ÿ last_insert_id
Ÿ lc_time_names
Ÿ pseudo_thread_id
Ÿ sql_auto_is_null
Ÿ time_zone
Ÿ timestamp
Ÿ unique_checks
存儲引擎,binary log模式支持情況。
Storage Engine
Row Logging Supported
Statement Logging Supported
ARCHIVE
Yes
Yes
BLACKHOLE
Yes
Yes
CSV
Yes
Yes
EXAMPLE
Yes
No
FEDERATED
Yes
Yes
HEAP
Yes
Yes
InnoDB
Yes
Yes when the transaction isolation level is REPEATABLE READ orSERIALIZABLE; No otherwise.
MyISAM
Yes
Yes
MERGE
Yes
Yes
NDB
Yes
No
一個語句會被以什麼模式記錄,取決於:1.語句本身,2.log_format,3.存儲引擎。
1.binlog-format=mixed,語句本身unsafe,就要求ROW方式寫入,如果語句本row injection要求ROW方式寫入。
2.當語句,binlog-format,引擎支持,任意之間出現沖突這無法寫入error。
具體表格查看:
http://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html
mysql上面的數據可能會通過DML語句直接修改,也可能通過DDL語句修改。
DML:DML語句對mysql數據庫的修改,會依據binlog_format來。
DDL:DDL語句對mysql數據庫修改,會以語句方式,不會理睬binlog_format。
slow log包括,執行時間超過 long_query_time並且至少請求min_examined_row_limit條記錄。
執行時間並不包含初始化表鎖的時間,mysqld會在執行完並且釋放鎖之後寫入到日志。所以日志上的順序和執行順序不同。
默認slow query log 是不啟動的,可以通過—slow_query_log設置,通過—slow_query_log_file來設置日志文件所在位置。--log_output來設置輸出方式。如果沒有指定shlow_query_log_file默認為host_name-slow.log。
若日志啟動會寫入到log。若啟動設置了文件方向,才會把後續的內容寫到日志文件中,否則寫入到表中。
如果設置了—log-short-format會盡量減少寫入的日志信息。若要把管理性的語句寫入到日志文件,需要啟動—log-slow-admin-statements。
log_queries_not_using_indexes控制把沒有使用索引的查詢寫入到日志。
log_throttle_queries_not_using_indexes是為了減少slow query log增長太快,每60s為一個區間,在區間內發送了log_throttle_queries_not_using_indexes個沒有使用索引的語句寫入到日志文件。
1.如果是非管理性語句或者log-slow-admin-statements=1
2.long_query_time或者log_queries_not_using_indexes符合
3.至少要達到請求min_examined_row_limit行
4.不在log_throttle_queries_not_using_indexes限制返回內的sql
slave不寫slow query log,除非啟動了—log-slow-slave-statement。
注:
log_throttle_queries_not_using_indexes,只會對沒有使用索引的sql處理。
對於binlog可以設置expire_logs_days自動過期binary log。如果有復制存在,設置的值不應該小余slave的延遲。也可以通過purge binary logs語句來手動清理日志。
通過flush logs手動讓binary log啟動一個新的日志文件。
日志刷新做一下動作:
1.如果啟動了general log 或者show query log,服務會關閉當前文件並且重新打開。
2.如果bianry log啟動了,服務會關閉binary log 文件並且打開一個新的binary log 文件。
3.如果啟動了error log,那麼會關閉文件並且重新打開。
若要新建文件可以先使用mv命令重命名,然後flush logs。
略
DTrace在mysql中被用來提供mysql執行查詢的信息,在執行過程中不同區域系統的使用。
DTrace可以跟著從連接到查詢執行然後返回的全部過程。
mysql DTrace 提供了一下事件(probe):
Group
Probes
Connection
connection-start
, connection-done
Command
command-start
, command-done
Query
query-start
, query-done
Query Parsing
query-parse-start
, query-parse-done
Query Cache
query-cache-hit
, query-cache-miss
Query Execution
query-exec-start
, query-exec-done
Row Level
insert-row-start
, insert-row-done
update-row-start
, update-row-done
delete-row-start
, delete-row-done
Row Reads
read-row-start
, read-row-done
Index Reads
index-read-row-start
, index-read-row-done
Lock
handler-rdlock-start
, handler-rdlock-done
handler-wrlock-start
, handler-wrlock-done
handler-unlock-start
, handler-unlock-done
Filesort
filesort-start
, filesort-done
Statement
select-start
, select-done
insert-start
, insert-done
insert-select-start
, insert-select-done
update-start
, update-done
multi-update-start
, multi-update-done
delete-start
, delete-done
multi-delete-start
, multi-delete-done
Network
net-read-start
, net-read-done
, net-write-start
, net-write-done
Keycache
keycache-read-start
, keycache-read-block
, keycache-read-done
, keycache-read-hit
, keycache-read-miss
, keycache-write-start
, keycache-write-block
,keycache-write-done
我有,到www.baidu.com裡面搜!
密碼錯了