1. MySQL 源码编译部署实战指南
作为一名长期奋战在数据库运维一线的工程师,我深知源码编译部署MySQL的重要性。相比直接使用二进制包,源码编译能让我们获得更高的定制化程度和性能优化空间。今天我将分享从零开始编译部署MySQL 8.3.0的完整过程,以及如何搭建高可用的主从复制集群。
1.1 环境准备与依赖安装
在开始编译之前,我们需要确保系统具备所有必要的编译工具和依赖库。以下是我在RHEL/CentOS 9系统上的准备步骤:
bash复制dnf install cmake3 gcc git bison openssl-devel ncurses-devel \
systemd-devel rpcgen libtirpc-devel \
gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ \
gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck \
gcc-toolset-12-annobin-plugin-gcc -y
这些依赖包各自承担着重要角色:
- cmake3:MySQL 8.0+使用CMake作为构建系统
- gcc/g++:C/C++编译器
- bison:语法分析器生成器,用于SQL解析
- openssl-devel:SSL加密支持
- ncurses-devel:终端处理库
- gcc-toolset-12系列:提供稳定的编译工具链
注意:在生产环境中,建议使用专门的编译用户而非root进行操作,避免权限问题。我这里为了演示方便直接使用root。
1.2 源码获取与解压
从MySQL官网下载带Boost库的源码包:
bash复制wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz
tar zxf mysql-boost-8.3.0.tar.gz
cd mysql-8.3.0
MySQL 8.0+需要Boost C++库支持,使用-DWITH_BOOST=bundled参数可以让编译过程自动下载和管理Boost库,简化部署流程。
1.3 编译配置与参数解析
创建构建目录并运行cmake配置:
bash复制mkdir build && cd build
cmake3 .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_BOOST=bundled \
-DWITH_SSL=system \
-DWITH_DEBUG=OFF
关键参数说明:
- CMAKE_INSTALL_PREFIX:指定MySQL安装目录
- MYSQL_DATADIR:数据文件存储位置,建议放在独立分区
- WITH_INNOBASE_STORAGE_ENGINE:启用InnoDB引擎
- utf8mb4字符集:完整支持4字节UTF-8编码(如emoji)
- WITH_SSL=system:使用系统OpenSSL库
1.4 编译与安装
配置完成后,开始编译过程:
bash复制make -j $(nproc) # 使用所有CPU核心并行编译
make install
编译时间取决于服务器性能,一般需要30分钟到2小时。完成后,MySQL将被安装到/usr/local/mysql目录。
1.5 系统环境配置
设置MySQL环境变量:
bash复制echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bash_profile
source ~/.bash_profile
创建专用用户和数据目录:
bash复制useradd -r -s /sbin/nologin -M mysql
mkdir -p /data/mysql
chown mysql:mysql /data/mysql/
1.6 初始化MySQL实例
执行初始化命令生成系统表:
bash复制mysqld --initialize --user=mysql
初始化过程会:
- 创建mysql系统数据库
- 生成root用户的临时密码(注意保存)
- 建立performance_schema和sys数据库
重要:初始化输出的临时密码必须妥善保存,首次登录时需要用到。如果丢失,需要删除数据目录重新初始化。
1.7 启动MySQL服务
使用提供的启动脚本:
bash复制cp support-files/mysql.server /etc/init.d/mysqld
/etc/init.d/mysqld start
chkconfig --level 35 mysqld on # 设置开机自启
1.8 安全加固
运行安全初始化脚本:
bash复制mysql_secure_installation
这个交互式脚本会引导你完成:
- 修改root密码
- 移除匿名用户
- 禁止root远程登录
- 删除test数据库
- 重载权限表
2. MySQL主从复制集群搭建
2.1 主从复制原理
MySQL主从复制基于二进制日志(binlog)实现,工作流程:
- 主库记录所有数据变更到binlog
- 从库IO线程从主库拉取binlog
- 从库SQL线程重放binlog中的事件
这种异步复制架构能提供:
- 读写分离能力
- 数据备份冗余
- 故障转移基础
2.2 主库配置
编辑/etc/my.cnf添加:
ini复制[mysqld]
server-id=10 # 唯一ID
log-bin=mysql-bin # 启用二进制日志
binlog-format=ROW # 推荐使用ROW格式
重启MySQL使配置生效:
bash复制/etc/init.d/mysqld restart
2.3 创建复制账号
在主库上创建专用于复制的账号:
sql复制CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
注意:MySQL 8.0默认使用caching_sha2_password认证插件,如果从库是旧版本MySQL,需要指定mysql_native_password。
2.4 从库初始配置
同样修改/etc/my.cnf:
ini复制[mysqld]
server-id=20 # 不同于主库
log-bin=mysql-bin # 也开启binlog(可选)
relay-log=mysql-relay-bin
read_only=1 # 设置为只读
2.5 建立主从关系
在从库上执行:
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
查看复制状态:
sql复制SHOW SLAVE STATUS\G
关键指标:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0
2.6 添加新从库
对于已有数据的场景,需要先同步数据:
- 在主库上锁表并获取binlog位置:
sql复制FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS; -- 记录File和Position
- 导出数据:
bash复制mysqldump -uroot -p --all-databases > full_backup.sql
- 解锁主库:
sql复制UNLOCK TABLES;
- 在新从库上导入数据并配置复制:
bash复制mysql -uroot -p < full_backup.sql
sql复制CHANGE MASTER TO ... -- 使用之前记录的binlog位置
START SLAVE;
3. 常见问题与解决方案
3.1 编译相关问题
问题1:CMake报错找不到OpenSSL
解决方案:
bash复制dnf install openssl-devel
问题2:编译过程中内存不足
解决方案:
- 增加swap空间
- 减少并行编译线程:
make -j 2
3.2 主从复制问题
问题1:Slave_SQL_Running: No,错误日志显示主键冲突
解决方案:
sql复制STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;
问题2:复制延迟严重
优化建议:
- 检查从库服务器负载
- 考虑使用半同步复制
- 优化主库binlog写入策略
3.3 性能调优建议
- InnoDB缓冲池大小:
ini复制innodb_buffer_pool_size = 系统内存的50-70%
- 连接数设置:
ini复制max_connections = 根据应用需求调整
thread_cache_size = 8
- 日志配置:
ini复制sync_binlog=1 # 每次事务提交都同步binlog
innodb_flush_log_at_trx_commit=1 # 完全符合ACID
4. 生产环境建议
- 监控:部署Prometheus + Grafana监控MySQL各项指标
- 备份:定期测试备份恢复流程,建议使用Percona XtraBackup
- 高可用:考虑使用MGR(MySQL Group Replication)或Orchestrator
- 安全:
- 定期轮换密码
- 限制数据库访问IP
- 启用审计日志
通过源码编译部署MySQL虽然步骤较多,但能让我们更深入理解MySQL的架构,并能根据实际业务需求进行深度定制。主从复制作为MySQL高可用的基础,掌握其配置和问题排查技巧是DBA的必备技能。