公司动态
MySQL 8.0 源码编译安装与主从复制配置实战指南
目录1. 环境准备与依赖安装1.1 下载 MySQL 源码1.2 升级编译工具链1.3 安装编译依赖2. 编译安装 MySQL 8.02.1 解压源码并配置2.2 CMake 配置参数详解2.3 编译与安装3. 初始化与配置3.1 关键目录与参数说明3.2 创建配置文件3.3 初始化数据库3.4 配置系统服务3.5 配置环境变量4. 配置 phpMyAdmin 访问4.1 修改 Nginx 配置4.2 配置 phpMyAdmin 连接4.3 重启 PHP-FPM5. MySQL 主从复制配置5.1 准备从库服务器5.2 配置主库Master5.3 配置从库Slave5.4 测试数据同步5.5 级联复制配置可选6. 主从复制原理简析6.1 复制流程6.2 核心组件说明7. 常见问题排查7.1 连接问题7.2 复制问题1. 环境准备与依赖安装1.1 下载 MySQL 源码从 MySQL 官方网站下载包含 Boost 库的源码包MySQL 8.0.36# 下载地址https://downloads.mysql.com/archives/community/# 选择包含 boost 的版本如 mysql-boost-8.0.36.tar.gz1.2 升级编译工具链MySQL 8.0 编译需要较新版本的 CMake 和 GCCCentOS 7 默认版本较低需要手动升级。升级 CMake# 1. 卸载旧版本yum remove-ycmake3rm-f/usr/bin/cmake# 删除旧软链接# 2. 下载新版本以 3.28.4 为例# 下载地址https://github.com/Kitware/CMake/releases/tarzxf cmake-3.28.4-linux-x86_64.tar.gz-C/usr/local/# 3. 配置环境变量vim~/.bash_profile# 添加export PATH/usr/local/cmake-3.28.4-linux-x86_64/bin:$PATHsource~/.bash_profile升级 GCC# 1. 启用 SCL 仓库并替换为阿里云源yuminstall-ycentos-release-sclcd/etc/yum.repos.d/# 修改 CentOS-SCLo-scl-rh.repo 和 CentOS-SCLo-scl.repo将 baseurl 替换为阿里云镜像vimCentOS-SCLo-scl-rh.repovimCentOS-SCLo-scl.repo# 2. 安装 devtoolset-9GCC 9yuminstall-ydevtoolset-9-gcc devtoolset-9-gcc-c# 3. 启用新版本 GCCsclenabledevtoolset-9bashwhichgcc gcc-v# 确认版本为 9.xg-v1.3 安装编译依赖yuminstall-ylibaio-devel patchelf2. 编译安装 MySQL 8.02.1 解压源码并配置tarzxf mysql-boost-8.0.36.tar.gzcdmysql-8.0.36/mkdirbuildcdbuild2.2 CMake 配置参数详解cmake..\-DCMAKE_C_COMPILER$(whichgcc)\-DCMAKE_CXX_COMPILER$(whichg)\-DCMAKE_INSTALL_PREFIX/usr/local/mysql\# 安装目录-DMYSQL_DATADIR/data/mysql\# 数据目录-DSYSCONFDIR/etc/mysql\# 配置文件目录-DMYSQL_UNIX_ADDR/data/mysql/mysql.sock\# Socket 文件路径-DMYSQL_TCP_PORT3306\# 监听端口-DWITH_INNOBASE_STORAGE_ENGINE1\# 启用 InnoDB-DWITH_MYISAM_STORAGE_ENGINE1\# 启用 MyISAM-DWITH_PARTITION_STORAGE_ENGINE1\# 启用分区表-DENABLED_LOCAL_INFILE1\# 允许 LOAD DATA LOCAL-DCMAKE_CXX_FLAGS-O2\# C 优化级别-DCMAKE_C_FLAGS-O2\# C 优化级别-DWITH_BOOST../boost/boost_1_77_0\# Boost 库路径-DWITH_SYSTEMD1\# 支持 systemd-DWITH_SSL/usr/local/openssl\# OpenSSL 路径-DWITH_ZLIBbundled\# 使用内置 zlib-DWITH_LIBAIO1\# 启用异步 I/O-DDEFAULT_CHARSETutf8mb4\# 默认字符集-DDEFAULT_COLLATIONutf8mb4_unicode_ci\# 默认排序规则-DMYSQL_MAINTAINER_MODE0\# 关闭维护模式-DWITH_DEBUG0\# 关闭调试模式-DINSTALL_TESTS0\# 不安装测试套件-DINSTALL_DOCS0# 不安装文档注意如果系统默认 GCC 版本为 11而编译使用的是 GCC 9必须通过$(which gcc)明确指定编译器路径。2.3 编译与安装make-j$(nproc)# 使用所有 CPU 核心并行编译makeinstall# 安装到 /usr/local/mysql3. 初始化与配置3.1 关键目录与参数说明参数值含义basedir/usr/local/mysqlMySQL 安装目录包含所有二进制文件、库文件datadir/data/mysql数据目录存放数据库文件、日志、表空间等socket/data/mysql/mysql.sockUnix 套接字文件本地连接使用port3306MySQL 监听端口usermysql运行 MySQL 的操作系统用户需改为实际用户pid-file/data/mysql/mysql.pid记录 MySQL 主进程 PIDcharacter-set-serverutf8mb4服务器默认字符集支持 emojicollation-serverutf8mb4_unicode_ci默认排序规则大小写不敏感log-error/data/mysql/mysql-error.log错误日志路径innodb_buffer_pool_size1GInnoDB 缓冲池大小建议设为物理内存的 60-80%max_connections1000最大并发连接数3.2 创建配置文件useradd-M-d/usr/local/mysql/-s/sbin/nologin mysql2mkdir-p/data/mysqlmkdir/etc/mysqlchownmysql2.mysql2 /data/mysql/创建/etc/mysql/my.cnf[mysqld] basedir/usr/local/mysql datadir/data/mysql socket/data/mysql/mysql.sock port3306 usermysql2 # 根据实际创建的用户修改 pid-file/data/mysql/mysql.pid character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci log-error/data/mysql/mysql-error.log innodb_buffer_pool_size1G max_connections1000 [client] socket/data/mysql/mysql.sock3.3 初始化数据库# 1. 创建数据目录并设置权限mkdir-p/data/mysqlchown-Rmysql2:mysql2 /data/mysql# 替换为实际用户# 2. 初始化系统数据库生成临时 root 密码/usr/local/mysql/bin/mysqld --defaults-file/etc/mysql/my.cnf--initialize# 3. 查看临时密码greptemporary password/data/mysql/mysql-error.log3.4 配置系统服务# 1. 复制 service 文件cdmysql-8.0.36/build/scripts/cpmysqld.service /usr/lib/systemd/system/# 2. 修改 service 文件中的用户如使用 mysql2vim/usr/lib/systemd/system/mysqld.service# 将 Usermysql 改为 Usermysql2# 将 Groupmysql 改为 Groupmysql2# 3. 重载 systemd 并启动服务systemctl daemon-reload systemctlenable--nowmysqld4. 安全初始化设置 root 密码等mysql_secure_installation3.5 配置环境变量vim~/.bash_profile# 添加export PATH/usr/local/mysql/bin:$PATHsource~/.bash_profile4. 配置 phpMyAdmin 访问4.1 修改 Nginx 配置# /usr/local/nginx/conf/nginx.conf location / { root html; index index.php index.html index.htm; } nginx -s reload测试访问输入mysql数据库用户名密码无法访问4.2 配置 phpMyAdmin 连接cd/usr/local/nginx/html/phpmyadmincpconfig.sample.inc.php config.inc.phpvimconfig.inc.php修改$cfg[Servers][$i][host]为127.0.0.1localhost 在特定环境下可能无法连接。vim config.inc.php 改为localhost无法登录4.3 重启 PHP-FPMvim/usr/local/php/etc/php.ini# 按需调整 PHP 配置systemctl reload php-fpm访问http://服务器IP/phpmyadmin/测试连接。5. MySQL 主从复制配置5.1 准备从库服务器主库操作server5# 1. 复制 MySQL 安装目录到从库cd/usr/local/scp-rpmysql/ server8:/usr/local/# 2. 查看主库 mysql 用户信息cat/etc/passwd|grepmysql# 输出示例mysql2:x:1001:1001::/usr/local/mysql/:/sbin/nologin从库操作server8# 1. 创建与主库相同的用户和目录useradd-u1001-M-d/usr/local/mysql/-s/sbin/nologin mysql2mkdir-p/data/mysql /etc/mysqlchown-Rmysql2:mysql2 /data/mysql/# 2. 复制配置文件和 service 文件# 在主库执行cd/etc/mysql/scpmy.cnf server8:/etc/mysql/cd/usr/lib/systemd/systemscpmysqld.service server8:/usr/lib/systemd/system/# 3. 从库初始化同主库步骤vim.bash_profile#将mysql加入环境变量/usr/local/mysql/binsource.bash_profile /usr/local/mysql/bin/mysqld --defaults-file/etc/mysql/my.cnf--initializegreptemporary password/data/mysql/mysql-error.log systemctl start mysqld mysql_secure_installation5.2 配置主库Mastervim/etc/mysql/my.cnf添加配置[mysqld] server-id1 # 必须唯一 log-binmysql-bin # 开启二进制日志 binlog-formatROW # 行格式复制 binlog-do-dbtest # 可选只复制指定数据库重启服务并创建复制用户-- 在主库执行systemctl restart mysqld mysql-pCREATEUSERrepl%IDENTIFIEDBYwestos;GRANTREPLICATIONSLAVEON*.*TOrepl%;FLUSHPRIVILEGES;-- 查看主库状态记录 File 和 PositionSHOWMASTERSTATUS;-------------------------------------------------------------------------------|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|-------------------------------------------------------------------------------|binlog.000002|691||||-------------------------------------------------------------------------------5.3 配置从库Slavevim/etc/mysql/my.cnf添加配置[mysqld] server-id2 # 必须与主库不同重启服务并配置复制-- 在从库执行systemctl restart mysqld mysql-p CHANGE MASTERTOMASTER_HOST192.168.150.139,-- 主库 IPMASTER_USERrepl,MASTER_PASSWORDwestos,MASTER_LOG_FILEbinlog.000002,-- 主库的 FileMASTER_LOG_POS691;-- 主库的 PositionSTARTSLAVE;SHOWSLAVESTATUS\G;关键状态检查Slave_IO_Running: Yes# I/O 线程正常运行Slave_SQL_Running: Yes# SQL 线程正常运行Seconds_Behind_Master: 0# 复制延迟为 05.4 测试数据同步在主库插入数据USEtest;INSERTINTOusers(username,password)VALUES(user1,123456);在从库验证USEtest;SELECT*FROMusers;-- 应能看到同步的数据注意从库上修改的数据不会同步到主库这是单向复制。插入第二行insert into westos.user_tb values (user2,123456);测试show master status5.5 级联复制配置可选如果需要配置 server8 作为 server6 的主库在server6上将mysql复制过来mysqldump-uroot-p123456testdump.dbscpdump.db server6: 在server6上 mysql-p123456mysqlcreate databasetest;mysql-uroot-p123456testdump.db查看数据是否同步vim /etc/mysql/my.cnf写入idsystemctl restart mysqld.service在server8上use test然后创建跟别的主机一样的用户repl并且加权限在 server8现作为二级主库SHOWMASTERSTATUS;-- 记录 File 和 Position在 server6新的从库CHANGE MASTERTOMASTER_HOST192.168.150.141,-- server8 IPMASTER_USERrepl,MASTER_PASSWORDwestos,MASTER_LOG_FILEbinlog.000002,-- server8 的 FileMASTER_LOG_POS2380;-- server8 的 PositionSTARTSLAVE;如果开启安全链接要在最后加入GETMASTAR_PUBLIC_KEY1//在不使用安全连接并且用户帐户已使用caching_sha2_password插件进行身份验证MySQL 8.0的默认设置则必须指定MASTER_PUBLIC_KEY_PATH或GET_MASTER_PUBLIC_KEY选项在该CHANGE MASTER TO语句中启用基于RSA密钥对的密码交换。mysqlstart slave;Query OK,0rows affected(0.00sec)mysqlshow slave status\G;测试在server5mysql上执行use testINSERT INTOusers(username,password) VALUES (user3, 123456);在别的主机也执行mysql use testmysql select * from users;发现数据同步6. 主从复制原理简析6.1 复制流程1. 写入 binlog2. I/O 线程拉取3. 写入 relay log4. SQL 线程重放主库 Master二进制日志从库 Slave中继日志从库数据6.2 核心组件说明主库 binlog记录所有数据变更操作INSERT/UPDATE/DELETEbinlog 坐标由MASTER_LOG_FILE文件名和MASTER_LOG_POS位置组成从库 I/O 线程连接主库拉取 binlog 事件到本地 relay log从库 SQL 线程读取 relay log 并在从库执行相同操作7. 常见问题排查7.1 连接问题phpMyAdmin 无法连接将host改为127.0.0.1而非localhostSocket 连接失败检查/data/mysql/mysql.sock文件权限和路径7.2 复制问题Slave_IO_Running: Connecting检查网络、防火墙、主库权限Slave_SQL_Running: No查看错误日志常见于数据不一致主从数据不同步检查SHOW SLAVE STATUS\G中的Last_Error