- 跟老男孩學Linux運維:MySQL入門與提高實踐
- 老男孩
- 1875字
- 2019-02-18 17:30:32
第3章 MySQL數據庫安裝方法及安裝實踐
3.1 MySQL數據庫的安裝方法及選擇
在當今的互聯網企業里,MySQL數據庫大多運行在Linux系列操作系統上,當然,你也可以運行在Windows/Unix等商業操作系統上,本書主要以國內互聯網公司應用最多的數據庫服務操作系統——CentOS 6最新版(6.8)x86_64 Linux系統為例進行講解,使用其他系統的讀者同樣也可以從本書受益!
即使是在CentOS 6 x86_64 Linux系統環境下,若應用場景不同或版本不同,MySQL數據庫的安裝方法也會有所區別,下面我們就把最常見的幾種方法一一介紹給大家!
3.1.1 yum/rpm方式安裝MySQL
MySQL官方網站及相關鏡像網站提供了不同版本的RPM安裝包,并且針對不同的硬件或操作系統平臺,安裝包的類型也會有區別。在使用時,可以到官方網站的下載頁面進行選擇,國內有一些互聯網公司提供了鏡像文件下載,比如搜狐、阿里云公司提供的鏡像資源就非常不錯。
下面是搜狐網提供的數據庫軟件鏡像地址:http://mirrors.sohu.com/mysql,如果本書使用的版本不再發布,那么可以選擇5.6的其他相關版本,老男孩也在本書開頭提供的地址中上傳了本書使用的版本的軟件。
注意:yum/rpm安裝方式適合所有MySQL軟件產品。
1.rpm包方式安裝MySQL
rpm包的安裝方式非常簡單,這里以el6平臺下的MySQL 5.6.40版本為例,首先,要通過上述搜狐鏡像地址下載到如下四個MySQL相關軟件安裝包。
MySQL-client-5.6.40-1.el6.x86_64.rpm MySQL-devel-5.6.40-1.el6.x86_64.rpm MySQL-server-5.6.40-1.el6.x86_64.rpm MySQL-shared-5.6.40-1.el6.x86_64.rpm
提示:我們可以從Linux的對應系統盤或系統鏡像里找到類似的rpm包,但是版本一般會較低一些。
一般來說,其中的MySQL-server-5.6.40-1.el6.x86_64.rpm和MySQL-client-5.6.40-1. el6.x86_64.rpm這兩個軟件包是必須要安裝的,至于另外兩個軟件包,則可視實際需要進行安裝,不過一般建議一起安裝。
可以把這四個rpm包上傳到服務器的目錄中,然后執行如下rpm命令進行安裝:
[root@oldboy tools]# rpm -qa|grep mysql #<==查找已經安裝的mysql的包。 mysql-libs-5.1.73-7.el6.x86_64 rpm -e mysql-libs-5.1.73-7.el6.x86_64 --nodeps #<==卸載系統已經安裝的mysql依賴包。 rpm -ivh MySQL-client-5.6.40-1.el6.x86_64.rpm rpm -ivh MySQL-devel-5.6.40-1.el6.x86_64.rpm rpm -ivh MySQL-shared-5.6.40-1.el6.x86_64.rpm rpm -ivh MySQL-server-5.6.40-1.el6.x86_64.rpm
這里的el6表示適合操作系統的版本,還有el5、el7等。i686表示適合32位的系統,x86_64表示適合64位的系統。
執行上述命令即可完成MySQL軟件的安裝。
在采用rpm包安裝方式時,必須要官方或第三方提供了現成的rpm軟件包,否則是無法使用該方式安裝的。另外,和直接采用yum的安裝方式相比,rpm包的安裝方式往往可以選擇更新的版本,但是rpm包安裝也有自身的問題,例如,無法滿足定制化安裝,比如,不能進行編譯參數、路徑等的更改。
2.yum方式安裝MySQL
yum方式安裝MySQL數據庫時,只需要執行一個命令“yum install mysql-server -y”即可,yum方式的安裝原理是在執行yum安裝命令之后,其會自動從yum源地址下載相應名稱的MySQL數據庫rpm包,然后到系統上安裝,并自動解決各種軟件包之間的依賴問題。這是一個非常不錯的安裝軟件的方式,不僅僅是針對MySQL,安裝其他軟件也是如此。
yum安裝方式的最大優點就是超級簡單,但是它也有自身的問題:例如它繼承了rpm包的無法定制化安裝的問題;另外一個缺點是采用默認的yum安裝時,一般隨yum源附帶的軟件版本都比較低,例如,截至作者寫作本文時(2018.5),使用CentOS 6.9 Linux默認yum安裝的MySQL版本僅為5.1.73。
3.1.2 采用常規方式編譯安裝MySQL
采用常規方式編譯安裝MySQL時,適合使用第一條最正宗的MySQL產品線5.2及以前版本:
所謂常規方式編譯安裝MySQL就是延續早期MySQL的3部曲安裝方式,即“./conf igure; make; make install”,下面是老男孩在早期的企業生產場景下操作過的具體命令及參數:
tar zxf mysql-5.1.73.tar.gz cd mysql-5.1.73 ./configure \ --prefix=/application/mysql5.1.73 \ --with-unix-socket-path=/application/mysql5.1.73/tmp/mysql.sock \ --localstatedir=/application/mysql5.1.73/data \ --enable-assembler \ --enable-thread-safe-client \ --with-mysqld-user=mysql \ --with-big-tables \ --without-debug \ --with-pthread \ --enable-assembler \ --with-extra-charsets=complex \ --with-readline \ --with-ssl \ --with-embedded-server \ --enable-local-infile \ --with-plugins=partition, innobase \ --with-mysqld-ldflags=-all-static \ --with-client-ldflags=-all-static make make install ln -s /application/mysql-5.1.73/ /application/mysql
安裝到這里,MySQL數據庫還不能正常啟動使用,還需要進行初始化數據庫等工作,具體可以參考后文的安裝部分。
此種方式適合所有MySQL 5.2.xx及以前的產品系列,是最常規的編譯方式,在當下的互聯網企業中,此種編譯安裝的方法已經很少使用了,原因是第一條產品線的產品(MySQL 5.2.xx及以前的產品系列)用得越來越少了,被第二條產品線(MySQL 5.4.xx及以后的產品系列)的產品逐漸替代了,因此,老男孩也不建議讀者再使用第一條產品線的產品作為對外的業務庫。
3.1.3 采用cmake方式編譯安裝MySQL
考慮到MySQL 5.4.xx及以后系列產品的特殊性,其編譯方式和早期的第一條產品線的有所不同,這里采用cmake或gmake的方式編譯安裝。即“./cmake; make; make install”,生產場景的具體命令及參數具體如下:
tar zxf mysql-5.6.40.tar.gz cd mysql-5.6.40 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \ -DMYSQL_DATADIR=/application/mysql-5.6.40/data \ -DMYSQL_UNIX_ADDR=/application/mysql-5.6.40/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITH_ZLIB=bundled \ -DWITH_SSL=bundled \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_EMBEDDED_SERVER=1 \ -DENABLE_DOWNLOADS=1 \ -DWITH_DEBUG=0 #提示,編譯時可配置的選項很多,具體可參考本章最后一部分的內容或官方文檔。 make make install ln -s /application/mysql-5.6.40/ /application/mysql
安裝到這里,MySQL數據庫仍然無法正常啟動使用,還需要進行初始化數據庫等工作,具體可以參考后文的安裝部分,另外,cmake等用于編譯的工具也需要提前進行安裝。相關參數的說明,請見本章結尾的內容。
如果上述操作未出現錯誤,則MySQL 5.6.40軟件cmake方式的安裝就算成功了。
3.1.4 采用二進制方式免編譯安裝MySQL
采用二進制方式免編譯安裝MySQL的方法和yum/rpm包安裝的方式類似,適合各類MySQL產品系列,不需要復雜的編譯設置及編譯時間等待,直接解壓下載軟件包,就相當于編譯方式的make install步驟完成了,然后只要進行初始化數據庫的操作,即可完成并啟動。此方式的MySQL軟件包一般都比較大,最大可達180MB,采用二進制方式免編譯安裝MySQL的方法在后文會詳細講解。
3.1.5 如何正確選擇MySQL的安裝方式
若是對數據庫要求不太高的場景,則可以采用yum/rpm方式安裝MySQL,例如,并發不大,只是在公司內部(wiki系統)、企業內部(Zabbix監控系統,OpenStack后臺管理)等需要數據庫的一些應用場景,當然,生產場景下也是可以選擇yum或rpm方式進行安裝的。
但是,有很多大型網站或門戶網站,在安裝MySQL時,往往會有各種定制化、初始化的需求,這時,要根據企業的需求先把源碼包制作成rpm包,然后搭建自己的yum倉庫,最終采用“yum install mysql-server -y”的方式進行安裝,這樣做的優點是既兼顧了yum/rpm安裝方式簡單的優點,又用到了源碼包安裝方式的可定制性,但是,使用這個方法需要一定的技術能力,此部分的內容建議參考老男孩教育為讀者提供的如下博文。
自動化運維必備技能——定制屬于自己的RPM包http://blog.oldboyedu.com/autodeploy-rpm/。
自動化運維必備技能——搭建屬于自己的YUM倉庫http://blog.oldboyedu.com/autodeploy-yum/。
二進制免編譯安裝方式簡單方便,且適合5.0-5.1和5.5-5.7系列,是不少專業DBA的選擇,普通Linux運維人員一般多采用編譯的方式進行安裝,對應到MySQL 5.0-5.1系列就是常規編譯方式,對應到MySQL 5.5-5.7系列就是cmake編譯方式。
所以綜合來講,這些安裝方式都是可以使用的,只是不同層次的人習慣不同,實際應用的性能差距不是很大。
老男孩的建議:首先是選擇MySQL 5.5或以上的數據庫版本,當數據庫服務器機器數量少的話,可以采用cmake編譯方式安裝,這是很多運維人員的習慣選擇。在數據庫服務器機器數量多的情況下,可采用二進制免編譯方式安裝,這是某些DBA的偏愛,若是數據庫服務器機器數量特別大,且對定制化要求很高,則可以選擇通過源碼定制rpm包,搭建yum倉庫的安裝方式。當然了,采用此種方法的讀者也要具備這方面的能力才行,前文已經給出了做rpm定制以及yum倉庫搭建的地址,這里不再贅述。
3.2 安裝并配置MySQL數據庫
3.2.1 安裝MySQL數據庫
1.MySQL數據庫的安裝環境準備
如果讀者沒有物理服務器環境,則可以搭建vmware等虛擬機環境學習,相應地需要準備如下內容。
1)請提前加大VM虛擬機硬件的內存,最好將內存設置成2GB以上。
2)最好提前下載好要安裝的MySQL相關軟件包(http://mirrors.sohu.com/mysql/),如果本書使用的軟件版本已更新,請更新至5.6的最新版即可。
3)重視每個操作過程的輸出,有錯誤要解決掉然后再繼續,不能忽略掉操作中的錯誤(error)。
4)建議進入虛擬機界面去執行make以及make install,通過SSH操作有時會導致網絡中斷。
有關vmware虛擬化學習軟件和CentOS 6操作系統的安裝詳細步驟見《跟老男孩學Linux運維:Web集群實戰》,或者參看免費部署文章:http://book.51cto.com/art/201605/510756.htm。
特別提示:Linux操作系統的安裝選包很重要,如果系統安裝的不合適(不要按照上述文章來安裝,除非你真正知道自己在做什么),會導致MySQL無法正常安裝及使用。
2.安裝MySQL需要的依賴包和編譯軟件
當前的Linux系統環境情況如下:
[root@oldboy ~]# cat /etc/redhat-release #<==操作系統版本 CentOS release 6.9 (Final) [root@oldboy ~]# uname -r #<==內核版本 2.6.32-696.el6.x86_64 [root@oldboy ~]# uname -m x86_64 #<==64位系統
(1)安裝MySQL需要的依賴包
安裝MySQL之前,最好先安裝MySQL需要的依賴包,不然后面會出現很多報錯信息,到那時還得再回來安裝MySQL的依賴包。安裝命令如下:
[root@oldboy ~]# yum install ncurses-devel libaio-devel -y #<==確保系統可以 上網再執行。 [root@oldboy ~]# rpm -qa ncurses-devel libaio-devel ncurses-devel-5.7-4.20090207.el6.x86_64 libaio-devel-0.3.107-10.el6.x86_64
提示:安裝后使用rpm -qa ncurses-devel libaio-devel命令進行檢查,如果出現兩行如上信息則表示安裝成功。
(2)安裝編譯MySQL需要的軟件
由于MySQL 5.5及以上的系列產品要采用特殊的編譯方式安裝,因此,需要先安裝常用的編譯MySQL的工具cmake軟件包,命令如下:
[root@oldboy ~]# yum install cmake -y [root@oldboy ~]# rpm -qa cmake cmake-2.8.12.2-4.el6.x86_64
提示:安裝后使用“rpm -qa cmake”檢查,如果出現一行如上信息則表示安裝成功。
此外,也有網友采用源碼包的方式安裝cmake的,但是操作起來比較復雜,因此一般建議讀者選擇這個簡單的yum安裝方法。
3.開始安裝MySQL
為了讓大家學習更多的MySQL技術,本文選擇以相對復雜的源代碼安裝方式為例來講解MySQL多實例安裝,大型公司一般都會將MySQL軟件定制成rpm包,然后放到yum倉庫里,使用yum安裝,中小型企業里的二進制和編譯安裝的區別不大。
使用二進制方式安裝MySQL的方法見http://oldboy.blog.51cto.com/2561410/1893734。
(1)建立MySQL用戶賬號
首先以root身份登錄到Linux系統中,然后執行如下命令創建mysql用戶賬號:
[root@oldboy ~]# useradd -s /sbin/nologin -M mysql #<==默認會創建和mysql用戶 同名的組。 [root@oldboy ~]# id mysql uid=500(mysql) gid=500(mysql) groups=500(mysql)
根據上述結果輸出,可以看到mysql用戶和組已經創建成功。
(2)獲取MySQL軟件包
MySQL軟件包的下載地址為:http://dev.mysql.com/downloads/mysql/(如果地址變更無法下載,則可以去http://mirrors.sohu.com/mysql下載或者去本章開頭提供的云盤地址去下載相關的軟件包)。可以把軟件下載到客戶端電腦本地后,使用rz等工具傳到Linux里,或者找到網絡下載地址后,直接在Linux里使用wget命令下載下來。
提示:本書以MySQL編譯的方式進行講解,使用二進制方式安裝的完整過程前文已經給過地址了。在生產場景中,二進制和源碼包兩種安裝方法都是可用的,其應用場景一般沒什么太大差別。不同之處在于:二進制的安裝包較大,名字和源碼包也有些區別,二進制的安裝過程比源碼更快,更多區別在前文選擇安裝方式章節中已經講解過了,這里就不再贅述了。
MySQL源碼包和二進制安裝包的名稱見表3-1。
表3-1 MySQL二進制和源碼包名稱

(3)采用編譯方式安裝MySQL
配置及編譯安裝的步驟具體如下。
第一步,下載mysql軟件包,命令及操作如下:
[root@oldboy ~]# mkdir -p /home/oldboy/tools #<==這是老男孩習慣使用的軟件目錄。 [root@oldboy ~]# cd /home/oldboy/tools/ [root@oldboy tools]# wget -q http://mirrors.163.com/mysql/Dowloads/MySQL-5.6/ mysql-5.6.40.tar.gz #<==如果數據庫軟件更新了,請參考前文執行更換。 [root@oldboy tools]# ls -lh total 31M -rw-r--r--. 1 root root 31M Nov 28 07:46 mysql-5.6.40.tar.gz #<==源碼包大小31M。
第二步,解壓并配置mysql,命令及操作如下:
[root@oldboy tools]# tar xf mysql-5.6.40.tar.gz [root@oldboy tools]# cd mysql-5.6.40 [root@oldboy tools]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \ -DMYSQL_DATADIR=/application/mysql-5.6.40/data \ -DMYSQL_UNIX_ADDR=/application/mysql-5.6.40/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ -DWITH_ZLIB=bundled \ -DWITH_SSL=bundled \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_EMBEDDED_SERVER=1 \ -DENABLE_DOWNLOADS=1 \ -DWITH_DEBUG=0
提示:
1)編譯時可配置的選項很多,常見的參數選項請參見3.4節的選項說明講解,此處就不特別說明了。
2)編譯MySQL需要安裝gcc等工具,此部分在安裝操作系統時就已經安裝上了,具體請參考CentOS 6操作系統的詳細安裝步驟,可參見《跟老男孩學Linux運維:Web集群實戰》—書或免費部署文章http://book.51cto.com/art/201605/510756.htm。
3)如果讀者感覺輸入這些配置比較費時間,可以加本篇開頭的QQ交流群獲取文件。
第三步,編譯并安裝mysql,命令及操作如下:
[root@oldboy mysql-5.6.34]# make #<==如果是多核cpu,則可指定make -j cpu核數,加快編譯速度。 [root@oldboy mysql-5.6.34]# make install
如果是虛擬環境測試,以上兩步過程可能有些長,請耐心等待。
第四步,為mysql安裝路徑設置不帶版本號的軟鏈接/application/mysql,操作命令如下:
[root@oldboy mysql-5.6.34]# ln -s /application/mysql-5.6.34/ /application/mysql
#補充:如果系統里有曾經安裝的數據庫文件和啟動程序,則最好停掉或刪除,以免發生沖突。
[root@oldboy mysql-5.6.34]# ls -l /application/
total 4
lrwxrwxrwx. 1 root root 26 Feb 26 17:49 mysql -> /application/mysql-5.6.34/
drwxr-xr-x. 13 root root 4096 Feb 26 17:49 mysql-5.6.34
[root@oldboy mysql-5.6.34]# ls /application/mysql/ #<==這是老男孩常用的mysql的
安裝路徑。
bin COPYING data docs include lib man mysql-test README scripts share
sql-bench support-files
如果上述操作未出現錯誤(每個步驟結束后,都可以使用“echo $?”查看返回值是否為0,為0則表示正確),則查看/application/mysql/目錄;若其下有內容,則表示MySQL 5.6.40源代碼包采用cmake方式安裝成功了。
3.2.2 創建MySQL數據庫配置文件并對數據庫目錄授權
MySQL 5.5及老版數據庫默認為用戶提供了多個配置文件模板,但是MySQL 5.6的support-f iles目錄下已經沒有配置文件模板了。
[root@oldboy mysql-5.6. 40]# ll support-files/*.cnf -rw-r--r--. 1 root root 1126 Feb 26 17:54 support-files/my-default.cnf [root@oldboy mysql-5.6. 40]# mv /etc/my.cnf /etc/my.cnf.bak #提示:在CentOS 6.9版操作系統最小化安裝完成之后,在/etc目錄下會存在一個my.cnf,需要 將此文件更名為其他的名字,如:/etc/my.cnf.bak,否則,該文件會干擾源碼安裝的MySQL的正確配置, 造成無法啟動。 #在啟動MySQL服務時,會按照一定的順序搜索my.cnf,先在/etc目錄下找,若找不到則搜索"$basedir/ my.cnf",本例依舊選擇大家熟悉的/etc/路徑! [root@oldboy mysql-5.6.40]# cp support-files/my-default.cnf /etc/my.cnf 提示:此行操作可以省略,在下文初始化mysql時會自動生成my.cnf模板文件,如果已經執行了上 述命令,則初始化后會生成my-new.cnf文件,my.cnf和my-new.cnf除了注釋以外是一致的。 [root@oldboy mysql-5.6. 40]# chown -R mysql.mysql /application/mysql/ #<==授權mysql用戶管理mysql的安裝目錄,此步不做會導致啟動服務錯誤。
關于mysql的配置文件my.cnf參數的更多說明及調優,請參看本書后面的章節。
3.2.3 初始化MySQL數據庫文件
上述配置完畢后,就可以初始化數據庫數據文件了,這個步驟其實也可以在編譯安裝MySQL之后就操作,只不過放到這里更合理一些。
(1)初始化MySQL數據庫
初始化數據庫的核心命令為:
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/
--datadir=/application/mysql/data --user=mysql
提示:--basedir=/application/mysql/為MySQL的安裝路徑,--datadir為數據文件目錄。另外,需要注意mysql_install_db和MySQL 5.1的路徑不同,MySQL 5.1在MySQL bin路徑下。
整個初始化的操作過程為:
[root@oldboy mysql-5.6.34]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql #<==初始化mysql數據庫文件,會有很多信息提示,如果沒有ERROR級別的錯誤,有兩個OK的字樣, 則表示初始化成功,否則就要解決初始化的問題。 WARNING:The host‘oldboy'could not be looked up with/application/mysq1//bin/ resolveip. #<==如果沒做主機名解析,則提示警告。 Installing MySQL system tables...2018-05-10 18:00:25 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_ timestamp server option (see documentation for more details). 2018-05-10 00:08:25 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap. 2018-05-10 00:08:25 0 [Note] /application/mysql//bin/mysqld (mysqld 5.6.40) starting as process 47993 ... 2018-05-10 00:08:25 16787 [Note] InnoDB: Using atomics to ref count buffer pool pages 2018-05-10 00:08:25 16787 [Note] InnoDB: The InnoDB memory heap is disabled 2018-05-10 00:08:25 16787 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2018-05-10 00:08:25 16787 [Note] InnoDB: Memory barrier is not used 2018-05-10 00:08:25 16787 [Note] InnoDB: Compressed tables use zlib 1.2.3 2018-05-10 00:08:25 16787 [Note] InnoDB: Using Linux native AIO 2018-05-10 00:08:25 16787 [Note] InnoDB: Using CPU crc32 instructions 2018-05-10 00:08:25 16787 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2018-05-10 00:08:25 16787 [Note] InnoDB: Completed initialization of buffer pool 2018-05-10 00:08:25 16787 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! 2018-05-10 00:08:25 16787 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB 2018-05-10 00:08:25 16787 [Note] InnoDB: Database physically writes the file full: wait... ...省略若干... 2018-05-10 00:08:28 16787 [Note] InnoDB: Waiting for purge to start 2018-05-10 00:08:28 16787 [Note] InnoDB: 5.6.34 started; log sequence number 0 2018-05-10 00:08:28 16787 [Note] Binlog end 2018-05-10 00:08:28 16787 [Note] InnoDB: FTS optimize thread exiting. 2018-05-10 00:08:28 16787 [Note] InnoDB: Starting shutdown... 2018-05-10 00:08:28 16787 [Note] InnoDB: Shutdown completed; log sequence number 1625977 OK #<==兩個OK是初始化成功的標志。 Filling help tables... 2018-05-10 00:08:28 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-05-10 00:08:28 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap. 2018-05-10 00:08:28 0 [Note] /application/mysql//bin/mysqld (mysqld 5.6.34) starting as process 48015 ... 2018-05-10 00:08:28 16809 [Note] InnoDB: Using atomics to ref count buffer pool pages 2018-05-10 00:08:28 16809 [Note] InnoDB: The InnoDB memory heap is disabled ...省略若干... 2018-05-10 00:08:28 16809 [Note] InnoDB: FTS optimize thread exiting. 2018-05-10 00:08:28 16809 [Note] InnoDB: Starting shutdown... 2018-05-10 00:08:28 16809 [Note] InnoDB: Shutdown completed; log sequence number 1625987 OK #<==兩個OK是初始化成功的標志。 To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /application/mysql//bin/mysqladmin -u root password 'new-password' /application/mysql//bin/mysqladmin -u root -h oldboy password 'new-password' Alternatively you can run: /application/mysql//bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd . ; /application/mysql//bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl Please report any problems at http://bugs.mysql.com/ The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com ###請注意如下幾行英文的說明 New default config file was created as /application/mysql//my.cnf and will be used by default by the server when you start it. You may edit this file to change server settings #從上述說明中可以知道MySQL的默認配置文件已經變到了/application/mysql//my.cnf下。 WARNING: Default config file /etc/my.cnf exists on the system This file will be read by default by the MySQL server If you do not want to use this, either remove it, or use the --defaults-file argument to mysqld_safe when starting the server #從上述說明中可以看到數據庫啟動時會讀取/etc/my.cnf,因此有可能會導致無法啟動,避免的方 法就是使用mysqld_safe 啟動服務時采用“--defaults-file”參數指定配置文件,前文已將/etc/ my.cnf改名了,并進行了新的配置文件替換,所以,就不需要指定參數了,這里是一個坑,請讀者注意。
此步驟必須要初始化成功,否則,后面會出現登錄不了數據庫等各種問題。
(2)初始化數據庫的原理及結果說明
初始化數據庫的實質就是創建基礎的數據庫系統的庫文件,例如,生成mysql庫表等。
初始化數據庫之后,查看數據目錄,可以看到多了如下文件:
[root@oldboy mysql-5.6.40]# ls -l /application/mysql/data total 110604 -rw-rw----. 1 mysql mysql 12582912 May 10 00:08 ibdata1 -rw-rw----. 1 mysql mysql 50331648 May 10 00:08 ib_logfile0 -rw-rw----. 1 mysql mysql 50331648 May 10 00:08 ib_logfile1 drwx------. 2 mysql mysql 4096 May 10 00:08 mysql #<==用于存放管理mysql 的數據。 drwx------. 2 mysql mysql 4096 May 10 00:08 performance_schema #<==5.5及以上增加的內部性能庫。 drwxr-xr-x. 2 mysql mysql 4096 May 10 00:48 test #<==用于測試的test數據庫。 [root@oldboy mysql-5.6.40]# tree /application/mysql/data #<==如果沒有tree,則可以采用yum install tree -y方式安裝 /application/mysql/data ├—— ibdata1 ├—— ib_logfile0 ├—— ib_logfile1 ├—— mysql | ├—— columns_priv.frm | ├—— columns_priv.MYD | ├—— columns_priv.MYI …省略若干… | ├—— general_log.CSV | ├—— general_log.frm | ├—— help_category.frm | ├—— procs_priv.frm | ├—— procs_priv.MYD | ├—— procs_priv.MYI | ├—— proxies_priv.frm | ├—— proxies_priv.MYD | ├—— proxies_priv.MYI | ├—— servers.frm …省略若干… | ├—— time_zone_name.MYI | ├—— time_zone_transition.frm | ├—— time_zone_transition.MYD | ├—— time_zone_transition.MYI | ├—— time_zone_transition_type.frm | ├—— time_zone_transition_type.MYD | ├—— time_zone_transition_type.MYI | ├—— user.frm | ├—— user.MYD | └—— user.MYI ├—— performance_schema | ├—— accounts.frm | ├—— cond_instances.frm | ├—— db.opt | ├—— events_stages_current.frm | ├—— events_stages_history.frm | ├—— events_stages_history_long.frm | ├—— events_stages_summary_by_account_by_event_name.frm …省略若干… | ├—— threads.frm | └—— users.frm └—— test └—— db.opt 3 directories, 136 files
(3)MySQL初始化故障排錯集錦
本節的所有故障都必須要解除,即必須要出現兩個Yes字樣,否則,后面就算數據庫服務可以啟動,也會出現登錄不了MySQL數據庫等各種問題,因此讀者若遇到了故障無法解決,則可以提前看一下本章結尾的故障集錦內容。
3.2.4 配置并啟動MySQL數據庫
1)設置MySQL啟動腳本:
[root@oldboy mysql-5.6.40]# pwd /home/oldboy/tools/mysql-5.6.40 [root@oldboy mysql-5.6.40]# cp support-files/mysql.server /etc/init.d/mysqld #<==將mysql啟動腳本復制到mysql的命令路徑。 [root@oldboy mysql-5.6.40]# chmod 700 /etc/init.d/mysqld #<==使腳本可執行, 注意權限要小一些。 [root@oldboy mysql-5.6.40]# ls -l /etc/init.d/mysqld -rwx------. 1 root root 10619 May 10 00:20/etc/init.d/mysqld #提示:老男孩開發了一個專業、規范,且相對簡單的Shell版MySQL服務啟動腳本,地址如下: http://oldboy.blog.51cto.com/2561410/1945183
2)啟動MySQL數據庫:
#<==這是啟動數據庫規范方法之一,還可以使用” /application/mysql/bin/mysqld_safe --user=mysql &”啟動。這個命令結尾“&”符號的作用是,在后臺執行mysql服務,這條 命令執行完 還需要按下回車才能進入到命令行狀態。 #<==注意,如果已經執行了上面的/etc/init.d/mysqld start啟動命令,還想嘗試下面mysqld_ safe的命令,請先執行/etc/init.d/mysqld stop結束mysql進程。 [root@oldboy mysql-5.6.40]# /etc/init.d/mysqld start Starting MySQL. SUCCESS!
特別提示:這里有一個大坑,就是數據庫可能會無法啟動,報錯信息如下:
[root@oldboy mysql-5.6.40]# /etc/init.d/mysqld start Starting MySQL.Logging to '/application/mysql-5.6.40/data/oldboy.err'. 180510 00:21:04 mysqld_safe Directory '/application/mysql-5.6.40/tmp' for UNIX socket file don't exists. ERROR! The server quit without updating PID file (/application/mysql-5.6.40/ data/oldboy.pid). 提示:/application/mysql-5.6.40/tmp目錄不存在,5.6.34前的早期版本沒事。
解決辦法:
[root@oldboy mysql-5.6.40]# mkdir -p /application/mysql-5.6.40/tmp #<==編譯時指定的socket路徑。 [root@oldboy mysql-5.6.40]# chown -R mysql.mysql /application/mysql/ [root@oldboy mysql-5.6.40]# /etc/init.d/mysqld start Starting MySQL. SUCCESS!
提示:禁止使用kill -9、killall -9等命令強制殺死數據庫,這會引起數據庫無法啟動等故障發生。企業中曾發生過的血的教訓案例請看http://oldboy.blog.51cto. com/2561410/1431161。
3)檢查MySQL數據庫是否啟動:
[root@oldboy ~]# netstat -lntup|grep mysql tcp 0 0 :::3306 :::* LISTEN 48065/mysqld
如果發現3306端口沒起來,則請使用tail -100 /application/mysql/data/機器名.err檢查日志報錯進行調試。經常查看服務運行日志是個很好的習慣,也是高手的習慣。
4)查看MySQL數據庫啟動結果日志:
[root@oldboy ~]# tail /application/mysql/data/oldboy.err 2018-05-10 17:38:36 48065 [Note] InnoDB: Waiting for purge to start 2018-05-10 17:38:36 48065 [Note] InnoDB: 5.6.40 started; log sequence number 1625987 2018-05-10 17:38:36 48065 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4f94404a-fc74-11e6-8112-000c292ece3f. 2018-05-10 17:38:36 48065 [Note] Server hostname (bind-address): '*'; port: 3306 2018-05-10 17:38:36 48065 [Note] IPv6 is available. 2018-05-10 17:38:36 48065 [Note] - '::' resolves to '::'; 2018-05-10 17:38:36 48065 [Note] Server socket created on IP: '::'. 2018-05-10 17:38:36 48065 [Note] Event Scheduler: Loaded 0 events 2018-05-10 17:38:36 48065 [Note] /application/mysql-5.6.40/bin/mysqld: ready for connections. Version: '5.6.34' socket: '/application/mysql-5.6.40/tmp/mysql.sock' port: 3306 Source distribution
本例查看了錯誤日志的命令及錯誤日志中的內容,這里省略了大部分日志內容,只給出了默認的10行,如果有錯誤,一般會顯示error字樣。
5)設置MySQL開機自啟動:
[root@oldboy ~]# chkconfig --add mysqld [root@oldboy ~]# chkconfig --list mysqld mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
此外,將啟動命令/etc/init.d/mysqld start放到/etc/rc.local里面也可以實現開機自啟動。
若MySQL安裝及使用出現故障,則可根據下面的分析思路進行檢查。
細看所有步驟執行命令返回的屏幕輸出,不要忽略關鍵的輸出內容。
查看mysql錯誤日志/application/mysql/data/機器名.err。
輔助查看系統日志/var/log/messages。
如果是MySQL關聯了其他服務,則還要同時查看相關服務的日志。
仔細閱讀,重新查看所有操作的步驟是否正確,書寫的命令及字符是否都正確。
經常查看各種服務運行日志是個很好的習慣,也是成長為高手的必經之路!
3.2.5 將MySQL相關命令加入全局路徑
如果不為MySQL的命令配置全局路徑,就會無法在命令行直接輸入mysql這樣的客戶端命令,只能使用全路徑命令(/application/mysql/bin/mysql),這種附帶路徑輸入命令的方式很麻煩。下面來看看配置的具體方法。
1)確認mysql命令所在的路徑:
[root@oldboy /]# ls /application/mysql/bin/mysql /application/mysql/bin/mysql
2)在PATH變量前面增加/application/mysql/bin路徑,并追加到/etc/prof ile文件中:
[root@oldboy /]# echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
#<==注意,echo后是單引號,雙引號是不行的。
[root@oldboy /]# tail -1 /etc/profile
export PATH=/application/mysql/bin:$PATH #<==放在前面也是有目的的,是為了防止執行
時使用老版本的mysql命令。
[root@oldboy /]# source /etc/profile
#<==執行source使上一行添加到/etc/profile中,內容直接生效。
#<==以上命令的用途為,定義mysql全局路徑,實現在任意路徑執行mysql命令。
[root@oldboy ~]# echo $PATH
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:
/usr/bin:/root/bin
#<==執行echo $PATH,若有/application/mysql/bin輸出則表示配置成功。
提示:更簡單的設置方法為使用下面的命令做軟鏈接:ln -s /application/mysql/bin/* /usr/local/sbin/,把mysql命令所在的路徑鏈接到全局路徑/usr/local/sbin/的下面。
要特別強調的是,務必把MySQL命令路徑放在PATH路徑中其他路徑的前面,否則,可能會導致使用的mysql客戶端等命令和本章編譯安裝的mysql服務對應的mysql命令不是同一個,進而產生錯誤。下面的網址中給出了因為MySQL路徑配置問題而導致的錯誤案例:http://oldboy.blog.51cto.com/2561410/1122867,該錯誤實際上就是因為使用yum安裝的MySQL客戶端命令訪問了編譯安裝的服務端而導致的。
3.2.6 登錄MySQL測試
登錄并測試的命令如下:
[root@oldboy ~]# mysql #<==直接輸入mysql就可以進入數據庫了,而且身份還是root。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.40 Source distribution
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help; ' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
提示:你還可以使用如下三種命令寫法登錄mysql。
mysql -uroot -p
mysql -uroot
mysql -uroot -p ’密碼’
若出現登錄故障,則可以通過以下方法排查。
如果這里提示無法登錄,排除了數據庫啟動問題之后,則很可能是數據庫初始化文件有問題。例如,執行mysql后提示如下錯誤:
[root@oldboy ~]# mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
解決辦法:重新初始化數據庫即可,此問題一般都是數據庫初始化問題或者數據庫文件損壞以及目錄權限問題。
mysql> show databases; #<==查看當前的數據庫 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> select user(); #<==查看當前的登錄用戶 +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> #<==快捷鍵ctrl+d,也可以使用quit或exit等。
MySQL安裝完成后,默認情況下,管理員賬號root是無密碼的,極不安全,必須要處理一下。
3.2.7 基本的MySQL安全配置
1.為root用戶設置密碼
MySQL管理員的賬號root密碼默認為空,極不安全,可以通過mysqladmin命令為mysql不同實例的數據庫設置獨立的密碼:
[root@oldboy ~]# mysqladmin -u root password 'oldboy123' #<==為root用戶設置密碼oldboy123。 Warning: Using a password on the command line interface can be insecure. #<==這里是一個警告,提醒用戶命令行放置密碼是不安全的,請讀者盡量不要在命令行輸入密碼, 而是采取交互式的方式輸入密碼。 [root@oldboy ~]# mysql #<==無法直接輸入命令登錄了。 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) [root@oldboy ~]# mysql -uroot -p #<==新的登錄方式,也可以直接帶密碼mysql -uroot -poldboy123。 Enter password: #<==輸入新密碼oldboy123,交互式輸入密碼不會記錄 在命令記錄里,因此更安全。 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.6.40 Source distribution Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help; ' or '\h' for help. Type '\c' to clear the current input statement. mysql>
讀者也可以執行mysql_secure_installation命令交互式地設置系統的用戶密碼。
2.清理mysql服務器內無用的用戶
mysql> select user, host from mysql.user; +------+-----------+ | user | host | +------+-----------+ | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | oldboy | | root | oldboy | +------+-----------+ 6 rows in set (0.00 sec) mysql> drop user root@'::1'; Query OK, 0 rows affected (0.00 sec) mysql> drop user root@'oldboy'; Query OK, 0 rows affected (0.00 sec) mysql> drop user ''@'oldboy'; Query OK, 0 rows affected (0.00 sec) mysql> drop user ''@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> select user, host from mysql.user; +------+-----------+ | user | host | +------+-----------+ | root | 127.0.0.1 | | root | localhost | +------+-----------+ 2 rows in set (0.00 sec)
提示:對于drop命令及數據庫安全,后文會有詳細講解,此處不執行也可以。
有時使用drop命令可能會無法刪除對應用戶。比如,當數據庫內的host等字段為大寫及特殊Linux主機名時,刪除用戶就會遇到問題,例如:
mysql> drop user ' '@'MySQL'; ERROR 1396 (HY000): Operation DROP USER failed for ' '@'mysql'
可使用DML語句,并采用delete命令刪除來解決此問題,具體命令如下:
mysql> delete from mysql.user where user='' and host='MySQL'; Query OK, 1 row affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
3.刪除mysql數據庫內無用的test庫
mysql> drop database test; Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec)
有關MySQL的更多安全措施,在后文會有更詳細的講解。
3.3 MySQL安裝FAQ
問題1:在配置mysql時遇到錯誤。
出現的錯誤如下:
checking for tgetent in -ltinfo... no checking for termcap functions library... configure: error: No curses/termcap library found
原因:缺少ncurses安裝包。
解決方法:執行“yum -y install ncurses-devel”命令。
問題2:初始化MySQL數據庫時出現故障。
故障1:給出了警告信息“WARNING: The host 'oldboy' could not be looked up with resolveip”。
警告是可以忽略的,如果非要解決則需要修改對主機名的解析,使其和“uname -n”命令的結果一樣,如下:
[root@oldboy ~]# grep "`uname -n`" /etc/hosts 127.0.0.1 oldboy #<==也可以使用網卡IP解析。
故障2:錯誤提示“ERROR: 1004 Can't create f ile '/tmp/#sql300e_1_0.frm' (errno:13)”。
在執行初始化數據庫命令時可能就會遇到這樣的錯誤,錯誤提示如下:
ERROR: 1004 Can't create file '/tmp/#sql300e_1_0.frm' (errno: 13)
120406 15:47:02 [ERROR] Aborting
120406 15:47:02 [Note] /application/mysql/libexec/mysqld: Shutdown complete
Installation of system tables failed! Examine the logs in
/application/mysql/data for more information.
根據提示可知,/tmp目錄不能創建文件,所以解決辦法是對/tmp目錄增加權限,具體如下。
解決辦法:還原/tmp目錄權限。操作命令如下:
[root@oldboy ~]# chmod 1777 /tmp #<==1777是/tmp的默認權限,除非曾經改動 過此目錄權限才會報錯。 [root@oldboy ~]# ls -ld /tmp/ drwsrwxrwt. 8 root root 4096 3月 10 18:07 /tmp/
本示例的故障必須要解除,否則,后面會出現登錄不了MySQL數據庫等各種問題。
問題3:登錄數據庫時提示“Access denied for user 'root'@'localhost'”。
解答:正文里已經給出答案,此處不再贅述。
問題4:有時使用drop命令刪除MySQL用戶刪不掉。
解答:正文里已經給出答案,此處不再贅述。
3.4 MySQL 5.6編譯常見參數選項說明
MySQL 5.6編譯常見參數選項說明如表3-2所示。
表3-2 MySQL 5.6編譯參數及說明

更多內容請參考官方MySQL 5.6的cmake編譯參數:http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
3.5 章節試題
1)MySQL的常見安裝方法有哪些?
2)在企業中如何選擇不同的MySQL安裝方法?
3)請描述如何安裝及配置MySQL服務?
4)安裝及配置MySQL服務遇到故障如何排錯?
5)MySQL安裝后可以做哪些基礎優化?