Mysql 配置參數詳解以及優化配置

mysql有以下幾種日誌:
 
錯誤日誌:   log-err
 
查詢日誌:   log
 
慢查詢日誌:  log-slow-queries
 
更新日誌:   log-update
 
二進制日誌: log-bin 


要把日誌生成在 /var/log 目錄下(是系統日誌存放的地方,只有 root 賬號有寫權限),需要 MySQL進程對這個目錄有讀寫權限,一般是不這麼做的,也考慮到安全問題,包括 MySQL 本身的數據安全,因爲對 MySQL 的所有操作,都會記錄到常規查詢日誌。MySQL的日誌就不要用 /var/log/ 目錄下。

---------------------------------------------------------------------2my.cnf

default-character-set = utf8
port 
  = 3306
socket 
= /tmp/mysql.sock

no-auto-rehash

#default-character-set = utf8
user 
  = mysql
port 
  = 3306
socket 
= /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /data0/mysql/3306/data
open_files_limit 
  = 10240
back_log = 600
max_connections = 3000 實際MySQL服務器允許的最大連接數16384;
max_connect_errors = 6000 
可以允許多少個錯誤連接
table_cache = 1024 
高速緩存的大小.table_cache的值在2G內存以下的機器中的值默認時256到512,如果機器有4G內存,則默認這個值是2048,但這決意味着機器內存越大,這個值應該越大,因爲table_cache加大後,使得mysql對SQL響應的速度更快了,不可避免的會產生更多的死鎖(deadlock),這樣反而使得數據庫整個一套操作慢了下來,嚴重影響性能。
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 2M是一個connection級參數,在每個connection第一次需要使用這個buffer的時候,一次性分配設置的內存.並不是越大越好,由於是connection級的參數,過大的設置+高併發可能會耗盡系統內存資源。
join_buffer_size = 2M
thread_cache_size = 64 
重新利用保存在緩存中線程的數量,當斷開連接時如果緩存中還有空間,那麼客戶端的線程將被放到緩存中,如果線程重新被請求,那麼請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那麼這個線程將被重新創建,如果有很多新的線程,增加這個值可以改善系統性能
 
根據物理內存設置規則如下:
 
  1G  --->8
 
  2G  --->16
 
  3G  --->32
 
  >3G ---> 64


thread_concurrency = 16 對mysql的性能影響很大,在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核),出現同一時刻只能一個cpu(或核)在工作的情況。
 
應設爲CPU核數的2倍. 比如有一個雙核的CPU,那麼thread_concurrency的應該爲4; 2個雙核的cpu, thread_concurrency的值應爲8.

query_cache_size = 32M緩存機制簡單的說就是緩存sql文本及查詢結果,如果運行相同的sql,服務器直接從緩存中取到結果,而不需要再去解析和執行sql。如果表更改了,那麼使用這個表的所有緩衝查詢將不再有效,查詢緩存值的相關條目被清空
query_cache_limit = 2M 單個查詢能夠使用的緩衝區大小.缺省爲1M
query_cache_min_res_unit = 2k它指定分配緩衝區空間的最小單位,缺省爲4K。檢查狀態值Qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多,這就表明查詢結果都比較小,此時需要減小query_cache_min_res_unit
default-storage-engine = MyISAM
default_table_type = MyISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED 
設置所有連接的默認事務隔離級
tmp_table_size = 256M 臨時HEAP數據表的最大長度
max_heap_table_size = 256M HEAP數據表(內存表)的最大長度(默認設置是16M);
long_query_time = 1
log_long_format
log-bin = /data0/mysql/3306/binlog
binlog_cache_size = 8M 爲binary log指定在查詢請求處理過程中SQL 查詢語句使用的緩存大小
binlog_format = MIXED
max_binlog_cache_size = 8M
max_binlog_size = 512M
expire_logs_days = 7
key_buffer_size = 256M 
索引緩衝區的大小,嚴格說是它決定了數據庫索引處理的速度,尤其 是索引讀的速度
read_buffer_size = 1M 
讀查詢操作所能使用的緩衝區大小,該參數對應的分配內存也是每連接獨享.
read_rnd_buffer_size = 16M 針對按某種特定順序(如ORDER BY子句)輸出的查詢結果(默認256K)加速排序操作後的讀數據,提高讀分類行的速度。
bulk_insert_buffer_size = 64M 指定 MyISAM 類型數據表表使用特殊的樹形結構的緩存
myisam_sort_buffer_size = 128M myisam引擎的sort_buffer_size
myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G 
這個參數已經不在MySQL
myisam_repair_threads = 1
myisam_recover 
自動檢查和修復無法正確關閉MyISAM表

skip-name-resolve
master-connect-retry = 10
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

server-id = 1 設定爲master

innodb_additional_mem_pool_size = 16MInnoDB用來存儲數據字典和其他內部數據結構的內存池大小。
 
應用程序裏的表越多就應該分配越多的內存,如果innodb用光了這個內存就會向系統內存要。
 
並且寫入警告日誌,根據MySQL手冊,對於2G內存的機器,推薦值是20M。
 
缺省值是1M。通常不用太大,只要夠用就行,與表結構的複雜度有關係。


innodb_status_file
InnoDB發送診斷輸出到stderr或文件,而不是到stdout或者固定尺寸內存緩衝,以避免底層緩衝溢出。作爲一個副效果,SHOWINNODB STATUS的輸出每15秒鐘寫到一個狀態文件。這個文件的名字是innodb_status.pid,其中pid是服務器進程ID。這個文件在MySQL數據目錄裏創建。正常關機之時,InnoDB刪除這個文件。如果發生不正常的關機,這些狀態文件的實例可能被展示,而且必須被手動刪除。在移除它們之前,你可能想要檢查它們來看它們是否包含有關不正常關機的原因的有用信息。僅在配置選項innodb_status_file=1被設置之時,innodb_status.pid文件被創建。



innodb_buffer_pool_size = 2048M 指定大小的內存來緩衝數據和索引。
 
對於單獨的MySQL數據庫服務器,最大可以把該值設置成物理內存的80%。
 
根據MySQL手冊,對於2G內存的機器,推薦值是1G(50%)

innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_io_threads = 4 IO操作(硬盤寫操作)的最大線程個數(默認設置是4)。
innodb_thread_concurrency = 16InnoDB驅動程序能夠同時使用的最大線程個數(默認設置是8)。
innodb_flush_log_at_trx_commit = 2 
InnoDB記錄日誌的方式
 
如果設置爲1,則每個事務提交的時候,MySQL都會將事務日誌寫入磁盤。
 
如果設置爲0或者2,則大概每秒中將日誌寫入磁盤一次。
 
實際測試發現,該值對插入數據的速度影響非常大
 
 設置爲2時插入10000條記錄只需要2秒,設置爲0時只需要1秒,而設置爲1時則需要229秒。
 
建議儘量將插入操作合併成一個事務,這樣可以大幅提高速度。
 
在存在丟失最近部分事務的危險的前提下,可以把該值設爲0。

innodb_log_buffer_size = 16M 日誌緩存的大小
 
默認的設置在中等強度寫入負載以及較短事務的情況下,一般可以滿足服務器的性能要求。
 
如果更新操作峯值或者負載較大就應該加大這個值。8-16M即可。

innodb_log_file_size = 128M日誌組中每個日誌文件的大小在高寫入負載尤其是大數據集的情況下很重要。
 
這個值越大性能就越高,但恢復時時間會加長。默認是5M。Javaeye推薦innodb_log_file_size =64M

innodb_log_files_in_group = 3 日誌組中的日誌文件數目,推薦使用3
innodb_max_dirty_pages_pct = 90 最大髒頁的百分數
innodb_lock_wait_timeout = 120 事務獲得資源超時設置,默認50s
innodb_file_per_table = 0 
爲每一個新數據表創建一個表空間文件而不是把數據表都集中保存在中央表空間裏

quick 
不緩衝查詢,直接導出至stdout
max_allowed_packet = 32M
停用mysql的嚴格驗證STRICT_TRANS_TABLES
#把sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"中"STRICT_TRANS_TABLES,"去掉,重啓MySQL服務,問題解決……汗顏~~~
經過此役,總結數據庫設計中的一個注意點,也即避免此現象的兩種方法:
1、在表的設計過程中,對所有不能爲空的字段設置默認值
2、配置MySQL服務,如上所述將STRICT_TRANS_TABLES去掉


#開啓event
#event_scheduler = on
#myisam自動修復
myisam-recover=BACKUP,FORCE


# 在 中輸入
log-bin=/var/lib/mysql/mysql-bin
#expire_logs_days = 10
#max_binlog_size = 100M
log=/var/lib/mysql/mysql.log
log-error=/var/lib/mysql/error.log
#log-update=/var/lib/mysql/update.log 
未能成功生成
long_query_time=1
log-slow-queries
log-queries-not-using-indexes


是否啓用了日誌
mysql>show variables like 'log_%';
怎樣知道當前的日誌
mysql> show master status;
顯示二進制日誌數目
mysql> show master logs;
看二進制日誌文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail


#詳細說明
log-bin=/var/lib/mysql/mysql-bin#二進制LOG,mysqlbinlog直接讀取二進制日誌文件。二進制日誌包含所有更新數據的語句,其目的是在恢復數據庫時用它來把數據儘可能恢復到最後的狀態。另外,如果做同步複製( Replication)的話,也需要使用二進制日誌傳送修改情況。log_bin指定日誌文件,如果不提供文件名,MySQL將自己產生缺省文件名。MySQL會在文件名後面自動添加數字索引,每次啓動服務時,都會重新生成一個新的二進制文件。

時間長了log bin也會佔很大的硬盤空間,所以在my.ini中加上對其的限制。
#expire_logs_days = 10
#max_binlog_size = 100M
---------------------
# show master status;
#mysqlbinlog mysql-bin.000052
-------------格式如下:
flush privileges
;
# at 173
#090814 10:09:22 server id 1 
end_log_pos448  Query thread_id=51   exec_tim                                     e=0   error_code=0
use sq_gllutf8;
SET TIMESTAMP=1250215762;
;
SET@@session.character_set_client=33,@@session.collation_connection=33,@@sessio 
                                   n.collation_server=8;
update gll_products set 
sn_name='休閒褲'  ,ch_name='H957-3' ,color='卡其'  ,co                                    mposition='60%馬棉44'  ,huoqi='' ,p_remarks=''  ,utime='2009-08-1410:09:22'                                    uip='192.168.200.96'  WHERE id = '339'
;
# at 448
#090814 10:11:14 server id 1 
end_log_pos556  Query thread_id=59   exec_tim                                     e=0   error_code=0
SET TIMESTAMP=1250215874;
delete from gll_member 
WHERE id = '26'
;
DELIMITER ;
# End of log file
ROLLBACK ;
;
-----------------------------------

log=/var/lib/mysql/mysql.log 
#對所有執行語句進行記錄
----------------------------格式如下:
090814 10:11:14 
   59 Connect   sq_szczkj@localhost on
 
               59 Init DB   sq_gllutf8
 
               59 Query     SET NAMES 'UTF8'
 
               59 Query     delete from gll_member  WHEREid = '26'
 
           

發佈了16 篇原創文章 · 獲贊 5 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章