bind9 dlz / mysql在Ubuntu下segfault libmysqlclient.so

我有一个很大的问题。 我将bind9名称服务器安装到三台不同的计算机上。 两个Ubuntu 10.04.4 LTS和一个Ubuntu 11.10

我用这个方法编译了9.7.0,9.7.3,9.9.0:

./configure --prefix=/usr --sysconfdir=/etc/bind --localstatedir=/var \ --mandir=/usr/share/man --infodir=/usr/share/info \ --enable-threads --enable-largefile --with-libtool --enable-shared --enable-static \ --with-openssl=/usr --with-gssapi=/usr --with-gnu-ld \ --with-dlz-mysql=yes --with-dlz-bdb=no \ --with-dlz-filesystem=yes --with-geoip=/usr make make install 

在设置dlz / mysql之后,BIND服务器一直工作,直到5-30分钟。 Ahter我有段错误。

我用一个简单的进程看门狗来暂时解决这个问题,如果这个命名被停止了,那么看门狗就会重新启动它,但是这并不是一个长时间的好主意。

我的日志输出是:

消息:

 Apr 13 19:33:51 dnsvm kernel: [ 8.088696] eth0: link up Apr 13 19:33:58 WATCHDOG: named not running. Restarting Apr 13 19:35:08 dnsvm kernel: [ 87.082572] named[1027]: segfault at 88 ip b71c4291 sp b5adfe30 error 4 in libmysqlclient.so.16.0.0[b714e000+1aa000] Apr 13 19:35:08 WATCHDOG: named not running. Restarting Apr 13 19:35:08 dnsvm kernel: [ 87.457510] named[1423]: segfault at 68 ip b71d6122 sp b52f0a40 error 4 in libmysqlclient.so.16.0.0[b7160000+1aa000] Apr 13 19:35:09 WATCHDOG: named not running. Restarting Apr 13 19:41:56 dnsvm kernel: [ 494.838206] named[1448]: segfault at 88 ip b731c291 sp b5436e30 error 4 in libmysqlclient.so.16.0.0[b72a6000+1aa000] Apr 13 19:41:57 WATCHDOG: named not running. Restarting Apr 13 19:57:26 dnsvm kernel: [ 1424.023409] named[2976]: segfault at 88 ip b72d1291 sp b6beee30 error 4 in libmysqlclient.so.16.0.0[b725b000+1aa000] Apr 13 19:57:26 WATCHDOG: named not running. Restarting Apr 13 20:11:56 dnsvm kernel: [ 2294.324663] named[6441]: segfault at 88 ip b7357291 sp b6473e30 error 4 in libmysqlclient.so.16.0.0[b72e1000+1aa000] Apr 13 20:11:57 WATCHDOG: named not running. Restarting 

系统日志: http : //pastebin.com/hjUyt8gN

第一个服务器是一个原生的,普通的x64服务器(u1004lts),第二个是虚拟化服务器(u11.10),第三个也是虚拟化的(10.04lts)。这个服务器只适用于dns提供的mysql服务器数据库。 但问题是所有的服务器,所有绑定版本。

named.conf: http : //pastebin.com/zwm1yP7V

任何人都可以帮助我,或者有什么好主意吗?

问题:(来自http://bind-dlz.sourceforge.net/mysql_driver.html

MySQL驱动程序有一个额外的限制。 MySQL在其C api中使用线程本地存储。 因此,MySQL要求应用程序的每个线程执行MySQL“线程初始化”来设置线程本地存储。 在DLZ驱动程序API中保持安全是不可能的。 这是MySQL造成的一个限制,而不是DLZ API。 由于这个BIND只能在使用MySQL驱动时使用单线程运行。 要确保BIND在启动BIND(named)时在命令行上使用单个线程传递“-n 1”运行。 这不应该是大多数UN * X系统的限制,因为BIND通常是单线程编译的(有一些例外)。 即使将BIND编译为支持在命令行上传递“-n 1”的线程,也会导致它使用单个线程。 另外,如果MySQL驱动程序被编译成BIND但不被使用,则不需要“-n 1”。 只有当MySQL驱动程序被使用时,才需要“-n 1”命令行参数。

解决:

 nano /etc/defaults/bind9 

并改变这一行:

 # startup options for the server OPTIONS="-u bind" 

至:

 # startup options for the server OPTIONS="-u bind -n 1" 

重新启动DNS服务器。