天天看點

[MySQL Reference Manual] 5 MySQL 服務管理 5. MySQL 服務管理

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442383">5. MySQL 服務管理</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442384">5.1 The Mysql Server</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442385">5.2 Mysql 服務日志</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442386">5.2.1 選擇General query log和slow query log 的輸出方式</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442387">5.2.2 Error Log</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442388">5.2.3 General Query Log</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442389">5.2.4 Binary Log</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442390">5.2.4.1 binary log日志記錄方式</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442391">5.2.4.2設定binary log格式</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442392">5.2.4.3混合binary log模式</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442393">5.2.4.4 mysql資料庫的log format</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442394">5.2.5 Slow Query Log</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442395">5.2.6 服務日志維護</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442396">5.3 一個裝置運作多個執行個體</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442397">5.4 使用DTrace跟蹤mysqld</a>

<a href="http://www.cnblogs.com/Amaranthus/p/3852947.html#_Toc393442398">5.4.1 mysqld DTrace Probe 說明</a>

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&gt; mv host_name.err host_name.err-old

shell&gt; mysqladmin flush-logs

shell&gt; 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&gt; mv host_name.log host_name-old.log

shell&gt; 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比預期的要短,就會出錯:

<code>The binary log</code> <code>file_name</code> <code>is shorter than its expected size</code>.

以下session value會被寫入到binary log,被應用在slave解析binary log階段:

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

<code>--binlog-format=format</code>

Option-File Format

<code>binlog-format</code>

System Variable Name

<a href="http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_format">binlog_format</a>

Variable Scope

Global, Session

Dynamic Variable

Yes

Permitted Values

Type

<code>enumeration</code>

Default

<code>STATEMENT</code>

Valid Values

<code>ROW</code>

<code>MIXED</code>

當發生服務是運作在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級别使用,不會影響日志模式的切換:

存儲引擎,binary log模式支援情況。

Storage Engine

Row Logging Supported

Statement Logging Supported

ARCHIVE

BLACKHOLE

CSV

EXAMPLE

No

FEDERATED

HEAP

InnoDB

MyISAM

MERGE

<a href="http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster.html">NDB</a>

一個語句會被以什麼模式記錄,取決于:1.語句本身,2.log_format,3.存儲引擎。

1.binlog-format=mixed,語句本身unsafe,就要求ROW方式寫入,如果語句本row injection要求ROW方式寫入。

2.當語句,binlog-format,引擎支援,任意之間出現沖突這無法寫入error。

具體表格檢視:

<a href="http://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html">http://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html</a>

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

[MySQL Reference Manual] 5 MySQL 服務管理 5. MySQL 服務管理

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 Reference Manual] 5 MySQL 服務管理 5. MySQL 服務管理

mysql DTrace 提供了一下事件(probe):

Group

Probes

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-connection.html">Connection</a>

<code>connection-start</code>, <code>connection-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-command.html">Command</a>

<code>command-start</code>, <code>command-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-query.html">Query</a>

<code>query-start</code>, <code>query-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-query-parsing.html">Query Parsing</a>

<code>query-parse-start</code>, <code>query-parse-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-querycache.html">Query Cache</a>

<code>query-cache-hit</code>, <code>query-cache-miss</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-queryexec.html">Query Execution</a>

<code>query-exec-start</code>, <code>query-exec-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-rowlevel.html">Row Level</a>

<code>insert-row-start</code>, <code>insert-row-done</code>

<code>update-row-start</code>, <code>update-row-done</code>

<code>delete-row-start</code>, <code>delete-row-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-readrow.html">Row Reads</a>

<code>read-row-start</code>, <code>read-row-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-index.html">Index Reads</a>

<code>index-read-row-start</code>, <code>index-read-row-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-lock.html">Lock</a>

<code>handler-rdlock-start</code>, <code>handler-rdlock-done</code>

<code>handler-wrlock-start</code>, <code>handler-wrlock-done</code>

<code>handler-unlock-start</code>, <code>handler-unlock-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-filesort.html">Filesort</a>

<code>filesort-start</code>, <code>filesort-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-statement.html">Statement</a>

<code>select-start</code>, <code>select-done</code>

<code>insert-start</code>, <code>insert-done</code>

<code>insert-select-start</code>, <code>insert-select-done</code>

<code>update-start</code>, <code>update-done</code>

<code>multi-update-start</code>, <code>multi-update-done</code>

<code>delete-start</code>, <code>delete-done</code>

<code>multi-delete-start</code>, <code>multi-delete-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-network.html">Network</a>

<code>net-read-start</code>, <code>net-read-done</code>, <code>net-write-start</code>, <code>net-write-done</code>

<a href="http://dev.mysql.com/doc/refman/5.6/en/dba-dtrace-ref-keycache.html">Keycache</a>

<code>keycache-read-start</code>, <code>keycache-read-block</code>, <code>keycache-read-done</code>, <code>keycache-read-hit</code>, <code>keycache-read-miss</code>, <code>keycache-write-start</code>, <code>keycache-write-block</code>,<code>keycache-write-done</code>

    本文轉自 Fanr_Zh 部落格園部落格,原文連結:http://www.cnblogs.com/Amaranthus/p/3852947.html,如需轉載請自行聯系原作者