在 Fedora Core 6 (glibc 2.5+, NPTL 線程庫) 上從源碼編譯 MySQL 5.0/5.1 時,./configure 階段報錯:
checking "LinuxThreads"... "Not found"
configure: error: This is a linux system and Linuxthreads was not found.
On linux Linuxthreads should be used.
Please install Linuxthreads (or a new glibc) and try again.
MySQL 5.1 及更早版本 configure.ac 中硬編碼檢測邏輯:僅識別 LinuxThreads,不識別 NPTL。檢測方式為尋找 linuxthreads 目錄或特定符號,NPTL 環境下自然找不到,導致誤判「缺少線程庫」。
| 方案 | 操作步驟 | 優點 | 缺點/風險 |
|---|---|---|---|
| 方案 A:欺騙 configure 使用 MIT-pthreads (推薦) | 1. 下載 pthreads-1_60_beta6-mysql.tar.gz (MySQL 官方舊版鏡像)2. 解壓至 MySQL 源碼根目錄,重命名為 mit-pthreads3. 執行 ./configure --with-mit-threads --prefix=/usr/local/mysql | 不修改源碼、編譯通過、運行期使用系統 NPTL (MIT-pthreads 僅用於編譯期鏈接符號) | 需找到對應版本 MIT-pthreads 包、額外編譯時間 |
| 方案 B:修改 configure.ac / configure 強制跳過檢測 | 1. 編輯 configure 文件,搜索 Linuxthreads 相關邏輯2. 將檢測結果強制置為 "found" 或註釋報錯邏輯 3. 重新運行 ./configure | 無需外部依賴、快速 | 修改自動生成文件難維護、升級版本需重複操作、可能引入運行時隱患 |
| 方案 C:安裝兼容包 (舊版發行版) | yum install glibc-linuxthreads-devel (RHEL 4/5 有此包) | 系統級解決 | FC6 及更新發行版已移除此包、污染開發環境 |
| 方案 D:升級 MySQL 版本 (根治) | 使用 MySQL 5.5+ / 5.6+ / 8.0,已原生支持 NPTL 檢測 | 獲得新特性、性能優化、安全修復、長期支持 | 業務遷移成本高、SQL 模式兼容性需測試 |
wget https://downloads.mysql.com/archives/get/file/pthreads-1_60_beta6-mysql.tar.gz
# 若官方鏡像失效,可嘗試鏡像站或從舊版 MySQL 源碼包中提取
tar zxvf pthreads-1_60_beta6-mysql.tar.gz
mv pthreads-1.60-beta6 mysql-source-root/mit-pthreads
# 確認結構: mysql-source-root/mit-pthreads/Makefile.in 存在
cd mysql-source-root
./configure --prefix=/usr/local/mysql \
--with-mit-threads \
--with-charset=utf8mb4 \
--with-collation=utf8mb4_unicode_ci \
--with-extra-charsets=all \
--enable-thread-safe-client \
--with-big-tables \
--with-readline \
--with-ssl \
--with-zlib-dir=system \
--enable-local-infile \
--enable-assembler \
--enable-profiling
make -j$(nproc)
make install
# 初始化數據目錄
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
# 啟動
/usr/local/mysql/bin/mysqld_safe --user=mysql &
# 連接測試
/usr/local/mysql/bin/mysql -uroot -e "SELECT VERSION(); SHOW VARIABLES LIKE 'version_compile_os';"
# 輸出應顯示 linux-gnu,證明使用系統 NPTL
getpid() 返回進程 ID、信號面向進程、pthread_kill 精確投遞、線程取消點標準。/proc/PID/stat 反映進程級 CPU/內存,非線程級。libpthread.so.0 提供兼容符號,舊二進制可無縫運行。cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DWITH_SSL=system -DWITH_ZLIB=system \
-DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_DEBUG=OFF -DWITH_UNIT_TESTS=OFF
CMake 會自動檢測 NPTL,無需手動干預。yum install -y gcc gcc-c++ cmake ncurses-devel openssl-devel bison perl-Data-Dumper-DWITH_DEBUG=OFF,性能提升 20%+。-DWITH_SSL=system -DWITH_ZLIB=system,避免重複造輪子、安全更新跟隨系統。Linux thread not found 是 MySQL 早期構建系統未適配 NPTL 的歷史遺留問題。最經濟的修復是引入 MIT-pthreads 欺騙 configure,實際運行仍使用高性能 NPTL。長期來看,升級至 MySQL 5.5+ (CMake 構建) 或直接使用官方二進制包 是正道。理解線程庫演進,有助於排查高併發下的鎖爭用、信號處理、調試難題,也是 Linux 系統程序員的核心內功。