1. 程式人生 > >MySQL資料庫配置詳解

MySQL資料庫配置詳解

下面是我生產環境中MySQL的配置詳解:

[mysqld]

mysql服務端配置

server-id=1

服務ID,每個服務的服務ID不同即可

log-bin=mysql-bin

定義bin_log的位置和名稱,mysql操作記錄二進位制日誌

relay_log=mysql-realy-bin

定義relay_log的位置和名稱,從伺服器解析主伺服器二進位制檔案後記錄的檔案

relay_log_index=slave-mysql-realy-bin.index

定義relay_log_index的位置和名稱

expire_logs_days=15

超過15天的binlog刪除

binlog_format=mixed

mysql複製方式為混合模式

說明:mysql複製主要有三種方式:基於SQL語句的複製(statement-based replication, SBR),基於行的複製(row-based replication, RBR),混合模式複製(mixed-based replication, MBR)。對應的,binlog的格式也有三種:STATEMENT,ROW,MIXED。

① STATEMENT模式(SBR)

每一條會修改資料的sql語句會記錄到binlog中。優點是並不需要記錄每一條sql語句和每一行的資料變化,減少了binlog日誌量,節約IO,提高效能。缺點是在某些情況下會導致master-slave中的資料不一致(如sleep()函式, last_insert_id(),以及user-defined functions(udf)等會出現問題)

② ROW模式(RBR)

不記錄每條sql語句的上下文資訊,僅需記錄哪條資料被修改了,修改成什麼樣了。而且不會出現某些特定情況下的儲存過程、或function、或trigger的呼叫和觸發無法被正確複製的問題。缺點是會產生大量的日誌,尤其是alter table的時候會讓日誌暴漲。

③ MIXED模式(MBR)

以上兩種模式的混合使用,一般的複製使用STATEMENT模式儲存binlog,對於STATEMENT模式無法複製的操作使用ROW模式儲存binlog,MySQL會根據執行的SQL語句選擇日誌儲存方式。

auto-increment-increment=2

自增量每次增加的值改為2

auto-increment-offset= 1

第一次載入數值時的偏移值的個位值是1

innodb_flush_log_at_trx_commit=1

# 0:如果innodb_flush_log_at_trx_commit的值為0,log buffer每秒就會被刷寫日誌檔案到磁碟,提交事務的時候不做任何操作(執行是由mysql的master thread執行緒來執行的。

# 主執行緒中每秒會將重做日誌緩衝寫入磁碟的重做日誌檔案(REDO LOG)中。不論事務是否已經提交)預設的日誌檔案是ib_logfile0,ib_logfile1

# 1:當設為預設值1的時候,每次提交事務的時候,都會將log buffer刷寫到日誌。

# 2:如果設為2,每次提交事務都會寫日誌,但並不會執行刷的操作。每秒定時會刷到日誌檔案。要注意的是,並不能保證100%每秒一定都會刷到磁碟,這要取決於程序的排程。

# 每次事務提交的時候將資料寫入事務日誌,而這裡的寫入僅是呼叫了檔案系統的寫入操作,而檔案系統是有 快取的,所以這個寫入並不能保證資料已經寫入到物理磁碟

# 預設值1是為了保證完整的ACID。當然,你可以將這個配置項設為1以外的值來換取更高的效能,但是在系統崩潰的時候,你將會丟失1秒的資料。

# 設為0的話,mysqld程序崩潰的時候,就會丟失最後1秒的事務。設為2,只有在作業系統崩潰或者斷電的時候才會丟失最後1秒的資料。InnoDB在做恢復的時候會忽略這個值。

# 總結

# 設為1當然是最安全的,但效能頁是最差的(相對其他兩個引數而言,但不是不能接受)。如果對資料一致性和完整性要求不高,完全可以設為2,如果只最求效能,例如高併發寫的日誌伺服器,設為0來獲得更高效能

replicate-ignore-db=sys

複製時忽略的資料庫

datadir=/data/mysql_data

資料儲存目錄

socket=/var/lib/mysql/mysql.sock

對伺服器端指定套接字檔案路徑

對mysql.sock來說,其作用是程式與mysqlserver處於同一臺機器,發起本地連線時可用。

character_set_server=utf8

設定字符集

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

# mysql資料庫的中有一個環境變數sql_mode,定義了mysql應該支援的sql語法,資料校驗等

# STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制

# NO_ZERO_IN_DATE:這個模式影響了是否允許日期中的月份和日包含0。如果開啟此模式,2016-01-00是不允許的,但是0000-02-01是允許的。它實際的行為受到 strict mode是否開啟的影響1。

# NO_ZERO_DATE:設定該值,mysql資料庫不允許插入零日期。它實際的行為受到 strictmode是否開啟的影響2。

# ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程中,如果資料被零除,則產生錯誤而非警告。如果未給出該模式,那麼資料被零除時MySQL返回NULL

# NO_AUTO_CREATE_USER:禁止GRANT建立密碼為空的使用者

# NO_ENGINE_SUBSTITUTION:如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤。不設定此值時,用預設的儲存引擎替代,並丟擲一個異常

symbolic-links=0

不支援符號連結

log-error=/var/log/mysqld.log

錯誤日誌檔案目錄

pid-file=/var/run/mysqld/mysqld.pid

程序檔案目錄

innodb_buffer_pool_size=8G

InnoDB緩衝池大小(這裡設定為記憶體大小的一半)

# InnoDB使用一個緩衝池來儲存索引和原始資料, 不像MyISAM

# 這裡你設定越大,你在存取表裡面數據時所需要的磁碟I/O越少.

# 在一個獨立使用的資料庫伺服器上,你可以設定這個變數到伺服器實體記憶體大小的80%

# 不要設定過大,否則,由於實體記憶體的競爭可能導致作業系統的換頁顛簸.

# 注意在32位系統上你每個程序可能被限制在 2-3.5G 使用者層面記憶體限制,

# 所以不要設定的太高.

innodb_log_file_size=256M

確定資料日誌檔案的大小,更大的設定可以提高效能,但也會增加恢復故障資料庫所需的時間

innodb_flush_method=O_DIRECT

InnoDB 用來重新整理日誌的方法為O_DSYNC

# 表空間總是使用雙重寫入重新整理方法

#  預設值是 “fdatasync”, 另一個是 “O_DSYNC”.

# 一般來說,如果你有硬體 RAID 控制器,並且其獨立快取採用 write-back 機制,並有著電池斷電保護,那麼應該設定配置為 O_DIRECT

# 否則,大多數情況下應將其設為 fdatasync

max_connections=500

MySQL的最大連線數

# 如果伺服器的併發連線請求量比較大,建議提高此值,以增加並行連線數量,當然這建立在機器能支撐的情況下,因為如果連線數越多,介於MySQL會為每個連線提供連線緩衝區,就會開銷越多的記憶體,所以要適當調整該值,不能盲目提高設值。可以過'conn%'萬用字元檢視當前狀態的連線數量,以定奪該值的大小。

innodb_autoextend_increment=128

每次自動擴充套件的增量大小

# 增加InnoDB系統空間最簡單的方法就是,在配置檔案中配置autoextend.

# #該innodb_autoextend_increment設定不會影響每個表的單獨表空間檔案或常規表空間檔案。無論innodb_autoextend_increment設定如何,這些檔案都是自動擴充套件的 。初始擴充套件是少量的,之後以4MB的增量擴充套件。 

# 預設是8M, 如果一次insert資料量比較多的話, 可以適當增加.