使用 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 系列的 ABImydumper 編譯時鏈接了該版本,運行時動態加載失敗
# 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",即為路徑問題
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
# 1. 創建配置文件
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
# 2. 更新緩存
ldconfig
# 3. 驗證
ldconfig -p | grep libmysqlclient
# 應顯示庫路徑指向 /usr/local/mysql/lib/
# 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.5 | libmysqlclient_r.so.16 | 0.9.x - 0.10.x |
| 5.6 / 5.7 | libmysqlclient.so.18 / .20 | 0.10.x - 0.12.x |
| 8.0 | libmysqlclient.so.21 | 0.13.x+ (需 CMake 3.8+) |
| MariaDB 10.x | libmariadb.so.3 | 0.12.x+ (支援 MariaDB) |
原版 mydumper 更新緩慢,推薦使用活躍維護的分支:
# 使用 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 註冊)或方案三(重新編譯),避免環境變量污染其他進程。長期建議遷移至活躍維護的分支版本,獲得更好兼容性與功能。