MySQL安裝通常使用RPM或者源碼安裝的方式。
RPM安裝的優勢是快速,方便.缺點是不能自定義安裝目錄.若是須要調整數據文件和日誌文件的存放位置,還須要進行一些手動調整。
源碼安裝的優勢是能夠自定義安裝目錄,缺點是編譯時間長,過程複雜
其實還有一種方式,定製RPM包.
它至關於用源碼安裝的方式定製了一個RPM包.一次打包,能夠屢次使用
它能夠定製路徑,安裝時自動建立賬號,自動配置服務,環境變量等,而且安裝過程快速,簡單。
在大規模部署的場景下,優勢十分突出.
缺點是製做RPM包,須要本身編寫Red Hat定義的spec文件.而spec文件編寫的學習曲線比較陡.
需求以下
1.建立用戶mysql
2.數據庫軟件安裝在/home/mysql/mysql-5.6.14目錄
3.數據文件存放在/data目錄下
4.配置服務,自動啓動
首先,下載rpmbuild
yum install rpm-build -y
它是Red Hat用於打RPM包的工具.
安裝以後重啓計算機,能夠看到/root/rpmbuild目錄下有以下文件夾
這個工具打包的過程大體以下,
編寫spec指定打包的過程
將源碼壓縮包放在SOURCES目錄下,
將源碼解壓縮到BUILD目錄,執行make命令
將make install 的結果放在BUILDROOT目錄下,
最後將BUILDROOT下編譯好的二進制文件製做成RPM包。
而且能夠指定在RPM安裝以前,安裝以後,卸載等過程執行的命令
首先,下載源碼包
http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.14.tar.gz
並將其複製到指定的目錄
/root/rpmbuild/SOURCES/mysql-5.6.14.tar.gz
安裝編譯MySQL須要的依賴包
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
編寫spec腳本
vim mysql.spec
Name: MySQL
Version: 5.6.14
Release: 1%{?dist}
Summary: MySQL-5.6.14 RPM
Group: applications/database
License: GPL
URL: http://www.mysql.com
Source0: mysql-5.6.14.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: cmake
AutoReqProv: no
%description
MySQL 5.6.14
%define MYSQL_USER mysql
%define MYSQL_GROUP mysql
%prep
%setup -n mysql-%{version}
%build
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql/mysql-5.6.14 \
-DMYSQL_DATADIR=/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/data/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 -j `cat /proc/cpuinfo | grep processor| wc -l`
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%pre
mkdir -p /data
useradd -m -s /bin/bash mysql
chown -R mysql:mysql /data
%post
/home/mysql/mysql-5.6.14/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.14 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.14/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.14/bin;" >> /home/mysql/.bashrc
source /home/mysql/.bashrc
%preun
service mysql stop
chkconfig --del mysql
userdel mysql
rm -rf /home/mysql
rm -rf /data
rm -rf /etc/init.d/mysql
%clean
rm -rf %{buildroot}
%files
%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})
%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /home/mysql/mysql-5.6.14/*
%changelog
這個腳本各個Segment的做用請參考
http://machael.blog.51cto.com/829462/213477
其中
Source0: mysql-5.6.14.tar.gz
這個壓縮文件須要放在指定的目錄中(/root/rpmbuild/SOURCES)
自動解壓的時候,會在這個指定目錄中找這個文件
AutoReqProv: no
這個參數必須設置,不然在安裝的時候,會顯示有依賴包的缺失.其實是不須要的。
%setup -n mysql-%{version}
解壓源碼包以後,會進入目錄執行build,它默認是根據%{name}和%{version}拼接的目錄.
以MySQL爲例,在spec中寫的name爲MySQL,version爲5.6.14
那麼它會進入MySQL-5.6.14的目錄,
可是源碼包解壓以後的目錄是mysql-5.6.14(小寫)
因此在setup這個段使用-n參數,匹配這個目錄.(就是說默認的設置不靈,須要本身匹配目錄)
make -j `cat /proc/cpuinfo | grep processor| wc -l`
查看計算機有幾個核,而後多線程編譯
這個腳本的過程是這樣的
首先解壓源碼包
%prep
%setup -n mysql-%{version}
而後執行%build的過程,make編譯
而後執行%install
將編譯以後的代碼真實的安裝一遍,
它安裝的目錄是/root/rpmbuild/BUILDROOT/MySQL-5.6.14-1.el6.i386/home/mysql/mysql-5.6.14/
由於咱們指定的安裝目錄是/home/mysql/mysql-5.6.14/,它至關於在一個沙盒中安裝了一遍.
它會將沙盒中安裝以後的文件打成RPM包
%files就是指定哪些沙盒中的文件打入RPM包
%files指定的文件是相對路徑,絕對路徑應該是%{buildroot}/home/mysql/mysql-5.6.14
默認的%{buildroot}就是/root/rpmbuild/BUILDROOT/MySQL-5.6.14-1.el6.i386/
這個%{buildroot}是由spec文件的BuildRoot設置的
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
%pre是RPM安裝以前執行的命令
這裏主要是建立數據文件的目錄和賬號
mkdir -p /data
useradd -m -s /bin/bash mysql
chown -R mysql:mysql /data
%post是RPM安裝以後執行的命令
這裏主要是建立數據庫實例,配置服務,配置環境變量
/home/mysql/mysql-5.6.14/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.14 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.14/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.14/bin;" >> /home/mysql/.bashrc
source /home/mysql/.bashrc
%preun是卸載RPM包執行的命令,主要用於清理
service mysql stop
chkconfig --del mysql
userdel mysql
rm -rf /home/mysql
rm -rf /data
rm -rf /etc/init.d/mysql
其實編寫spec文件本質上是在寫一個回調函數,rpmbuild根據spec的回調函數,生成一個Shell腳本,打包的過程就是執行Shell腳本的過程。
定製RPM安裝包能夠知足大規模自動化部署的場景
由於它能夠
定製配置文件(將配置文件放在ftp或者http上,在%post段下載這個配置文件放在/etc下)
定製安裝目錄和數據文件,日誌文件的目錄(生產系統不一樣的掛載點,底層多是不一樣的物理設備)
自動建立賬號,配置服務和環境變量
這些特性在規模很小時微不足道,
好比給研發和測試安裝,人家還嫌你有毛病.明明一個rpm能搞定,你還整這麼複雜,不是臭顯擺嗎?
生產環境裝一個庫運行好幾年,再裝的時候,這個RPM估計都忘了放哪裏了...
可是一旦規模上來了,一天須要裝個10臺8臺的,這個自動化安裝的優勢就顯現出來了
參考:
源碼安裝MySQL
http://www.cnblogs.com/xiongpq/p/3384681.html
rpmbuild spec文件詳解
http://machael.blog.51cto.com/829462/213477
http://www.worldhello.net/2011/04/02/2405.html
AutoReqProv參數的解釋
http://blog.csdn.net/peng_zhou/article/details/3530230html