2.12.3. Solaris注意事项

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.23.2。可以从http://gcc.gnu.org/下载。请注意egcs 1.1.1gcc 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系统,在CFLAGSCXXFLAGS环境变量中加上-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二进制,在CFLAGSCXXFLAGS增加-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 储存引擎时将会造成严重的性能下降。

如果fdatasyncsched_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加到CFLAGSCXXFLAGS上并重新编译。

如果你正使用gccSFW版本(Solaris 8安装包内),运行configure之前你必须将/opt/sfw/lib加到环境变量LD_LIBRARY_PATH上。

如果你正使用从sunfreeware.com下载的gcc,会遇到许多问题。要想避免,应当在运行机器上重新编译gccGNU 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不提供静态版本的系统库(libpthreadslibdl),因此你不能用--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遇到内核文件。

2.12.3.1. Solaris 2.7/2.8注意事项

一般情况,可以在Solaris 2.72.8中使用Solaris 2.6二进制。大多数Solaris 2.6发布也适用Solaris 2.72.8

MySQL应当能够自动检测到新的Solaris版本并解决下面的问题。

Solaris 2.7/2.8include文件中有一些缺陷。当使用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

2.12.3.2. Solaris x86注意事项

x86 Solaris 8, 如果使用strip删除调试符号,mysqld转储内核。

如果正在 Solaris x86上使用gccegcs,并且你碰到了在装载时的内核转储问题,应该使用下列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

关注编程学问公众号