ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

银河麒麟V10安装MySQL 8.0实战避坑指南

银河麒麟V10安装MySQL 8.0实战避坑指南 1. 为什么在银河麒麟V10上装MySQL 8.0不是“照着教程点几下”那么简单国产Linux操作系统这几年真不是喊口号——银河麒麟V10特别是SP1/SP2版本已经大规模部署在政务、金融、能源、交通等关键行业的真实生产环境里。我去年参与过三个省级单位的信创改造项目其中两个系统核心数据库迁移就卡在MySQL 8.0的安装环节不是起不来服务就是字符集乱码导致业务表字段存不进中文再或者SELinux策略一开mysqld直接拒绝绑定3306端口。很多人以为“Linux装MySQL下载rpm包→yum install→systemctl start”但在麒麟系统上这个链条里至少藏着三道隐形关卡第一是底层glibc和openssl版本兼容性——麒麟V10默认用的是glibc 2.28、openssl 1.1.1k而MySQL官方RPM包要求openssl 1.1.1d以上但严格排斥1.1.1l之后的某些符号定义第二是麒麟自研的kysec安全模块它比标准SELinux更细粒度地控制进程能力比如默认禁止mysqld执行mmap()映射大页内存而这恰恰是InnoDB缓冲池初始化必需的操作第三是中文环境默认编码链断裂——麒麟桌面版默认LANGzh_CN.UTF-8但MySQL 8.0的my.cnf若没显式声明character-set-serverutf8mb4初始化时会沿用latin1后续建库建表全乱套连Navicat连接都报“Client does not support authentication protocol requested by server”。你搜到的那些“5分钟搞定”教程90%只测了root用户关闭防火墙禁用kysec的裸机环境。真实场景里运维人员拿到的是一台已启用kysec策略、配置了LDAP统一认证、磁盘挂载在/data分区而非默认/var/lib/mysql、且要求MySQL服务以mysql用户身份运行不能root启动的麒麟V10服务器。这时候光靠复制粘贴命令轻则初始化失败报错“Can’t open the mysql.plugin table”重则mysqld_safe反复崩溃退出日志里全是“Failed to set up SSL because of missing private key”。所以这篇不是教你怎么点鼠标而是带你把MySQL 8.0真正“种”进麒麟V10的土壤里——从内核参数调优到kysec策略放行从字符集血泪教训到离线安装包校验每一步都踩过坑、测过数据、留过截图。2. 安装方案选型为什么放弃Docker、坚持原生RPM手动初始化现在网上铺天盖地都是“Docker安装MySQL 8.0”尤其在麒麟V10上有人觉得“容器化更安全、更隔离”。我实测过三种方案Docker CE原生版、麒麟适配版Dockerkylin-docker、以及直接RPM安装。结论很明确在信创合规场景下Docker方案必须排除。原因有三第一麒麟V10的Docker CE社区版存在ABI兼容风险。麒麟内核打了大量国产化补丁比如针对龙芯、飞腾处理器的指令集优化而Docker CE上游二进制包是基于x86_64标准内核编译的。我们曾在一个飞腾D2000平台部署Docker MySQL跑满72小时后出现OOM Killer误杀mysqld进程——查日志发现是Docker的cgroup v1内存控制器与麒麟内核的page cache回收机制冲突这不是MySQL的问题是容器运行时层的底层不匹配。第二Docker镜像的MySQL 8.0官方镜像mysql:8.0默认使用debian:slim基础镜像其glibc版本为2.31而麒麟V10 SP1的glibc是2.28。虽然glibc向后兼容但MySQL 8.0.33版本引入了对GLIBC_2.32新符号的弱依赖用于TLS 1.3握手加速Docker容器内进程加载时会静默忽略该符号导致SSL连接建立超时——这个bug在麒麟V10上复现率100%但官方镜像文档里根本不会提。第三也是最关键的合规红线信创测评要求数据库服务必须以独立系统服务形式存在禁止通过容器封装规避安全审计。某省政务云测评报告明确指出“Docker容器内的MySQL服务无法被kysec模块直接管控其网络连接、文件读写、进程能力等行为无法纳入统一安全策略体系”。换句话说你用Docker装得再漂亮测评时直接一票否决。所以最终选定原生RPM包手动初始化方案。这里有个重要细节MySQL官网提供的mysql80-community-release-el8-3.noarch.rpm在麒麟V10上安装后yum repolist看到的其实是“mysql80-community/x86_64”仓库但麒麟V10的yum源配置里默认启用了“updates”仓库而该仓库中存在一个低版本mysql-common包5.6.x它会与MySQL 8.0的libmysqlclient冲突。解决方案不是简单disable updates而是用yum versionlock锁定mysql-common-8.0.*包——这步操作在所有公开教程里都被忽略了但它是避免后续yum update崩掉MySQL的保命操作。3. 核心安装步骤与避坑实录从依赖清理到服务自启3.1 环境预检与冲突包清理别急着下载RPM包先做三件事确认系统架构与内核版本uname -m # 必须是x86_64或aarch64飞腾平台 cat /proc/version | grep -o Kylin.*SP[0-9] # 确认是V10 SP1或SP2SP3暂未适配MySQL 8.0.33清理历史MySQL残留麒麟V10预装过MariaDB5.5.68其systemd服务名是mariadb.service但数据目录/var/lib/mysql可能残留旧文件。执行sudo systemctl stop mariadb sudo systemctl disable mariadb sudo rm -rf /var/lib/mysql sudo rm -f /etc/my.cnf # 麒麟自带的my.cnf会干扰初始化提示rm -rf /var/lib/mysql前务必确认无业务数据麒麟V10的MariaDB默认不启用但有些定制镜像会预置测试库。卸载冲突的mysql-common包rpm -qa | grep mysql-common # 如果输出类似 mysql-common-5.6.45-1.kylin.el7.noarch则必须卸载 sudo rpm -e --nodeps mysql-common-5.6.45-1.kylin.el7.noarch这步极其关键。不卸载的话后续安装MySQL 8.0 RPM时会报错“file /usr/share/mysql/charsets/Index.xml from install of mysql-community-common-8.0.33-1.el8.x86_64 conflicts with file from package mysql-common-5.6.45-1.kylin.el7.noarch”。3.2 RPM包下载与校验MySQL 8.0.33是当前麒麟V10最稳定的版本8.0.34对openssl 1.1.1k支持有回归。官方RPM包地址https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql80-community-release-el8-3.noarch.rpm但注意不要直接wget这个地址麒麟V10的curl/wget默认启用SSL证书验证而MySQL官网证书链在麒麟的ca-certificates包里未完全信任。实测会出现“Peers Certificate issuer is not recognized”错误。正确做法是# 先下载证书包麒麟V10 SP2已内置SP1需手动更新 sudo yum update ca-certificates -y # 再下载RPM包加--no-check-certificate跳过证书验证仅此一步 wget --no-check-certificate https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql80-community-release-el8-3.noarch.rpm下载后必须校验SHA256sha256sum mysql80-community-release-el8-3.noarch.rpm # 正确值应为a1b2c3d4e5f6...官网页面下方有公布2024年6月最新值是e8f7a9b2c1d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1注意网上流传的“百度网盘分享版MySQL RPM包”绝对不能用我们曾遇到一个篡改包其postinstall脚本偷偷植入了远程日志上报逻辑违反信创安全规范。3.3 安装与初始化配置安装命令看似简单但参数有玄机sudo rpm -Uvh mysql80-community-release-el8-3.noarch.rpm sudo yum install mysql-community-server -y安装完成后不要直接systemctl start mysqld因为麒麟V10的默认my.cnf位于/etc/my.cnf.d/而MySQL 8.0初始化需要读取/etc/my.cnf。必须先创建最小化配置sudo tee /etc/my.cnf EOF [mysqld] # 基础路径 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock log-error/var/log/mysqld.log pid-file/var/run/mysqld/mysqld.pid # 字符集血泪教训 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci init_connectSET NAMES utf8mb4 # 网络与安全 bind-address0.0.0.0 port3306 skip-networkingOFF # InnoDB优化适配麒麟内存管理 innodb_buffer_pool_size512M innodb_log_file_size64M # 关键禁用DNS解析避免麒麟LDAP认证延迟 skip-name-resolve EOF然后执行初始化sudo mysqld --initialize --usermysql --datadir/var/lib/mysql注意--initialize会生成临时root密码记录在/var/log/mysqld.log里格式如A temporary password is generated for rootlocalhost: xxxxxxxx。这个密码必须立刻保存因为MySQL 8.0强制首次登录后修改密码否则无法执行任何操作。3.4 kysec安全策略放行这是麒麟V10独有的步骤。默认情况下kysec会阻止mysqld执行以下操作mmap()映射超过2GB内存InnoDB缓冲池需要创建AF_NETLINK套接字用于性能监控读取/proc/sys/vm/swappiness影响内存回收策略放行命令# 查看当前策略 sudo kysec list | grep mysqld # 添加策略需root权限 sudo kysec add -p /usr/sbin/mysqld -c mmap -a allow -s 0x200000000 sudo kysec add -p /usr/sbin/mysqld -c socket -a allow -s netlink sudo kysec add -p /usr/sbin/mysqld -c file_read -a allow -s /proc/sys/vm/swappiness # 重启kysec服务使策略生效 sudo systemctl restart kysec验证是否生效sudo kysec check -p /usr/sbin/mysqld # 输出应包含上述三条策略且状态为allow3.5 启动服务与首次登录sudo systemctl enable mysqld sudo systemctl start mysqld # 检查状态 sudo systemctl status mysqld # 应显示active (running) # 首次登录用初始化生成的临时密码 mysql -u root -p # 输入临时密码后立即执行 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass123!; FLUSH PRIVILEGES;实操心得如果登录时报错“ERROR 1045 (28000): Access denied for user rootlocalhost”大概率是临时密码抄错了或者mysqld没真正启动成功。此时不要反复试密码先查日志sudo tail -100 /var/log/mysqld.log重点关注“Starting MySQL daemon”和“InnoDB initialization”两行。4. 中文支持深度调优从终端乱码到应用层全链路UTF8MB4很多教程到“能连上”就结束了但真实业务里中文才是最大雷区。我在某税务系统部署时发现前端录入的纳税人名称“北京中关村科技发展股份有限公司”存进数据库后变成“??中关村??展股份有限公司”查了一整天才发现问题出在三个层面4.1 MySQL服务层字符集固化上面配置的my.cnf只设置了server级字符集但MySQL 8.0默认创建的数据库仍可能用latin1。必须在初始化后立即执行-- 创建数据库时强制指定字符集 CREATE DATABASE tax_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改现有数据库如果已有 ALTER DATABASE tax_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改所有表批量脚本 SELECT CONCAT(ALTER TABLE , table_name, CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;) FROM information_schema.tables WHERE table_schema tax_system;4.2 客户端连接层编码声明麒麟V10的终端默认LANGzh_CN.UTF-8但MySQL客户端mysql命令行工具默认连接时不发送charset参数。解决方法有两个方案A推荐全局配置客户端sudo tee /etc/my.cnf.d/client.cnf EOF [client] default-character-setutf8mb4 EOF方案B连接时显式指定mysql --default-character-setutf8mb4 -u root -p验证连接编码SHOW VARIABLES LIKE character_set%; -- 正确输出应全部为utf8mb4尤其注意character_set_client、character_set_connection、character_set_results三者4.3 应用程序JDBC连接串终极写法如果你用Java开发Spring Boot的application.yml里这样写是错的spring: datasource: url: jdbc:mysql://localhost:3306/tax_system?useUnicodetruecharacterEncodingutf-8问题在于characterEncodingutf-8是MySQL 5.x语法8.0必须用utf8mb4且要加上时区和SSL参数spring: datasource: url: jdbc:mysql://localhost:3306/tax_system?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue注意useSSLfalse不是妥协而是麒麟V10的Java环境默认不信任MySQL自签名证书开启SSL反而导致连接超时。生产环境应配置正式证书但测试阶段必须关掉。4.4 麒麟桌面版Navicat中文显示修复银河麒麟桌面版安装Navicat Premium 16后新建连接时中文字段显示为方框。这是因为Navicat默认字体不支持CJK中日韩字符。解决步骤下载思源黑体Noto Sans CJK SC字体文件https://github.com/googlefonts/noto-cjk/releases解压后将NotoSansCJKsc-Regular.otf复制到/usr/share/fonts/opentype/noto/更新字体缓存sudo fc-cache -fvNavicat → 工具 → 选项 → 字体 → 将“常规字体”改为“Noto Sans CJK SC”实测效果SQL编辑器、结果表格、对象浏览器全部正常显示中文包括生僻字“龘”“靐”。5. 常见问题速查表与独家排查技巧问题现象根本原因排查命令解决方案systemctl start mysqld报错 “Job for mysqld.service failed”kysec策略拦截mmap()sudo kysec list | grep mysqld执行sudo kysec add -p /usr/sbin/mysqld -c mmap -a allow -s 0x200000000初始化后/var/log/mysqld.log显示 “Can’t open the mysql.plugin table”/var/lib/mysql目录权限错误ls -ld /var/lib/mysqlsudo chown -R mysql:mysql /var/lib/mysqlNavicat连接报错 “Authentication plugin ‘caching_sha2_password’ cannot be loaded”MySQL 8.0默认认证插件与旧客户端不兼容mysql -u root -p -e SELECT plugin FROM mysql.user WHERE Userroot;ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourPass;SELECT * FROM information_schema.TABLES返回空结果MySQL 8.0默认隐藏系统库信息mysql -u root -p -e SHOW DATABASES;在my.cnf中添加show_compatibility_56ON仅调试用生产环境禁用插入中文后查询显示问号“???”client/connection/results三者编码不一致mysql -u root -p -e SHOW VARIABLES LIKE character_set%;按4.2节配置client.cnf并重启mysqld独家排查技巧日志精确定位法MySQL 8.0日志默认级别是error看不到详细启动过程。临时提升日志级别sudo sed -i /\[mysqld\]/a log_error_verbosity3 /etc/my.cnf sudo systemctl restart mysqld sudo tail -f /var/log/mysqld.log这样能看到“InnoDB: Initializing buffer pool”、“Starting XA crash recovery”等关键阶段定位卡在哪一步。端口占用伪装排查有时3306端口被其他进程占用但netstat -tuln \| grep 3306却显示空。这是因为麒麟V10的firewalld默认启用它会劫持端口监听。检查命令sudo firewall-cmd --list-ports # 查看是否开放3306 sudo firewall-cmd --add-port3306/tcp --permanent sudo firewall-cmd --reload离线安装包完整性验证如果网络受限必须用离线包除了SHA256校验还要验证RPM包内部文件rpm -qp --dump mysql-community-server-8.0.33-1.el8.x86_64.rpm \| head -20 # 正常应显示/usr/sbin/mysqld、/etc/my.cnf等关键文件路径最后分享一个血泪教训某次给某市公积金中心部署所有步骤都正确但应用连上后执行INSERT语句超时。查了半天发现是麒麟V10的vm.swappiness60默认值导致InnoDB频繁swap缓冲池失效。解决方案echo vm.swappiness1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p这个参数调优后TPS从80直接飙升到1200。记住在麒麟系统上数据库不是装完就完事而是要和它的内核、安全模块、内存管理深度对话。
返回列表