percona server 5.6 自制rpm包

前言

RPM是Red-hat系统的软件管理工具,目前,RPM已发展成为业界认可的Linux系统软件工具。RPM制作灵活方便,在安装、升级、卸载等方面有着显著的优点。mysql通过自制RPM包方式,可以缩短编译安装时间,简化安装过程,自定义数据库配置,非常灵活方便,可以极大的提升效率。

1
2
3
4
5
6
优点:
RPM内含已编译过的程序与设置文件等数据,可以让用户免除重新编译的困扰。
RPM在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装。
RPM文件本身提供软件版本信息、依赖属性软件名称、软件用途说明、软件所含文件信息,便于了解软件。
RPM管理的方式使用数据库记录RPM文件的相关参数,便于升级、删除、查询与验证。
详情请参考:http://rpm.org/documentation.html

准备

操作系统:centos 6.5 x86_64
构建工具:rpmbuild

RPM常用命令

列出已安装的RPM包

列出系统中已安装的全部RPM包

1
2
3
4
5
6
7
8
9
10
11
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qa|head -10  #由于包太多,用head过滤了前10
glib2-2.28.8-5.el6.x86_64
gnome-icon-theme-2.28.0-8.el6.noarch
bind-libs-9.8.2-0.23.rc1.el6_5.1.x86_64
mhash-0.9.9.9-3.el6.x86_64
libreport-2.0.9-19.el6.centos.x86_64
libcroco-0.6.2-5.el6.x86_64
libcap-2.16-5.5.el6.x86_64
libxml2-python-2.7.6-21.el6_8.1.x86_64
abrt-addon-kerneloops-2.0.8-21.el6.centos.x86_64
libasyncns-0.8-1.1.el6.x86_64

列出系统中以mysql开头的RPM包

1
2
3
4
5
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qa "mysql*"
mysql-community-libs-5.7.16-1.el6.x86_64
mysql-libs-5.1.73-3.el6_5.x86_64
mysql-devel-5.1.73-8.el6_8.x86_64
mysql-5.7.17-1.el6.x86_64

列出系统中包括mysql关键字的RPM包

1
2
3
4
5
6
7
8
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qa|grep "mysql"  
php56w-mysql-5.6.30-1.w6.x86_64
mysql-community-libs-5.7.16-1.el6.x86_64
zabbix-server-mysql-3.0.9-1.el6.x86_64
mysql-libs-5.1.73-3.el6_5.x86_64
mysql-devel-5.1.73-8.el6_8.x86_64
mysql-5.7.17-1.el6.x86_64
zabbix-web-mysql-3.0.9-1.el6.noarch

列出系统中近期安装的RPM包

1
2
3
4
5
6
7
8
9
10
11
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qa --last | head 
tree-1.5.3-3.el6.x86_64 20170713日 星期四 093513
git-1.7.1-8.el6.x86_64 20170712日 星期三 102920
perl-Git-1.7.1-8.el6.noarch 20170712日 星期三 102919
elfutils-0.164-2.el6.x86_64 20170711日 星期二 103026
perf-2.6.32-696.3.2.el6.x86_64 20170711日 星期二 103025
elfutils-libs-0.164-2.el6.x86_64 20170711日 星期二 103025
elfutils-libelf-0.164-2.el6.x86_64 20170711日 星期二 103025
pmm-client-1.1.6-1.x86_64 20170710日 星期一 165804
gcc-gfortran-4.4.7-18.el6.x86_64 20170706日 星期四 154043
gcc-c++-4.4.7-18.el6.x86_64 20170706日 星期四 154043

查找特定RPM包

查找某RPM包是否安装

1
2
3
4
5
6
7
8
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q mysql-server
package mysql-server is not installed
[root@iZuf6c08fdv8duubho2b0rZ ~]#
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q zabbix
package zabbix is not installed
[root@iZuf6c08fdv8duubho2b0rZ ~]#
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q gcc
gcc-4.4.7-18.el6.x86_64

查找某RPM包的基本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q percona-server
percona-server-5.6.36-82.0.x86_64
[root@iZuf6c08fdv8duubho2b0rZ ~]#
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qi percona-server
Name : percona-server Relocations: /usr/local/percona
Version : 5.6.36 Vendor: Jiessie
Release : 82.0 Build Date: 20170620日 星期二 130820
Install Date: 20170620日 星期二 134236秒 Build Host: iZuf6c08fdv8duubho2b0rZ
Group : applications/database Source RPM: percona-server-5.6.36-82.0.src.rpm
Size : 460543421 License: GPL
Signature : (none)
Packager : dwj999@163.com
URL : https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.36-82.0/source/tarball/percona-server-5.6.36-82.0.tar.gz
Summary : percona-server-5.6.36-82.0
Description :
Percona Server is an enhanced, drop-in MySQL® replacement which has been downloaded more than 1,000,000 times.
A free open source solution, Percona Server is a MySQL alternative which offers breakthrough performance, scalability, features, and instrumentation. Self-tuning algorithms and support for extremely high-performance hardware make it the clear choice for organizations that demand excellent performance and reliability from their MySQL database server.
[root@iZuf6c08fdv8duubho2b0rZ ~]#

查找某RPM包的配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qc httpd
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/var/www/error/HTTP_BAD_GATEWAY.html.var
/var/www/error/HTTP_BAD_REQUEST.html.var
/var/www/error/HTTP_FORBIDDEN.html.var
/var/www/error/HTTP_GONE.html.var
/var/www/error/HTTP_INTERNAL_SERVER_ERROR.html.var
/var/www/error/HTTP_LENGTH_REQUIRED.html.var
/var/www/error/HTTP_METHOD_NOT_ALLOWED.html.var
/var/www/error/HTTP_NOT_FOUND.html.var
/var/www/error/HTTP_NOT_IMPLEMENTED.html.var
/var/www/error/HTTP_PRECONDITION_FAILED.html.var
/var/www/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
/var/www/error/HTTP_REQUEST_TIME_OUT.html.var
/var/www/error/HTTP_REQUEST_URI_TOO_LARGE.html.var
/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var
/var/www/error/HTTP_UNAUTHORIZED.html.var
/var/www/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
/var/www/error/HTTP_VARIANT_ALSO_VARIES.html.var
/var/www/error/contact.html.var
/var/www/error/include/bottom.html
/var/www/error/include/spacer.html
/var/www/error/include/top.html

查找某RPM包的文档信息

1
2
3
4
5
6
7
8
9
10
11
12
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qd httpd
/usr/share/doc/httpd-2.2.15/ABOUT_APACHE
/usr/share/doc/httpd-2.2.15/CHANGES
/usr/share/doc/httpd-2.2.15/LICENSE
/usr/share/doc/httpd-2.2.15/NOTICE
/usr/share/doc/httpd-2.2.15/README
/usr/share/doc/httpd-2.2.15/VERSIONING
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz

查找某RPM包的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qs rsync
normal /etc/xinetd.d/rsync
normal /usr/bin/rsync
normal /usr/share/doc/rsync-3.0.6
normal /usr/share/doc/rsync-3.0.6/COPYING
normal /usr/share/doc/rsync-3.0.6/NEWS
normal /usr/share/doc/rsync-3.0.6/OLDNEWS
normal /usr/share/doc/rsync-3.0.6/README
normal /usr/share/doc/rsync-3.0.6/support
normal /usr/share/doc/rsync-3.0.6/support/Makefile
normal /usr/share/doc/rsync-3.0.6/support/atomic-rsync
normal /usr/share/doc/rsync-3.0.6/support/cvs2includes
normal /usr/share/doc/rsync-3.0.6/support/deny-rsync
normal /usr/share/doc/rsync-3.0.6/support/file-attr-restore
normal /usr/share/doc/rsync-3.0.6/support/files-to-excludes
normal /usr/share/doc/rsync-3.0.6/support/git-set-file-times
normal /usr/share/doc/rsync-3.0.6/support/logfilter
normal /usr/share/doc/rsync-3.0.6/support/lsh
normal /usr/share/doc/rsync-3.0.6/support/mnt-excl
normal /usr/share/doc/rsync-3.0.6/support/munge-symlinks
normal /usr/share/doc/rsync-3.0.6/support/rrsync
normal /usr/share/doc/rsync-3.0.6/support/rsyncstats
normal /usr/share/doc/rsync-3.0.6/support/savetransfer.c
normal /usr/share/doc/rsync-3.0.6/tech_report.tex
normal /usr/share/man/man1/rsync.1.gz
normal /usr/share/man/man5/rsyncd.conf.5.gz

RPM包的状态

状态 说明
Normal 正常,表明文件未被其他软件包修改过
not installed 未安装,表明文件未安装
Replaced 已替换,表明文件已被其他软件包修改替换过,不再是原先的文件
net shared 网络共享,表明文件处于网络共享状态

查找某RPM包的所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -ql rsync
/etc/xinetd.d/rsync
/usr/bin/rsync
/usr/share/doc/rsync-3.0.6
/usr/share/doc/rsync-3.0.6/COPYING
/usr/share/doc/rsync-3.0.6/NEWS
/usr/share/doc/rsync-3.0.6/OLDNEWS
/usr/share/doc/rsync-3.0.6/README
/usr/share/doc/rsync-3.0.6/support
/usr/share/doc/rsync-3.0.6/support/Makefile
/usr/share/doc/rsync-3.0.6/support/atomic-rsync
/usr/share/doc/rsync-3.0.6/support/cvs2includes
/usr/share/doc/rsync-3.0.6/support/deny-rsync
/usr/share/doc/rsync-3.0.6/support/file-attr-restore
/usr/share/doc/rsync-3.0.6/support/files-to-excludes
/usr/share/doc/rsync-3.0.6/support/git-set-file-times
/usr/share/doc/rsync-3.0.6/support/logfilter
/usr/share/doc/rsync-3.0.6/support/lsh
/usr/share/doc/rsync-3.0.6/support/mnt-excl
/usr/share/doc/rsync-3.0.6/support/munge-symlinks
/usr/share/doc/rsync-3.0.6/support/rrsync
/usr/share/doc/rsync-3.0.6/support/rsyncstats
/usr/share/doc/rsync-3.0.6/support/savetransfer.c
/usr/share/doc/rsync-3.0.6/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz

查找某RPM包的安装、卸载前后的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q --scripts httpd         
preinstall scriptlet (using /bin/sh):
# Add the "apache" user
getent group apache >/dev/null || groupadd -g 48 -r apache
getent passwd apache >/dev/null || \
useradd -r -u 48 -g apache -s /sbin/nologin \
-d /var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh):
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
/sbin/service httpd stop > /dev/null 2>&1
/sbin/chkconfig --del httpd
/sbin/service htcacheclean stop > /dev/null 2>&1
/sbin/chkconfig --del htcacheclean
fi
posttrans scriptlet (using /bin/sh):
test -f /etc/sysconfig/httpd-disable-posttrans || \
/sbin/service httpd condrestart >/dev/null 2>&1 || :

查找某RPM包的修改历史

1
2
3
4
5
6
7
8
9
10
11
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q --changelog python |head -10
* 二 809 2016 Charalampos Stratakis <cstratak@redhat.com> - 2.6.6-66
- Fix for CVE-2016-1000110 HTTPoxy attack
Resolves: rhbz#1359161

* 二 621 2016 Tomas Orsava <torsava@redhat.com> - 2.6.6-65
- Fix for CVE-2016-0772 python: smtplib StartTLS stripping attack (rhbz#1303647)
Raise an error when STARTTLS fails (upstream patch)
- Fix for CVE-2016-5699 python: http protocol steam injection attack (rhbz#1303699)
Disabled HTTP header injections in httplib (upstream patch)
Resolves: rhbz#1346354

查找某个组群里的RPM包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -qg Applications/Databases 
db4-utils-4.7.25-18.el6_4.x86_64
mysql-libs-5.1.73-3.el6_5.x86_64
percona-xtrabackup-2.3.6-1.el6.x86_64
Percona-Server-client-51-5.1.73-rel14.12.624.rhel6.x86_64
rh-postgresql95-postgresql-libs-9.5.4-1.el6.x86_64
postgresql95-libs-9.5.5-1PGDG.rhel6.x86_64
postgresql95-9.5.5-1PGDG.rhel6.x86_64
postgresql95-contrib-9.5.5-1PGDG.rhel6.x86_64
postgresql95-server-9.5.5-1PGDG.rhel6.x86_64
sqlite-3.6.20-1.el6_7.2.x86_64
mongodb-2.4.14-4.el6.x86_64
mongodb-server-2.4.14-4.el6.x86_64
mysql-devel-5.1.73-8.el6_8.x86_64
innotop-1.11.4-1.el6.noarch
Percona-Server-shared-56-5.6.35-rel80.0.el6.x86_64
mysql-community-libs-5.7.16-1.el6.x86_64
redis-2.4.10-1.el6.x86_64
percona-toolkit-3.0.3-1.el6.x86_64
percona-zabbix-templates-1.1.7-2.noarch
pmm-client-1.1.6-1.x86_64

通常,RPM 可以分为这几大类:娱乐(Amusement)、开发(Development)、文档(Document)、硬件(Hardware)、综合包(Metapackages)、多媒体(Multimedia)、生产力(Productivity)和系统(System)。

查询特定RPM包依赖

查询RPM包依赖

1
2
3
4
5
6
7
8
9
10
11
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q --requires percona-server
coreutils
shadow-utils
/bin/sh
/bin/sh
/bin/sh
/bin/sh
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadIsXz) <= 5.2-1

查询RPM包提供

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q --provides percona-server
adt_null.so()(64bit)
audit_log.so()(64bit)
auth.so()(64bit)
auth_socket.so()(64bit)
auth_test_plugin.so()(64bit)
connection_control.so()(64bit)
ha_tokudb.so()(64bit)
handlersocket.so()(64bit)
innodb_engine.so()(64bit)
libHotBackup.so()(64bit)
libdaemon_example.so()(64bit)
libfnv1a_udf.so()(64bit)
libfnv_udf.so()(64bit)
libmemcached.so()(64bit)
libmurmur_udf.so()(64bit)
libperconaserverclient.so.18()(64bit)
libperconaserverclient.so.18(libperconaserverclient_18)(64bit)
mypluglib.so()(64bit)
mysql_no_login.so()(64bit)
perl(My::Config)
perl(My::Config::Group)
perl(My::Config::Option)
perl(My::ConfigFactory)
perl(My::CoreDump)
perl(My::Exec)
perl(My::File::Path)
perl(My::Find)
perl(My::Handles)
perl(My::Memcache)
perl(My::Memcache::Binary)
perl(My::Options)
perl(My::Platform)
perl(My::SafeProcess)
perl(My::SafeProcess::Base)
perl(My::Suite::Query_response_time)
perl(My::SysInfo)
perl(My::Test)
perl(Subunit) = 0.0.2
perl(mtr_cases)
perl(mtr_match)
perl(mtr_report)
perl(mtr_results)
perl(mtr_unique)
qa_auth_client.so()(64bit)
qa_auth_interface.so()(64bit)
qa_auth_server.so()(64bit)
query_response_time.so()(64bit)
semisync_master.so()(64bit)
semisync_slave.so()(64bit)
test_udf_services.so()(64bit)
tokudb_backup.so()(64bit)
validate_password.so()(64bit)
percona-server = 5.6.36-82.0
percona-server(x86-64) = 5.6.36-82.0

查询某依赖的RPM包

1
2
3
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -q --whatrequires openssl 
postfix-2.6.6-6.el6_5.x86_64
openssl-devel-1.0.1e-48.el6_8.4.x86_64

RPM包的验证

验证某个RPM包状态

1
2
3
4
5
6
[root@iZuf6c08fdv8duubho2b0rZ ~]# rpm -V percona-server
missing /usr/local/percona/data
missing /usr/local/percona/data/test
missing /usr/local/percona/data/test/db.opt
missing /usr/local/percona/my.cnf
此处由于自定义了RPM包,配置文件和数据目录转移了,显示missing

RPM包的备份与恢复

RPM的Database文件存放在/var/lib/rpm目录。除了 __db.00* 是数据文件外,其他文件都属于 Berkeley DB 格式,所以要注意备份此目录。

RPM延伸

其他高级用法,请参考:https://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html

安装依赖

1
yum -y install rpm-build readline-devel redhat-rpm-config gcc gcc-c++ cmake make zlib-devel openssl-devel perl libtool automake autoconf time ccache bison libaio-devel gperf

创建用户及配置

创建用户

1
2
useradd jiessie 
su - jiessie

创建目录

1
2
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} 
echo '%_topdir /home/jiessie/rpmbuild' > ~/.rpmmacros

RPMBUILD

目录结构

1
2
3
4
5
6
7
8
9
[root@iZuf6c08fdv8duubho2b0rZ jiessie]# tree rpmbuild/
rpmbuild/
├── BUILD #编译生成的临时文件
├── RPMS #RPM包存放目录
├── SOURCES #源码存放目录
├── SPECS #SPEC文件目录
└── SRPMS #SRC RPM包存放目录

5 directories, 0 files

编写SPEC文件

详情,请参考:https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#.25prep_.E9.83.A8.E5.88.86

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
-bash-4.1$ cat percona.5.6.36.spec 
Name: percona-server #软件包名
Version:5.6.36 #版本号
Release: 82.0 #发布序列号
License: GPL #软件授权方式
Vendor: Jiessie #作者信息

Group: applications/database #软件包所属类别
URL: https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.36-82.0/source/tarball/percona-server-5.6.36-82.0.tar.gz #软件的项目主页
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root #安装或编译时使用的虚拟目录,在生成rpm的过程中,执行make install时就会把软件安装到该路径中,默认构建根目录为%{_topdir}/BUILDROOT,可以用$RPM_BUILD_ROOT方式引用
BuildRequires: cmake #编译过程中需要的包列表
Requires: coreutils,shadow-utils #程序安装时需要的包列表
Packager: dwj999@163.com #打包者信息
Autoreq: no
Source: percona-server-5.6.36-82.0.tar.gz #源代码包
prefix: /usr/local/percona #rpm包安装的路径
Summary: percona-server-5.6.36-82.0 #一行简短的软件包介绍

%description #软件包详细说明,可写在多个行上
Percona Server is an enhanced, drop-in MySQL® replacement which has been downloaded more than 1,000,000 times.
A free open source solution, Percona Server is a MySQL alternative which offers breakthrough performance, scalability, features, and instrumentation. Self-tuning algorithms and support for extremely high-performance hardware make it the clear choice for organizations that demand excellent performance and reliability from their MySQL database server.

%define MYSQL_USER mysql #定义的MYSQL_USER变量
%define MYSQL_GROUP mysql #定义的MYSQL_GROUP变量
%define __os_install_post %{nil}

%prep #这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。读取位于%_sourcedir(~/rpmbuild/SOURCES)目录的源代码和patch,随后会解压源代码至%_builddir(~/rpmbuild/BUILD)下的子目录并应用所有patch,描述解压源代码的方法,包含%setup和%patch命令
%setup -q -n %{name}-%{version}-%{release} #-q不输出信息,-n解压到指定目录中

%build #包含构建阶段执行的命令,构建完成后便开始后续安装
CFLAGS="-O3 -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing"
CXX=g++
CXXFLAGS="-O3 -g -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing"
export CFLAGS CXX CXXFLAGS

cmake . \
-DSYSCONFDIR:PATH=%{prefix} \
-DCMAKE_INSTALL_PREFIX:PATH=%{prefix} \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DENABLE_PROFILING:BOOL=ON \
-DWITH_DEBUG:BOOL=OFF \
-DWITH_VALGRIND:BOOL=OFF \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \
-DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON \
-DWITH_TOKUDB_STORAGE_ENGINE:BOOL=ON \
-DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON \
-DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON \
-DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DENABLED_LOCAL_INFILE:BOOL=ON \
-DWITH_EMBEDDED_SERVER=0 \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DCOMMUNITY_BUILD:BOOL=ON \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_NDBCLUSTER_STORAGE_ENGINE=1 \
-DENABLED_PROFILING=1 \
-DINNODB_PAGE_ATOMIC_REF_COUNT=1 \
-DWITH_INNODB_MEMCACHED=1;

make -j `cat /proc/cpuinfo | grep processor| wc -l`

%install #包含安装阶段执行的命令。命令将文件从 %{_builddir} 目录安装至 %{buildroot} 目录
make DESTDIR=$RPM_BUILD_ROOT install
cp %{_sourcedir}/my.cnf $RPM_BUILD_ROOT%{prefix}/ #拷贝模板配置文件,下文会介绍配置文件

%clean #清理安装目录的命令
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/*

%files #需要被打包/安装的文件列表
%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP}) #设置默认文件权限格式%defattr(<file permissions>, <user>, <group>, <directory permissions>),-使用默认的权限,文本文件是0644,可执行文件是0755
%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) %{prefix}/*

%pre #软件安装之前执行的脚本
if ! id %{MYSQL_USER} > /dev/null 2>&1;then
useradd -M -s /sbin/nologin %{MYSQL_USER} #创建MySQL用户
fi

%post #软件安装之后执行的脚本
if [ -f %{prefix}/support-files/mysql.server > /dev/null 2>&1 ] && [ ! -f %{_initddir}/mysql > /dev/null 2>&1 ];then
cp %{prefix}/support-files/mysql.server %{_initddir}/mysqld #拷贝启动脚本
chmod +x %{_initddir}/mysqld #添加启动脚本执行权限
chkconfig --level 2345 %{_initddir}/mysqld on #添加到系统启动服务中
fi

if [ ! -f %{_sysconfdir}/my.cnf ];then
cp %{prefix}/my.cnf %{_sysconfdir}/my.cnf #拷贝配置文件
else
cp %{prefix}/my.cnf %{_sysconfdir}/my.cnf.rpmnew #如存在文件,则重命名
fi
mkdir -p /hwdata/data/percona #创建数据目录
chown -R mysql:mysql /hwdata/data/percona #授权数据目录
rm -rf %{prefix}/my.cnf #删除prefix目录的my.cnf
rm -rf %{prefix}/data #删除prefix目录的data目录
%{prefix}/scripts/mysql_install_db --rpm --user=mysql --basedir=%{prefix} #初始化安装 --datadir=/hwdata/data/percona
/etc/init.d/mysqld start #开启MySQL服务
%{prefix}/bin/mysqladmin -uroot password '123456'
%{prefix}/bin/mysql -uroot -p123456 -e "grant all privileges on *.* to root@'127.0.0.1' identified by '123456' with grant option;"
%{prefix}/bin/mysql -uroot -p123456 -e "grant all privileges on *.* to root@'localhost' identified by '123456' with grant option;"
%{prefix}/bin/mysql -uroot -p123456 -e "delete from mysql.user where Password='';"
%{prefix}/bin/mysql -uroot -p123456 -e "delete from mysql.db where User='';"
%{prefix}/bin/mysql -uroot -p123456 -e "delete from mysql.proxies_priv where Host!='localhost';"
%{prefix}/bin/mysql -uroot -p123456 -e "drop database test;"
%{prefix}/bin/mysql -uroot -p123456 -e "reset master;"

echo "PATH=/usr/local/percona/bin/:$PATH:$HOME/bin" >> /etc/profile #添加环境变量
echo "export PATH" >> /etc/profile
source /etc/profile #环境变量生效

%preun #rpm卸载前执行的脚本,在升级的时候会执行
if [ -f %{_sysconfdir}/my.cnf ];then
mv %{_sysconfdir}/my.cnf %{_sysconfdir}/my.cnf.rpmold
fi

if [ -f %{_initddir}/mysql ];then
mv %{_initddir}/mysql %{_initddir}/mysql.rpmold
fi

%postun #rpm卸载后执行的脚本,在升级rpm包的时候不会执行
rm -rf %{prefix}
rm -rf /hwdata/data/percona
userdel -r %{MYSQL_USER} >/dev/null 2>&1

%changelog #RPM 包变更日志

MySQL模板文件(my.cnf)

以下为my.cnf配置模板文件,不做过多解释,请参考:https://dev.mysql.com/doc/refman/5.6/en/option-files.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
-bash-4.1$ cat my.cnf 
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8

[mysql]
#prompt="MySQL [\d]> "
prompt="MySQL [\d] \R:\m:\\s > "
no-auto-rehash

[mysqld]
# basic setting #
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/percona
datadir = /hwdata/data/percona
pid-file = /hwdata/data/percona/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
autocommit = 1
auto_increment_increment = 1
auto_increment_offset = 1
event_scheduler = 1 #slave need off
#read_only=ON #slave need on
skip-name-resolve
skip-external-locking
transaction_isolation = READ-COMMITTED
init-connect = 'SET NAMES utf8'
character-set-server = utf8
query_cache_size = 0
query_cache_type = 0

max_connections = 2000
max_connect_errors = 100000
max_length_for_sort_data = 8192
max_allowed_packet = 32M
max_heap_table_size = 128M
tmp_table_size = 128M
open_files_limit = 65535
table_open_cache = 1024
table_definition_cache = 2048
table_open_cache = 1024

read_buffer_size = 4M
read_rnd_buffer_size = 8M
sort_buffer_size = 4M
join_buffer_size = 16M
key_buffer_size = 256M

back_log = 300
expire_logs_days = 7
log_error = /hwdata/data/percona/mysql-error.log
log_bin = mysql-bin
log_warnings = 2
log_queries_not_using_indexes = 1
binlog_format = ROW
slow_query_log = 1
slow_query_log_file = /hwdata/data/percona/mysql-slow.log
long_query_time = 1
log_slow_rate_limit=100
log_slow_rate_type=query
log_slow_verbosity=full
slow_query_log_always_write_time=1
slow_query_log_use_global_control=all
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
min_examined_row_limit = 100
binlog-rows-query-log-events = 1
log-bin-trust-function-creators = 1
binlog_cache_size = 1M
userstat=1
performance_schema = 0
#lower_case_table_names = 1
default_storage_engine = InnoDB
innodb_page_size = 16384
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_per_table = 1
innodb_open_files = 1024
innodb_buffer_pool_size = 4096M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_lru_scan_depth = 4000
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_flush_method=O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_log_buffer_size = 16M
innodb_log_file_size = 1536M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 75
innodb_lock_wait_timeout = 120
innodb_large_prefix = 1
innodb_print_all_deadlocks = 1
innodb_autoinc_lock_mode = 2
innodb_online_alter_log_max_size=1G
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
metadata_locks_hash_instances = 8

gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates

slave_skip_errors = ddl_exist_errors
slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'
slave_net_timeout = 60
master_info_repository = TABLE
relay_log_info_repository = TABLE

thread_cache_size = 64
thread_handling = pool-of-threads
thread_pool_oversubscribe = 10

bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1

interactive_timeout = 1800
wait_timeout = 1800
lock_wait_timeout = 1800

[mysqldump]
quick
max_allowed_packet = 16M

[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
-bash-4.1$

上传源码文件及模板文件

1
2
3
4
5
-bash-4.1$ ls -l rpmbuild/SOURCES/
总用量 54808
-rw-r--r-- 1 jiessie jiessie 3629 714 10:22 my.cnf
-rw-r--r-- 1 jiessie jiessie 56116691 714 10:22 percona-server-5.6.36-82.0.tar.gz
-bash-4.1$

执行编译过程

rpmbuild -bb percona.5.6.36.spec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
-bash-4.1$ pwd
/home/jiessie/rpmbuild/SPECS
-bash-4.1$ rpmbuild -bb percona.5.6.36.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.YmJTDn
+ umask 022
+ cd /home/jiessie/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/jiessie/rpmbuild/BUILD
+ rm -rf percona-server-5.6.36-82.0
+ /usr/bin/gzip -dc /home/jiessie/rpmbuild/SOURCES/percona-server-5.6.36-82.0.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd percona-server-5.6.36-82.0
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.vvnRcl
+ umask 022
+ cd /home/jiessie/rpmbuild/BUILD
+ cd percona-server-5.6.36-82.0
+ LANG=C
+ export LANG
+ unset DISPLAY
+ CFLAGS='-O3 -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing'
+ CXX=g++
+ CXXFLAGS='-O3 -g -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing'
+ export CFLAGS CXX CXXFLAGS
+ cmake . -DSYSCONFDIR:PATH=/usr/local/percona -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/percona -DCMAKE_BUILD_TYPE:STRING=Release -DENABLE_PROFILING:BOOL=ON -DWITH_DEBUG:BOOL=OFF -DWITH_VALGRIND:BOOL=OFF -DENABLE_DEBUG_SYNC:BOOL=OFF -DWITH_EXTRA_CHARSETS:STRING=all -DWITH_SSL:STRING=bundled -DWITH_UNIT_TESTS:BOOL=OFF -DWITH_ZLIB:STRING=bundled -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON -DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON -DWITH_TOKUDB_STORAGE_ENGINE:BOOL=ON -DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON -DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DENABLED_LOCAL_INFILE:BOOL=ON -DWITH_EMBEDDED_SERVER=0 -DINSTALL_LAYOUT:STRING=STANDALONE -DCOMMUNITY_BUILD:BOOL=ON -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_NDBCLUSTER_STORAGE_ENGINE=1 -DENABLED_PROFILING=1 -DINNODB_PAGE_ATOMIC_REF_COUNT=1 -DWITH_INNODB_MEMCACHED=1
-- Running cmake version 2.8.12.2
-- Found Git: /usr/bin/git (found version "1.7.1")
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- ...省略部分...
-- Not building tokudb-backup-plugin
-- Library perconaserverclient depends on OSLIBS -lpthread;m;rt;dl
-- Skipping deb packaging on unsupported platform Final.
-- CMAKE_BUILD_TYPE: Release
-- COMPILE_DEFINITIONS: HAVE_CONFIG_H
-- CMAKE_C_FLAGS: -O3 -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -Wall -Wextra -Wformat-security -Wvla -Wwrite-strings -Wdeclaration-after-statement
-- CMAKE_CXX_FLAGS: -O3 -g -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -Wall -Wextra -Wformat-security -Wvla -Woverloaded-virtual -Wno-unused-parameter
-- CMAKE_C_FLAGS_RELEASE: -O3 -DNDEBUG -DDBUG_OFF
-- CMAKE_CXX_FLAGS_RELEASE: -O3 -DNDEBUG -DDBUG_OFF
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:

COMMUNITY_BUILD
ENABLE_DEBUG_SYNC
ENABLE_PROFILING
WITH_TOKUDB_STORAGE_ENGINE


-- Build files have been written to: /home/jiessie/rpmbuild/BUILD/percona-server-5.6.36-82.0
++ cat /proc/cpuinfo
++ grep processor
++ wc -l
+ make -j 4
Scanning dependencies of target abi_check
Scanning dependencies of target INFO_BIN
Scanning dependencies of target INFO_SRC
Scanning dependencies of target zlib
[ 0%] [ 0%] Building C object zlib/CMakeFiles/zlib.dir/adler32.c.o
[100%] ...省略部分...
[100%] Built target udf_example
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.MNmU8M
+ umask 022
+ cd /home/jiessie/rpmbuild/BUILD
+ '[' /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64 '!=' / ']'
+ rm -rf /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64
++ dirname /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64
+ mkdir -p /home/jiessie/rpmbuild/BUILDROOT
+ mkdir /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64
+ cd percona-server-5.6.36-82.0
+ LANG=C
+ export LANG
+ unset DISPLAY
+ make DESTDIR=/home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64 install
[ 0%] Built target INFO_BIN
[100%] ...省略部分...
[100%] Built target my_safe_process
Install the project...
-- Install configuration: "Release"
-- Installing: /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64/usr/local/percona/docs/mysql.info
-- ...省略部分...
cpio: percona-server-5.6.36-82.0/storage/innobase/pars0lex.l: Cannot stat: No such file or directory
97189 blocks
+ /usr/lib/rpm/check-buildroot
Processing files: percona-server-5.6.36-82.0.x86_64
Provides: adt_null.so()(64bit) audit_log.so()(64bit) auth.so()(64bit) auth_socket.so()(64bit) auth_test_plugin.so()(64bit) connection_control.so()(64bit) handlersocket.so()(64bit) innodb_engine.so()(64bit) libdaemon_example.so()(64bit) libfnv1a_udf.so()(64bit) libfnv_udf.so()(64bit) libmemcached.so()(64bit) libmurmur_udf.so()(64bit) libperconaserverclient.so.18()(64bit) libperconaserverclient.so.18(libperconaserverclient_18)(64bit) mypluglib.so()(64bit) mysql_no_login.so()(64bit) perl(My::Config) perl(My::Config::Group) perl(My::Config::Option) perl(My::ConfigFactory) perl(My::CoreDump) perl(My::Exec) perl(My::File::Path) perl(My::Find) perl(My::Handles) perl(My::Memcache) perl(My::Memcache::Binary) perl(My::Options) perl(My::Platform) perl(My::SafeProcess) perl(My::SafeProcess::Base) perl(My::Suite::Query_response_time) perl(My::SysInfo) perl(My::Test) perl(Subunit) = 0.0.2 perl(mtr_cases) perl(mtr_match) perl(mtr_report) perl(mtr_results) perl(mtr_unique) qa_auth_client.so()(64bit) qa_auth_interface.so()(64bit) qa_auth_server.so()(64bit) query_response_time.so()(64bit) semisync_master.so()(64bit) semisync_slave.so()(64bit) test_udf_services.so()(64bit) validate_password.so()(64bit)
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Processing files: percona-server-debuginfo-5.6.36-82.0.x86_64
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64
Wrote: /home/jiessie/rpmbuild/RPMS/x86_64/percona-server-5.6.36-82.0.x86_64.rpm
Wrote: /home/jiessie/rpmbuild/RPMS/x86_64/percona-server-debuginfo-5.6.36-82.0.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.FOVDND
+ umask 022
+ cd /home/jiessie/rpmbuild/BUILD
+ cd percona-server-5.6.36-82.0
+ rm -rf /home/jiessie/rpmbuild/BUILDROOT/percona-server-5.6.36-82.0.x86_64
+ rm -rf /home/jiessie/rpmbuild/BUILD/percona-server-5.6.36-82.0
+ exit 0
-bash-4.1$

查看生成的RPM文件

1
2
3
4
5
-bash-4.1$ ls -l rpmbuild/RPMS/x86_64/
总用量 99528
-rw-rw-r-- 1 jiessie jiessie 53752860 714 10:34 percona-server-5.6.36-82.0.x86_64.rpm
-rw-rw-r-- 1 jiessie jiessie 48158544 714 10:35 percona-server-debuginfo-5.6.36-82.0.x86_64.rpm
-bash-4.1$

percona-server-5.6.36-82.0.x86_64.rpm 此文件即是编译后生成的RPM安装文件

结束语

随着云计算时代的到来,docker被越来越多的应用的实际生产中,但对于公司规模较小,自动化平台还不够完善的企业,自制RPM包安装MySQL也是一种不错的选择。

-------------本文结束感谢您的阅读-------------