无废话 Sphinx Server 2.0.1 及 Sphinx Client PHP 模块编译安装

Sphinx 又发新版本了,当前最新版本为 2.0.1。

Sphinx 安装
wget http://sphinxsearch.com/files/sphinx-2.0.1-beta.tar.gz
tar zxf sphinx-2.0.1-beta.tar.gz
cd sphinx-2.0.1-beta
./configure –prefix=/usr/local/sphinx –with-mysql
make && make install

PHP 的模块好久没有更新,只好先使用官方提供的 PHP 接口类(在源代码包的 api/ 目录下)。
实际使用中发现 PHP 模块有存在一些 BUG,建议大家还是使用官方提供的 PHP 接口类,而且在一些情况下,PHP 接口类性能并不比 PHP 模块的差。

— EOF —

无废话 Sphinx Server 及 Sphinx Client PHP 模块编译安装

Sphinx 安装
wget http://sphinxsearch.com/files/sphinx-1.10-beta.tar.gz
tar zxf sphinx-1.10-beta.tar.gz
cd sphinx-1.10-beta
./configure –prefix=/usr/local/sphinx –with-mysql
make && make install

libsphinxclient 安装(PHP模块需要)
cd api/libsphinxclient
./configure –prefix=/usr/local/sphinx
make 时会出现以下错误:

libsphinxclient # make
make  all-am
make[1]: Entering directory `/work/setup/sphinx-1.10-beta/api/libsphinxclient'
/bin/sh ./libtool --mode=compile --tag=CC gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c -o sphinxclient.lo sphinxclient.c
mkdir .libs
 gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c sphinxclient.c  -fPIC -DPIC -o .libs/sphinxclient.o
sphinxclient.c: In function 'net_connect_get':
sphinxclient.c:1358: error: 'SO_NOSIGPIPE' undeclared (first use in this function)
sphinxclient.c:1358: error: (Each undeclared identifier is reported only once
sphinxclient.c:1358: error: for each function it appears in.)
make[1]: *** [sphinxclient.lo] Error 1
make[1]: Leaving directory `/work/setup/sphinx-1.10-beta/api/libsphinxclient'
make: *** [all] Error 2

请打开sphinxclient.c,将以下代码:

#ifndef _WIN32
        if ( setsockopt ( sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, (sock
len_t)sizeof(optval) ) < 0 )
        {
                set_error ( client, "setsockopt() failed: %s", sock_error() );
                return -1;
        }
#endif

修改为:

#ifndef _WIN32
#ifdef SO_NOSIGPIPE
        if ( setsockopt ( sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, (sock
len_t)sizeof(optval) ) < 0 )
        {
                set_error ( client, "setsockopt() failed: %s", sock_error() );
                return -1;
        }
#endif
#endif

如果出现以下错误:

gcc -g -O2 -o test test.o  .libs/libsphinxclient.a
.libs/libsphinxclient.a(sphinxclient.o): In function `set_error':
/opt/software/sphinx-1.10-beta/api/libsphinxclient/sphinxclient.c:359: undefined reference to `_vsnprintf'
collect2: ld returned 1 exit status
make[1]: *** [test] Error 1
make[1]: Leaving directory `/opt/software/sphinx-1.10-beta/api/libsphinxclient'
make: *** [all] Error 2

则注释掉头部的:

#define vsnprintf _vsnprintf

就可以了。

接着:
make install

Sphinx Client PHP 模块安装
wget http://pecl.php.net/get/sphinx-1.1.0.tgz
tar zxf sphinx-1.1.0.tgz
cd sphinx-1.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinx/
make && make install

更新:
Sphinx 2.0.1 版本的安装请看:
http://hily.me/blog/2011/05/sphinx-server-2-0-1-quick-installation/

-- EOF --

MySQL 5.1 无法使用 InnoDB 的问题

使用 ./configure –with-plugins=innobase,innodb_plugin 配置 mysql 5.1.42,安装完成后启动 mysql,在 show engines 中仍然没有看到 InnoDB。
如果这时在 my.cnf 中有相关变量的定义,就会出现类似以下的错误:

100125 11:46:23 mysqld_safe Starting mysqld daemon with databases from /work/db/
3306/data
100125 11:46:23 [ERROR] /usr/local/mysql/libexec/mysqld: unknown variable ‘innod
b_data_home_dir=/work/db/3306/data’
100125 11:46:23 [ERROR] Aborting

这种情况下只需要在 my.cnf 中加入以下变量定义就可以了:

ignore_builtin_innodb
plugin_load=innodb=ha_innodb.so;innodb_trx=ha_innodb.so;innodb_locks=ha_innodb.s
o;innodb_lock_waits=ha_innodb.so;innodb_cmp=ha_innodb.so;innodb_cmp_reset=ha_inn
odb.so;innodb_cmpmem=ha_innodb.so;innodb_cmpmem_reset=ha_innodb.so

或者执行以下 sql 语句来加载:

install plugin innodb soname ‘ha_innodb.so’

更多插件可以用:

show plugin

来查看。

有将 mysql 升级到 5.1 以后版本的朋友需要特别注意这个问题了, 因为 5.1 后的版本(具体哪个版本开始我也不清楚),InnoDB 都不再内置了,都是以插件形式加载。

更多变量帮助请参考:
http://dev.mysql.com/doc/refman/5.1-maria/en/innodb-parameters.html

— EOF —

MySQL 5.1.42 configure 错误一例

./configure 时提示:

config.status: creating include/config.h
config.status: executing depfiles commands
config.status: executing libtool commands
/bin/rm: cannot remove `libtoolT’: No such file or directory
config.status: executing default commands

这时直接打开 configure,把 $RM “$cfgfile” 那行删除掉,重新再运行 ./configure 就可以了。
不过删除没删除,好像对编译没什么影响。

网上所说的那些方法根本不管用,如:

# aclocal
# autoconf
# automake
# libtoolize –force

或者:

# autoreconf –force –install
# libtoolize –automake –force
# automake –force –add-missing

这个也不行:

Note
For MySQL 5.1.12 and earlier, you must separately configure
the INNODB storage engine. You can do this by running the
following command from the main source directory:
shell> (cd storage/innobase; autoreconf –force –install)
shell> cd mysql-5.1
shell> autoreconf –force –install
shell> ./configure # Add your favorite options here
shell> make
Or you can use BUILD/autorun.sh as a shortcut for the
following sequence of commands:
shell> aclocal; autoheader
shell> libtoolize –automake –force
shell> automake –force –add-missing; autoconf
The command line that changes directory into the
storage/innobase directory is used to configure the InnoDB
storage engine. You can omit this lines if you do not require
InnoDB support.

— EOF —

无法远程连接 MySQL 的解决方法

近日在 Ubuntu 上安装了一个 MySQL 5.0,因为使用 phpMyAdmin 还必须安装 PHP,所以打算直接使用远程管理工具 Navicat for MySQL 来连接。

在 Ubuntu 中通过 mysql 命令行创建好一个数据表并分配了权限:

GRANT ALL ON testdb.* TO usera IDENTIFIED BY ‘passwd’

然后重启加载权限:

mysqladmin –uroot –p flush-privileges

之后使用 Navicat 连接时仍然提示没有权限:

2003 – Can’t connect to MySQL server on ‘ubuntu'(10061)

查看 mysql.user 表,usera 的确已经有了任意主机访问的权限。

于是想到是不是 MySQL Server 绑定了本地地址,打开 /etc/mysql/my.cnf,找到:

bind-address = 127.0.0.1

去除 IP 地址绑定,把它改为:

bind-address = 0.0.0.0

然后重启 MySQL Server:

/etc/init.d/mysql restart

这样 Navicat 就可以正常连接了,Debian下应该也有同样的问题。

— EOF —