Mysql-5.7 Compile

Posted on Dec 5, 2023
Compile build MySQL-5.7 from source code with Debian 12+ or Fedora 38+.

Get mysql-5.7 source code

# get with github
git clone --depth 1 --branch=mysql-5.7.44 [email protected]:mysql/mysql-server.git

# get with mysql.com
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.44.tar.gz

Compile build


# Debian
sudo apt install libncurses-dev bison libatomic1 libaio-dev pkg-config make cmake gcc g++ mariadb-common

# Fedora
sudo dnf install ncurses-devel bison libtirpc-devel rpcgen libatomic mariadb-common

# openssl
git clone --depth 1 --branch=OpenSSL_1_1_1w https://github.com/openssl/openssl.git
cd openssl
./config --prefix=/usr/local/openssl1.1.1w/
make -j16 && sudo make install
cd /usr/local && sudo ln -s openssl1.1.1w openssl

# boost
wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
sudo tar zxvf boost_1_59_0.tar.gz -C /usr/local/ && sudo chmod 755 /usr/local/boost_1_59_0
cd /usr/local && sudo ln -s boost_1_59_0 boost

# user & data
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql

# mysql5.7
mkdir build && cd build

cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
  -DMYSQL_DATADIR=/database/mysql/data \
  -DWITH_BOOST=/usr/local/boost/ \
  -DSYSCONFDIR=/usr/local/mysql/etc \
  -DBUILD_CONFIG=mysql_release \
  -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  -DWITH_PARTITION_STORAGE_ENGINE=1 \
  -DWITH_FEDERATED_STORAGE_ENGINE=1 \
  -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  -DWITH_MYISAM_STORAGE_ENGINE=1 \
  -DENABLED_LOCAL_INFILE=1 \
  -DENABLE_DTRACE=0 \
  -DDEFAULT_CHARSET=utf8mb4 \
  -DWITH_DEBUG=0 \
  -DDEFAULT_COLLATION=utf8mb4_general_ci \
  -DWITH_EMBEDDED_SERVER=0 \
  -DWITH_SSL=/usr/local/openssl \
  -DWITH_SYSTEMD=on

make -j16 && sudo make install

Initialize mysqldb

sudo chown mysql:mysql /usr/local/mysql
# make log dir
sudo mkdir -p /var/log/mysql/ && sudo chown mysql:mysql /var/log/mysql/

# if use mysqld-debug
cd /usr/local/mysql/bin && sudo ln -s mysqld-debug mysqld

# initialize
sudo mkdir -p /database/mysql/data
sudo chown -R mysql:mysql /database/mysql/data
sudo -u mysql /usr/local/mysql/bin/mysqld --initialize --explicit_defaults_for_timestamp --user=mysql --basedir=/usr/local/mysql --datadir=/database/mysql/data

Start server

sudo cp /usr/local/mysql/lib/systemd/system/mysqld.service /usr/lib/systemd/system/

/lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=forking
RuntimeDirectory=mysqld
RuntimeDirectoryMode=2755
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

/etc/mysql/conf.d/mysqld.cnf

[mysqld]
port        = 3306
socket      = /var/run/mysqld/mysql.sock
pid-file    = /var/run/mysqld/mysql.pid
user        = mysql
basedir     = /usr/local/mysql
datadir     = /database/mysql/data
log_error   = /var/log/mysql/mysql-error.log

/etc/mysql/conf.d/mysql.cnf

[client]
port        = 3306
socket      = /var/run/mysqld/mysql.sock
sudo systemctl enable --now mysqld.service

Create user

mysql -uroot -h127.0.0.1 -p'do%%b(wgs8-Q'

Tip: password is execute mysqld --initialize generated.

SET PASSWORD = PASSWORD('debian');
GRANT ALL ON *.* TO usr1@'%' IDENTIFIED BY 'debian';

mysql -h10.24.0.1 -uusr1 -pdebian