Linux系統(tǒng)下自行編譯安裝MySQL及基礎(chǔ)配置全過(guò)程解析
安裝依賴:
CentOS:
# yum -y install wget gcc-c++ cmake make bison ncurses-devel perl unzip
Ubuntu:(使用ubuntu下面有不少需要root權(quán)限,請(qǐng)注意)
# sudo apt-get install -y g++ gcc make libpcre3 zlib1g libbz2-dev automake cmake perl libncurses5-dev bison
添加MySQL系統(tǒng)用戶
# groupadd mysql # useradd -r -g mysql mysql
提前建立好相關(guān)目錄
# mkdir /data/logs/mysql # mkdir /data/mysql
下載MySQL源代碼:
# wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12.tar.gz
配置
# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 \ -DMYSQL_DATADIR=/data/mysql \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DMYSQL_USER=mysql \ -DDEFAULT_CHARSET=utf8 \ -DEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DENABLE_DOWNLOADS=1
配置釋義:
-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 設(shè)置安裝目錄
-DMYSQL_DATADIR=/data/mysql 設(shè)置數(shù)據(jù)庫(kù)存放目錄
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock 設(shè)置UNIX socket 目錄
-DMYSQL_USER=mysql 設(shè)置運(yùn)行用戶
-DDEFAULT_CHARSET=utf8 設(shè)置默認(rèn)字符集,默認(rèn)latin1
-DEFAULT_COLLATION=utf8_general_ci 設(shè)置默認(rèn)校對(duì)規(guī)則,默認(rèn)latin1_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1 添加InnoDB引擎支持
-DENABLE_DOWNLOADS=1 自動(dòng)下載可選文件,比如自動(dòng)下載谷歌的測(cè)試包
-DMYSQL_TCP_PORT=3306 設(shè)置服務(wù)器監(jiān)聽(tīng)端口,默認(rèn)3306
-DSYSCONFDIR=/data/etc 設(shè)置my.cnf所在目錄,默認(rèn)為安裝目錄
更多參數(shù)執(zhí)行 # cmake . -LH 或者查看官方說(shuō)明
Note:
執(zhí)行過(guò)程中會(huì)出現(xiàn):
CMake Error: Problem with tar_extract_all(): Invalid argument CMake Error: Problem extracting tar: /usr/local/src/mysql-5.6.12/source_downloads/gmock-1.6.0.zip
解決方法:
cd mysql目錄下面會(huì)發(fā)現(xiàn)有一個(gè)source_downloads目錄,需要解壓unzip gmock-1.6.0.zip,然后再重新執(zhí)行上述配置過(guò)程。當(dāng)然你也可以去掉-DENABLE_DOWNLOADS=1這個(gè)選項(xiàng),不編譯谷歌的測(cè)試包也沒(méi)有什么問(wèn)題,但是之前的某些版本會(huì)出現(xiàn)無(wú)法編譯的問(wèn)題。
編譯安裝
# make && make install
建立鏈接文件,方便以后使用和升級(jí):
# ln -s /usr/local/server/mysql-5.6.12 /usr/local/server/mysql
設(shè)置權(quán)限:
# chown -R mysql:mysql /usr/local/server/mysql # chown -R mysql:mysql /usr/local/server/mysql-5.6.12 # chown -R mysql:mysql /data/mysql # chown -R mysql:mysql /data/logs/mysql
初始化數(shù)據(jù)庫(kù)
# /usr/local/server/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/server/mysql --collation-server=utf8_general_ci
這時(shí)候會(huì)出現(xiàn)以下警告,下面配置my.cnf會(huì)解決這個(gè)問(wèn)題
詳情請(qǐng)查看 MySQL 5.6 中 TIMESTAMP 的變化
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
配置啟動(dòng)項(xiàng)目:
# cp /usr/local/server/mysql/support-files/mysql.server /etc/init.d/mysql
修改安裝目錄下my.cnf,部分參數(shù)需要結(jié)合實(shí)際情況進(jìn)行修改
[mysqld] datadir = /data/mysql socket = /tmp/mysql.sock pid-file = /data/logs/mysql/mysql.pid user = mysql port = 3306 default_storage_engine = InnoDB # InnoDB #innodb_buffer_pool_size = 128M #innodb_log_file_size = 48M innodb_file_per_table = 1 innodb_flush_method = O_DIRECT # MyISAM #key_buffer_size = 48M # character-set character-set-server=utf8 collation-server=utf8_general_ci # name-resolve skip-host-cache skip-name-resolve # LOG log_error = /data/logs/mysql/mysql-error.log long_query_time = 1 slow-query-log slow_query_log_file = /data/logs/mysql/mysql-slow.log # Others explicit_defaults_for_timestamp=true #max_connections = 500 open_files_limit = 65535 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [client] socket = /tmp/mysql.sock port = 3306 Note:
被注釋掉的部分語(yǔ)句,需要結(jié)合業(yè)務(wù)和硬件資源進(jìn)行修改,所以先占位,使用默認(rèn)值即可。my.cnf文件中不能出現(xiàn)拼寫錯(cuò)誤,否則,接下來(lái)啟動(dòng)會(huì)出現(xiàn)很多意想不到的錯(cuò)誤,如果出現(xiàn)無(wú)法啟動(dòng)請(qǐng)參看:mysql-error.log文件。權(quán)限設(shè)置不當(dāng)也會(huì)導(dǎo)致啟動(dòng)失敗。
啟動(dòng)前,再次確認(rèn)一遍權(quán)限:
很有可能現(xiàn)在my.cnf的權(quán)限不是mysql,同時(shí)檢查一下/etc/my.cnf是否存在,如果存在則刪除?。?!
# chown -R mysql:mysql /usr/local/server/mysql-5.6.12
啟動(dòng)mysql:
# service mysql start
添加環(huán)境變量
#echo 'export PATH=$PATH:/usr/local/server/mysql/bin'>> /etc/profile
安全設(shè)置(設(shè)定初始密碼,移除匿名用戶,移除測(cè)試數(shù)據(jù)庫(kù)):
# /usr/local/server/mysql/bin/mysql_secure_installation
添加開(kāi)機(jī)啟動(dòng)
CentOS:
# chkconfig mysql on
Ubuntu:
# sudo update-rc.d mysql defaults
配置須知:
MySQL有大量可以修改的配置選項(xiàng),通常只需要把基本的項(xiàng)配置正確,應(yīng)該將更多的時(shí)間花在schema的優(yōu)化、索引上,以及查詢?cè)O(shè)計(jì)上。正確地配置MySQL的基本配置項(xiàng)后,再花力氣去修改其他配置選項(xiàng)的收益通常就比較小了。
過(guò)度優(yōu)化的服務(wù)器導(dǎo)致的潛在風(fēng)險(xiǎn)很大,容易頻繁崩潰、運(yùn)行緩慢。
MySQL大多數(shù)默認(rèn)配置選項(xiàng)已經(jīng)是最佳配置了,所以最好不要做太多的改動(dòng),上文設(shè)置的參數(shù)對(duì)于大多數(shù)人已經(jīng)夠多了。
沒(méi)有一勞永逸的配置,隨著數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)、用戶數(shù)量的變化,過(guò)一段時(shí)間后,可以有選擇地調(diào)整數(shù)據(jù)庫(kù)的配置。
基本配置選項(xiàng)詳解:
socket = /tmp/mysql.sock pid_file = /data/logs/mysql/mysql.pid
socket和pid_file 文件如果不指定位置,放在默認(rèn)編譯位置,在不同的MySQL版本里可能會(huì)導(dǎo)致一些錯(cuò)誤
default_storage_engine = InnoDB
設(shè)定默認(rèn)存儲(chǔ)引擎,創(chuàng)建表的時(shí)候最好顯式進(jìn)行存儲(chǔ)引擎的配置
innodb_buffer_pool_size = 2G innodb_log_file_size = 128M innodb_file_per_table = 1 innodb_flush_method = 0_DIRECT
InnoDB最重要的兩個(gè)選項(xiàng)為緩沖池大小
innodb_buffer_pool_size和 日志文件大小innodb_log_file_size,默認(rèn)值一般都太小。
如果大部分表都是InnoDB表,InnoDB緩沖池的設(shè)置或許比其他任何東西都需要內(nèi)存。InnoDB并不僅僅緩存索引:它還會(huì)緩存數(shù)據(jù)、自適應(yīng)哈系索引、插入緩沖(Insert Buffer)、鎖,以及其他內(nèi)部數(shù)據(jù)結(jié)構(gòu)。InnoDB還使用緩沖池來(lái)幫助延遲寫入,合并多個(gè)寫入操作,一起順序?qū)懟???傊琁nnoDB嚴(yán)重依賴緩沖池,必須分配足夠內(nèi)存。
Note:
緩沖池越大,預(yù)熱和關(guān)閉都需要很長(zhǎng)時(shí)間。
InnoDB使用日志來(lái)減少事務(wù)提交的開(kāi)銷。因?yàn)槿罩疽呀?jīng)記錄了事務(wù),就無(wú)須在每個(gè)事務(wù)提交時(shí)把緩沖池的脹快刷新到磁盤中。InnoDB用日志把隨機(jī)I/O變成順序I/O。一旦日志安全寫到磁盤,事務(wù)就持久化了。如果斷電,InnoDB可以重放日志并且恢復(fù)已經(jīng)提交的事務(wù)。
整體日志大小受控于innodb_log_file_size和innodb_log_file_in_group兩個(gè)參數(shù)之乘積。一般需要設(shè)置幾百M(fèi)B甚至上GB。作為經(jīng)驗(yàn)法則,一般日志文件全部大小,應(yīng)該足夠容納服務(wù)器一小時(shí)的活動(dòng)內(nèi)容。
緩沖池大小設(shè)置方法:
從服務(wù)器總內(nèi)存開(kāi)始
減去操作系統(tǒng)占用內(nèi)存和其他服務(wù)占用內(nèi)存(如果還有其他服務(wù)的話)
減去MySQL自身需要內(nèi)存,例如為每個(gè)查詢操作分配一些緩沖。
減去足夠讓操作系統(tǒng)緩存InnoDB日志文件的內(nèi)存,至少是足夠緩存最近經(jīng)常訪問(wèn)的部分。再減去一些可以緩存二進(jìn)制日志的最后一部分,以防止復(fù)制產(chǎn)生了延遲,備庫(kù)可能讀取主庫(kù)上舊的二進(jìn)制日志文件,給主庫(kù)內(nèi)存造成壓力。
減去其他MySQL緩沖和緩存需要的內(nèi)存,如MyISAM鍵緩存(key_buffer_size),或者查詢緩存(query cache)
處以105%,向下取舍一個(gè)合理值。
Note:設(shè)置不需要很精確,而且寧可謹(jǐn)慎,而不要設(shè)置過(guò)大,如果設(shè)置少了20%可能只產(chǎn)生很小的影響,但是如果大了20%則可能造成很嚴(yán)重的問(wèn)題:內(nèi)存交換、磁盤抖動(dòng)、內(nèi)存耗盡和死機(jī)。
#MyISAM key_buffer_size = 128M
MyISAM自身只緩存索引,不緩存數(shù)據(jù)(依賴操作系統(tǒng)緩存數(shù)據(jù))。如果大部分為MyISAM表,就應(yīng)該分配較大key_buffer_size。
再分配多大內(nèi)存前,首先了解一下,MyISAM占用了多大的空間,肯定不需要分配比需要緩存的索引數(shù)據(jù)還大的內(nèi)存(有時(shí)候?yàn)閿?shù)據(jù)量擴(kuò)增預(yù)留一些,會(huì)設(shè)置比較大)。
有兩個(gè)方法計(jì)算索引大?。?br />
使用SQL語(yǔ)句,查詢INFORMATION——SCHEMA表的INDEX_LENGTH字段,把他們相加即可。
SELECT SUM( INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE='MYISAM';
使用的UNIX系統(tǒng),則使用以下命令
# du -sch `find /mysqldatadir -name “*.MYI”`
鍵緩存需要存儲(chǔ)多大的值?
不要超過(guò)索引總大小,也不要超過(guò)為操作系統(tǒng)緩存保留的總大小。取兩者較小值。
緩沖區(qū)使用率計(jì)算,通過(guò)SHOW STATUS和SHOW VARIABLES命令查看以下變量:
100 - ( ( Key_blocks_unused * key_cache_block_size) * 100 / key_buffer_size )
如果服務(wù)器運(yùn)行很長(zhǎng)一段時(shí)間之后,還是沒(méi)有使用完所有緩沖鍵,就可以把緩沖鍵調(diào)小一點(diǎn)。
鍵緩沖命中率
從經(jīng)驗(yàn)上來(lái)講,每秒未命中次數(shù)更有用,假定一個(gè)磁盤每秒可以產(chǎn)生100個(gè)隨機(jī)讀,每秒5次緩存未命中則不會(huì)導(dǎo)致I/O繁忙,每秒80次則可能導(dǎo)致I/O繁忙。計(jì)算公式:
Key_reads / Uptime
設(shè)定默認(rèn)字符集和編碼
# character-set-server character-set-server=utf8 collation-server=utf8_general_ci
以下選項(xiàng)設(shè)定僅使用IP來(lái)鏈接MySQL服務(wù)器,省略了DNS查詢時(shí)間
閱讀材料:http://dev.mysql.com/doc/refman/5.6/en/host-cache.html
# name-resolve skip-name-resolve skip-host-cache
設(shè)定錯(cuò)誤日志和慢查詢?nèi)罩?。大?s的為慢查詢
# LOG log_error = /data/logs/mysql/mysql-error.log long_query_time = 1 slow_query_log slow_query_log_file = /data/logs/mysql/mysql-slow.log # Others #timestamp默認(rèn)設(shè)置,5.6.6后不設(shè)置會(huì)報(bào)錯(cuò) explicit_defaults_for_timestamp=true
設(shè)定同時(shí)處理的最大鏈接,保證應(yīng)用激增產(chǎn)生而不堪重負(fù),當(dāng)查詢不能執(zhí)行,那打開(kāi)一個(gè)鏈接沒(méi)有任何好處,所以被“太多鏈接”的錯(cuò)誤拒絕是一個(gè)快速而代價(jià)下的失敗方式。具體設(shè)定需要參考預(yù)想的最大并發(fā)數(shù)和本機(jī)配置。
max_connections = 500
table_open_cache was known as table_cache in MySQL 5.1.2 and earlier.
table_open_cache應(yīng)該設(shè)置足夠大,避免總是重新打開(kāi)和解析表定義。如果Open_tables的值每秒變化很大,那么table_open_cache可能設(shè)置偏小。這個(gè)值從max_connections的10倍開(kāi)始設(shè)置比較好,但是,大部分情況下不要超過(guò)10000.
table_open_cache = 5000
如果在段時(shí)間內(nèi)不斷有錯(cuò)誤鏈接,比如:權(quán)限錯(cuò)誤,應(yīng)用配置出錯(cuò)等??蛻舳诉_(dá)到max_connect_errors設(shè)定次數(shù),就會(huì)被加入黑名單,無(wú)法連接,直到再次刷新主機(jī)緩存。(如何操作?)可以有效防止暴力破解密碼。
max_connect_errors = 2000
在典型的Linux系統(tǒng)上我們把open_files_limit設(shè)置的盡可能大。現(xiàn)代操作系統(tǒng)中打開(kāi)文件句柄開(kāi)銷都較小。如果這個(gè)參數(shù)設(shè)置不夠大,會(huì)出現(xiàn)經(jīng)典的24號(hào)錯(cuò)誤:”too many open files”。
open_files_limit = 65535
- Linux下安裝Mysql多實(shí)例作為數(shù)據(jù)備份服務(wù)器實(shí)現(xiàn)多主到一從多實(shí)例的備份
- Linux下安裝mysql-5.6.4 的圖文教程
- linux安裝mysql和使用c語(yǔ)言操作數(shù)據(jù)庫(kù)的方法 c語(yǔ)言連接mysql
- windows和linux安裝mysql后啟用日志管理功能的方法
- SUSE Linux下源碼編譯方式安裝MySQL 5.6過(guò)程分享
- Linux下編譯安裝MySQL-Python教程
- Linux下編譯安裝Mysql 5.5的簡(jiǎn)單步驟
- 在Linux系統(tǒng)安裝Mysql教程
相關(guān)文章
簡(jiǎn)單談?wù)凪ySQL的loose index scan
各種資料關(guān)于loose index scan的解釋很拗口,其實(shí)等同于oracle的index skip scan。今天我們就來(lái)詳細(xì)看看loose index scan的使用2015-12-12MySQL中二進(jìn)制與重做日志文件的基本概念學(xué)習(xí)教程
這篇文章主要介紹了MySQL中二進(jìn)制日志文件與重做日志文件的基本概念學(xué)習(xí)教程,講到了一些重做日志與二進(jìn)制日志的區(qū)別,需要的朋友可以參考下2015-11-11一次Mysql使用IN大數(shù)據(jù)量的優(yōu)化記錄
這篇文章主要給大家介紹了關(guān)于Mysql使用IN大數(shù)據(jù)量的優(yōu)化的實(shí)戰(zhàn)記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09MySQL子查詢與HAVING/SELECT的結(jié)合使用
這篇文章主要介紹了MySQL子查詢?cè)贖AVING/SELECT字句中使用、及相關(guān)子查詢和WITH/EXISTS字句的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-06-06阿里云安裝mysql數(shù)據(jù)庫(kù)出現(xiàn)2002錯(cuò)誤解決辦法
這篇文章主要介紹了阿里云安裝mysql數(shù)據(jù)庫(kù)出現(xiàn)2002錯(cuò)誤解決辦法,需要的朋友可以參考下2017-04-04Mybatis報(bào)錯(cuò): org.apache.ibatis.exceptions.PersistenceException
這篇文章主要介紹了Mybatis報(bào)錯(cuò): org.apache.ibatis.exceptions.PersistenceException解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12