1. 项目概述:银河麒麟系统与MySQL的适配挑战
在国产化替代的大背景下,银河麒麟操作系统(Kylin OS)作为国产自主操作系统的代表,其稳定性和安全性已得到广泛验证。而MySQL作为最流行的开源关系型数据库之一,在各类业务系统中扮演着核心角色。本文将聚焦于在银河麒麟KY10(aarch64架构)上部署MySQL 5.7.26这一特定场景,分享从环境准备到服务调优的全流程实战经验。
选择MySQL 5.7.26版本而非更新的8.0系列,主要基于以下考量:首先,5.7系列经过长期验证,稳定性更高;其次,许多传统业务系统对该版本有明确的兼容性要求;最重要的是,在ARM架构下,5.7.26的编译适配相对成熟,社区资源更为丰富。而aarch64作为ARM架构的64位实现,在国产CPU(如飞腾、鲲鹏)上表现优异,但软件生态仍存在一些适配挑战。
2. 环境准备与依赖检查
2.1 系统基础环境确认
在开始安装前,必须确保系统环境符合MySQL的编译要求。执行以下命令检查系统版本和架构:
bash复制cat /etc/kylin-release
uname -m
预期输出应包含"Kylin Linux Advanced Server release V10 (Tercel)"和"aarch64"。若系统版本不符,建议通过官方渠道获取正确镜像。
注意:银河麒麟不同SP版本间的库文件可能存在差异,混合使用可能导致依赖冲突。建议使用纯净系统环境。
2.2 依赖库的安装与配置
MySQL编译需要以下基础开发工具和库文件:
bash复制sudo yum groupinstall "Development Tools" -y
sudo yum install cmake ncurses-devel openssl-devel bison libaio -y
特别需要注意,aarch64架构下某些库的命名与x86不同。若遇到包不存在的情况,可尝试:
bash复制sudo yum provides */libssl.so.10 # 查找提供特定库的包
2.3 用户与目录规划
为MySQL创建专用用户和目录:
bash复制sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo mkdir -p /usr/local/mysql
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql
这种隔离式目录结构设计有两个优势:一是将程序文件与数据文件分离,便于维护;二是遵循最小权限原则,增强安全性。
3. MySQL源码编译与安装
3.1 源码获取与校验
从MySQL官方下载源码包:
bash复制wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26.tar.gz
echo "a5d6d9a5a8bcd5a5a8bcd5a5a8bcd5a5a8bcd5a5a" > mysql-5.7.26.tar.gz.sha256
sha256sum -c mysql-5.7.26.tar.gz.sha256
若校验失败,可能是下载中断或源文件被篡改,应重新获取。国内用户可以考虑使用镜像源加速下载。
3.2 编译参数配置
解压源码后,创建编译目录并配置:
bash复制tar zxvf mysql-5.7.26.tar.gz
cd mysql-5.7.26
mkdir build
cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DWITH_BOOST=../boost \
-DWITH_SYSTEMD=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci
关键参数说明:
WITH_SYSTEMD=1:支持systemd管理,这在银河麒麟系统中尤为重要WITH_SSL=system:使用系统自带的SSL库,避免兼容性问题utf8mb4字符集:完整支持4字节UTF-8编码(如emoji表情)
3.3 编译与安装
执行编译安装:
bash复制make -j$(nproc) # 使用所有CPU核心加速编译
sudo make install
aarch64架构下的编译时间通常比x86长30%-50%,在4核8G内存的机器上约需1.5-2小时。若内存不足,可减少并行编译任务数:
bash复制make -j2 # 限制为2个并行任务
编译过程中最常见的错误是内存溢出,表现为gcc被杀死。此时应关闭其他内存消耗程序,或增加swap空间:
bash复制sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo mkswap /swapfile
sudo swapon /swapfile
4. 数据库初始化与配置
4.1 初始化数据目录
切换到安装目录执行初始化:
bash复制cd /usr/local/mysql
sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
成功初始化后,终端会显示临时root密码,格式类似:
code复制[Note] A temporary password is generated for root@localhost: Abc123!#
务必记录此密码,首次登录时必须使用。若丢失,需手动删除数据目录重新初始化。
4.2 配置文件优化
创建/etc/my.cnf配置文件,以下配置针对aarch64架构特别优化:
ini复制[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
port=3306
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 内存配置(根据实际内存调整)
innodb_buffer_pool_size=2G # 建议为物理内存的50-70%
key_buffer_size=256M
query_cache_size=0 # 5.7.20+版本已弃用
# ARM架构特有优化
innodb_flush_neighbors=0 # 禁用邻页刷新,提升SSD性能
innodb_io_capacity=2000
innodb_io_capacity_max=4000
[client]
socket=/tmp/mysql.sock
default-character-set=utf8mb4
4.3 服务启动与自启配置
创建systemd服务单元文件:
bash复制sudo tee /etc/systemd/system/mysqld.service <<EOF
[Unit]
Description=MySQL Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65535
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable mysqld
sudo systemctl start mysqld
验证服务状态:
bash复制systemctl status mysqld
netstat -tlnp | grep mysql
5. 安全加固与常见问题排查
5.1 初始安全设置
使用临时密码登录并修改root密码:
bash复制/usr/local/mysql/bin/mysql -uroot -p
执行安全脚本:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost');
DROP DATABASE IF EXISTS test;
FLUSH PRIVILEGES;
5.2 常见问题解决方案
问题1:启动时报错 "libssl.so.10: cannot open shared object file"
解决方案:
bash复制sudo ln -s /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.10
sudo ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.10
问题2:连接数不足导致 "Too many connections"
调整最大连接数:
sql复制SET GLOBAL max_connections=500; -- 临时生效
永久生效需在my.cnf中添加:
ini复制max_connections=500
问题3:ARM架构下性能异常
检查CPU调度策略:
bash复制cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
建议设置为performance模式:
bash复制echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
6. 性能调优与监控
6.1 关键参数调优
在my.cnf的[mysqld]段添加以下优化参数:
ini复制# InnoDB优化
innodb_log_file_size=512M # 日志文件大小
innodb_log_buffer_size=32M
innodb_flush_log_at_trx_commit=1 # 数据安全优先
innodb_read_io_threads=8
innodb_write_io_threads=8
# 查询优化
table_open_cache=2000
thread_cache_size=100
6.2 监控方案部署
安装sysstat工具:
bash复制sudo yum install sysstat -y
sudo systemctl enable --now sysstat
创建MySQL监控脚本:
bash复制cat <<'EOF' > /usr/local/bin/mysql_monitor.sh
#!/bin/bash
echo "=== $(date) ==="
echo "QPS: $(mysql -uroot -p'密码' -e "SHOW GLOBAL STATUS LIKE 'Questions'" | awk 'NR==2{print $2}')"
echo "连接数: $(mysql -uroot -p'密码' -e "SHOW STATUS LIKE 'Threads_connected'" | awk 'NR==2{print $2}')"
echo "InnoDB缓冲池命中率: $(mysql -uroot -p'密码' -e "SHOW STATUS LIKE 'Innodb_buffer_pool_read%'" | awk 'NR==2{print $2/($2+$4)*100}')%"
EOF
chmod +x /usr/local/bin/mysql_monitor.sh
添加到crontab:
bash复制(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/mysql_monitor.sh >> /var/log/mysql_monitor.log") | crontab -
7. 备份与恢复策略
7.1 物理备份方案
使用Percona XtraBackup进行热备份:
bash复制wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.20/binary/tarball/percona-xtrabackup-2.4.20-Linux-x86_64.libgcrypt145.tar.gz
tar zxvf percona-xtrabackup-*.tar.gz
cd percona-xtrabackup-*/bin
sudo ./xtrabackup --backup --target-dir=/backups/mysql/$(date +%Y%m%d) --user=root --password=YourPassword
7.2 逻辑备份方案
使用mysqldump进行逻辑备份:
bash复制/usr/local/mysql/bin/mysqldump -uroot -p --single-transaction --master-data=2 --routines --triggers --all-databases > /backups/mysql/full_$(date +%Y%m%d).sql
建议的备份策略组合:
- 每日全量逻辑备份(保留7天)
- 每小时增量物理备份(保留48小时)
- 每周将备份归档到异地存储
8. 高可用方案展望
虽然单机部署能满足基本需求,但对于生产环境,建议考虑以下高可用方案:
-
主从复制:配置简单,适合读多写少的场景
sql复制-- 在主库执行 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'SlavePass123!'; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; -- 记录File和Position -- 在从库执行 CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl', MASTER_PASSWORD='SlavePass123!', MASTER_LOG_FILE='记录的File', MASTER_LOG_POS=记录的Position; START SLAVE; -
Galera Cluster:多主同步复制,保证数据强一致性
-
MHA自动故障转移:主库故障时自动提升从库
在ARM架构下部署这些方案时,需要特别注意网络延迟和CPU指令集兼容性问题。建议先在测试环境验证,再逐步迁移生产流量。
