MySQL 8.0作为当前最流行的开源关系型数据库之一,其源码编译安装方式相比直接使用二进制包或系统自带仓库安装,具有以下不可替代的优势:
重要提示:源码编译适合对MySQL有深度定制需求或需要特定优化场景。如果仅需快速部署测试环境,建议直接使用官方二进制包。
针对CentOS 7/Stream 8/9的不同版本,需注意以下差异:
| 组件 | CentOS 7 | Stream 8 | Stream 9 |
|---|---|---|---|
| 默认GCC版本 | 4.8.5 | 8.5.0 | 11.2.1 |
| CMake最低要求 | 2.8+ | 3.5+ | 3.18+ |
| OpenSSL兼容性 | 1.0.2 | 1.1.1 | 3.0+ |
实测中发现Stream 9的OpenSSL 3.0需要额外处理兼容性问题,建议统一使用OpenSSL 1.1.1:
bash复制# 卸载可能存在的旧版本
sudo yum remove openssl* -y
# 下载编译OpenSSL 1.1.1
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
make -j$(nproc)
sudo make install
MySQL 8.0编译依赖的完整清单(包含常被忽略的依赖):
bash复制# 基础构建工具
sudo yum install -y epel-release
sudo yum groupinstall -y "Development Tools"
# 必需依赖
sudo yum install -y \
cmake3 \
bison \
ncurses-devel \
libtirpc-devel \
rpcgen \
libaio-devel \
libarchive-devel \
zlib-devel \
lz4-devel \
lz4-static \
libcurl-devel \
patchelf
# 为CentOS 7特别处理
if [ -f /etc/redhat-release ] && grep -q "CentOS Linux 7" /etc/redhat-release; then
sudo yum install -y devtoolset-11
source /opt/rh/devtoolset-11/enable
fi
推荐从MySQL官方仓库获取特定版本(避免GitHub主分支的不稳定代码):
bash复制# 下载官方源码包(以8.0.34为例)
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34.tar.gz
# 验证完整性
wget https://dev.mysql.com/downloads/gpg/?file=mysql-8.0.34.tar.gz&p=26
gpg --verify mysql-8.0.34.tar.gz.asc mysql-8.0.34.tar.gz
# 解压并创建构建目录
tar -zxvf mysql-8.0.34.tar.gz
cd mysql-8.0.34
mkdir build
cd build
生产环境推荐配置(根据32核/128G内存服务器优化):
bash复制cmake3 .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_ARCHIVE_STORAGE_ENGINE=ON \
-DWITH_BLACKHOLE_STORAGE_ENGINE=ON \
-DWITH_FEDERATED_STORAGE_ENGINE=OFF \
-DWITH_ROCKSDB_STORAGE_ENGINE=ON \
-DROCKSDB_DISABLE_AVX2=OFF \
-DWITH_ZLIB=system \
-DWITH_LIBEVENT=system \
-DWITH_LZ4=system \
-DWITH_SSL=/usr/local/openssl \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_BOOST=../boost \
-DFORCE_INSOURCE_BUILD=1 \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_CXX_FLAGS="-march=native -mtune=native" \
-DCMAKE_C_FLAGS="-march=native -mtune=native"
关键参数说明:
-march=native:启用当前CPU支持的所有指令集(需测试兼容性)RelWithDebInfo:生产环境最佳构建类型(带调试符号但优化-O2)WITH_ROCKSDB:启用Facebook优化的RocksDB引擎(适合KV场景)根据服务器核心数动态调整编译线程(避免OOM):
bash复制# 计算安全线程数(核心数*1.5,不超过内存限制)
MAX_JOBS=$(($(nproc)*3/2))
MEM_AVAIL=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
if [ $MEM_AVAIL -lt 8000000 ]; then # 8GB以下
MAX_JOBS=$(($(nproc)/2))
fi
# 开始编译
make -j$MAX_JOBS | tee /tmp/mysql_compile.log
# 安装到目标目录
sudo make install
安全隔离最佳实践:
bash复制# 创建mysql用户组和用户
sudo groupadd -g 1001 mysql
sudo useradd -u 1001 -g mysql -s /bin/false -M mysql
# 创建数据目录并设置权限
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql
# 配置文件目录处理
sudo mkdir /etc/mysql
sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/mysql/my.cnf
在/etc/sysctl.conf中添加:
ini复制# InnoDB优化
vm.swappiness = 1
vm.dirty_ratio = 60
vm.dirty_background_ratio = 5
# 网络栈优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 32768
# 文件系统优化
fs.file-max = 65535
fs.aio-max-nr = 1048576
立即生效:sudo sysctl -p
Systemd服务文件配置(/usr/lib/systemd/system/mysqld.service):
ini复制[Unit]
Description=MySQL Server
After=network.target
[Service]
User=mysql
Group=mysql
Type=notify
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/mysql/my.cnf
LimitNOFILE=65535
TimeoutSec=infinity
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable mysqld
使用增强安全模式的初始化:
bash复制# 初始化数据目录
sudo /usr/local/mysql/bin/mysqld --initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/data/mysql \
--defaults-file=/etc/mysql/my.cnf
# 获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log
运行MySQL自带的加固脚本:
bash复制sudo /usr/local/mysql/bin/mysql_secure_installation
手动执行的额外安全措施:
sql复制-- 创建监控专用只读账户
CREATE USER 'monitor'@'%' IDENTIFIED BY 'ComplexP@ssw0rd';
GRANT SELECT, PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
-- 启用密码复杂度插件
INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.policy = STRONG;
-- 限制最大连接数(根据内存调整)
SET GLOBAL max_connections = 500;
使用sysbench验证编译效果(对比官方二进制包):
bash复制# 准备测试数据
sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password='YourPassword' \
--mysql-db=sbtest \
--tables=10 \
--table-size=1000000 \
prepare
# 运行测试
sysbench oltp_read_write \
--threads=32 \
--time=300 \
--report-interval=10 \
--db-driver=mysql \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password='YourPassword' \
--mysql-db=sbtest \
run
典型优化效果对比(32核/128G环境):
| 指标 | 官方二进制包 | 源码优化编译 |
|---|---|---|
| QPS | 12,358 | 15,742 (+27%) |
| 平均延迟 | 25.6ms | 20.3ms |
| 峰值内存 | 48GB | 42GB |
必备的监控项及其健康阈值:
sql复制-- InnoDB缓冲池命中率(应>99%)
SELECT (1 - (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests')) * 100
AS hit_ratio;
-- 线程缓存命中率(应>90%)
SELECT (1 - (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Threads_created') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Connections')) * 100
AS thread_cache_hit;
CMake错误:Could NOT find OpenSSL
解决方案:
bash复制export OPENSSL_ROOT_DIR=/usr/local/openssl
rm CMakeCache.txt
cmake3 .. -DWITH_SSL=/usr/local/openssl
make过程内存不足
降低并行度并启用交换空间:
bash复制sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
make -j$(($(nproc)/2))
运行时GLIBC版本不兼容
解决方案(保持二进制兼容性):
bash复制patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 \
--set-rpath /usr/local/mysql/lib:/usr/local/openssl/lib \
/usr/local/mysql/bin/mysqld
通过MySQL Shell实现无缝升级:
javascript复制// 使用MySQL Shell的升级检查工具
util.checkForServerUpgrade('root@localhost:3306', {
targetVersion: "8.0.34",
outputFormat: "JSON"
})
// 执行升级
util.upgradeServer('root@localhost:3306', {
password: 'YourPassword',
targetVersion: "8.0.34"
})
使用alternatives系统管理多版本:
bash复制sudo alternatives --install /usr/bin/mysql mysql /usr/local/mysql-8.0.32/bin/mysql 100 \
--slave /usr/bin/mysqldump mysqldump /usr/local/mysql-8.0.32/bin/mysqldump \
--slave /usr/bin/mysqladmin mysqladmin /usr/local/mysql-8.0.32/bin/mysqladmin
# 切换版本
sudo alternatives --config mysql