Mysql5.6.16配置與優化

1、準備安裝環境:

yum -yinstall make gcc- c++ cmake bison-devel ncurses-develmysql

2、下載mysql5.6.16

wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.16.tar.gzlinux

3、編譯安裝mysql

tar -xvzf mysql-5.6.16.tar.gzc++

cd mysql-5.6.16.tar.gzsql

cmake\數據庫

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \緩存

-DMYSQL_DATADIR=/usr/local/mysql/data \安全

-DSYSCONFDIR=/etc \服務器

-DWITH_MYISAM_STORAGE_ENGINE=1 \網絡

-DWITH_INNOBASE_STORAGE_ENGINE=1 \併發

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \

-DMYSQL_TCP_PORT=3306 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci

make && make install


錯誤1

Googlemock was notfound. gtest-based unit tests will be disabled. You can run cmake .-DENABLE_DOWNLOADS=1 to automatically download and build required componentsfrom source.
– If you are inside a firewall, you may need touse an http proxy: export http_proxy=http://example.com:80

處理辦法

使用參數-DENABLE_DOWNLOADS=1自動下載。

-DENABLE_DOWNLOADS=1

有網絡限制,設置http代理

exporthttp_proxy=http://googlemock.googlecode.com:80

unzip source_downloads/gmock-1.6.0.zip

錯誤2

Warning: Bisonexecutable not found in PATH

處理辦法

wget ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/5rolling/x86_64/SL/bison-2.3-2.1.x86_64.rpm

rpm –ivh bison-2.3-2.1.x86_64.rpm


從新編譯

cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql\

cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \

-DMYSQL_TCP_PORT=3306 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DENABLE_DOWNLOADS=1


make&& make install


4、配置MySQL

使用下面的命令查看是否有mysql用戶及用戶組

cat/etc/passwd 查看用戶列表

cat/etc/group  查看用戶組列表

若是沒有就建立

groupaddmysql

useradd-g mysql mysql

修改/usr/local/mysql權限

chown-R mysql:mysql /usr/local/mysql

進入安裝路徑

cd/usr/local/mysql

進入安裝路徑,執行初始化配置腳本,建立系統自帶的數據庫和表

scripts/mysql_install_db--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data--user=mysql

注:在啓動MySQL服務時,會按照必定次序搜索my.cnf,先在/etc目錄下找,找不到則會搜索"$basedir/my.cnf",在本例中就是/usr/local/mysql/my.cnf,這是新版MySQL的配置文件的默認位置!注意:在CentOS 6.4版操做系統的最小安裝完成後,在/etc目錄下會存在一個my.cnf,須要將此文件改名爲其餘的名字,如:/etc/my.cnf.bak,不然,該文件會干擾源碼安裝的MySQL的正確配置,形成沒法啓動。


5、啓動MySQL

添加服務,拷貝服務腳本到init.d目錄,並設置開機啓動

cpsupport-files/mysql.server /etc/init.d/mysql

chkconfigmysql on

servicemysql start  --啓動MySQL

6、配置用戶

MySQL啓動成功後,root默認沒有密碼,咱們須要設置root密碼。

設置以前,咱們須要先設置PATH,要不不能直接調用mysql

修改/etc/profile文件,在文件末尾添加

PATH=/usr/local/mysql/bin:$PATH

exportPATH

關閉文件,運行下面的命令,讓配置當即生效

source /etc/profile

如今,咱們能夠在終端內直接輸入mysql進入,mysql的環境了

執行下面的命令修改root密碼

mysql -u root  

mysql> SET PASSWORD = PASSWORD('123456');

若要設置root用戶能夠遠程訪問,執行

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%'IDENTIFIED BY 'challenger' WITH GRANT OPTION;

紅色的password爲遠程訪問時,root用戶的密碼,能夠和本地不一樣。

7、配置防火牆

防火牆的3306端口默認沒有開啓,若要遠程訪問,須要開啓這個端口

打開/etc/sysconfig/iptables

在「-A INPUT –m state --state NEW –m tcp –p–dport 22 –j ACCEPT」,下添加:

-A INPUT m state --state NEW m tcp p dport3306 j ACCEPT

而後保存,並關閉該文件,在終端內運行下面的命令,刷新防火牆配置:

service iptables restart


8、錯誤彙總

錯誤1

Starting MySQL...ERROR! The server quit without updating PID file

處理1:

skip-locking不採用此參數。

錯誤2:

「[Warning] TIMESTAMP with implicit DEFAULTvalue is deprecated.Please use --explicit_defaults_for_timestamp server option(see documentation for more details).」

處理2:

[mysqld]

explicit_defaults_for_timestamp = 1

錯誤3:


處理3:

table_cache = 614K 不採用此參數。


9、參數優化:

[client]

port=3306

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

default-character-set = utf8


[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

explicit_defaults_for_timestamp=1


port=3306

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

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

user=mysql


log_slave_updates=1

log_bin=/usr/local/mysql/mysql-test/suite/binlog/mysql-bin

binlog_format=mixed

binlog_cache_size=4M

max_binlog_cache_size=8M

max_binlog_size=1G

expire_logs_days=90

binlog-ignore-db=mysql

binlog-ignore-db=test

binlog-ignore-db=information_schema



key_buffer_size = 512M

sort_buffer_size = 16M

read_buffer_size = 8M

read_rnd_buffer_size = 64M

join_buffer_size = 16M

thread_cache_size = 128M

query_cache_size = 128M

#query_cache_limit=2M

#query_cache_min_res_unit=2K

thread_concurrency = 16



#table_cache=614

table_open_cache=512

open_files_limit=10240

#back_log=384

back_log=600

max_connections = 5000

max_connect_errors = 6000

external-locking=FALSE



max_allowed_packet = 32M

default-storage-engine = InnoDB

thread_stack = 512K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 256M

max_heap_table_size = 512M


bulk_insert_buffer_size = 256M

myisam_sort_buffer_size = 256M

myisam_max_sort_file_size = 10G

#myisam_max_extra_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover


long_query_time=2

slow_query_log

slow_query_log_file=/usr/local/mysql/slow.log

#skip-locking

#skip-networking


innodb_additional_mem_pool_size = 64M

innodb_buffer_pool_size = 6G

innodb_data_file_path = ibdata1:10M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 16

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 512M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table=0



wait_timeout=10

tmp_table_size = 128M

default-time-zone = system

character-set-server = utf8



[mysqld_safe]

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

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



[mysqldump]

quick

max_allowed_packet = 64M


[mysql]

no-auto-rehash

Remove the next comment character if you ar notfamiliar with SQL

safe -updates


[myisamchk]

key_buffer_size=256M

sort_buffer_size=256M

read_buffer=2M

write_buffer=2M


[mysqlhotcopy]

interactive-timeout



鏈接設置的優化


一、wait_timeout / interactive_timeout  鏈接超時

服務器關閉鏈接以前等待活動的秒數。MySQL所支持的最大鏈接數是有限的,由於每一個鏈接的創建都會消耗內存,所以咱們但願MySQL 處理完相應的操做後,應該斷開鏈接並釋放佔用的內存。若是你的MySQL Server有大量的閒置鏈接,他們不只會白白消耗內存,並且若是鏈接一直在累加而不斷開,最終確定會達到MySQL Server的鏈接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統的運行狀況來判斷。在系統運行一段時間後,能夠經過show processlist命令查看當前系統的鏈接狀態,若是發現有大量的sleep狀態的鏈接進程,則說明該參數設置的過大,能夠進行適當的調整小些。建議120 ~ 300

wait_timeout  指定一個請求的最大鏈接時間 wait_timeout = 10,對於4GB左右內存的服務器能夠設置爲5-10。

 

二、skip-name-resolve鏈接檢查

skip-name-resolve參數用於禁止DNS的反向解析。MySQL默認開啓了DNS的反向解析,當有新的鏈接到來時,MySQL會解析鏈接主機的DNS,這就影響了鏈接速度。使用該參數也有一個代價,就是每次鏈接都要使用ip地址,就不能再使用localhost,改爲127.0.0.1

 

三、max_connections  最大鏈接進程數,也就是容許同時鏈接的客戶數量

若是服務器的併發鏈接請求比較大,建議調高此值,以增長並行鏈接數量。但鏈接數越大,MySQL會爲每一個鏈接提供鏈接緩衝區,就會開銷越多的內存,服務器消耗的內存越多,可能會影響服務器性能,因此要根據服務器的配置適當調整該值,不能盲目提升設值。默認數值是100。【計算MySQL繁忙時處理鏈接的狀況,建議值50% ~ 80%】max_used_connections / max_connections * 100%

 

四、max_connect_errors  最大鏈接錯誤數

max_connect_errors = 10000000。對於同一主機,若是有超出該參數值個數的中斷錯誤鏈接,則該主機將被禁止鏈接。如需對該主機進行解禁,執行:FLUSH HOST;。

五、max_allowed_packet  設置最大包,限制server接受的數據包大小,避免超長SQL的執行有問題

默認值爲16M,當MySQL客戶端或mysqld服務器收到大於max_allowed_packet字節的信息包時,將發出「信息包過大」錯誤,並關閉鏈接。對於某些客戶端,若是通訊信息包過大,在執行查詢期間,可能會遇到「丟失與MySQL服務器的鏈接」錯誤。

增長該變量的值十分安全,這是由於僅當須要時纔會分配額外內存。例如,僅當你發出長查詢或mysqld必須返回大的結果行時mysqld纔會分配更多內存。該變量之因此取較小默認值是一種預防措施,以捕獲客戶端和服務器之間的錯誤信息包,並確保不會因偶然使用大的信息包而致使內存溢出。

六、thread_concurrency   容許經過的併發數 屬重點優化參數

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

 

七、back_log  設置MySQL能暫存的鏈接數量

當MySQL在一個很短期內收到很是多的鏈接請求時起做用。若是MySQL的鏈接數達到max_connections時,新來的請求將會被存在堆棧中,以等待某一鏈接釋放資源,該堆棧的數量即back_log,若是等待鏈接的數量超過back_log,將不被授予鏈接資源。設定back_log高於你的操做系統的限制是無效的。當你觀察你的主機進程列表,發現大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待鏈接進程時,就要加大 back_log 的值了。默認數值是50,若是訪問量大能夠它改成500。默認數值是50。

緩存設置的優化

一、表緩存

相關參數: table_open_cache

  指定表緩存的大小。每當MySQL訪問一個表時,若是在表緩衝區中還有空間,該表就被打開並放入其中,這樣能夠更快地訪問表內容。經過檢查峯值時間的狀態值,若是發現open_tables等於table_cache,而且opened_tables在不斷增加,那麼就須要增長table_open_cache的值了。注意,不能盲目地把這個參數設置得很大,若是設置太大,會引發文件描述符不足,形成性能不穩定或者數據庫鏈接失敗。建議爲512

  table_cache = 512指定表高速緩存的大小, 若是opened_tables太大,應該把table_cache變大。每當MySQL訪問一個表時,若是在表緩衝區中還有空間,該表就被打開並放入其中,這樣能夠更快地訪問表內容。經過檢查峯值時間的狀態值Open_tables和Opened_tables,能夠決定是否須要增長table_cache的值。若是你發現 open_tables等於table_cache,而且opened_tables在不斷增加,那麼你就須要增長table_cache的值了(上述狀態值可使用SHOW STATUS LIKE ‘Open%tables'得到)。注意,不能盲目地把table_cache設置成很大的值。若是設置得過高,可能會形成文件描述符不足,從而形成性能不穩定或者鏈接失敗。

 

二、查詢緩存

相關參數: query_cache_size / query_cache_type

  這個參數也是一個重要的優化參數。QC(注:查詢緩存簡稱) 主要用來緩存 MySQL 中的 結果集,也就是一條SQL語句執行的結果集,因此僅僅只能針對select 語句。在MySQL服務器上進行查詢,能夠啓用高速查詢緩存。讓數據庫引擎在後臺悄悄的處理是提升性能的最有效方法之一。當同一個查詢被執行屢次時,若是結果是從緩存中提取,那是至關快的。

  但隨着發展,這個參數也爆露出來一些問題。機器的內存愈來愈大,人們也都習慣性的把之前有用的參數分配的值愈來愈大。這個參數加大後也引起了一系列問題。咱們首先分析一下 query_cache_size的工做原理:一個SELECT查詢在DB中工做後,DB會把該語句緩存下來,當一樣的一個SQL再次來到DB裏調用時,DB在該表沒發生變化的狀況下把結果從緩存中返回給Client。這裏有一個關建點,就是DB在利用Query_cache工做時,要求該語句涉及的表在這段時間內沒有發生變動。那若是該表在發生變動時,Query_cache裏的數據又怎麼處理呢?首先要把Query_cache和該表相關的語句所有置爲失效,而後在寫入更新。那麼若是Query_cache很是大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎麼這麼慢了。因此在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。並且在高併發,寫入量大的系統,建系把該功能禁掉。
    QC 的使用須要多個參數配合,其中最爲關鍵的是 query_cache_size 和 query_cache_type ,前者設置緩存記錄集的內存大小,後者設置在何場景下使用QC 。在以往的經驗來看,中等規模的網站,query_cache_size 設置 256MB 足夠了。固然,還能夠經過計算QC的命中率來進行調整。

    Qcache_hits / (Qcache_hits + Qcache_inserts)  * 100%

  query_cache_type有三種選擇:0(OFF,不使用QC),1(ON,默認使用QC ),2(DEMAND,默認不使用QC)。爲何加上「默認」?MySQL還支持動態使用緩存的SQL語法,以下:

  # 強制使用緩存    SELECT  SQL_CACHE  id  FROM  table

  # 強制不使用緩存  SELECT  SQL_NO_CACHE  id  FROM  table

 

在有些處理任務中,咱們其實是能夠阻止查詢緩存工做的。

 // query cache does NOT work
        $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
     // query cache works!
        $today = date("Y-m-d");
       $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

 

三、索引緩存

相關參數:key_buffer_size

  這個是對MyISAM表性能影響最大的一個參數,用來設置用於緩存 MyISAM存儲引擎中索引文件的內存區域大小。若是有足夠的內存,這個緩存區域大小能夠設爲全部的 MyISAM表的索引大小的總和,即 data 目錄下全部*.MYI文件大小的總和。

  注意,因爲 MyISAM 引擎只會緩存索引塊到內存中,而不會緩存表數據庫塊。因此,查詢SQL語句必定要儘量讓過濾條件都在索引中,以便使用到索引緩存來提升查詢效率。

  計算索引緩存未命中的機率Key_reads / Key_read_requests * 100%

  若是Key_reads太大,則應該把key_buffer_size變大。增長它可獲得更好處理的索引(對全部讀和多重寫),若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行得太慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能。對於內存在4GB左右的服務器該參數可設置爲384M或512M。經過檢查狀態值Key_read_requests和 Key_reads,能夠知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該儘量的低,至少是1:100,1:1000更好(上述狀態值可使用SHOW STATUS LIKE ‘key_read%'得到)。注意:該參數值設置的過大反而致使是服務器總體效率下降。

 

四、插入緩存

相關參數:bulk_insert_buffer_size

  用於使用 MyISAM引擎,用來緩存批量插入數據的時候臨時緩存寫入數據。當咱們使用以下幾種數據寫入語句的時候,會使用這個內存區域來緩存批量結構的數據以幫助批量寫入數據文件,默認8M,建議不要超過32M

insert … select …
insert … values (…),(…),(…),…
load data infile… into… /* 非空表 */

 

 五、日誌緩存

相關參數:binlog_cache_size

  用於在打開了二進制日誌(binlog)記錄功能的環境中,是 MySQL 用來提升 binlog 的記錄效率而設計的一個在短期內緩存binlog 數據的內存緩存。

  若是數據庫中沒有大事務,寫入不是特別頻繁,2MB~4MB是一個合適的選擇。可是若是數據庫大事務較多,寫入比較頻繁,可適當加大。使用的時候,還能夠經過  binlog_cache_use 以及 binlog_cache_disk_use來分析設置的binlog_cache_size是否足夠,是否有大量的binlog_cache因爲內存大小不夠而使用臨時文件來緩存了。

 

六、其餘緩存參數設置

  1)、key_buffer  改變索引緩衝區長度

通常,該變量控制緩衝區的長度在處理索引表(讀/寫操做)時使用。MySQL使用手冊指出該變量能夠不斷增長以確保索引表的最佳性能,並推薦使用與系統內存25%的大小做爲該變量的值。這是MySQL十分重要的配置變量之一,若是你對優化和提升系統性能有興趣,能夠從改變 key_buffer_size變量的值開始。 

  2)、long_query_time 對緩長查詢設定一個時間限制

MySQL帶有「慢查詢日誌」,它會自動地記錄全部的在一個特定的時間範圍內還沒有結束的查詢。這個日誌對於跟蹤那些低效率或者行爲不端的查詢以及尋找優化對象都很是有用。long_query_time變量控制這一最大時間限定,以秒爲單位。 

3)、sort_buffer_size   屬重點優化參數

sort_buffer_size = 4M 查詢排序時所能使用的緩衝區大小。注意:該參數對應的分配內存是每鏈接獨佔,若是有100個鏈接,那麼實際分配的總共排序緩衝區大小爲100 × 4 = 400MB。因此,對於內存在4GB左右的服務器推薦設置爲4-8M。 

4)、read_buffer_size 讀查詢操做所能使用的緩衝區大小

read_buffer_size = 4M。和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享。MySql讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySql會爲它分配一段內存緩衝區。read_buffer_size變量控制這一緩衝區的大小。若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行得太慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能。 

5)、join_buffer_size  聯合查詢操做所能使用的緩衝區大小

  join_buffer_size = 8M,和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享。 

6)、thread_cache_size

thread_cache_size = 64服務器線程緩存這個值表示能夠從新利用保存在緩存中線程的數量,若是Threads_created太大,就要增長thread_cache_size的值。當斷開鏈接時若是緩存中還有空間,那麼客戶端的線程將被放到緩存中,若是線程從新被請求,那麼請求將從緩存中讀取,若是緩存中是空的或者是新的請求,那麼這個線程將被從新建立,若是有不少新的線程,增長這個值能夠改善系統性能.經過比較 Connections 和 Threads_created 狀態的變量,能夠看到這個變量的做用 

7)、tmp_table_size

若是Created_tmp_disk_tables太大, 就要增長tmp_table_size的值,用基於內存的臨時表代替基於磁盤的。tmp_table_size 的默認大小是 32M。若是一張臨時表超出該大小,MySQL產生一個 The table tbl_name is full 形式的錯誤,若是你作不少高級 GROUP BY 查詢,能夠增長 tmp_table_size 值。 

8)、read_rnd_buffer_size

MySql的隨機讀(查詢操做)緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySql會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但MySql會爲每一個客戶鏈接發放該緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大。

相關文章
相關標籤/搜索