ITEEDU

2.12.3. Solaris注意事项

2.12.3.1. Solaris 2.7/2.8注意事项
2.12.3.2. Solaris x86注意事项

在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遇到内核文件。