Skip to content

Unix and Linux

Aix clone cause the user process limit value changed

aix 5以及aix6系统在克隆以后,导致oracle用户的process数量限制初始化为128.在一切ha搭建或者主备机切换过程会导致监听以及中间件,客户端时而可连时而不可连接的状况。

在实施oracle要求中这个参数应该设置为65536或者大于65536.可以通过在root用户中进去smit chgsys修改,当然也可以用命令 chdev -l sys0 -a maxuproc ‘65536’来修改。

最近几个客户在克隆系统后,都遭遇了此类问题。希望对大伙有帮助,能引起注意。

Linux Bash漏洞检测以及修补方法

在广泛使用的Linux软件Bash中新发现了一个安全漏洞。该漏洞对电脑用户构成的威胁可能比今年4月发现的“心脏流血”(Heartbleed)漏洞更大。Hacker可以利用Bash中的漏洞完全控制目标系统,执行任意代码。

【BASH漏洞检测方法】
漏洞检测命令:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

如果显示如上,那么,很遗憾,必须立即打上安全补丁修复。

【建议修补方案 】

特别提示:该修复不会有任何影响。

根据Linux版本选择您需要修复的命令:.

centos:
yum -y update bash

ubuntu:
14.04 64bit
wget http://mirrors.aliyun.com/fix_stuff/bash_4.3-7ubuntu1.1_amd64.deb && dpkg -i bash_4.3-7ubuntu1.1_amd64.deb

14.04 32bit
wget http://mirrors.aliyun.com/fix_stuff/bash_4.3-7ubuntu1.1_i386.deb && dpkg -i  bash_4.3-7ubuntu1.1_i386.deb


12.04 64bit
wget http://mirrors.aliyun.com/fix_stuff/bash_4.2-2ubuntu2.2_amd64.deb && dpkg -i  bash_4.2-2ubuntu2.2_amd64.deb

12.04 32bit
wget http://mirrors.aliyun.com/fix_stuff/bash_4.2-2ubuntu2.2_i386.deb && dpkg -i  bash_4.2-2ubuntu2.2_i386.deb

10.× 64bit
wget http://mirrors.aliyun.com/fix_stuff/bash_4.1-2ubuntu3.1_amd64.deb && dpkg -i bash_4.1-2ubuntu3.1_amd64.deb

10.× 32bit
wget http://mirrors.aliyun.com/fix_stuff/bash_4.1-2ubuntu3.1_i386.deb && dpkg -i bash_4.1-2ubuntu3.1_i386.deb


debian:
7.5 64bit && 32bit
apt-get -y install --only-upgrade bash

6.0.x 64bit
wget http://mirrors.aliyun.com/debian/pool/main/b/bash/bash_4.1-3%2bdeb6u1_amd64.deb &&  dpkg -i bash_4.1-3+deb6u1_amd64.deb

6.0.x 32bit
wget http://mirrors.aliyun.com/debian/pool/main/b/bash/bash_4.1-3%2bdeb6u1_i386.deb &&  dpkg -i bash_4.1-3+deb6u1_i386.deb

opensuse:
13.1 64bit
wget http://mirrors.aliyun.com/fix_stuff/bash-4.2-68.4.1.x86_64.rpm && rpm -Uvh bash-4.2-68.4.1.x86_64.rpm


13.1 32bit
wget http://mirrors.aliyun.com/fix_stuff/bash-4.2-68.4.1.i586.rpm && rpm -Uvh bash-4.2-68.4.1.i586.rpm

aliyun linux:
5.x 64bit
wget http://mirrors.aliyun.com/centos/5/updates/x86_64/RPMS/bash-3.2-33.el5.1.x86_64.rpm && rpm -Uvh bash-3.2-33.el5.1.x86_64.rpm

5.x 32bit
wget http://mirrors.aliyun.com/centos/5/updates/i386/RPMS/bash-3.2-33.el5.1.i386.rpm && rpm -Uvh bash-3.2-33.el5.1.i386.rpm

【修补完成测试】
升级bash后,执行测试:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

如果显示如上,表示已经修补了漏洞。

快速检测多路径对应的DISK的脚本

该脚本为检测rac中disk多路径的情况,在添加磁盘进asm时候要格外小心,需要反复验证多路径对应磁盘,加错盘的情况时有发生,这脚本可以帮助DBA在添加磁盘时候判断对应lun的多路径的情况。

如果aix需要把sd改成rlv,把多路径的命令更换。

脚本为:

#!/bin/ksh
for disk in `ls /dev/sd*`
do
disk_short=`basename $disk`
wwid=`scsi_id -g -s /block/$disk_short`
if [ "$wwid" != "" ]
then
  echo -e "Disk:" $disk_short "\tWWID:" $wwid
fi
done

结果为:


Disk: sda       WWID: 3600601602b702d006218b7de8130e111
Disk: sdaa      WWID: 3600601602b702d000652b695c648e111
Disk: sdab      WWID: 3600601602b702d000752b695c648e111
Disk: sdac      WWID: 3600601602b702d007f2a73fbc648e111
Disk: sdad      WWID: 3600601602b702d007e2a73fbc648e111
Disk: sdae      WWID: 3600601602b702d006218b7de8130e111
Disk: sdaf      WWID: 3600601602b702d0036d7cf191241e111
Disk: sdag      WWID: 3600601602b702d0037d7cf191241e111
Disk: sdah      WWID: 3600601602b702d0038d7cf191241e111

AWK常用语法

关于AWK
1. awk非常适合于结构化的文本文件(行、列数据)复杂处理。相对于sed而言,它可进行复杂的编程处理,并且可以产生复杂的报表输出。
2. awk通常有三个版本,旧awk、nawk(新)、gawk。Solaris下建议用nawk,因为旧awk有很多功能不支持,例如数学运算幂 ^ ,函数getline,system等。
3. 基本语法:awk ‘pattern{action}’ filename 其中action内容可扩充,也可以有多个action。
执行顺序:awk一行行读入输入文件,顺序执行‘’内内容,按模式匹配来采取动作。
其他调用:awk可用内部变量和函数,条件与循环语句,也可执行数学运算和字符串操作。此外,可以使用BEGIN和END来执行处理前预操作和处理后后继 操作。
A. 常用内部变量:NR(当前行数)NF(字段总数)$0(当前整行)$1(第一个记录)
FS(字段分隔符)OFS(输出字段分隔符)ORS(输出记录分隔符)
B.模式 pattern可以是/ /包含的匹配形式,也是条件语句如$3<10
C.BEGIN(处理文件前的action,常包含FS、OFS等)、END(处理文件后的action)
D.条件与循环:if else(next,exit),for do while (continue,break)
E.数学运算符 + – * / % ^;数学函数sin int;字符串函数length index gsub substr等
F.数组与关联数组:a[1]; a[$1]; a[$0]; a[b[i]]
F.输出重定向和管道:> >> | ;awk内部命令:getline、system等
4.awk的三种调用方式: awk ‘pattern{action}’ filename1,filename2
awk –f myscript.awk filename1,filename2
#!/bin/nawk –f … … 执行:myscript.awk filename

特别注意事项:
———————————————————————————————————————-
A.从window拷贝语法句到Unix中,行结尾可能有不识别的字符会导致语法错误
B.写script文件时,BEGIN或END后必须紧跟{
C.所有action语句必须放在{ }中,否则提示语法错误。例如不可直接写print
D.单独的赋值或pattern条件句没有{ }则默认print $0;例如{ }外面的i=1
E.if条件块必须放在action中,也就是必须要有{ }来包含
F.条件的判断“相等”须用= =,而不是=(赋值);例如,if($1= =100)
G.输出多列须用“,”(逗号)隔开;for循环中间隔符为“;”而不是“,”
实例演练:(filename为以下文件,注意:第二列用“-”隔开而非空格,以避免与FS冲突)
ID Name Age City Country Tel Salary Children
1001 Steven 25 NY U.S.A +01-02-323222 $4900 2
1002 Huang-Yu 30 BJ CHN +86-10-36789966 ¥6000 1
1003 Fish-Mad 27 SG SG +65-67456632 $3000 3
1004 Vale-Kiss 46 LD ENG +44-20-87634321 $6280 3
以下分基础实例:1.无pattern 的action实例 2.有pattern的action实例
3.BEGIN,END,FS,OFS实例 4.if else; for while循环实例
5.数学运算与字符串操作实例
高级实例:6.数组与关联数组运用实例 7.多文件运用NR FNR实例
8.输出重定向和getline实例 1

基 础 篇
1.无pattern的action实例
a.awk ‘{print NR $1 $NF}’ data.txt 打印行号,第一列和最后一列,中间无分隔符
b.awk ‘{print $1,$NF}’ data.txt 打印第一列和最后一列,并且中间有分隔符
c.awk ‘{print $0,$NF+10}’ data.txt 打印整行,并打印 最后一行加上10的结果
2.有pattern的action实例
a.awk ‘/[0-9]/’ data.txt 打印记录中任意列包含数字0-9的行
b.awk ‘/01/||/02/’ data.txt 打印包含01或者02的行
c.awk ‘/01/,/02/’ data.txt 打印既包含01又包含02的行;等同awk ‘/01/&&/02’
d.awk ‘$1= =1001{print $2}’ data.txt 打印符合第一列等于1001的第二列
e.awk ‘$2= =”Steven”{print}’data.txt 打印符合第二列等于Steven的那些行
f.awk ‘$3>20&&$3<30’ data.txt 打印第三列在20到30之间的那些行
g.nawk ‘$3*$NF<100’ data.txt 打印第三列和最后一列乘积小于100的那些行
h.awk ‘$6~/01/{print $2}’ data.txt 打印符合仅仅第六列里包含01那些行的第二列
i.awk ‘NR>3{print $1,$2}’ data.txt 从第四行才开始打印第一列和第二列
3.有BEGIN、END并包含FS、OFS的实例
a.awk –F”+” ‘{print $1}’ data.txt 按+为分隔符来分隔列,并打印第一列
b.nawk –F’[+\t$]’ ‘{print $6,$7,$8,$9}’data.txt 按+或\t或$都可作分隔符,并打印指定列
c.nawk ‘BEGIN{FS=”[\t+$]”}{print $6,$8,$9}’data.txt
按+,\t,$(顺序无所谓)为分割符,并打印指定列
d.nawk ‘BEGIN{FS=”[\t+$]”;OFS=”%”}{print $6,$7,$8,$9}’ data.txt
按+,\t,$为分割符,用%作输出分隔符打印指定列
e.nawk –F‘[ [ ] ]’ ‘{print $1}’ data.txt 按 [ 或 ] 为分隔符,并打印第一列
f.nawk –F‘[ ][ ]’ ‘{print $1}’ data.txt 同上,按[ 或 ] 为分隔符,并打印第一列
关于-F和BEGIN内的FS定义特别注意如下:
A.-F参数后紧跟单个分隔符,则用双引号“”,例如 –F”+”
B.-F参数后紧跟多个分隔符,则用单引号‘ ’并用[ ],中间顺序无所谓,例如-F’[+$]’
C.BEGIN中的FS无论是单个还是多个分隔,均用双引号“”,多个则需加[ ]
例如:nawk ‘BEGIN{FS=”[\t+$]”}{print $6,$8,$9}’data.txt
D.BEGIN中若同时有FS和OFS,则建议中间用分号“;”来分隔开,否则提示出错
例如:nawk ‘BEGIN{FS=”[\t+$]”;OFS=”%”}{print $6,$7,$8,$9}’ data.txt
E.半方括号[ ]也可以作为分隔符,顺序无所谓。例如:-F‘[[]]’ 或 –F‘[][]’
F.在用多个分隔符的时候,为避免语法错误或想得到正确的结果,最好用nawk
4.条件if else和for while循环实例
a.nawk ‘{print($3>25 ? $2“ Old” : $2“ Young”)}’ data.txt
若第三列大于25就打印某某Old;否则打印某某Young
b.awk ‘{if($1>1002)print $2; else print $3}’ data.txt
若第二列大于1002就打印第二列,否则打印第三列
c.awk ‘NR>1{if($3<30)print$2;else if($3<40) print$2”m”;else exit;}END{print 10}’data.txt
从第二行开始判断第三列的值,如果小于30就打印$2,如果大于30而又小于240,打印$2并后跟m,若是都不符合就退出处理行,但是END后的操作仍执行
d.awk ‘BEGIN{ORS=””}{for(i=1;i
打印出每行的前面几列,最后几列不打印。特别注意:默认情况下,print每执行一次时,另起一行打印。因此为避免每打印一列就重新一行,设置ORS为 空,但是在每打印完符合条件的所有列后,需要手工换行(循环外的print起此作用)。
e.awk ‘BEGIN{ORS=””}{i=1; while(i
功能同上,打印出每行的前面几列,最后几列不打印。
5.数学运算和字符串操作实例
a.nawk ‘{print 2^5+sin(2.1)+int(0.9)}’ data.txt 在每一行都打印运算值(32.8632)
b.awk ‘END{print length(“How are you?”)}’ data.txt 打印出字符串的长度(12)
c.awk ‘END{print index(“How are you?”,”you”)}’ data.txt 返回you在字符串中的开始位置(9)
d.nawk ‘{gsub(/ \$/,””);print $0}’ data.txt 把每行的$符号用空替掉,并打印行
e.awk ‘END{print substr(“How are you?”,9,3)}’ data.txt
从字符串的第九个位置开始截出后面3个长度的子字符串
f.nawk ‘{print toupper($2), tolower($2)}’ data.txt
分别打印第二列大写和小写
g.nawk ‘END{print match(“How are you you?”,/you/),RSTART,RLENGTH}’ data.txt
打印you在字符串中第一个匹配的位置以及长度(9,9,3)
h.nawk ‘END{str=”How are you doing?”;sub(/o/,”0”,str);print str}’ data.txt
将字符串变量指定字符中第一个符合含有o的用0替换调
特别注意:sub函数的第三个参数不可直接用字符串,而必须用字符串变量。
i.awk ‘END{print split(“Jan,Feb,Mar,Apr,May”,mymonths,”,”),mymonths[2]}’ data.txt
将字符串用第三个参数分隔符号进行分隔,把分隔的各个元素放在第二个参数的数组中,函数返回分隔得到的元素数目。结果:(5,Feb)

高 级 篇
6.数组与关联数组(a[1],a[$1] a[$0],a[b[i]])
a.awk ‘{for(i=1;i
b.awk ‘{a[$1]=$2}END{for(x in a) print a[x]}’ data.txt
数组a关联到第一列,并将第二列值赋给a,最后打印a中的所有内容。注意:但不是顺序打印。for中的x是随意变量,awk自动确定。
c.awk ‘{b[i]=$1;a[$1]=$2;i++}END{for(j=1;j
实现从第二行开始打印每一行的第一列和第二列的功能。
注意:i从0开始取值,而j从1开始。a为关联数组,b为顺序数组。
7.多输入文件和NR、FNR的实例
a. awk ‘BEGIN{OFS=FS=”:”} NR==FNR{a[$1]=$2} NR>FNR{$2=a[$1];print}’
/etc/shadow /etc/passwd
该语句中第一个模式匹配到第一个输入文件shadow,第二个模式匹配到第二个输入文件passwd,并使用关联数组,实现不同文件关联列的其他列值相互 替换。 3
A.awk对多输入文件的执行顺序是,先将代码作用于第一个文件(一行行读入),然后该重复的代码又作用于第二个文件,再作用于第三个文件。
B.awk对多输入文件的执行顺序产生了行序号的问题。当第一个文件执行完,下次读入第二个文件,那么第二个文件的第一行怎么算呢?如果又计为1的话,那 不就两个1了么?(因为第一个文件也有第一行)。这就是NR和FNR的问题。
NR :全局行数(第二个文件的第一行接着第一个文件尾行数顺序计数)
FNR:当前文件自身的行数(不考虑前几个输入文件的自身行数及总数)
例如:data1.txt中有40行,data2.txt中有50行,那么awk ‘{}’ data1.txt data2.txt
NR 的值依次为:1,2……40,41,42……90
FNR的值依次为:1,2……40, 1, 2……50
8.重定向输出和特别函数getline实例
a.awk ‘{print FILENAME,$0}’ data1.txt data2.txt >data_all.txt
把第一个文件和第二个文件合并到data_all.txt中,新文件第一列为原始文件名,后面列为原始文件内容。
b.awk ‘$1!=fd{close(fd);fd=$1} {print substr($0,index($0,“ ”)+1)>$1}’ data_all.txt
把合并后的新文件data.txt重新拆开成原来的两个子文件,依照新文件的第一列来产生新文件名。生成一个完整子文件后,关闭之;再生成下一个子文件。
A.getline从整体上来说,应这么理解它的用法:
当其左右无重定向符 | 或 < 时,getline作用于当前文件,读入当前文件的第一行给其后跟的变量 var 或$0(无变量);应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 当其左右有重定向符 | 或 < 时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第 一行,而不是隔行。 B.getline用法大致可分为三大类(每大类又分两小类),即总共有6种用法。代码如下: nawk ‘BEGIN{“cat data.txt”|getline d; print d}’ data2.txt nawk ‘BEGIN{“cat data.txt”|getline; print $0}’ data2.txt nawk ‘BEGIN{getline d < “data.txt”; print d}’ data2.txt nawk ‘BEGIN{getline < “data.txt”; print $0}’ data2.txt 以上四行代码均实现“只打印data.txt文件的第一行”(若打印全部行,用循环) eg. nawk ‘BEGIN{FS=”:”;while(getline<”/etc/passwd”>0){print $1}}’ data.txt
nawk ‘{getline d; print d”#”$3}’ data.txt
awk首先读入第一行,接着处理getline函数,然后把下一行指定给变量d,再先打印d,由于d后面有换行符,所以后面紧跟的#会覆盖d,后面的$3 同样也会覆盖d。
nawk ‘{getline; print $0”#”$3}’ data.txt
awk首先读入第一行接着处理getline函数,然后把下一行指定给$0,现在的$0已经是下一行内容,后面的#和$3(从$0中取)会覆盖$0的内 容。
c.nawk ‘BEGIN{system(“echo \”input your name:\” ”);getline var; print “\nYour name is”,d,”\n”}’
系统提示输入名字,然后将输入的名字打印出来。特别注意:该awk语句后没有输入文件名,而是利用键盘输入作为文件名。
4

经 典 实 例
1.问题描述
有如下银行帐单部分文本,
200000000000007|shi yan city qi pei bu
202111320000018|hospital
200000000000007|shiyan city renmen road qi bei bu
201602520002941|middle school
200000000000007|mingfeng road qi pei
201602120000113|zhuanghuang factory
201602320000115|liangyou factory
要求:将第一列中重复的合并为一行,其第二列填入最长地址的那列
得到的结果应为:
200000000000007|shiyan city renmen road qi bei bu
202111320000018|hospital
201602520002941|middle school
201602120000113|zhuanghuang factory
201602320000115|liangyou factory
代码:(假设下面代码在文件myawk..sh中)
#!/usr/bin/nawk -f
BEGIN{FS=OFS=”|”; i=1;}
{ if(a[$1]==0){b[i]=$1;a[$1]=$2;i++}
if(length(a[$1])
}
END{for(j=1;j
}
执行:myawk.sh data.txt
比较代码:(实现不全)
awk ‘BEGIN{FS=OFS=”|”} !(length(a[$1])>length($2)){a[$1]=$2} END{for(i in a)print i,a[i]}’ data.txt
解释:此例中,用了两个数组,a用来与$1关联,b用来顺序记录,使得在最后打印时是完全按照$1顺序打印。条件句首先判断数组元素是否是第一次写入,若 非,则比较当前$2值和以前储存的值长度。
功能不全代码不能顺序打印。当$1有重复,而$2长度第一次、第二次、第三次是以递减的方式时,该代码应用得较好。但是,当$2各次得到的长度不确定时, 代码不能实现上述功能。例如:本例中第5行的第二列若比第3行的第二列长度长时,功能不全代码就不能实现要求。 5
2.问题描述:
有两个文件如下:
data1文件内容:
1 0.5 100
10 15 36.5
data2文件内容:
50 10 19
3.2 1 5
要求:得到一个新的文件,内容是data1和data2对应的列数字相加的和,新文件内容:
51 10.5 119
13.2 16 41.5
代码:(假设下面代码在文件myawk..sh中)
#!/usr/bin/nawk -f
{ for(i=1;i< =NF;i++) a[i]=$i; getline < “data2.txt” for(j=1;j printf $NF+a[NF]“\n” } 执行:myawk.sh data1.txt 解释: 上述代码用到了getline同时读入第二个文件的行内容并存入到$0中,最后用printf来实现相加后的打印。注意后面同时紧跟打印了\t和\n,以 用来列之间的分隔和行之间的分隔。此外,也可以用print来实现,但是print每执行完一次都要换行,(当然可以用OFS来进一步处理)。 实际上也可以用另外一种办法来实现,就是用NR、FNR比较,然后分别将两个文件赋值给不同的数组,然后相加。当然代码就没有上述代码简练。 3.问题描述 有两个如下文件: data2.txt 文件内容如下: 01 1111 AAA WW001 $$$$ 1000.00 02 2222 BBB GG001 %%%% 2000.00 03 3333 CCC JJ001 **** 3000.00 04 4444 DDD FF002 &&&& 4000.00 05 5555 EEE RR002 @@@@ 5000.00 06 666 FFF UU003 JJJJ 6000.00 07 777 III II005 PPPP 7000.00 08 8888 TTT TT008 TTTT 8000.00 data1.txt 文件内容如下: AAA 001 1000.00 BBB 001 2000.00 DDD 002 4000.00 EEE 002 5000.00 FFF 003 6000.00 data1的第1列、最后一列和data2的第3列、最后一列是相同的, data1的第2列和data2的第4列的后3位是相同的。 要求:data2中第三列、第四列后3位、第六列完全和data1相同的取出来得到新文件如下内容: 6 01 1111 AAA WW001 $$$$ 1000.00 02 2222 BBB GG001 %%%% 2000.00 04 4444 DDD FF002 &&&& 4000.00 05 5555 EEE RR002 @@@@ 5000.00 06 666 FFF UU003 JJJJ 6000.00 代码: nawk ‘NR<=FNR {a[$1]=$1″x”$2″x”$3} NR>FNR { b=substr($4,3);
c=$3″x”b”x”$6;
if(c==a[$3]) print}’ data1.txt data2.txt
执行:直接执行上述代码
解释:本例巧妙地利用了组合字符串(用x来组合),然后用来比较。
当NR< =FNR时,处理第一个文件,当NR>FNR时,处理第二个文件。

引用参考AWK常用语法

Killed远程登录Oracle的所有进程的方法

此方法用在停应用系统后,清除所有远程登录的客户端进程,特别是在进程过多的情况下。

!!!切忌千万不要在生产端轻易运行,否则后果自负

脚本:killsess.sh

########killsess.sh#########
#author:ludatou@2014/07/24 feigigi@qq.com
#desc:kill all session connect from client
ps -ef | grep LOCAL=NO | grep -v grep|awk '{if($3~/^[0-9]+$/)print $2}' > sessinfo.out
cat sessinfo.out |while read pid
do
  kill -9 $pid
done
cat /dev/null > sessinfo.out

例子:

[root@ludatou ~]# ps -ef | grep LOCAL|grep -v grep
ora10g   22367 22333  0 20:21 ?        00:00:00 oraclelu10g (DESCRIPTION=(LOCAL=NO)(ADDRESS=(PROTOCOL=beq)))
[root@ludatou ~]# chmod +x killsess.sh
[root@ludatou ~]# ./kiilsess.sh
[root@ludatou ~]# ps -ef | grep LOCAL|grep -v grep
[root@ludatou ~]# 

关于Aix上的逻辑卷偏移量

##########################
www.ludatou.com 大头
转载请指明处,否则追责法律责任
##########################

在AIX5.3中,系统支持三种类型的VG,分别是Original VG、Big VG、Scalable VG(AIX5.3的新特性)。
mkvg命令默认将创建Origninal VG:最大支持32 physical volumes and 255 logical volumes
mkvg –B命令将创建Big VG:最大支持128 physical volumes and 512 logical volumes
mkvg –S命令将创建Scalable VG:最大支持1024 physical volumes, 256 logical volumes and 32k physical partitions

应用程序直接访问LVCB是比较危险的,因此在建立数据文件使用的裸设备时,不能从逻辑卷开始位置,而是应该有一个偏移量(offset),偏移量的大小应大于LVCB的大小,一般用一个AIX逻辑块的大小做偏移量,即4096字节。Oracle数据库会自动跳过前 4k不用,这样保证了lvcb不会被覆盖,但这带来了另一个潜在的问题,当 Oracle的db_block_size大于4k的时候,一个Block可能跨在两个PV/LUN/磁盘上(如果做了条带化,那么将总有数据块跨在两个条带上–其实也还是将跨在不同的 PV/LUN/磁盘上。这样当系统崩溃的时候,很有可能造成大量的IO不完整,一个PV上IO写入,另一边可能未完成,启动Oracle的时候将会看到ORA-1578 错误,这几乎是致命的。
原有的带有偏移量的lv类型就叫做DS_LV。未解决上述问题,AIX引进了一种新的LV类,也就是“Z”类型LV,这种类型的LV通过lslv -L lv_name可以看到它的类型为:DS_LVZ。
零偏移量LV的创建:
1.在Origninal VG中,不论是否使用“-T O”参数,创建出来的lv都是DS_LV类型。
2.在Scalable VG中,不论是否使用“-T O”参数,创建出来的lv都是DS_LVZ类型。
3.在Big VG中,使用“-T O”参数,创建出来的lv都是DS_LVZ类型,而不使用则是DS_LV类型。

由此可见,为了解决alert日志中报告的问题,使用scalable VG或是big VG创建DS_LVZ类型的LV(zero offset)即可解决。

检查lv是不是0偏移的裸设备命令:
1、用oracle账户执行:dbfsize /dev/rlv_test
2、lslv -L lvName
案例:

hz@bank:[/home/oracle]#lslv -L lvdata002
LOGICAL VOLUME:     lvdata002              VOLUME GROUP:   datavg02
LV IDENTIFIER:      00cffde300004c000000012157f880d8.81 PERMISSION:     read/write
VG STATE:           active/complete        LV STATE:       opened/syncd
TYPE:               raw                    WRITE VERIFY:   off
MAX LPs:            512                    PP SIZE:        256 megabyte(s)
COPIES:             2                      SCHED POLICY:   parallel
LPs:                16                     PPs:            32
STALE PPs:          0                      BB POLICY:      relocatable
INTER-POLICY:       minimum                RELOCATABLE:    no
INTRA-POLICY:       middle                 UPPER BOUND:    16
MOUNT POINT:        N/A                    LABEL:          None
MIRROR WRITE CONSISTENCY: off
EACH LP COPY ON A SEPARATE PV ?: no
Serialize IO ?:     NO
DEVICESUBTYPE : DS_LVZ

确认VG的类型,用命令 lsvg 看 MAX PVs 的值—-Normal: 32, Big:128, Scalable:1024 (不一定准确,准确的查询用下面的方法)

lqueryvg -At -g VGID(如00cffde300004c000000012157f8acd7)

10.111.4.1上查看到datavg03的 VG Type:1,0对应的是普通,1对应的是big,2对应的是scale

创建数据库使用的裸设备

mklv -y 'lvxscmxindx004' -T O -w 'n' -s 'n' -r 'n' -t raw datavg 20

关于AIX双网卡的负载均衡与HA冗余

在AIX上一般在开始设计的一套数据库后台系统时候,在Power AIX层面都会考虑到硬件的冗余,比如交换机,网卡,Host DISK,FC卡,FC线等,今日一个朋友提出疑问,在AIX层面做EtherChannel时候是否存在流量的负载均衡以及互备模式,AIX的EtherChannel模式如下,

1.Standard: 在这种模式下EtherChannel使用目标主机的IP地址来决定用哪一块网卡来发送数据。EtherChannel用目标IP的末字节除以成员网卡的个数的余数(模)来决定由哪一块网卡发送数据。比如目标IP是10.10.10.1, EtherChannel中有两块成员网卡, (1 % 2) = 1, 所以第二块网卡被用来发送数据 (网卡编号从0开始)。 网卡编号按照它们在smit界面中列出的顺序排列。对于非IP流量(如ARP), 目标MAC地址的末字节被用来进行计算。 这是默认的运行模式。

2.Round Robin: 在这种模式下各个成员网卡被轮流使用,每轮每个网卡发送一个数据包。

3.Network Interface Backup: 这种模式是用于AIX 5.1和AIX 4.3.3的网卡后备模式。在这种模式下,EtherChannel在任何时刻都只将一块网卡用于负担网络流量。主要用于网卡连接到不同的交换机上,并且通过任何的交换机都可以到达同样的网络的情况下。当检测到某个网卡-交换机连接出现问题时(通过网线检测或选择ping某个IP地址, EtherChannel将停止当前的成员网卡并启动下一个成员网卡。只有这种模式会用到Internet Address to Ping, Number of Retries和Retry Timeout选项。

4.Backup Adapter: 可选项。用于AIX 5.2的EtherChannel后备模式。指定您想要用来后备整个EtherChannel的网卡。

6.Internet Address to Ping: 仅用于网卡后备模式。EtherChannel会ping您在这里指定的IP地址。如果回应超时达到指定的数目,EtherChannel会切换网卡。 Number of Retries: 允许的回应超时的次数,默认是3。

7.Retry Timeout: 回应超时的时限。默认是1秒。

答案已经很明显,Round Robin模式具备此功能,只是这种模式采用轮询的方式,不够智能,所以建议流量负载均衡方面还是需要在网络层去规划。

遭遇ORA-27300: OS system dependent operation:fork failed with status: 12

系统平台为

Oracle Solaris on SPARC (64-bit)

数据库版本

11.2.0.3

遭遇这个错误主要是因为备份恢复出问题了,执行介质恢复一下吃光了而且系统告警日志报错如下:

/opt/app/oracle/diag/rdbms/standbydbrtps/RTPS/trace/RTPS_psp0_6332.trc:
ORA-27300: OS system dependent operation:fork failed with status: 12
ORA-27301: OS failure message: Not enough space
ORA-27302: failure occurred at: skgpspawn3

在系统的/var/adm/messages中同时也收到信息如下:

shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,

经过诊断与Oracle bug 18387547吻合.该bug信息如下:

Hdr: 18387547 11.2.0.3 RDBMS 11.2.0.3 SECURITY PRODID-5 PORTID-23
Abstract: MEMORY LEAK OF RECOVERY PROCESS IF TDE IS ENABLED

*** 03/12/14 01:45 am ***

PROBLEM:
--------
Customer uses TDE and physical standby. The memory will be eaten by the
recovery process (manual or managed).

DIAGNOSTIC ANALYSIS:
--------------------
When media recovery starts, process that do media recovery (ora_mrp if
recovery is run without parallelism or ora_pr if it is parallel recovery), is
allocating 96 bytes buffers in order to do ioctl() for /dev/crypto, but the
memory is not beeing freed (dtrace shows only malloc() calls, and no free()
calls). Each ioctl() call will be issued with new 96 buffer, and that will
deplete memory on server, causing server to stop once all virtual memory is
used.

In /var/adm/messages we can see the errors:
Feb 9 18:19:58 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16090 (oracle_server_mo)
Feb 9 18:21:43 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16097 (oracle_server_mo)
Feb 9 18:23:33 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16103 (oracle_server_mo)
Feb 9 18:25:19 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16106 (oracle_server_mo)
Feb 9 18:27:05 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16110 (oracle_server_mo)
Feb 9 18:28:54 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16117 (oracle_server_mo)
Feb 9 18:30:42 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16129 (oracle_server_mo)
Feb 9 18:32:31 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16138 (oracle_server_mo)
Feb 9 18:34:17 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16148 (oracle_server_mo)
Feb 9 18:36:03 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16151 (oracle_server_mo)
Feb 9 18:37:50 shadowdog-FO genunix: [ID 470503 kern.warning] WARNING: Sorry,
no swap space to grow stack for pid 16156 (oracle_server_mo)

In alert log:
Process startup failed, error stack:
Errors in file
/u01/app/oracle/diag/rdbms/standbydbrtps/RTPS/trace/RTPS_psp0_6631.trc:
ORA-27300: OS system dependent operation:fork failed with status: 12
ORA-27301: OS failure message: Not enough space
ORA-27302: failure occurred at: skgpspawn3

WORKAROUND:
-----------
Restart MRP

RELATED BUGS:
-------------


REPRODUCIBILITY:
----------------


TEST CASE:
----------


STACK TRACE:
------------


SUPPORTING INFORMATION:
-----------------------


24 HOUR CONTACT INFORMATION FOR P1 BUGS:
----------------------------------------


DIAL-IN INFORMATION:
--------------------


IMPACT DATE:
------------


*** 03/12/14 01:46 am ***
*** 03/12/14 01:47 am ***
*** 03/12/14 01:48 am ***
*** 03/27/14 04:40 am ***
*** 03/27/14 05:30 am *** (CHG: Sta->10)
*** 03/27/14 05:30 am ***

*** 04/01/14 01:27 am *** (CHG: Sta->16)
*** 04/01/14 01:27 am ***
*** 04/01/14 03:28 am ***
*** 04/01/14 04:54 am *** (CHG: Sta->10)
*** 04/01/14 04:54 am ***
*** 04/01/14 05:02 am ***
*** 04/15/14 11:25 pm *** (CHG: Sta->16)
*** 04/15/14 11:25 pm ***
*** 04/20/14 12:59 am *** (CHG: Sta->91)
*** 04/20/14 01:00 am ***
*** 04/20/14 01:00 am *** (ADD: Impact/Symptom->LEAK - DB MEMORY/OTH...)

libXp.so.6: cannot open shared object file,during installing oracle database 11g on rhel as 6.1 x64

报错信息:

/tmp/OraInstall2011-09-24_10-16-11PM/jre/1.4.2/lib
/i386/libawt.so: libXp .so.6: cannot open  shared object file: No such file or directory occurred..

这个错误是我在以前安装时候碰到的,最近问的人挺多,则顺便趁早上这个点发布出来.首先我们从错误上看能很明显看到是libxp.so.6这个文件出问题了,但是你使用rpm -qa | grap libXp你会发现,这个包已经安装了,
仔细检查你会发现,系统提示的是/tmp/OraInstall2011-09-24_10-16-11PM/jre/1.4.2/lib/i386/libawt.so,i386而不是686,而现在安装的平台都常都是linux 6.1 x64上,默认安装的libXp版本也是64bit版本的,所以这里的解决办法基本就可以明了了,使用rpm -e | grep libXp,然后安装正确的386版本的libXp即可。如果有依赖包先卸载依赖包。