Build MySQL 8 from the source rpm in OL7

Following our discussion with Simon about compiling MySQL 8.0.34 and 8.1.0 for OL9 (RedHat and CentOS Stream as well), see this blog post, we realized that compiling the latest MySQL 8.x on OL7 (EL7) wasn’t very simple either.

After soliciting the MySQL release engineer team, I was able to compile MySQL correctly from its src rpm.

Let me share the various steps with you.

My build machine is a VM.Standard.E4.Flex instance on OCI having 4 OCPUs and 64GB of ram with Oracle Linux 7.9. The machine has also a block volume of 50GB attached and mounted in /home/opc/rpmbuild.

Getting the source RPM

To get the source RPM, you need first to install the MySQL Community’s repo:

$ sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-9.noarch.rpm

Depending on which version you want to compile, you can use one of the following commands:

For latest 8.0:

$ yumdownloader --source mysql-community-server

For latest Innovation Release (8.1 at the moment):

$ yumdownloader --source mysql-community-server --enablerepo=mysql-innovation-community

Now we have both files we can use:

$ ls -lh *src.rpm
-rw-rw-r--. 1 opc opc 544M Jun 25 03:05 mysql-community-8.0.34-1.el7.src.rpm
-rw-rw-r--. 1 opc opc 544M Jun 23 08:23 mysql-community-8.1.0-1.el7.src.rpm

Removing Problematic Packages

I learned from the MySQL Release Engineering Team, that ksplice packages will break any rpm build.

This mean that on my build machine, I will have to remove all ksplice packages.

$ rpm -qa | grep ksplice
ksplice-release-el7-1.0-7.el7.x86_64
ksplice-core0-1.0.59-1.el7.x86_64
ksplice-1.0.59-1.el7.x86_64
ksplice-tools-1.0.59-1.el7.x86_64

This is not much… let’s do it now:

$ sudo yum remove -y ksplice ksplice-core0 ksplice-release-el7 ksplice-tools

Dependencies

To build RPMs, we need to start by installing the following package:

$ sudo yum install rpm-build

Of course MySQL also need several packages including libraries and compiler required to compile it.

To know which one we need, we can already try to rebuild the rpm:

$ rpmbuild --rebuild mysql-community-8.1.0-1.el7.src.rpm
[...]
error: Failed build dependencies:
	cmake3 >= 3.6.1 is needed by mysql-community-8.1.0-1.el7.x86_64
	devtoolset-11-gcc is needed by mysql-community-8.1.0-1.el7.x86_64
	devtoolset-11-gcc-c++ is needed by mysql-community-8.1.0-1.el7.x86_64
	devtoolset-11-binutils is needed by mysql-community-8.1.0-1.el7.x86_64
	bison >= 2.1 is needed by mysql-community-8.1.0-1.el7.x86_64
	perl(Env) is needed by mysql-community-8.1.0-1.el7.x86_64
	perl(Data::Dumper) is needed by mysql-community-8.1.0-1.el7.x86_64
	perl(JSON) is needed by mysql-community-8.1.0-1.el7.x86_64
	libaio-devel is needed by mysql-community-8.1.0-1.el7.x86_64
	ncurses-devel is needed by mysql-community-8.1.0-1.el7.x86_64
	numactl-devel is needed by mysql-community-8.1.0-1.el7.x86_64
	openssl-devel is needed by mysql-community-8.1.0-1.el7.x86_64
	zlib-devel is needed by mysql-community-8.1.0-1.el7.x86_64
	cyrus-sasl-devel is needed by mysql-community-8.1.0-1.el7.x86_64
	openldap-devel is needed by mysql-community-8.1.0-1.el7.x86_64

So let’s start by installing those packages:

$ sudo yum install -y cmake devtoolset-11-gcc devtoolset-11-gcc-c++ \
                      devtoolset-11-binutils bison perl perl-Data-Dumper \
                      perl-JSON libaio-devel ncurses-devel numactl-devel \
                      openssl-devel zlib-devel cyrus-sasl-devel openldap-devel \ 
                      perl-Env
$ sudo yum install -y cmake3 --enablerepo=ol7_developer_EPEL

Then they are other packages that are required but not listed (we also need to install the system gcc-c++ to build MySQL 5.6 for the shared compat libraries):

$ sudo yum install -y systemd-devel curl-devel gcc-c++

Building RPMs

Now we are ready to build all the rpms from the source package.

This is the command to rebuild everything for the version you want:

$ rpmbuild --rebuild mysql-community-8.1.0-1.el7.src.rpm

When done, all the new rpms can be found in ~/rpmbuild/RPMS/x86_64/:

$ ls -lh ~/rpmbuild/RPMS/x86_64/
total 946M
-rw-rw-r--. 1 opc opc  17M Aug 19 00:07 mysql-community-client-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 3.6M Aug 19 00:08 mysql-community-client-plugins-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 667K Aug 19 00:07 mysql-community-common-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 486M Aug 19 00:10 mysql-community-debuginfo-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 1.9M Aug 19 00:08 mysql-community-devel-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 4.1M Aug 19 00:08 mysql-community-embedded-compat-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 2.3M Aug 19 00:07 mysql-community-icu-data-files-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 1.6M Aug 19 00:08 mysql-community-libs-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 669K Aug 19 00:08 mysql-community-libs-compat-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc  36M Aug 19 00:06 mysql-community-server-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc  27M Aug 19 00:07 mysql-community-server-debug-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 363M Aug 19 00:08 mysql-community-test-8.1.0-1.el7.x86_64.rpm
-rw-rw-r--. 1 opc opc 5.2M Aug 19 00:08 mysql-router-community-8.1.0-1.el7.x86_64.rpm

Conclusion

Building an RPM for MySQL on Oracle Linux 7 using the source RPM is an involved but rewarding process and you can also use the same process to build extra RPMs for your own components.

You need then to install the src rpm, modify the mysql.spec file (or work on a copy). This process is similar to what I explained in this article.

As we wrap up, it’s always a good practice to test the custom RPMs in a controlled environment before deploying it into production. This ensures that everything runs as expected and reduces the potential for unforeseen issues.

Thank you for journeying through this guide. And as usual, enjoy MySQL !

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

As MySQL Community Manager, I am an employee of Oracle and the views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

You can find articles I wrote on Oracle’s blog.