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