如何在AIX中编译Perl
AIX默认是不带编译器的,所以如果要自己编译Perl,需要先安装编译器。开源的gcc自然可以算是最佳选择。
在64位平台的AIX中,如果选择使用gcc来编译perl源代码,默认情况下是编译成32位的版本。这样在编译DBD::Oracle的时候也需要选择正确的32位库,否则无法编译成功。也可以选择将Perl编译成64位的,这样在64位平台上应该更方便些,很多依赖库的路径使用默认即可。
编译成32位Perl
$./Configure -des -Dprefix=/opt/perl -Dcc=gcc $make && make install
编译成64位Perl
$./Configure -des -Dprefix=/opt/perl -Dcc='gcc -maix64' $make && make install
注:gcc在linux下64位编译选项为-m64,在HP-UX下64位编译选项为-mlp64。不同平台下需要编译64位程序,选用不同的选项即可。为了确认编译后的版本,可以使用-V选项运行perl:
$./perl -V
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
Platform:
osname=aix, osvers=5.3.0.0, archname=aix-64all
uname='aix dbtest 3 5 00cad8cf4c00 '
config_args='-des -Dprefix=/opt/perl -Dcc=gcc -maix64'
hint=recommended, useposix=true, d_sigaction=define
useithreads=undef, usemultiplicity=undef
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc -maix64 -maix64', ccflags ='-D_ALL_SOURCE -D_ANSI_C_SOURCE
-D_POSIX_SOURCE -DUSE_NATIVE_DLOPEN -fno-strict-aliasing -pipe
-maix64 -DUSE_64_BIT_ALL',
optimize='-O',
cppflags='-D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE
-DUSE_NATIVE_DLOPEN -fno-strict-aliasing -pipe'
ccversion='', gccversion='4.2.0', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=87654321
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=8
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='gcc -maix64 -maix64', ldflags =' -Wl,-brtl -Wl,-bdynamic -Wl,-b64'
libpth=/lib /usr/lib /usr/ccs/lib
libs=-lbind -lnsl -ldbm -ldl -lld -lm -lcrypt -lc
perllibs=-lbind -lnsl -ldl -lld -lm -lcrypt -lc
libc=/lib/libc.a, so=a, useshrplib=false, libperl=libperl.a
gnulibc_version=''
Dynamic Linking:
dlsrc=dl_aix.xs, dlext=so, d_dlsymun=undef,
ccdlflags='-Xlinker -bE:/opt/perl/lib/5.10.1/aix-64all/CORE/perl.exp'
cccdlflags=' ', lddlflags=' -Wl,-b64 -Wl,-bhalt:4 -Wl,
-G -Wl,-bI:$(PERL_INC)/perl.exp -Wl,
-bE:$(BASEEXT).exp -Wl,-bnoentry -lc -lm'
Characteristics of this binary (from libperl):
Compile-time options: PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP USE_64_BIT_ALL
USE_64_BIT_INT USE_LARGE_FILES USE_PERLIO
Built under aix
Compiled at Dec 1 2009 19:48:22
@INC:
/opt/perl/lib/5.10.1/aix-64all
/opt/perl/lib/5.10.1
/opt/perl/lib/site_perl/5.10.1/aix-64all
/opt/perl/lib/site_perl/5.10.1
如何在AIX上安装gcc
默认情况下AIX是不带编译器,如果需要编译一些源代码,则可以安装linux上常用的gcc。AIX上支持安装linux的RPM包。首先要安装RPM包支持,下载地址为:
ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox/INSTALLP/ppc/rpm.rte
使用installp安装即可,如下表示已经安装
lslpp -l rpm.rte Fileset Level State Description ---------------------------------------------------------------------------- Path: /usr/lib/objrepos rpm.rte 3.0.5.40 COMMITTED RPM Package Manager Path: /etc/objrepos rpm.rte 3.0.5.40 COMMITTED RPM Package Manager
然后去下载gcc的安装包,进入下面的链接即可下载IBM提供的AIX Toolbox for Linux Applications,包括gcc:
http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/download.html
AIX5.3上的gcc下载地址为:
ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox/RPMS/ppc/gcc/gcc-4.2.0-3.aix5.3.ppc.rpm
root>#rpm -i gcc-4.2.0-3.aix5.3.ppc.rpm root>#gcc -v Using built-in specs. Target: powerpc-ibm-aix5.3.0.0 Configured with: ../configure --with-as=/usr/bin/as --with-ld=/usr/bin/ld --enable-languages=c,c++,java --prefix=/opt/freeware --enable-threads --enable-version-specific-runtime-libs --host=powerpc-ibm-aix5.3.0.0 --target=powerpc-ibm-aix5.3.0.0 --build=powerpc-ibm-aix5.3.0.0 --disable-libjava-multilib Thread model: aix gcc version 4.2.0
Linux中如何让进程在后台运行
在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:
$ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh &
对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:
$ ./test.sh [1]+ Stopped ./test.sh $ bg %1 [1]+ ./test.sh & $ jobs -l [1]+ 22794 Running ./test.sh &
AIX平台升级到Oracle10.2.0.4的几个问题
最近将AIX5306上一个Oracle从9.2.0.6升级到了10.2.0.4,虽然最终升级顺利完成,不过还是碰到了几个小问题,在这里记录一下。
1. plan_table的问题
如果在9i的sys用户下手动执行过$ORACLE_HOME/rdbms/admin/utlxplan.sql脚本建立plan_table,则升级前必须删除。否则执行完升级脚本catupgrd.sql会发现Oracle Database Packages and Types组件一直是invalid的,并且升级脚本的log中有如下错误:
遇到该错误后,删除plan_table重建也还来得及:
@?/rdbms/admin/prvtspao.plb
@?/rdbms/admin/utlrp
2.lock_sga的问题
Oracle10.2.0.4在AIX平台分配共享内存的机制有了一点变化。原来9i使用lock_sga=true是正常的,但是10.2.0.4则无法启动instance,报错:
ORA-27126: unable to lock shared memory segment in core
IBM AIX RISC System/6000 Error: 1: Not owner
看起来像是权限问题,但是即使给Oracle用户加system组也没有用。后来Oracle解释说需要给Oracle用户赋予两个capability:CAP_BYPASS_RAC_VMM和CAP_PROPAGATE,但这两个capabilities是采用大页内存时才需要设置的,这样说10.2.0.4如果lock_sga的话,默认是要采用大页内存的。当然,大页内存的使用还需要os上设置相关参数的,如果os没有设置,oracle应该还是要采用4k的内存页。
#lsuser -a capabilities oracle
oracle capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE
3.dba_segments和dba_free_space空间计算不一致的问题
SUM(BYTES)/1024/1024/1024
-------------------------
468.554688
select sum(bytes)/1024/1024/1024 from dba_free_space;
SUM(BYTES)/1024/1024/1024
-------------------------
63.3510742
select sum(bytes)/1024/1024/1024 from dba_segments;
SUM(BYTES)/1024/1024/1024
-------------------------
381.477112
显然,468.554688-63.3510742=405.203614,这比从dba_segments算出来的总占用空间381.477112大了20多G,并且这个差距在不断拉大,每天大概相差4G左右。这个问题还在跟Oracle扯皮,不知道他们是否会承认这个是bug。