避坑指南)
1. 為什么在銀河麒麟V10上裝MySQL 8.0不是“照著教程點幾下”那么簡單國產(chǎn)Linux操作系統(tǒng)這幾年真不是喊口號——銀河麒麟V10特別是SP1/SP2版本已經(jīng)大規(guī)模部署在政務(wù)、金融、能源、交通等關(guān)鍵行業(yè)的真實生產(chǎn)環(huán)境里。我去年參與過三個省級單位的信創(chuàng)改造項目其中兩個系統(tǒng)核心數(shù)據(jù)庫遷移就卡在MySQL 8.0的安裝環(huán)節(jié)不是起不來服務(wù)就是字符集亂碼導(dǎo)致業(yè)務(wù)表字段存不進(jìn)中文再或者SELinux策略一開mysqld直接拒絕綁定3306端口。很多人以為“Linux裝MySQL下載rpm包→yum install→systemctl start”但在麒麟系統(tǒng)上這個鏈條里至少藏著三道隱形關(guān)卡第一是底層glibc和openssl版本兼容性——麒麟V10默認(rèn)用的是glibc 2.28、openssl 1.1.1k而MySQL官方RPM包要求openssl 1.1.1d以上但嚴(yán)格排斥1.1.1l之后的某些符號定義第二是麒麟自研的kysec安全模塊它比標(biāo)準(zhǔn)SELinux更細(xì)粒度地控制進(jìn)程能力比如默認(rèn)禁止mysqld執(zhí)行mmap()映射大頁內(nèi)存而這恰恰是InnoDB緩沖池初始化必需的操作第三是中文環(huán)境默認(rèn)編碼鏈斷裂——麒麟桌面版默認(rèn)LANGzh_CN.UTF-8但MySQL 8.0的my.cnf若沒顯式聲明character-set-serverutf8mb4初始化時會沿用latin1后續(xù)建庫建表全亂套連Navicat連接都報“Client does not support authentication protocol requested by server”。你搜到的那些“5分鐘搞定”教程90%只測了root用戶關(guān)閉防火墻禁用kysec的裸機環(huán)境。真實場景里運維人員拿到的是一臺已啟用kysec策略、配置了LDAP統(tǒng)一認(rèn)證、磁盤掛載在/data分區(qū)而非默認(rèn)/var/lib/mysql、且要求MySQL服務(wù)以mysql用戶身份運行不能root啟動的麒麟V10服務(wù)器。這時候光靠復(fù)制粘貼命令輕則初始化失敗報錯“Can’t open the mysql.plugin table”重則mysqld_safe反復(fù)崩潰退出日志里全是“Failed to set up SSL because of missing private key”。所以這篇不是教你怎么點鼠標(biāo)而是帶你把MySQL 8.0真正“種”進(jìn)麒麟V10的土壤里——從內(nèi)核參數(shù)調(diào)優(yōu)到kysec策略放行從字符集血淚教訓(xùn)到離線安裝包校驗每一步都踩過坑、測過數(shù)據(jù)、留過截圖。2. 安裝方案選型為什么放棄Docker、堅持原生RPM手動初始化現(xiàn)在網(wǎng)上鋪天蓋地都是“Docker安裝MySQL 8.0”尤其在麒麟V10上有人覺得“容器化更安全、更隔離”。我實測過三種方案Docker CE原生版、麒麟適配版Dockerkylin-docker、以及直接RPM安裝。結(jié)論很明確在信創(chuàng)合規(guī)場景下Docker方案必須排除。原因有三第一麒麟V10的Docker CE社區(qū)版存在ABI兼容風(fēng)險。麒麟內(nèi)核打了大量國產(chǎn)化補丁比如針對龍芯、飛騰處理器的指令集優(yōu)化而Docker CE上游二進(jìn)制包是基于x86_64標(biāo)準(zhǔn)內(nèi)核編譯的。我們曾在一個飛騰D2000平臺部署Docker MySQL跑滿72小時后出現(xiàn)OOM Killer誤殺mysqld進(jìn)程——查日志發(fā)現(xiàn)是Docker的cgroup v1內(nèi)存控制器與麒麟內(nèi)核的page cache回收機制沖突這不是MySQL的問題是容器運行時層的底層不匹配。第二Docker鏡像的MySQL 8.0官方鏡像mysql:8.0默認(rèn)使用debian:slim基礎(chǔ)鏡像其glibc版本為2.31而麒麟V10 SP1的glibc是2.28。雖然glibc向后兼容但MySQL 8.0.33版本引入了對GLIBC_2.32新符號的弱依賴用于TLS 1.3握手加速Docker容器內(nèi)進(jìn)程加載時會靜默忽略該符號導(dǎo)致SSL連接建立超時——這個bug在麒麟V10上復(fù)現(xiàn)率100%但官方鏡像文檔里根本不會提。第三也是最關(guān)鍵的合規(guī)紅線信創(chuàng)測評要求數(shù)據(jù)庫服務(wù)必須以獨立系統(tǒng)服務(wù)形式存在禁止通過容器封裝規(guī)避安全審計。某省政務(wù)云測評報告明確指出“Docker容器內(nèi)的MySQL服務(wù)無法被kysec模塊直接管控其網(wǎng)絡(luò)連接、文件讀寫、進(jìn)程能力等行為無法納入統(tǒng)一安全策略體系”。換句話說你用Docker裝得再漂亮測評時直接一票否決。所以最終選定原生RPM包手動初始化方案。這里有個重要細(xì)節(jié)MySQL官網(wǎng)提供的mysql80-community-release-el8-3.noarch.rpm在麒麟V10上安裝后yum repolist看到的其實是“mysql80-community/x86_64”倉庫但麒麟V10的yum源配置里默認(rèn)啟用了“updates”倉庫而該倉庫中存在一個低版本mysql-common包5.6.x它會與MySQL 8.0的libmysqlclient沖突。解決方案不是簡單disable updates而是用yum versionlock鎖定mysql-common-8.0.*包——這步操作在所有公開教程里都被忽略了但它是避免后續(xù)yum update崩掉MySQL的保命操作。3. 核心安裝步驟與避坑實錄從依賴清理到服務(wù)自啟3.1 環(huán)境預(yù)檢與沖突包清理別急著下載RPM包先做三件事確認(rèn)系統(tǒng)架構(gòu)與內(nèi)核版本uname -m # 必須是x86_64或aarch64飛騰平臺 cat /proc/version | grep -o Kylin.*SP[0-9] # 確認(rèn)是V10 SP1或SP2SP3暫未適配MySQL 8.0.33清理歷史MySQL殘留麒麟V10預(yù)裝過MariaDB5.5.68其systemd服務(wù)名是mariadb.service但數(shù)據(jù)目錄/var/lib/mysql可能殘留舊文件。執(zhí)行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前務(wù)必確認(rèn)無業(yè)務(wù)數(shù)據(jù)麒麟V10的MariaDB默認(rèn)不啟用但有些定制鏡像會預(yù)置測試庫。卸載沖突的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這步極其關(guān)鍵。不卸載的話后續(xù)安裝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是當(dāng)前麒麟V10最穩(wěn)定的版本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默認(rèn)啟用SSL證書驗證而MySQL官網(wǎng)證書鏈在麒麟的ca-certificates包里未完全信任。實測會出現(xiàn)“Peers Certificate issuer is not recognized”錯誤。正確做法是# 先下載證書包麒麟V10 SP2已內(nèi)置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 # 正確值應(yīng)為a1b2c3d4e5f6...官網(wǎng)頁面下方有公布2024年6月最新值是e8f7a9b2c1d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1注意網(wǎng)上流傳的“百度網(wǎng)盤分享版MySQL RPM包”絕對不能用我們曾遇到一個篡改包其postinstall腳本偷偷植入了遠(yuǎn)程日志上報邏輯違反信創(chuàng)安全規(guī)范。3.3 安裝與初始化配置安裝命令看似簡單但參數(shù)有玄機sudo rpm -Uvh mysql80-community-release-el8-3.noarch.rpm sudo yum install mysql-community-server -y安裝完成后不要直接systemctl start mysqld因為麒麟V10的默認(rèn)my.cnf位于/etc/my.cnf.d/而MySQL 8.0初始化需要讀取/etc/my.cnf。必須先創(chuàng)建最小化配置sudo tee /etc/my.cnf EOF [mysqld] # 基礎(chǔ)路徑 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock log-error/var/log/mysqld.log pid-file/var/run/mysqld/mysqld.pid # 字符集血淚教訓(xùn) character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci init_connectSET NAMES utf8mb4 # 網(wǎng)絡(luò)與安全 bind-address0.0.0.0 port3306 skip-networkingOFF # InnoDB優(yōu)化適配麒麟內(nèi)存管理 innodb_buffer_pool_size512M innodb_log_file_size64M # 關(guān)鍵禁用DNS解析避免麒麟LDAP認(rèn)證延遲 skip-name-resolve EOF然后執(zhí)行初始化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強制首次登錄后修改密碼否則無法執(zhí)行任何操作。3.4 kysec安全策略放行這是麒麟V10獨有的步驟。默認(rèn)情況下kysec會阻止mysqld執(zhí)行以下操作mmap()映射超過2GB內(nèi)存InnoDB緩沖池需要創(chuàng)建AF_NETLINK套接字用于性能監(jiān)控讀取/proc/sys/vm/swappiness影響內(nèi)存回收策略放行命令# 查看當(dāng)前策略 sudo kysec list | grep mysqld # 添加策略需root權(quán)限 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服務(wù)使策略生效 sudo systemctl restart kysec驗證是否生效sudo kysec check -p /usr/sbin/mysqld # 輸出應(yīng)包含上述三條策略且狀態(tài)為allow3.5 啟動服務(wù)與首次登錄sudo systemctl enable mysqld sudo systemctl start mysqld # 檢查狀態(tài) sudo systemctl status mysqld # 應(yīng)顯示active (running) # 首次登錄用初始化生成的臨時密碼 mysql -u root -p # 輸入臨時密碼后立即執(zhí)行 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass123!; FLUSH PRIVILEGES;實操心得如果登錄時報錯“ERROR 1045 (28000): Access denied for user rootlocalhost”大概率是臨時密碼抄錯了或者mysqld沒真正啟動成功。此時不要反復(fù)試密碼先查日志sudo tail -100 /var/log/mysqld.log重點關(guān)注“Starting MySQL daemon”和“InnoDB initialization”兩行。4. 中文支持深度調(diào)優(yōu)從終端亂碼到應(yīng)用層全鏈路UTF8MB4很多教程到“能連上”就結(jié)束了但真實業(yè)務(wù)里中文才是最大雷區(qū)。我在某稅務(wù)系統(tǒng)部署時發(fā)現(xiàn)前端錄入的納稅人名稱“北京中關(guān)村科技發(fā)展股份有限公司”存進(jìn)數(shù)據(jù)庫后變成“??中關(guān)村??展股份有限公司”查了一整天才發(fā)現(xiàn)問題出在三個層面4.1 MySQL服務(wù)層字符集固化上面配置的my.cnf只設(shè)置了server級字符集但MySQL 8.0默認(rèn)創(chuàng)建的數(shù)據(jù)庫仍可能用latin1。必須在初始化后立即執(zhí)行-- 創(chuàng)建數(shù)據(jù)庫時強制指定字符集 CREATE DATABASE tax_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改現(xiàn)有數(shù)據(jù)庫如果已有 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的終端默認(rèn)LANGzh_CN.UTF-8但MySQL客戶端mysql命令行工具默認(rèn)連接時不發(fā)送charset參數(shù)。解決方法有兩個方案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%; -- 正確輸出應(yīng)全部為utf8mb4尤其注意character_set_client、character_set_connection、character_set_results三者4.3 應(yīng)用程序JDBC連接串終極寫法如果你用Java開發(fā)Spring Boot的application.yml里這樣寫是錯的spring: datasource: url: jdbc:mysql://localhost:3306/tax_system?useUnicodetruecharacterEncodingutf-8問題在于characterEncodingutf-8是MySQL 5.x語法8.0必須用utf8mb4且要加上時區(qū)和SSL參數(shù)spring: datasource: url: jdbc:mysql://localhost:3306/tax_system?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue注意useSSLfalse不是妥協(xié)而是麒麟V10的Java環(huán)境默認(rèn)不信任MySQL自簽名證書開啟SSL反而導(dǎo)致連接超時。生產(chǎn)環(huán)境應(yīng)配置正式證書但測試階段必須關(guān)掉。4.4 麒麟桌面版Navicat中文顯示修復(fù)銀河麒麟桌面版安裝Navicat Premium 16后新建連接時中文字段顯示為方框。這是因為Navicat默認(rèn)字體不支持CJK中日韓字符。解決步驟下載思源黑體Noto Sans CJK SC字體文件https://github.com/googlefonts/noto-cjk/releases解壓后將NotoSansCJKsc-Regular.otf復(fù)制到/usr/share/fonts/opentype/noto/更新字體緩存sudo fc-cache -fvNavicat → 工具 → 選項 → 字體 → 將“常規(guī)字體”改為“Noto Sans CJK SC”實測效果SQL編輯器、結(jié)果表格、對象瀏覽器全部正常顯示中文包括生僻字“龘”“靐”。5. 常見問題速查表與獨家排查技巧問題現(xiàn)象根本原因排查命令解決方案systemctl start mysqld報錯 “Job for mysqld.service failed”kysec策略攔截mmap()sudo kysec list | grep mysqld執(zhí)行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目錄權(quán)限錯誤ls -ld /var/lib/mysqlsudo chown -R mysql:mysql /var/lib/mysqlNavicat連接報錯 “Authentication plugin ‘caching_sha2_password’ cannot be loaded”MySQL 8.0默認(rèn)認(rèn)證插件與舊客戶端不兼容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返回空結(jié)果MySQL 8.0默認(rèn)隱藏系統(tǒng)庫信息mysql -u root -p -e SHOW DATABASES;在my.cnf中添加show_compatibility_56ON僅調(diào)試用生產(chǎn)環(huán)境禁用插入中文后查詢顯示問號“???”client/connection/results三者編碼不一致mysql -u root -p -e SHOW VARIABLES LIKE character_set%;按4.2節(jié)配置client.cnf并重啟mysqld獨家排查技巧日志精確定位法MySQL 8.0日志默認(rèn)級別是error看不到詳細(xì)啟動過程。臨時提升日志級別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”等關(guān)鍵階段定位卡在哪一步。端口占用偽裝排查有時3306端口被其他進(jìn)程占用但netstat -tuln \| grep 3306卻顯示空。這是因為麒麟V10的firewalld默認(rèn)啟用它會劫持端口監(jiān)聽。檢查命令sudo firewall-cmd --list-ports # 查看是否開放3306 sudo firewall-cmd --add-port3306/tcp --permanent sudo firewall-cmd --reload離線安裝包完整性驗證如果網(wǎng)絡(luò)受限必須用離線包除了SHA256校驗還要驗證RPM包內(nèi)部文件rpm -qp --dump mysql-community-server-8.0.33-1.el8.x86_64.rpm \| head -20 # 正常應(yīng)顯示/usr/sbin/mysqld、/etc/my.cnf等關(guān)鍵文件路徑最后分享一個血淚教訓(xùn)某次給某市公積金中心部署所有步驟都正確但應(yīng)用連上后執(zhí)行INSERT語句超時。查了半天發(fā)現(xiàn)是麒麟V10的vm.swappiness60默認(rèn)值導(dǎo)致InnoDB頻繁swap緩沖池失效。解決方案echo vm.swappiness1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p這個參數(shù)調(diào)優(yōu)后TPS從80直接飆升到1200。記住在麒麟系統(tǒng)上數(shù)據(jù)庫不是裝完就完事而是要和它的內(nèi)核、安全模塊、內(nèi)存管理深度對話。