在Solaris中,甚至在解压缩MySQL分发版时,你也会遇到问题,因为Solaris tar不能处理长文件名。这说明解压缩MySQL分发版时会遇见错误。
如果出现这种问题,必须使用GNU tar(gtar)来解压缩分发版。可以从http://dev.mysql.com/downloads/os-solaris.html找到预编译的Solaris版本。
Sun原生线程只在Solaris 2.5和更高版本中工作。对于版本2.4和更早版本,MySQL自动使用MIT-pthreads。请参见2.8.5节,“MIT-pthreads注意事项”。
如果你运行configure时遇到下面的错误,说明编译器安装得有问题:
checking for restartable system calls... configure: error can not
run test programs while cross compiling
在这种情况下,应当将编译器升级到较新的版本。还可以在config.cache文件中插入下面的行来解决该问题:
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
如果在SPARC上使用Solaris,建议使用编译器gcc 2.95.2或3.2。可以从http://gcc.gnu.org/下载。请注意egcs 1.1.1和gcc 2.8.1不能在SPARC上可靠地工作。
当使用gcc 2.95.2时建议的configure行:
CC=gcc CFLAGS="-O3" \
CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local/mysql --with-low-memory \
--enable-assembler
如果你使用UltraSPARC系统,在CFLAGS和CXXFLAGS环境变量中加上-mcpu=v8 -Wa,-xarch=v8plusa,性能可以提高4%。
如果你有Sun Forte 5.0(或更新版)编译器,可以运行:
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" \
CXX=CC CXXFLAGS="-noex -mt" \
./configure --prefix=/usr/local/mysql --enable-assembler
要想用Sun Forte 编译器创建64-位二进制,使用下面的配置选项:
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" \
CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" \
./configure --prefix=/usr/local/mysql --enable-assembler
要想使用gcc创建64-位Solaris二进制,在CFLAGS和CXXFLAGS中增加-m64,并从configure行删掉--enable-assembler。
在MySQL基准测试中,在UltraSPARC上使用32位模式的Forte 5.0,同使用带-mcpu标记的gcc 3.2比较,速度提高了4%。
如果创建了64位的mysqld二进制,速度要比32-位二进制慢4%,但是可以处理更多的线程和内存。
当为x86_64使用Solaris 10时,你应当安装用forcedirectio选项保存InnoDB文件的文件系统。(默认情况不用该选项来安装)。如果不这样做,当在该平台上使用InnoDB 储存引擎时将会造成严重的性能下降。
如果fdatasync或sched_yield出现问题,你可以在configure行加LIBS=-lrt修复该问题。
对于早于WorkShop 5.3的编译器,你可能需要编辑configure脚本。应将该行:
#if !defined(__STDC__) || __STDC__ != 1
更该为:
#if !defined(__STDC__)
如果你用-Xc 选项打开__STDC__,Sun 编译器不能用Solaris pthreads.h 头文件编译。这是一个Sun 缺陷(中断的编译器或include文件)。
如果运行mysqld时出现下面的错误消息,原因是你企图不启用-mt multi-thread选项而用Sun编译器编译MySQL:
libc internal error: _rmutex_unlock: rmutex not held
将-mt加到CFLAGS和CXXFLAGS上并重新编译。
如果你正使用gcc的SFW版本(在Solaris 8安装包内),运行configure之前你必须将/opt/sfw/lib加到环境变量LD_LIBRARY_PATH上。
如果你正使用从sunfreeware.com下载的gcc,会遇到许多问题。要想避免,应当在运行机器上重新编译gcc和GNU binutils。
如果你用gcc编译MySQL时遇到下面的错误,说明gcc配置不适合Solaris的版本:
shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ...
./thr_alarm.c: In function `signal_hand':
./thr_alarm.c:556: too many arguments to function `sigwait'
在这种情况下正确的做法是得到最新版本的gcc,并用你当前的gcc编译器编译。至少对于Solaris 2.5,几乎所有二进制版本的gcc有旧的不再使用的include文件,中断了所有使用线程的程序,也可能会中断其它程序。
Solaris不提供静态版本的系统库(libpthreads和libdl),因此你不能用--static编译MySQL。如果你试图这样做,会遇到下面的错误:
ld: fatal: library -ldl: not found
undefined reference to `dlopen'
cannot find -lrt
如果你连接你自己的MySQL客户端程序,运行时会出现下面的错误:
ld.so.1: fatal: libmysqlclient.so.#:
open failed: No such file or directory
可以通过下面的方法避免该问题:
· 用-Wl,r/full/path/to/libmysqlclient.so标记而不要用-Lpath)连接客户端。
· 将libmysqclient.so复制到/usr/lib。
· 运行客户端程序前,将libmysqlclient.so目录的路径名加到LD_RUN_PATH环境变量上。
如果你未安装zlib用 -lz连接时configure出现问题,你有两个选则:
· 如果你想要使用压缩通信协议,你需要从ftp.gnu.org获得并安装zlib。
· 构建MySQL时用--with-named-z-libs=no选项运行configure。
如果你正使用gcc,向MySQL调用用户定义函数(UDF)时出现问题,尝试向UDF连接行添加-lgcc到。
如果想让MySQL自动启动,可以将support-files/mysql.server复制到/etc/init.d,并创建/etc/rc3.d/S99mysql.server符号连接。
如果有太多进程试图快速连接mysqld,你应当能再MySQL日志只看见错误:
Error in accept: Protocol error
可以尝试用--back_log=50选项启动服务器来解决该问题。(在MySQL 4以前的版本中使用-O back_log=50)。
Solaris不支持setuid() 应用程序所需的内核文件,因此如果你使用--user选项你不能从mysqld遇到内核文件。
一般情况,可以在Solaris 2.7和2.8中使用Solaris 2.6二进制。大多数Solaris 2.6发布也适用Solaris 2.7和2.8。
MySQL应当能够自动检测到新的Solaris版本并解决下面的问题。
Solaris 2.7/2.8的include文件中有一些缺陷。当使用gcc时你会看见下面的错误:
/usr/include/widec.h:42: warning: `getwc' redefined
/usr/include/wchar.h:326: warning: this is the location of the previous
definition
如果出现该问题,修复的办法是将/usr/include/widec.h复制到.../lib/gcc-lib/os/gcc-version/include,并将41行从:
#if !defined(lint) && !defined(__lint)
更改为:
#if !defined(lint) && !defined(__lint) && !defined(getwc)
另外,可以直接编辑/usr/include/widec.h。用任何一种方法修复后,应当删掉config.cache并再次运行configure。
如果运行make时遇到下面的错误,这是因为configure不能检测到curses.h文件(可能是因为/usr/include/widec.h中的错误):
In file included from mysql.cc:50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'
可以用下面任何一种方法解决该问题:
· 用CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure配置。
· 根据前面的讨论编辑/usr/include/widec.h并重新configure。
· 删掉config.h文件中的#define HAVE_TERM行并重新运行make。
如果链接客户端程序时连接器找不到-lz,问题可能是libz.so文件安装到了/usr/local/lib。可以用下面任何一种方法解决该问题:
· 向LD_LIBRARY_PATH增加/usr/local/lib。
· 增加到libz.so from /lib的连接。
· 如果使用Solaris 8,可以安装Solaris 8 CD分发版中的可选项zlib。
· 构建MySQL时用--with-named-z-libs=no选项运行configure。
在x86 Solaris 8上, 如果使用strip删除调试符号,mysqld转储内核。
如果正在 Solaris x86上使用gcc或egcs,并且你碰到了在装载时的内核转储问题,应该使用下列configure命令:
CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \
CXX=gcc \
CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors \
-fno-exceptions -fno-rtti -DHAVE_CURSES_H" \
./configure --prefix=/usr/local/mysql
用libstdc++库和与C++异常处理来避免这个问题。
如果这没有帮助,你应该编译一个调试版本并且用一个踪迹文件运行它或在gdb下运行它。请参见E.1.3节,“在gdb环境下调试mysqld”。