下面是我生產(chǎn)環(huán)境中MySQL的配置詳解:
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括大廠網(wǎng)站建設(shè)、大廠網(wǎng)站制作、大廠網(wǎng)頁制作以及大廠網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,大廠網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到大廠省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
[mysqld]
mysql服務(wù)端配置
server-id=1
服務(wù)ID,每個(gè)服務(wù)的服務(wù)ID不同即可
log-bin=mysql-bin
定義bin_log的位置和名稱,mysql操作記錄二進(jìn)制日志
relay_log=mysql-realy-bin
定義relay_log的位置和名稱,從服務(wù)器解析主服務(wù)器二進(jìn)制文件后記錄的文件
relay_log_index=slave-mysql-realy-bin.index
定義relay_log_index的位置和名稱
expire_logs_days=15
超過15天的binlog刪除
binlog_format=mixed
mysql復(fù)制方式為混合模式
說明:mysql復(fù)制主要有三種方式:基于SQL語句的復(fù)制(statement-based replication, SBR),基于行的復(fù)制(row-based replication, RBR),混合模式復(fù)制(mixed-based replication, MBR)。對(duì)應(yīng)的,binlog的格式也有三種:STATEMENT,ROW,MIXED。
① STATEMENT模式(SBR)
每一條會(huì)修改數(shù)據(jù)的sql語句會(huì)記錄到binlog中。優(yōu)點(diǎn)是并不需要記錄每一條sql語句和每一行的數(shù)據(jù)變化,減少了binlog日志量,節(jié)約IO,提高性能。缺點(diǎn)是在某些情況下會(huì)導(dǎo)致master-slave中的數(shù)據(jù)不一致(如sleep()函數(shù), last_insert_id(),以及user-defined functions(udf)等會(huì)出現(xiàn)問題)
② ROW模式(RBR)
不記錄每條sql語句的上下文信息,僅需記錄哪條數(shù)據(jù)被修改了,修改成什么樣了。而且不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過程、或function、或trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題。缺點(diǎn)是會(huì)產(chǎn)生大量的日志,尤其是alter table的時(shí)候會(huì)讓日志暴漲。
③ MIXED模式(MBR)
以上兩種模式的混合使用,一般的復(fù)制使用STATEMENT模式保存binlog,對(duì)于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的SQL語句選擇日志保存方式。
auto-increment-increment=2
自增量每次增加的值改為2
auto-increment-offset= 1
第一次加載數(shù)值時(shí)的偏移值的個(gè)位值是1
innodb_flush_log_at_trx_commit=1
# 0:如果innodb_flush_log_at_trx_commit的值為0,log buffer每秒就會(huì)被刷寫日志文件到磁盤,提交事務(wù)的時(shí)候不做任何操作(執(zhí)行是由mysql的master thread線程來執(zhí)行的。
# 主線程中每秒會(huì)將重做日志緩沖寫入磁盤的重做日志文件(REDO LOG)中。不論事務(wù)是否已經(jīng)提交)默認(rèn)的日志文件是ib_logfile0,ib_logfile1
# 1:當(dāng)設(shè)為默認(rèn)值1的時(shí)候,每次提交事務(wù)的時(shí)候,都會(huì)將log buffer刷寫到日志。
# 2:如果設(shè)為2,每次提交事務(wù)都會(huì)寫日志,但并不會(huì)執(zhí)行刷的操作。每秒定時(shí)會(huì)刷到日志文件。要注意的是,并不能保證100%每秒一定都會(huì)刷到磁盤,這要取決于進(jìn)程的調(diào)度。
# 每次事務(wù)提交的時(shí)候?qū)?shù)據(jù)寫入事務(wù)日志,而這里的寫入僅是調(diào)用了文件系統(tǒng)的寫入操作,而文件系統(tǒng)是有 緩存的,所以這個(gè)寫入并不能保證數(shù)據(jù)已經(jīng)寫入到物理磁盤
# 默認(rèn)值1是為了保證完整的ACID。當(dāng)然,你可以將這個(gè)配置項(xiàng)設(shè)為1以外的值來換取更高的性能,但是在系統(tǒng)崩潰的時(shí)候,你將會(huì)丟失1秒的數(shù)據(jù)。
# 設(shè)為0的話,mysqld進(jìn)程崩潰的時(shí)候,就會(huì)丟失最后1秒的事務(wù)。設(shè)為2,只有在操作系統(tǒng)崩潰或者斷電的時(shí)候才會(huì)丟失最后1秒的數(shù)據(jù)。InnoDB在做恢復(fù)的時(shí)候會(huì)忽略這個(gè)值。
# 總結(jié)
# 設(shè)為1當(dāng)然是最安全的,但性能頁是最差的(相對(duì)其他兩個(gè)參數(shù)而言,但不是不能接受)。如果對(duì)數(shù)據(jù)一致性和完整性要求不高,完全可以設(shè)為2,如果只最求性能,例如高并發(fā)寫的日志服務(wù)器,設(shè)為0來獲得更高性能
replicate-ignore-db=sys
復(fù)制時(shí)忽略的數(shù)據(jù)庫
datadir=/data/mysql_data
數(shù)據(jù)存儲(chǔ)目錄
socket=/var/lib/mysql/mysql.sock
對(duì)服務(wù)器端指定套接字文件路徑
對(duì)mysql.sock來說,其作用是程序與mysqlserver處于同一臺(tái)機(jī)器,發(fā)起本地連接時(shí)可用。
character_set_server=utf8
設(shè)置字符集
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數(shù)據(jù)庫的中有一個(gè)環(huán)境變量sql_mode,定義了mysql應(yīng)該支持的sql語法,數(shù)據(jù)校驗(yàn)等
# STRICT_TRANS_TABLES:在該模式下,如果一個(gè)值不能插入到一個(gè)事務(wù)表中,則中斷當(dāng)前的操作,對(duì)非事務(wù)表不做限制
# NO_ZERO_IN_DATE:這個(gè)模式影響了是否允許日期中的月份和日包含0。如果開啟此模式,2016-01-00是不允許的,但是0000-02-01是允許的。它實(shí)際的行為受到 strict mode是否開啟的影響1。
# NO_ZERO_DATE:設(shè)置該值,mysql數(shù)據(jù)庫不允許插入零日期。它實(shí)際的行為受到 strictmode是否開啟的影響2。
# ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程中,如果數(shù)據(jù)被零除,則產(chǎn)生錯(cuò)誤而非警告。如果未給出該模式,那么數(shù)據(jù)被零除時(shí)MySQL返回NULL
# NO_AUTO_CREATE_USER:禁止GRANT創(chuàng)建密碼為空的用戶
# NO_ENGINE_SUBSTITUTION:如果需要的存儲(chǔ)引擎被禁用或未編譯,那么拋出錯(cuò)誤。不設(shè)置此值時(shí),用默認(rèn)的存儲(chǔ)引擎替代,并拋出一個(gè)異常
symbolic-links=0
不支持符號(hào)鏈接
log-error=/var/log/mysqld.log
錯(cuò)誤日志文件目錄
pid-file=/var/run/mysqld/mysqld.pid
進(jìn)程文件目錄
innodb_buffer_pool_size=8G
InnoDB緩沖池大?。ㄟ@里設(shè)置為內(nèi)存大小的一半)
# InnoDB使用一個(gè)緩沖池來保存索引和原始數(shù)據(jù), 不像MyISAM
# 這里你設(shè)置越大,你在存取表里面數(shù)據(jù)時(shí)所需要的磁盤I/O越少.
# 在一個(gè)獨(dú)立使用的數(shù)據(jù)庫服務(wù)器上,你可以設(shè)置這個(gè)變量到服務(wù)器物理內(nèi)存大小的80%
# 不要設(shè)置過大,否則,由于物理內(nèi)存的競(jìng)爭(zhēng)可能導(dǎo)致操作系統(tǒng)的換頁顛簸.
# 注意在32位系統(tǒng)上你每個(gè)進(jìn)程可能被限制在 2-3.5G 用戶層面內(nèi)存限制,
# 所以不要設(shè)置的太高.
innodb_log_file_size=256M
確定數(shù)據(jù)日志文件的大小,更大的設(shè)置可以提高性能,但也會(huì)增加恢復(fù)故障數(shù)據(jù)庫所需的時(shí)間
innodb_flush_method=O_DIRECT
InnoDB 用來刷新日志的方法為O_DSYNC
# 表空間總是使用雙重寫入刷新方法
# 默認(rèn)值是 “fdatasync”, 另一個(gè)是 “O_DSYNC”.
# 一般來說,如果你有硬件 RAID 控制器,并且其獨(dú)立緩存采用 write-back 機(jī)制,并有著電池?cái)嚯姳Wo(hù),那么應(yīng)該設(shè)置配置為 O_DIRECT
# 否則,大多數(shù)情況下應(yīng)將其設(shè)為 fdatasync
max_connections=500
MySQL的最大連接數(shù)
# 如果服務(wù)器的并發(fā)連接請(qǐng)求量比較大,建議提高此值,以增加并行連接數(shù)量,當(dāng)然這建立在機(jī)器能支撐的情況下,因?yàn)槿绻B接數(shù)越多,介于MySQL會(huì)為每個(gè)連接提供連接緩沖區(qū),就會(huì)開銷越多的內(nèi)存,所以要適當(dāng)調(diào)整該值,不能盲目提高設(shè)值。可以過'conn%'通配符查看當(dāng)前狀態(tài)的連接數(shù)量,以定奪該值的大小。
innodb_autoextend_increment=128
每次自動(dòng)擴(kuò)展的增量大小
# 增加InnoDB系統(tǒng)空間最簡(jiǎn)單的方法就是,在配置文件中配置autoextend.
##該innodb_autoextend_increment設(shè)置不會(huì)影響每個(gè)表的單獨(dú)表空間文件或常規(guī)表空間文件。無論innodb_autoextend_increment設(shè)置如何,這些文件都是自動(dòng)擴(kuò)展的 。初始擴(kuò)展是少量的,之后以4MB的增量擴(kuò)展。
# 默認(rèn)是8M, 如果一次insert數(shù)據(jù)量比較多的話, 可以適當(dāng)增加.