一般来说,我们生产环境的 MySQL 是安装在 RHEL/CentOS 7 下的,常见安装部署的方法有三种:
- yum/rpm 安装
- 二进制 安装
- 源码 安装
生产环境建议使用二进制安装法,其优点是部署简单、快速、方便,并且相对"yum/rpm 安装" 方法能更方便地自定义文件存放的目录结构,方便用脚本批量部署,方便日后运维管理。
在生产上很少用到源码编译安装 MySQL, 最主要的原因,就是编译安装太慢了,二进制部署只需要几十秒。并且,源码编译安装容易遇到一些不好解决的编译问题。
那么什么时候需要用到编译安装呢?
当我们需要修改 MySQL 源代码以修复功能、修改功能、新增功能时,当我们想修改 MySQL 默认设定时,当我们需要对 MySQL 做 debug 时,我们就需要用到编译安装。
- 改源码
- 改默认设定
- debug
话不多说,下面看看我们的实战步骤,如何编译安装 MySQL 的最新版本。
编译安装 MySQL8.0.22
我们的目标
1. 通过实验,在 CentOS 7.9 (minimal 安装版) 操作系统下,编译安装 MySQL 社区版的最新版本 8.0.22
2. 修改源代码,实现一个假的 MySQL 版本号。
3. 通过修改默认设定,禁用不常用的两个存储引擎,FEDERATED 和 ARCHIVE;修改默认设定,使默认读的是 my.cnf,取代 etc/my.cnf
4. 让 MySQL 可以 debug。
01 安装操作
# 安装 cmake
cd root
yum -y install wget
wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.tar.gz
tar zxvf cmake-3.8.2-Linux-x86_64.tar.gz
mv cmake-3.8.2-Linux-x86_64 /usr/local/cmake
echo -e "\nexport PATH=/usr/local/cmake/bin:\$PATH" >>/etc/profile
source /etc/profile
# 安装gcc
## 安装编译安装时需要用的工具包
yum -y install bzip2 gcc gcc-c++
gcc下载
正在上传…重新上传取消
wget http://mirror.hust.edu.cn/gnu/gcc/gcc-5.5.0/gcc-5.5.0.tar.gz
tar zxvf gcc-5.5.0.tar.gz
cd gcc-5.5.0
## 下载mpfr、gmp、mpc、isl等依赖包
./contrib/download_prerequisites
## 开始编译安装 gcc(1.5h)
mkdir build && cd build
../configure --prefix=/usr/ --enable-checking=release \
--enable-languages=c,c++ --disable-multilib
make -j4 && make install
## 注意了,上面那个 prefix 必须用 usr/,以便覆盖掉旧版的 gcc ,以免编译程序找不到新版 gcc
## 检查验证 gcc 版本
gcc -v
# 安装 ncurses-devel、bison、openssl-devel
yum -y install ncurses-devel bison openssl-devel
下载源代码
cd /root/
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.22.tar.gz
编译安装
tar zxvf mysql-boost-8.0.22.tar.gz
cd mysql-8.0.22
# cmake(2h,如果提示没有这个命令,那么应该是要用绝对路径执行/usr/local/cmake/cmake-3.8.2-Linux-x86_64/bin/cmake)
cmake . \
-DWITH_BOOST=./boost/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
#-DMYSQL_DATADIR=/data/mysql/mysql3306/data \
#-DMYSQL_DATADIR=/data/mysql/mysql3307/data \
-DSYSCONFDIR=/ \
-DWITH_DEBUG=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 \
-DFORCE_INSOURCE_BUILD=1
##-DWITH_BOOST 编译指定boost
##-DCMAKE_INSTALL_PREFIX MYSQL安装环境目录
##-DMYSQL_DATADIR MYSQL数据存放路径
## SYSCONFDIR=/ # 修改读取 my.cnf 的路径
## WITH_DEBUG=1 # 可 debug 的版本
## WITHOUT_FEDERATED_STORAGE_ENGINE=1 \ # 摘掉 FEDERATED 存储引擎
## WITHOUT_ARCHIVE_STORAGE_ENGINE=1 \ # 摘掉 ARCHIVE 存储引擎
# 编译安装
make -j4 && make install
报错:
这个报错是内存不足,需要扩大内存。增加内存 或者 先关闭占用内存大的服务
MySQL 的编译是有进度条的,等待吧。
完成编译安装了~
配置环境变量
echo -e "export PATH=/usr/local/mysql/bin:\$PATH" >>/etc/profile
source /etc/profile
验证
[root@localhost mysql-8.0.22]# mysql -V
mysql Ver 100.9.99 for Linux on x86_64 (Source distribution)
02 配置操作
建组建用户
groupadd mysql
useradd -M -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
创建目录结构
mkdir -p /data/mysql/mysql3306/{data,logs,tmp}
mkdir -p /data/mysql/mysql3307/{data,logs,tmp}
chown mysql:mysql /data/mysql/mysql3306/ -R
chown mysql:mysql /data/mysql/mysql3307/ -R
初始化实例
cd /data/mysql/mysql3306/data/
#如果两个实例那么就是以下区分开来的初始化
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/mysql3306/data/
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/mysql3307/data/
#以下初始化为通用,不区分实例的初始化
mysqld --initialize-insecure
准备配置文件(3306改为3307即可,3307的server_id=3)
vi my.cnf
[client]
port=3306
#客户端连接socket,必须与服务端的socket使用同一个
socket=/data/mysql/mysql3306/mysql.sock
[mysqld]
user = mysql
port = 3306
server-id = 1
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
tmpdir = /data/mysql/mysql3306/tmp
socket = /data/mysql/mysql3306/mysql.sock
log_error = /data/mysql/mysql3306/error.logvi
给权限:
chown mysql:mysql my.cnf
启动 MySQL双实例
mysqld_safe --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &
mysqld_safe --defaults-file=/data/mysql/mysql3307/data/my.cnf 2>&1 >/dev/null &
******************************************************************************************************************
(1)报错
按照下面操作会报错:
mysqld --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &
mysqld --defaults-file=/data/mysql/mysql3307/data/my.cnf 2>&1 >/dev/null &
启动3307实例报错:
解决:
这个文件存在,应该是因为存在了sock的锁文件,导致启动的时候不能创建该文件导致的失败,删除或改名备份后,再次启动正常。(每次都需要删除,很烦人)
cd /tmp/
rm -rf mysql.sock.lock
(2)报错
2022-03-31T01:33:48.899180Z mysqld_safe error: log-error set to '/data/mysql/mysql3309/error.logvi', however file don't exists. Create writable for user 'mysql'.
解决:
意思是/data/mysql/mysql3309没有error.logvi文件,创建给权限即可:
touch /data/mysql/mysql3309/error.logvi
chown mysql.mysql /data/mysql/mysql3309/error.logvi
*****************************************************************************************************************
登录进入mysql数据库内
mysql -S /data/mysql/mysql3306/mysql.sock
mysql -S /data/mysql/mysql3307/mysql.sock
为mysql设置密码(需要进行设置密码后后续才可以把服务快速关停:以下后面两个命令后直接加入password '123123')
mysqladmin -u root -S /data/mysql/mysql3306/mysql.sock
mysqladmin -u root -S /data/mysql/mysql3307/mysql.sock
带密码登录不同实例数据库的方法
mysql -uroot -p123123 -S /data/mysql/mysql3306/mysql.sock
mysql -uroot -p123123 -S /data/mysql/mysql3307/mysql.sock
************************************************************************
停止MySQL不同实例服务的实质命令。
停止3306实例的命令如下:mysqladmin -uroot -p123123 -S /data/3306/mysql.sock shutdown
停止3307实例的命令如下:mysqladmin -uroot -p123123 -S /data/3307/mysql.sock shutdown
************************************************************************
脚本编辑:
vi /data/mysql/mysql3306/mysql(chown mysql:mysql mysql && chmod 700 mysql)
#!/bin/bash
###############################################
#this scripts is created by Mr.wu at 2022-03-27
port=3306
mysql_user="root"
mysql_pwd="123123" #这里需要修改为用户的实际密码
CmdPath="/usr/local/mysql/bin"
mysql_sock="/data/mysql/mysql${port}/mysql.sock"
#startup function
function_start_mysql(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL....\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/mysql/mysql${port}/data/my.cnf 2>&1 >/dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
#stop function
function_stop_mysql(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/mysql/mysql${port}/mysql.sock shutdown
fi
}
#restart function
function_restart_mysql(){
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: /data/mysql/mysql${port}/mysql{start|stop|restart}\n"
esac
启动方式:(备注:脚本直接运行了双实例这个步骤:mysqld_safe --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &)(然后进入数据库内使用命令:mysql -uroot -p123123 -S /data/mysql/mysql3306/mysql.sock)
/data/mysql/mysql3306/mysql start
/data/mysql/mysql3306/mysql stop
配置MySQL多实例数据库开机自启动
echo "#mysql multi instances" >> /etc/rc.local
echo "/data/mysql/mysql3306/mysql start" >> /etc/rc.local
echo "/data/mysql/mysql3307/mysql start" >> /etc/rc.local