MySQL安装⼀般使⽤RPM或者源码安装的⽅式。
RPM安装的优点是快速,⽅便.缺点是不能⾃定义安装⽬录.如果需要调整数据⽂件和⽇志⽂件的存放位置,还需要进⾏⼀些⼿动调整。源码安装的优点是可以⾃定义安装⽬录,缺点是编译时间长,过程复杂
其实还有⼀种⽅式,定制RPM包.
它相当于⽤源码安装的⽅式定制了⼀个RPM包.⼀次打包,可以多次使⽤
它可以定制路径,安装时⾃动创建帐号,⾃动配置服务,环境变量等,并且安装过程快速,简单。在⼤规模部署的场景下,优点⼗分突出.
缺点是制作RPM包,需要⾃⼰编写Red Hat定义的spec⽂件,⽽编写完成后,也需要进⾏编译
现在开始定制mysql的rpm包1、定制rpm包,⾸先需要安装⼀个包 yum -y install rpm-build
2、定制rpm包只需要⽤到普通⽤户便可以完成,所以这⾥推荐使⽤普通⽤户 useradd wadeson
3、创建⾃制rpm包需要⽤到的基本仓库⽬录
在⽤户的家⽬录下⾯执⾏[wadeson@testdb ~]$ rpmbuild ~,即可,会⾃动⽣成需要⽤到的⼀些⽬录
[wadeson@testdb rpmbuild]$ ll total 24
drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 BUILD 解压后的tar.gz
drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 BUILDROOT 临时安装⽬录,会打包该⽬录下⽂件 drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 RPMS 编译后存放的rpm⽂件
drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 SOURCES 源代码和⼀些⽂件的存放地
drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 SPECS 编写spec⽂件vim 直接创建就有⼀部分样例 drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 SRPMS src格式的rpm包存放的位置
这个⼯具打包的过程⼤致如下,编写spec指定打包的过程
将源码压缩包放在SOURCES⽬录下,
将源码解压缩到BUILD⽬录,执⾏make命令(mysql使⽤cmake,make)将make install 的结果放在BUILDROOT⽬录下,
最后将BUILDROOT下编译好的⼆进制⽂件制作成RPM包。并且可以指定在RPM安装之前,安装之后,卸载等过程执⾏的命令
⽬录名 说明 macros中的宏名
BUILD 编译rpm包的临时⽬录%_builddir
BUILDROOT 编译后⽣成的软件临时安装⽬录%_buildrootdirRPMS 最终⽣成的可安装rpm包的所在⽬录%_rpmdir
SOURCES 所有源代码和补丁⽂件的存放⽬录%_sourcedirSPECS 存放SPEC⽂件的⽬录(重要)%_specdir
SRPMS 软件最终的rpm源码格式存放路径(暂时忽略掉,别挂在⼼上)%_srcrpmdir
相应的⽬录创建好了之后,开始进⾏真正的操作,⾸先下载mysql的源码包,这⾥以mysql-5.6.37为例将下载好的mysql-5.6.37存放在相应的⽬录:
[wadeson@testdb ~]$ cd rpmbuild/SOURCES/[wadeson@testdb SOURCES]$ lltotal 31448
-rw-rw-r--. 1 wadeson wadeson 32200158 Aug 23 22:19 mysql-5.6.37.tar.gz[wadeson@testdb rpmbuild]$ tree ..
|-- BUILD
|-- BUILDROOT|-- RPMS
|-- SOURCES
| `-- mysql-5.6.37.tar.gz|-- SPECS
`-- SRPMS
⼀些宏的参数:
[wadeson@testdb rpmbuild]$ rpmbuild --showrc|grep _topdir-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES-14: _specdir %{_topdir}/SPECS-14: _srcrpmdir %{_topdir}/SRPMS-14: _topdir %{getenv:HOME}/rpmbuild
[wadeson@testdb rpmbuild]$ echo \"%_topdir %(echo $HOME)/rpmbuild\" > ~/.rpmmacros[wadeson@testdb rpmbuild]$ rpmbuild --showrc|grep _topdir-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES-14: _specdir %{_topdir}/SPECS-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir %(echo /home/wadeson)/rpmbuild然后相应的宏的值对应相应的⽬录
理解好了这些之后,于是进⼊到SPEC⽬录进⾏编写spec⽂件:
直接使⽤vim mysql.spec就可以,⾥⾯默认带有⼀些默认的配置,现在做如下修改,并配有相应的解释:
Name: mysql 后⾯可以变量引⽤:%{name}Version: 5.6.37 后⾯可以变量引⽤:%{version}
Release: 1%{?dist} {?dist}: ?表⽰后⾯的dist有值就启⽤,没有值就舍弃,dist根据系统版本来定义,像redhat5就是el5,redhat6就是el6
Summary: MySQL-5.6.37 RPM 概要(随便写就⾏,不过就字符限制⽆需太长)
Group: applications/database #需要在⼀个存在的组中,通过/usr/share/doc/rpm-version/GROUPS查看完整的组列表License: GPL
URL: http://www.mysql.com
Source0: mysql-5.6.37.tar.gz 因为这⾥只⽤到了mysql源码,如果需要my.cnf配置⽂件,那么可以Source1:my.cnf依次类推
这个压缩⽂件需要放在指定的⽬录中(/root/rpmbuild/SOURCES) ⾃动解压的时候,会在这个指定⽬录中找这个⽂件
# prefix: /usr/local/mysql-5.6.37 当然这⾥可以定义变量,下⾯使⽤%{prefix}进⾏引⽤
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %{_tmppath}这个宏的值可以通过上⾯rpmbuild --showrc|grep_tmppath查看
#安装或编译时使⽤的虚拟⽬录,在⽣成rpm的过程中,执⾏make install时就会把软件安装到该路径中,默认构建根⽬录为%{_topdir}/BUILDROOT
[wadeson@testdb SPECS]$ rpmbuild --showrc|grep _tmppath
-14: __dbi_other %{?_tmppath:tmpdir=%{_tmppath}} %{?__dbi_cdb} -14: _tmppath %{_var}/tmp
[wadeson@testdb SPECS]$ rpmbuild --showrc|grep _var -14: _dbpath %{_var}/lib/rpm -14: _tmppath %{_var}/tmp -14: _var /var
即%{_tmppath}真正的值为/var/tmp,
BuildRequires: cmake,ncurses-devel
#在编译过程中需要的包列表,以逗号分开,并可以指定最⼩版本。#Requires:
AutoReqProv: no
%description
this is rpmbuilding mysql5.6.37 rpm
%define MYSQL_USER mysql define进⾏定义变量 # 1.如何定义变量?
# %define author zuosi #定义了⼀个变量author,值为zuosi%define MYSQL_GROUP mysql
%prep
%setup -q -n mysql-%{version} 进⾏解压-q不输出信息,-n指定解压⽬录
解压源码包之后,会进⼊⽬录执⾏build,它默认是根据%{name}和%{version}拼接的⽬录.
%build #该阶段执⾏常见的configure和make操作cmake . \\
-DCMAKE_INSTALL_PREFIX:=/usr/local/mysql-5.6.37 \\ # 这⾥的安装的prefix可以定义变量取代,调⽤变量使⽤%{varname}就⾏
-DMYSQL_DATADIR=/data/mysql \\-DSYSCONFDIR=/etc \\
-DWITH_MYISAM_STORAGE_ENGINE=1 \\-DWITH_INNOBASE_STORAGE_ENGINE=1 \\-DWITH_MEMORY_STORAGE_ENGINE=1 \\-DWITH_READLINE=1 \\
-DMYSQL_UNIX_ADDR=/tmp/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`
查看计算机有⼏个核,然后多线程编译
# make %{?_smp_mflags} ← 多核则并⾏编译,与上⾯选⼀个就⾏
%install
rm -rf %{buildroot} # 先删掉之前的构建
make install DESTDIR=%{buildroot} # 安装到哪⾥ 然后执⾏%install
将编译之后的代码真实的安装⼀遍,
它安装的⽬录是/home/wadeson/rpmbuild/BUILDROOT/mysql-5.6.37-1.el6.x86_64/usr/local/mysql-5.6.37
因为我们指定的安装⽬录是/usr/local/mysql-5.6.37,它相当于在⼀个沙盒中安装了⼀遍.它会将沙盒中安装之后的⽂件打成RPM包
%clean
rm -rf %{buildroot} # 清理构建仓库中的BUILDROOT
%files # 就是指定哪些沙盒中的⽂件打⼊RPM包%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})
#设置默认⽂件权限式%defattr( #另外,defattr(⽂件权限,⽤户名,组名,⽬录权限)⽤来指定权限,如: %defattr(-,root,root,-),这条指令设置缺省权限。%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /usr/local/mysql-5.6.37/* 给basedir下的mysql赋权限 %pre # 是RPM安装之前执⾏的命令这⾥主要是创建数据⽂件的⽬录和帐号mkdir -p /data/mysql if ! id %{MYSQL_USER} > /dev/null 2>&1;then useradd -M -s /sbin/nologin %{MYSQL_USER}fi chown -R mysql:mysql /data/mysql %post # 是RPM安装之后执⾏的命令这⾥主要是创建数据库实例,配置服务,配置环境变量 /usr/local/mysql-5.6.37/scripts/mysql_install_db --basedir=/usr/local/mysql-5.6.37 --datadir=/data/mysql --user=mysqlcp /usr/local/mysql-5.6.37/support-files/mysql.server /etc/init.d/mysqldchmod +x /etc/init.d/mysqldchkconfig mysqld on cp /usr/local/mysql-5.6.37/my.cnf /etc/my.cnf %preun # 是卸载RPM包执⾏的命令,主要⽤于清理service mysqld stopchkconfig --del mysqld userdel mysqlrm -rf /home/mysqlrm -rf /data/mysql rm -rf /etc/init.d/mysqld rm -rf /usr/local/mysql-5.6.37 %changelog 下⾯是⼀个完整的spec⽂件: Name: mysqlVersion: 5.6.37 Release: 1%{?dist} Summary: MySQL-5.6.37 RPM Group: applications/databaseLicense: GPL URL: http://www.mysql.comSource0: mysql-5.6.37.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-rootBuildRequires: cmake,ncurses-devel#Requires:AutoReqProv: no %description this is rpmbuilding mysql5.6.37 rpm%define MYSQL_USER mysql%define MYSQL_GROUP mysql%prep %setup -q -n mysql-%{version} %build cmake . \\ -DCMAKE_INSTALL_PREFIX:=/usr/local/mysql-5.6.37 \\-DMYSQL_DATADIR=/data/mysql \\-DSYSCONFDIR=/etc \\ -DWITH_MYISAM_STORAGE_ENGINE=1 \\-DWITH_INNOBASE_STORAGE_ENGINE=1 \\-DWITH_MEMORY_STORAGE_ENGINE=1 \\-DWITH_READLINE=1 \\ -DMYSQL_UNIX_ADDR=/tmp/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_cimake -j `cat /proc/cpuinfo | grep processor| wc -l` %install rm -rf %{buildroot} make install DESTDIR=%{buildroot}%clean rm -rf %{buildroot} %files %defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP}) %attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /usr/local/mysql-5.6.37/*%pre mkdir -p /data/mysql if ! id %{MYSQL_USER} > /dev/null 2>&1;then useradd -M -s /sbin/nologin %{MYSQL_USER}fi chown -R mysql:mysql /data/mysql %post /usr/local/mysql-5.6.37/scripts/mysql_install_db --basedir=/usr/local/mysql-5.6.37 --datadir=/data/mysql --user=mysqlcp /usr/local/mysql-5.6.37/support-files/mysql.server /etc/init.d/mysqldchmod +x /etc/init.d/mysqldchkconfig mysqld on cp /usr/local/mysql-5.6.37/my.cnf /etc/my.cnf%preun service mysqld stopchkconfig --del mysqlduserdel mysql rm -rf /home/mysqlrm -rf /data/mysql rm -rf /etc/init.d/mysqld rm -rf /usr/local/mysql-5.6.37 %changelog 完成了spec⽂件后,于是使⽤如下命令进⾏编译: [wadeson@testdb SPECS]$ rpmbuild --helpUsage: rpmbuild [OPTION...]--quiet Build options with [