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/3530230