1. 程式人生 > 實用技巧 >MySQL之my.cnf配置檔案優化

MySQL之my.cnf配置檔案優化

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 # [client] port = 3306 socket =/tmp/mysql.sock default-character-set= utf8 [mysql] no-auto-rehash#僅允許使用鍵值的updates和deletes [mysqld] port = 3306#msyql伺服器埠號 basedir =/usr/local/mysql#mysql安裝目錄 datadir =/usr/local/mysql/data#mysql資料存放目錄 #datadir = /data/mysql/data #同上 socket =/usr/local/mysql/data/mysql.sock#sock檔案 #字符集與校對規則
character-set-server = utf8#預設字符集 collation-server = utf8_general_ci#設定校對規則 external-locking = FALSE#避免外部鎖定(減少出錯機率,增加穩定性) skip-name-resolv#禁止外部連線進行DNS解析 skip-slave-start# 複製程序就不會隨著資料庫的啟動而啟動 http://blog.csdn.net/aeolus_pu/article/details/9419965 #master庫binlog引數相關 server-id= 1#主從複製時,ID不能相同 #binlog_format = mixed #二進位制日誌格式(mixed、row、statement)
binlog-cache-size = 32M#設定二進位制日誌快取大小 sync-binlog = 1#每隔N秒將快取中的二進位制日誌記錄寫回硬碟 max_binlog_cache_size = 8M#最大的二進位制Cache日誌緩衝尺寸 max_binlog_size = 1G#單個二進位制日誌檔案的最大值,預設1G,最大1G log-bin-index =/usr/local/mysql/data/mysql-bin.index#binlog索引檔案位置 log-bin =/usr/local/mysql/data/mysql-bin#binlog日誌存放目錄 expire_logs_days = 90#二進位制日誌檔案過期時間 #slave資料庫binlog引數 server-id= 10#各資料庫id不能相同 log_slave_updates = 1#級聯也使用 relay-log =/usr/lcoal/mysql/data/relay-bin#relady目錄 relay-log-info-file=/usr/local/mysql/data/relay-log.info#info目錄 slave-skip-errors = 1007,1008,1032,1062#跳過主從複製時的錯誤 read-only = 1#從伺服器只讀,SQL執行緒不影響,具有super,root使用者不限制 master-connect-retry = 60#主從複製丟失,重連間隔時間,預設60s #replicate-ignore-db = mysql #忽略mysql庫不同步 replicate-wild-do-table=testdb1.% replicate-wild-do-table=testdb2.% replicate-wild-do-table=testdb3.% #master半同步開啟引數 rpl_semi_sync_master_enabled = ON rpl_semi_sync_master_timeout = 10000 #rpl_semi_sync_master_wait_no_slave = ON #rpl_semi_sync_master_trace_level = 32 #slave半同步開啟引數 rpl_semi_sync_slave_enabled = ON #rpl_semi_sync_slave_trace_level = 32 back_log = 1000#指出在MySQL暫時停止響應新請求之前,短時間內的多少個請求 open_files_limit = 1024#開啟檔案的最大個數,如果出現too mantopen files之類的就需要調整該值了 #連線相關 max_connections = 2000#指定MySQL允許的最大連線程序數,show global variables like '%connections%'; http://elf8848.iteye.com/blog/1847445 max_user_connections = 2000#單使用者最大的連線數,max_user_connections < 例項 max_user_connections < max_connections max_connect_errors = 100000#預設為10,設定每個主機的連線請求異常中斷的最大次數,超過後會blocked,連線成功後初始0,出現錯誤後需要flush hosts max_allowed_packet = 8M#伺服器一次能處理的最大的查詢包的值 wait_timeout = 360#指定一個請求的最大連線時間 interactive_timeout = 360#連線保持活動的時間 #訪問日誌 #general_log = on #general_log_file = /usr/local/mysql/data/mysql_access.log #錯誤日誌 log_error =/data/mysql/data/mysql_error.log #慢查詢相關引數 slow_query_log = on#開啟慢查詢 log-queries-not-using-indexes#記錄所有沒有使用到索引的查詢語句 long_query_time = 2#指定多少秒未返回結果的查詢屬於慢查詢 min_examined_row_limit = 5#記錄那些由於查找了多餘5次而引發的慢查詢 log-slow-admin-statements#記錄那些慢的OPTIMIZE TABLE,ANALYZE TABLE和ALTER TABLE語句 log-slow-slave-statements#記錄由slave所產生的慢查詢 slow_query_log_file =/usr/local/mysql/data/slow.log#指定慢查詢日誌檔案路徑 table_cache = 614#表分配的記憶體,實體記憶體越大,設定就越大 table_open_cache = 512#設定快取記憶體表的數目 thread_cache_size = 64#伺服器執行緒快取數,與記憶體大小有關(建議大於3G設定為64) thread_concurrency = 32#CPU核數的兩倍 query_cache_size = 32M#指定MySQL查詢緩衝區的大小 query_cache_limit = 2M#只有小於此設定值的結果才會被快取 query_cache_min_res_unit = 2k#設定查詢快取分配記憶體的最小單位 key_buffer_size = 512M#指定用於索引的緩衝區大小,增加它可得到更好的索引處理效能 sort_buffer_size = 2M#設定查詢排序時所能使用的緩衝區大小,系統預設大小為2MB join_buffer_size = 1M#聯合查詢操作所能使用的緩衝區大小 read_buffer_size = 4M#讀查詢操作所能使用的緩衝區大小 read_rnd_buffer_size = 16M#設定進行隨機讀的時候所使用的緩衝區 thread_stack = 192K#設定Mysql每個執行緒的堆疊大小,預設值足夠大,可滿足普通操作 bulk_insert_buffer_size = 8M#可以適當調整引數至16MB~32MB,建議8MB #myisam引數引擎相關 myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 myisam_recover#自動檢查和修復沒有適當關閉的MyISAM表 key_buffer_size = 16M#myisam索引buffer,只有key沒有data transaction_isolation = READ-COMMITTED#事務隔離級別 tmp_table_size = 64M#設定記憶體臨時表最大值 max_heap_table_size = 64M#獨立的記憶體表所允許的最大容量 #innodb引擎引數相關 default-storage-engine=InnoDB#預設表的型別為InnoDB innodb_old_blocks_time =1000#減小單次的大批量資料查詢,預設為0,調整後效能提升80% http://www.cnblogs.com/cenalulu/archive/2012/10/10/2718585.html innodb_flush_method = O_DIRECT#從innode重新整理到磁碟,不經過系統write,fdatasync(預設),O_DSYNC,O_DIRECT http://blog.csdn.net/jiao_fuyou/article/details/16113403 innodb_additional_mem_pool_size = 16M#設定InnoDB儲存的資料目錄資訊和其他內部資料結構的記憶體池大小 innodb_buffer_pool_size = 51G#InnoDB使用一個緩衝池來儲存索引和原始資料,官方建議實體記憶體的80% innodb_data_file_path = ibdata1:128M:autoextend#表空間 innodb_file_io_threads = 4#InnoDB中的檔案I/O執行緒,通常設定為4,innodb除master執行緒外,還有insert buffer, log, read, write這4種執行緒,預設各有一個 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_thread_concurrency = 8#伺服器有幾個CPU就設定為幾,建議用預設設定,一般設為8 innodb_flush_log_at_trx_commit = 2#設定為0就等於innodb_log_buffer_size佇列滿後再統一儲存,預設為1 innodb_log_buffer_size = 16M#預設為1MB,通常設定為6-8MB就足夠 innodb_log_file_size = 512M#確定日誌檔案的大小,更大的設定可以提高效能,但也會增加恢復資料庫的時間 innodb_log_files_in_group = 3#為提高效能,MySQL可以以迴圈方式將日誌檔案寫到多個檔案。推薦設定為3 innodb_max_dirty_pages_pct = 90#InnoDB主執行緒重新整理快取池中的資料 innodb_lock_wait_timeout = 120#InnoDB事務被回滾之前可以等待一個鎖定的超時秒數 innodb_file_per_table = 1#InnoDB為獨立表空間模式,每個資料庫的每個表都會生成一個數據空間,0關閉,1開啟 innodb_autoextend_increment = 256#這個引數的作用是控制innodb 共享表空間檔案自動擴充套件的大小 [mysqldump] quick max_allowed_packet = 64M [mysqld_safe] log-error =/usr/local/mysql/data/mysql.err pid-file=/usr/local/mysql/data/mysqld.pid 查詢innodb分配資源 mysql> show engine innodb status; ---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 137363456;inadditional pool allocated 0 Dictionary memory allocated 59957 Buffer pool size 8191 Free buffers 8028 Database pages 163 Old database pages 0 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages made young 0, not young 0 0.00 youngs/s, 0.00 non-youngs/s Pagesread163, created 0, written 1 0.00 reads/s, 0.00 creates/s, 0.00 writes/s No buffer pool page gets since the last printout Pagesreadahead 0.00/s, evicted without access 0.00/s, Randomreadahead 0.00/s LRU len: 163, unzip_LRU len: 0 I/Osum[0]:cur[0], unzipsum[0]:cur[0] 我們使用的是專用於MySQL的(5.5 Percona的)上執行CentOS的(不同口味),主要128GB的伺服器。我們innodb_buffer_pool_size設定為104GB這些和他們也有/ tmp目錄8GB的記憶體磁碟。他們被大量使用,但從未使用過任何的交換。當然vm.swappiness設定為1, 下面就是我們用較低層的伺服器(包括128GB為簡潔起見),他們又從來沒有使用過任何掉期和執行大型資料庫(2-3TB): 128GB RAM:innodb_buffer_pool_size = 104GB 64GB RAM:innodb_buffer_pool_size = 56G 32GB RAM:innodb_buffer_pool_size = 28G 在大多數情況下,我們分配(N - 7G)* 0.9。所以對於一個64G的節點,我們最終分配給緩衝池記憶體〜51G 64GB RAM:innodb_buffer_pool_size = 51G https://www.percona.com/blog/2015/06/02/80-ram-tune-innodb_buffer_pool_size/ http://osxr.org:8080/mysql/ident?_i=back_log&_remember=1 王導DBA MySQL優化 log_error = localhost3306.err sync_binlog=1 innodb_old_blocks_time =1000 innodb_flush_method = O_DIRECT back_log=1000 max_connections = 2000 max_user_connections=2000 min_examined_row_limit =5 skip-slave-start skip-name-resolve max_connect_errors = 100000 character-set-server=utf8 collation-server=utf8_bin binlog_cache_size=32M query_cache_limit = 2M tmp_table_size=256M max_heap_table_size=256M interactive_timeout=360 wait_timeout=360 log_slave_updates=1 expire_logs_days=60 binlog_format=mixed tmpdir=/dev/shm innodb_autoextend_increment = 256 innodb_buffer_pool_instances=8 innodb_additional_mem_pool_size=128M innodb_max_dirty_pages_pct=80 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_log_file_size = 1G innodb_log_files_in_group = 2 innodb_flush_log_at_trx_commit = 2 innodb_file_per_table=1

這個引數最關鍵

innodb_flush_log_at_trx_commit = 2

一、引數解釋

0:log buffer將每秒一次地寫入log file中,並且log file的flush(刷到磁碟)操作同時進行。該模式下在事務提交的時候,不會主動觸發寫入磁碟的操作。

1:每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中去,該模式為系統預設。

2:每次事務提交時MySQL都會把log buffer的資料寫入log file,但是flush(刷到磁碟)操作並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁碟)操作。

二、引數修改

找到mysql配置檔案mysql.ini,修改成合適的值,然後重啟mysql。

三、注意事項

當設定為0,該模式速度最快,但不太安全,mysqld程序的崩潰會導致上一秒鐘所有事務資料的丟失。

當設定為1,該模式是最安全的,但也是最慢的一種方式。在mysqld 服務崩潰或者伺服器主機crash的情況下,binary log 只有可能丟失最多一個語句或者一個事務。。
當設定為2,該模式速度較快,也比0安全,只有在作業系統崩潰或者系統斷電的情況下,上一秒鐘所有事務資料才可能丟失。

四、其他相關

查詢資料時候看到其他文章說innodb_flush_log_at_trx_commit和sync_binlog 兩個引數是控制MySQL 磁碟寫入策略以及資料安全性的關鍵引數,當兩個引數都設定為1的時候寫入效能最差,推薦做法是innodb_flush_log_at_trx_commit=2,sync_binlog=500 或1000