mysql配置詳解

weixin_34162629發表於2015-11-25

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


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

---------------------------------------------------------------------2 my.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響應的速度更快了,不可避免的會產生更多的死鎖(dead lock),這樣反而使得資料庫整個一套操作慢了下來,嚴重影響效能。
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 = 16M InnoDB用來儲存資料字典和其他內部資料結構的記憶體池大小。
  應用程式裡的表越多就應該分配越多的記憶體,如果innodb用光了這個記憶體就會向系統記憶體要。
  並且寫入警告日誌,根據MySQL手冊,對於2G記憶體的機器,推薦值是20M。
  預設值是1M。通常不用太大,只要夠用就行,與表結構的複雜度有關係。


innodb_status_file
InnoDB傳送診斷輸出到stderr或檔案,而不是到stdout或者固定尺寸記憶體緩衝,以避免底層緩衝溢位。作為一個副效果,SHOW INNODB 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 = 16 InnoDB驅動程式能夠同時使用的最大執行緒個數(預設設定是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_pos 448  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-14 10:09:22'  ,                                            uip='192.168.200.96'  WHERE id = '339'
;
# at 448
#090814 10:11:14 server id 1  end_log_pos 556  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  WHERE id = '26'
                    59 Quit
090814 10:11:15      60 Connect    sq_szczkj@localhost on
                    60 Init DB    sq_gllutf8
                    60 Query      SET NAMES 'UTF8'
                    60 Query      select * from gll_member  ORDER BY id DESC
                    60 Query      select * from gll_member  ORDER BY id DESC  limit  0,50
                    60 Quit
                    61 Connect    sq_szczkj@localhost on
                    61 Init DB    sq_gllutf8
                    61 Query      SET NAMES 'UTF8'
                    61 Query      select * from gll_zone  ORDER BY id DESC
                    61 Query      select * from gll_zone  ORDER BY id DESC  limit  0,99
                    61 Quit
---------------------------------

log-error=/var/lib/mysql/error.log
#log-update=/var/lib/mysql/update.log  未能成功生成

long_query_time=1
log-slow-queries
#--log-slow-queries[=file_name



] 的file_name引數可選,預設值是host_name



-slow.log ,如果指定了file_name引數的話,mysql就會把慢查詢的日誌記錄到file_name所設定的檔案中,如果file_name提供的是一個相對路徑,mysql會把日誌記錄到mysql的data目錄中。
log-queries-not-using-indexes #在mysql的啟動配置檔案或命令列引數中增加--log-queries-not-using-indexes 引數就可以啟用未使用索引查詢語句了,日誌記錄的檔案就是log-slow-queries對應的檔案。


----------------Mysql的log_slow_queries日誌檔案設定不當錯誤
1,容易發生錯誤的設定:
log_slow_queries = ON
log_slow_queries=/var/log/slow-queries.log
long_query_time=5
這種容易導致slow-queries.log無法讀取的錯誤(許可權問題)。
常見錯誤提示:
Could not use /var/log/slow-queries.log for
logging (error 13). Turning logging off for the whole duration of the
MySQL server process. To turn it on again: fix the cause, shutdown the
MySQL server and restart it.

2,比較妥當的配置:
log_slow_queries = ON
log_slow_queries=slow-log
long_query_time=5
直接在目錄/var/lib/mysql/ 下生成 slow-log 檔案



----------------------------測試慢日誌
mysql>select sleep(1);
mysql>select sleep(3);
mysql>select * from gll_products;

開啟mysql.log和慢日誌檔案可以看到
select sleep(3);
select * from gll_products;








---------------------------------------------------------------------3 命令說明



show variables like 'long%'; 查詢 long_query_time 的值

mysql>show variables like 'log_%';  是否啟用了日誌
mysql> show variables like 'log_%';
+---------------------------------+--------------------------+
| Variable_name                  | Value                    |
+---------------------------------+--------------------------+
| log_bin                        | ON                      |
| log_bin_trust_function_creators | OFF                      |
| log_error                      | /var/lib/mysql/error.log |
| log_queries_not_using_indexes  | ON                      |
| log_slave_updates              | OFF                      |
| log_slow_queries                | ON                      |
| log_warnings                    | 1                        |
+---------------------------------+--------------------------+




mysql> show master logs;  顯示二進位制日誌數目

mysql>show variables like 'log_bin'; 確認你日誌是否啟用

mysql> show master status; 怎樣知道當前的二進位制日誌

檢視從某一段時間到某一段時間的二進位制日誌
mysqlbinlog --start-datetime='2008-01-19 00:00:00' --stop-datetime='2008-01-30 00:00:00' /var/lib/mysql/mysql-bin.000006 > mysqllog1.log

shell>mysqlbinlog mail-bin.000001  看二進位制日誌檔案用mysqlbinlog
或者shell>mysqlbinlog mail-bin.000001 | tail

flush privileges;  重新整理資料庫

mysql> SHOW STATUS;  執行下列命令可以獲取狀態變數的值:

mysql> SHOW STATUS LIKE ‘[匹配模式]’; ( 可以使用%、?等 )  如果只要檢查某幾個狀態變數,可以使用下列命令:

select version(); 檢視mysql版本

 

http://blog.sina.com.cn/s/blog_417b97470100mvnj.html  Mysql效能調優

相關文章