萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux mydumper 報錯 "libmysqlclient_16 not defined" 根因與修復

使用 mydumper 進行 MySQL 並行邏輯備份時,報錯 symbol gzopen, version libmysqlclient_16 not defined in file libmysqlclient_r.so.16,本質是動態鏈接器找不到正確版本的 MySQL 客戶端庫。本文解析根因,提供環境變量、庫路徑註冊、編譯安裝三種修復方案。

錯誤現場分析


mydumper: relocation error: mydumper: symbol gzopen, version libmysqlclient_16 not defined in file libmysqlclient_r.so.16 with link time reference
  • libmysqlclient_r.so.16:MySQL 5.1/5.5 時代的線程安全客戶端庫(_r 後綴)
  • libmysqlclient_16:符號版本標識,表示需要 MySQL 5.1 系列的 ABI
  • mydumper 編譯時鏈接了該版本,運行時動態加載失敗

現場排查步驟


# 1. 確認 MySQL 庫文件存在
ls -la /usr/local/mysql/lib/
# 應見到:libmysqlclient_r.so.16, libmysqlclient_r.so.16.0.0 等

# 2. 檢查動態鏈接器緩存
ldconfig -p | grep libmysqlclient
# 若無輸出,說明庫路徑未註冊

# 3. 檢查 mydumper 依賴
ldd /usr/local/bin/mydumper | grep mysql
# 輸出應顯示:libmysqlclient_r.so.16 => /usr/local/mysql/lib/libmysqlclient_r.so.16
# 若顯示 "not found",即為路徑問題

方案一:環境變量 LD_LIBRARY_PATH(最快生效,僅當前進程)


export LD_LIBRARY_PATH="/usr/local/mysql/lib:$LD_LIBRARY_PATH"
mydumper -h localhost -u root -p password -c -o ./backup -B mydb

寫入腳本或 ~/.bashrc 永久生效:


echo 'export LD_LIBRARY_PATH="/usr/local/mysql/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc

方案二:註冊庫路徑到 ldconfig(系統級,推薦)


# 1. 創建配置文件
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf

# 2. 更新緩存
ldconfig

# 3. 驗證
ldconfig -p | grep libmysqlclient
# 應顯示庫路徑指向 /usr/local/mysql/lib/

方案三:編譯安裝 mydumper 指定庫路徑(根治,版本匹配最精確)


# 1. 安裝依賴
yum install -y cmake gcc gcc-c++ glib2-devel mysql-devel zlib-devel openssl-devel

# 2. 下載源碼(匹配 MySQL 版本)
git clone https://github.com/maxbube/mydumper.git
cd mydumper
git checkout v0.15.0  # 選擇兼容標籤

# 3. 編譯安裝(指定 MySQL 庫路徑)
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mydumper \
      -DMYSQL_CONFIG=/usr/local/mysql/bin/mysql_config \
      -DMYSQL_INCLUDE_DIR=/usr/local/mysql/include \
      -DMYSQL_LIB_DIR=/usr/local/mysql/lib .
make && make install

# 4. 驗證
/usr/local/mydumper/bin/mydumper --version
ldd /usr/local/mydumper/bin/mydumper | grep mysql

版本兼容性對照表

MySQL 版本客戶端庫版本mydumper 建議版本
5.1 / 5.5libmysqlclient_r.so.160.9.x - 0.10.x
5.6 / 5.7libmysqlclient.so.18 / .200.10.x - 0.12.x
8.0libmysqlclient.so.210.13.x+ (需 CMake 3.8+)
MariaDB 10.xlibmariadb.so.30.12.x+ (支援 MariaDB)

替代方案:mydumper 現代分支

原版 mydumper 更新緩慢,推薦使用活躍維護的分支:

  • maxbube/mydumper:最活躍,支援 MySQL 8.0、MariaDB、TiDB、壓縮、加密、S3 上傳
  • percona/mydumper:Percona 維護,企業級穩定

# 使用 Percona 版(通常包管理器可直接安裝)
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install -y percona-mydumper

驗證修復


# 測試備份
mydumper -h 127.0.0.1 -u root -p 'password' \
  --database testdb \
  --outputdir /tmp/mydump \
  --threads 4 \
  --compress \
  --verbose 3

# 應無 relocation error,正常輸出表結構與數據文件

核心修復邏輯:讓動態鏈接器找到 mydumper 編譯時依賴的精確庫版本。生產環境推薦方案二(ldconfig 註冊)或方案三(重新編譯),避免環境變量污染其他進程。長期建議遷移至活躍維護的分支版本,獲得更好兼容性與功能。

copyright © 萬盛學電腦網 all rights reserved