![g_ascii_strtoull 中的 mydumper 分段错误](https://linux22.com/image/117060/g_ascii_strtoull%20%E4%B8%AD%E7%9A%84%20mydumper%20%E5%88%86%E6%AE%B5%E9%94%99%E8%AF%AF.png)
我正在尝试使用 mydumper 生成 mysql 数据库的转储,以便在发生灾难时可以用来恢复数据库。
然而,它就是行不通。我使用这个命令行:
mydumper --user remote-backup --password ******
在大约 1 秒的延迟后,它只输出一条Segmentation fault
消息。
apt install mydumper
我已经在 debian 8.5 (jessie) 机器上安装了它,该机器安装了mydumper 0.6.1, built against MySQL 5.5.35
.我在用着mysqld Ver 5.7.14 for Linux on i686 (MySQL Community Server (GPL))
。我需要针对 mysql 5.7 重建 mydumper 吗?
这是 gdb 的回溯:
(gdb) run
Starting program: /usr/bin/mydumper --user remote-backup --password ******
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".
[New Thread 0xb77aab40 (LWP 3189)]
[Thread 0xb77aab40 (LWP 3189) exited]
[New Thread 0xb77aab40 (LWP 3190)]
[New Thread 0xb6dffb40 (LWP 3191)]
[New Thread 0xb63ffb40 (LWP 3192)]
[New Thread 0xb5bfeb40 (LWP 3194)]
Program received signal SIGSEGV, Segmentation fault.
0xb7912bf8 in __GI_____strtoull_l_internal (nptr=nptr@entry=0x0,
endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0,
loc=loc@entry=0xb7a87400 <_nl_C_locobj>) at ./strtol_l.c:298
298 ./strtol_l.c: No such file or directory.
(gdb) backtrace
#0 0xb7912bf8 in __GI_____strtoull_l_internal (nptr=nptr@entry=0x0,
endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0,
loc=loc@entry=0xb7a87400 <_nl_C_locobj>) at ./strtol_l.c:298
#1 0xb791321f in __GI___strtoull_l (nptr=0x0, endptr=0x0, base=10,
loc=0xb7a87400 <_nl_C_locobj>) at ./strtol_l.c:556
#2 0xb7bcbdc6 in g_ascii_strtoull () from /lib/i386-linux-gnu/libglib-2.0.so.0
#3 0x0804cf6a in dump_database ()
#4 0x0804ede1 in start_dump ()
#5 0x0804b595 in main ()
答案1
我通过从源代码重建 mydumper 解决了这个问题。
事实证明,我使用的 mysqld 版本比 debian (jessie) 提供的版本更新,因此显然 debian 提供的 mydumper 可执行文件与其不兼容(尽管这只是猜测,也许这不是原因)根本没有)。
为了构建 mydumper,您需要:
- 克隆https://github.com/maxbube/mydumper.git
- 使用 apt-get 安装依赖项(请参阅 github 上的 mydumper 自述文件,在编写此答案时您需要
sudo apt-get install libglib2.0-dev zlib1g-dev libpcre3-dev libssl-dev
) - 安装与您正在使用的 mysqld 版本相对应的 libmysqlclient-dev 软件包。由于本例中我没有使用debian提供的,所以我也无法安装debian提供的开发文件。对我有用的是从
debian sid
存储库(直接从 ftp)下载 .deb 包:libmysqlclient-dev这取决于libmysqlclient20。下载这些文件,然后sudo dpkg -i libmysqlclient20_5.7.18-1_i386.deb libmysqlclient-dev_5.7.18-1_i386.deb
按照自述文件中的说明构建 mydumper(也将构建 myloader):
cd mydumper cmake . make
您可能需要安装构建工具,例如
sudo apt-get install build-essential cmake
现在,当前目录中应该有两个可执行文件。从这一点来看,我生成备份的一切都很顺利。
我还需要myloader
在目标服务器上从源代码构建,因为 debian 提供的版本也会出现段错误,但这一次不是 mysql 版本不匹配;所以实际上我不知道为什么 debian 可执行文件不起作用。