最近给朋友弄个dns,freebsd+mydns+mysql+freevrrpd的整合,mysql的socket文件指定在用户目录下的tmp目录,非默认的"/tmp"目录,这时mydns是启动不了的,在日志里可以看到Can‘t connect to local MySQL server through socket /tmp/mysql.sock的提示。
解决过程
首先当然是google和baidu了,结果是一篇相关文章也没找到,在编译参数和配置文件里--help了没有找到点相关提示,不得已找源文件的问题了,还好,算是搞定了,具体方法如下,其他有类似的问题可以方便了:
1:直接在编译前指定mysql.sock的绝对路径,在sql.c文件修改
$cd mydns-1.1.0/src/lib/
$cp sql.c sql.c.20070717
$vi sql.c
修改87行如下:
修改"if (!(mysql_real_connect(sql, host, user, password, database, port, NULL, 0)))"为"if (!(mysql_real_connect(sql, host, user, password, database, port, "/home/tools/mysql/tmp/mysql.sock", 0)))"
"/home/tools/mysql/tmp/mysql.sock"换成你自己的mysql.sock的路径, 修改后再按照之前的方式编译就可以了,这个方法是解决了之前的mydns启动的问题,单要是能在mydns.conf里指定更好些。下面就提供mydns.conf支持自定义此项的方法;
2:直接在编译前修改源文件,比起第1步骤稍显复杂, 这里只给出修改前后的文件diff的结果
此处共修改了4个文件,包括./mydns-1.1.0/src/mydns/db.c、./mydns-1.1.0/src/lib/sql.c、./mydns-1.1.0/src/lib/mydns.h、./mydns-1.1.0/src/util/util.c;
surferwl@cnbsd/home/backup/mydns$ diff mydns-1.1.0/src/mydns/db.c mydns-1.1.0/src/mydns/db.c.20070717
38d37
< char *socket = conf_get(&Conf, "socket", NULL);
40c39
< sql_open(user, password, host, database, socket);
---
> sql_open(user, password, host, database);
289d287
< char *socket = conf_get(&Conf, "socket", NULL);
293c291
< sql_open(user, password, host, database, socket);
---
> sql_open(user, password, host, database);
surferwl@cnbsd/home/backup/mydns$
surferwl@cnbsd/home/backup/mydns$ diff mydns-1.1.0/src/lib/sql.c mydns-1.1.0/src/lib/sql.c.20070717
30d29
< static char *_sql_socket = NULL;
38c37
< sql_open(char *user, char *password, char *host, char *database, char *socket)
---
> sql_open(char *user, char *password, char *host, char *database)
54d52
< if (_sql_socket) Free(_sql_socket);
59d56
< _sql_socket = socket ? strdup(socket) : NULL;
90c87
< if (!(mysql_real_connect(sql, host, user, password, database, port, socket, 0)))
---
> if (!(mysql_real_connect(sql, host, user, password, database, port, NULL, 0)))
surferwl@cnbsd/home/backup/mydns$
surferwl@cnbsd/home/backup/mydns$ diff mydns-1.1.0/src/lib/mydns.h mydns-1.1.0/src/lib/mydns.h.20070717
401c401
< extern void sql_open(char *user, char *password, char *host, char *database, char *socket);
---
> extern void sql_open(char *user, char *password, char *host, char *database);
surferwl@cnbsd/home/backup/mydns$
surferwl@cnbsd/home/backup/mydns$ diff mydns-1.1.0/src/util/util.c mydns-1.1.0/src/util/util.c.20070717
53d52
< char *socket = conf_get(&Conf, "socket", NULL);
62c61
< sql_open(user, password, host, database, socket);
---
> sql_open(user, password, host, database);
surferwl@cnbsd/home/backup/mydns$
不知是否看清了,修改后我的mydns.conf配置指定mysql的socket相关项为"socket = /home/tools/mysql/tmp/mysql.sock",当然这里是否使用socket字眼取决于你自己了,ok,到此2种方法都说完。
后记
mydns设计主要是配合mysql或pgsql使用的,比较小巧灵活,适合一般企业使用,要说性能还是bind强悍;mydns配合mysql的replication,还有freevrrpd,也算是有主备了,这个还支持web界面,不过这个web界面不推荐使用,倒不如自己弄个界面方便,还少些服务.
.
TAG: mysql mydsn