作为一名Oracle DBA,在所难免要接触Unix,但是Unix本身又是极其复杂的,想要深刻掌握同样很不容易。那么到底我们该怎么入手呢?
Donald K Burleson 的《Unix for Oracle DBAs Pocket Reference》这本书就比较详细的说明了作为一名Oracle DBA所应该掌握的知识,而且基本上都有例子供实验,因此有选择的翻译出主要的章节:
3 构建Unix命令
4 Unix服务器环境
5 进程管理
6 Server Values
7 内存和CPU管理
10 服务器监控
11 文件管理
12 磁盘管理
13 其它杂项

3 构建Unix命令

  有的时候Unix的命令看上去很复杂,其实有可能是多个命令合在一起的。
3.1.分解一个复杂的Unix命令:
ps -ef|grep "ora_"|grep -v grep|awk '{ print $2 }'|xargs kill -9
  乍看这条命令,给人很复杂神秘的感觉。然而,这实际上是通过管道符(|)来合在一起的一组简单命令。写成下面的格式更易懂一些:
ps -ef
|
grep "ora_"
|
grep -v grep
|
awk '{ print $2 }'
|
xargs kill -9
  这条命令总的目的是杀掉所有Oracle的进程。ps -ef 列出所有的进程,而grep "ora_" 只列出ps -ef中的ora_开头的进程;grep -v grep的作用是进程中不列出命令本身,awk '{ print $2 }'的作用是只列出显示的进程的第2部分。    xargs 将前面列出的内容传给后面的命令,kill -9命令会强制关闭列出来的进程。
为了更好的理解这条命令,我们不妨逐步执行这个命令,查看输出结果:
HBZW> ps -ef
UID         PID   PPID    C STIME    TTY             TIME CMD
root          0      0  1.2 13:48:38 ??           0:36.18 [kernel idle]
root          1      0  0.0 13:48:38 ??           0:00.05 /sbin/init -a
root          3      1  0.0 13:48:39 ??           0:00.02 /sbin/kloadsrv
root          5      1  0.0 13:48:40 ??           0:00.00 /sbin/hotswapd
root         53      1  0.0 13:48:56 ??           0:00.00 /sbin/update
root        170      1  0.0 13:49:00 ??           0:00.16 /usr/sbin/evmd
......
oracle     2445      1  0.0 14:48:35 ??           0:00.36 ora_ckpt_gaxz
oracle     2447      1  0.0 14:48:35 ??           0:00.38 ora_smon_gaxz
oracle     2449      1  0.0 14:48:36 ??           0:00.07 ora_reco_gaxz
oracle     2451      1  0.0 14:48:36 ??           0:00.19 ora_cjq0_gaxz
oracle     2453      1  0.0 14:48:36 ??           0:02.20 ora_qmn0_gaxz
oracle     2455      1  0.0 14:48:36 ??           0:00.06 ora_s000_gaxz
oracle     2457      1  0.0 14:48:36 ??           0:00.07 ora_d000_gaxz

HBZW> ps -ef|grep "ora_"
oracle     2439      1  0.0 14:48:35 ??           0:00.08 ora_pmon_gaxz
oracle     2441      1  0.0 14:48:35 ??           0:00.09 ora_dbw0_gaxz
oracle     2443      1  0.0 14:48:35 ??           0:00.11 ora_lgwr_gaxz
oracle     2445      1  0.0 14:48:35 ??           0:00.40 ora_ckpt_gaxz
oracle     2447      1  0.0 14:48:35 ??           0:00.40 ora_smon_gaxz
oracle     2449      1  0.0 14:48:36 ??           0:00.07 ora_reco_gaxz
oracle     2451      1  0.0 14:48:36 ??           0:00.23 ora_cjq0_gaxz
oracle     2453      1  0.0 14:48:36 ??           0:02.46 ora_qmn0_gaxz
oracle     2455      1  0.0 14:48:36 ??           0:00.06 ora_s000_gaxz
oracle     2457      1  0.0 14:48:36 ??           0:00.07 ora_d000_gaxz
oracle     2530   2310  0.0 15:10:56 pts/1        0:00.00 grep ora_
HBZW> ps -ef|grep "ora_"|grep -v grep
oracle     2439      1  0.0 14:48:35 ??           0:00.08 ora_pmon_gaxz
oracle     2441      1  0.0 14:48:35 ??           0:00.09 ora_dbw0_gaxz
oracle     2443      1  0.0 14:48:35 ??           0:00.11 ora_lgwr_gaxz
oracle     2445      1  0.0 14:48:35 ??           0:00.41 ora_ckpt_gaxz
oracle     2447      1  0.0 14:48:35 ??           0:00.40 ora_smon_gaxz
oracle     2449      1  0.0 14:48:36 ??           0:00.07 ora_reco_gaxz
oracle     2451      1  0.0 14:48:36 ??           0:00.24 ora_cjq0_gaxz
oracle     2453      1  0.0 14:48:36 ??           0:02.53 ora_qmn0_gaxz
oracle     2455      1  0.0 14:48:36 ??           0:00.06 ora_s000_gaxz
oracle     2457      1  0.0 14:48:36 ??           0:00.07 ora_d000_gaxz
HBZW> ps -ef|grep "ora_"|grep -v grep|awk '{ print $2 }'
2439
2441
2443
………
HBZW> ps -ef|grep "ora_"|grep -v grep|awk '{ print $2 }'|xargs kill -9
HBZW>
3.2.find命令常用方法
find命令是一个重要的工具,用来查找文件。下面是列出几个常用的方法:
----当前路径下及所有子目录下查找文件名是netmgr的文件
# find . -name netmgr
----在/usr及所有子目录下查找名字是vi的文件
# find /usr -name vi
----在当前目录及所有子目录下查找文件名包含net的文件
# find ./ -name "net*"
----在当前目录及所有子目录查找整个文件名或路径(包含路径)包含特定字符串rdbms 的文件或者路径
# find ./ -print |grep rdbms
----查找当前目录及所有目录下的文件的文件内容中含有特定字符串
比如我们要查找当前目录下哪个文件的内容里含有good这个单词:
# find ./ -print|xargs grep -i good
总而言之,通过管道符|,将一个命令的输出作为另外一个命令的输入,是Unix下Oracle管理中常用的方法。

4 Unix服务器环境

本节内容有助于你轻松掌握Unix环境。本节首先介绍当你作为Oracle用户登录到Unix中会自动被执行的命令。在主目录下有一个特殊的文件,这个文件中可以写入一些当该用户登录到系统后就自动运行的命令。如果使用Korn shell,那么文件名就是.profile。如果使用C shell,那么文件名就是.cshrc。
4.1.设置标准Unix提示符(ksh)
将下面的代码放到.profile中,就会得到一个包含服务器名称、数据库名称和当前工作目录的提示符。这样可以防止我们执行误操作。
PS1=" `hostname`*\${ORACLE_SID}-\${PWD} >"
下面是具体的效果:
corphp*PROD-/home/oracle >pwd
/home/oracle
corphp*PROD-/home/oracle >cd /u01/oradata/PROD
corphp*PROD-/u01/oradata/PROD >
在上面的例子中,corphp是主机名,PROD是Oracle实例名,后面跟的是当前目录。注意,这个方法在ksh下一般都有效,如果是别的shell可能不行。
4.2.获取Oracle主目录(ksh):
$ cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'
/poll/oracle/ora92
4.3.为Oracle创建有用的unix别名
alias命令可以用一个短小的名字来代表一长的Unix命令。例如:
alias log='cd $ORACLE_HOME/$ORACLE_SID/bdump'
rm命令在删除数据的时候默认不确认,这就非常危险,为了避免误删除,我们可以用下面的办法:
alias rm='rm -i'
这样,执行rm的时候相当于执行的rm -i,就会确认是否删除。
我们可以通过这样的方法,把常用的命令组合用别名来代替,放到.profile文件中。需要调用的时候调用别名即可。下面在.profile中定义了一些常用的别名:
# Aliases
#
alias alert='tail -100\ $ORACLE_HOME/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.lo
g|more' alias arch='cd $ORACLE_HOME/admin/$ORACLE_SID/arch'
alias bdump='cd $ORACLE_HOME/admin/$ORACLE_SID/bdump'
alias cdump='cd $ORACLE_HOME/admin/$ORACLE_SID/cdump'       
alias pfile='cd $ORACLE_HOME/admin/$ORACLE_SID/pfile'
alias rm='rm -i'
alias sid='env|grep ORACLE_SID'
alias admin='cd $ORACLE_HOME/admin'
4.4.将SQL*Plus脚本放入Unix shell中
这个例子中的脚本叫做run_sql.ksh,该脚本调用了SQL*Plus来执行一条SQL语句,然后执行/home/oracle/sql/longscriptl.sql
#!/bin/ksh
#请用正确的sid替换下面的sidname
ORACLE_SID=sidname
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
$ORACLE_HOME/bin/sqlplus system/manager<<!
SELECT name FROM v\$datafile;
@/home/oracle/sql/longscript.sql
exit
!
然后要用chmod 755 run_sql.ksh来将此脚本改成可执行。接下来就可以直接在提示符下调用了(假设该脚本位于当前目录下):
# ./run_sql.ksh
当然,我们也可以在提示符下用下面的命令来执行SQL*Plus脚本:
# sqlplus system/manager @/home/oracle/sql/longscript.sql
4.5.将任务提交到后台执行
nohup命令可以作为一个后台进程来提交任务。这对长时间执行的Oracle作业尤其有用,因为这可以释放命令提示符,从而你可以进行其他工作。例如:
nohup run_sql.ksh > logfile.lst 2>&1 &
上面这条命令中不光nohup,还有其他内容,让我们来了解一下各部分的含义:
nohup
  将这个任务提交,让其持续运行,甚至你断开终端会话。
run_sql.ksh
  指定想在后台中运行的Unix脚本
>logfile.lst
  指定存放输出的文件名
2>&1
  将标准错误信息输入到标准输出设备上。2代表标准错误信息。1代表标准输出设备。
&
  在后台运行这条命令,释放提示符。
通过在nohup命令的最后加一个空格和ampersand(& 字符,这个命令会以后台任务来运行。nohup命令会将常用到,因为它避免了当你退出Unix后程序就终止的问题。
4.6.监控后台运行的进程的执行情况
如果你将后台作业的输出重定向到了一个文件,那么你可以通过tail -f命令来监控后台进程的运行情况。例如:
tail -f logfile.list
tail -f命令不断的显示输出文件中的新的行,从而让你很轻松的可以看到进程的执行情况。为了终止tail -f命令,可以随时按下Ctrl-C。
4.7.确保合适的参数传递给Oracle Shell脚本
下面的代码展示怎样阻止不合适的参数传递给Oracle的shell脚本。你可以利用此技术来防止意外的破坏。在这个例子中,check_param.ksh脚本需要两个参数:一个Oracle SID和一个大于100的数字值。if语句的作用是条件不满足的时候退出脚本。
# Exit if no first parameter $1.
if [ -z "$1" ]
then
echo "Usage: check_parms.ksh <ORACLE_SID>\
<#_days> (where value is > 100)"
exit 99
fi
# Exit if no second parameter $2.
if [ -z "$2" ]
then
echo "Usage: check_parms.ksh <ORACLE_SID>\
<#_days> (where value is > 100)"
exit 99
fi
# Exit if parm is not greater than 100.
tmp=`expr $2` # Convert string to number.
if [ $tmp -lt 101 ]
then
echo
echo "Argument two is less than 100.\
Aborting Script."
echo
exit 99
fi
echo "Right para"
在这个脚本中,$1和$2代表第一个和第二个传递给脚本的参数。if语句中的-z参数检查是否返回null参数,也就是是否没有输入参数。头两个if检查是否传递了参数,第3个if检查第二个参数是否大于100。
4.8.保证只有Oracle用户可以运行脚本

#!/bin/ksh
if [ `whoami` != 'oracle' ]
then
echo "Error: You must be oracle to execute."
exit 99
fi
上面的语句只允许oracle用户来执行脚本。虽然unix文件权限可能允许任何用户来执行,但是经验丰富的DBA应该在脚本上加上限制,只允许oracle用户来运行特定的脚本,如关闭数据库等操作。
4.9.检查是否传递了正确的SID
这个脚本显示了怎样检查传递的Oracle SID是否有效。这个脚本假设第一个参数是传入的SID,然后检查是否是有效的SID。接下来脚本会检查/etc/oratab文件,这个文件中会存有有效的SID。
#!/bin/ksh
# Exit if no first parameter $1 passed.
if [ -z "$1" ]
then
echo "Please pass a valid ORACLE_SID\
to this script"
exit 99
fi
# Validate the Oracle database name with
# lookup in /etc/oratab.
TEMP=`cat /etc/oratab|grep \^$1:| cut -f1 -d':'|wc -l`
tmp=`expr TEMP` # Convert string to number.
if [ $tmp -ne 1 ]
then
echo "Your input $1 is not a valid ORACLE_SID."
exit 99
fi
这个脚本可以检查传递的参数是否是有效的Oracle SID。注意,如果你使用Solaris,那么oratab参数文件将是/var/opt/oratab。另外,有的unix中可能不需要转换TEMP变量。如果上面的脚本不能运行,那么将tmp=`expr TEMP`语句去掉。
4.10.理解cat /etc/oratab|grep \^$1:| cut -f1 -d':'|wc -l的含义
在上面的这个脚本中,对于初次接触unix脚本的人来说最难于理解,所以我们来解释一下。
cat /etc/oratab|
grep \^$1:|
cut -f1 -d':'|
wc -l
cat /etc/oratab的作用是显示/etc/oratab的全部内容。
# cat /etc/oratab
#
# This file is used by ORACLE utilities.  It is created by root.sh
# and updated by the Database Configuration Assistant when creating
……
*:/poll/oracle/oracle/OraHome1:N
*:/poll/oracle/ora92:N
gaxz:/poll/oracle/ora92:N
grep \^$1:是在前面的结果中过滤。$1代表第一个传递的参数的值,\^代表要是1行的开头,总的意思就是,要查找一行的开头是$1和:的行。假设$1是gaxz,我们替代一下看看效果:
# cat /etc/oratab |grep \^gaxz:
gaxz:/poll/oracle/ora92:N
cut -f1 -d':' 的作用是去除掉:和:后面的内容:
# cat /etc/oratab |grep \^gaxz|cut -f1 -d':'
gaxz
wc -l 的作用是统计前面的内容出现的次数
# cat /etc/oratab |grep \^gaxz|cut -f1 -d':'|wc -l
1
所以可以看出,如果我们将gaxz作为脚本的参数传递,那么将判断是正确的SID
4.11.在UNIX服务器间的循环操作(LOOP)
Unix的for loop结构可以用来遍历服务器上的某个文件中的所有内容。例如,你可以写一个Unix脚本来读取oratab文件中的所有内容,并且访问文件中的所有列出的数据库。进一步利用这个功能,我们可以访问包含你的数据库名称的文件,遍历每一个服务器。我们可以写一个脚本,访问你的企业环境中的每一个服务器中的每一个数据库。这个脚本在所有的Unix服务器都是可信任(trusted)的,也就是允许远程脚本命令的时候尤其有用。Unix的rsh命令可以提交远程脚本命令。rsh命令通过在.rhosts文件中加入一个条目,允许你访问远程主机。例如,如果你希望你的Oracle用户允许访问一个远程服务器,名字叫做prodwest,那么prodwest服务器中需要在oracle用户的主目录下有.rhosts文件,如何配置这个文件可以和系统DBA联系。一般在这个文件中加入+ +即表示允许其它所有远程用户访问。如果只允许特定的ip地址访问,可以参考我的.rhosts文件:
# .rhosts
# allow other server to remotely use this server
192.168.128.200 +
192.168.128.201 +
下面是一个访问各个服务器上的数据库的一个示例,这个脚本并不真正做什么,只是显示每个服务器下的oratab文件中的SID。但是我们可以据此来完善这个脚本。
# Loop through each host name . . .
for host in `cat ~oracle/.rhosts|\
cut -d"." -f1|awk '{print $1}'|sort -u`
do
echo " "
echo "************************"
echo "$host"
echo "************************"
# Loop through each database name
# /etc/oratab (AIX & HP-UX) or
# /var/opt/oracle/oratab in Solaris.
for db in `rsh $host\
"cat /etc/oratab|egrep ':N|:Y'|\
grep -v \*|cut -f1 -d':'"`
do
# Get the ORACLE_HOME for each database.
home=`rsh $host "cat /etc/oratab|\
egrep ':N|:Y'|grep -v \*|grep ${db}|\
cut -f2 -d':'"`
echo " "
echo "database is $db"
done
done
4.12.在所有的数据库中执行某SQL*Plus脚本
# Loop through each host name . . .
for host in `cat ~oracle/.rhosts|\
cut -d"." -f1|awk '{print $1}'|sort -u`
do
echo " "
echo "************************"
echo "$host"
echo "************************"
# Loop from database to database.
for db in `cat /etc/oratab|egrep ':N|:Y'|\
grep -v \*|grep ${db}|cut -f1 -d':'"`
do
home=`rsh $host "cat /etc/oratab|egrep\
':N|:Y'|grep -v \*|grep ${db}|cut -f2 -d':'"`
echo "************************"
echo "database is $db"
echo "************************"
rsh $host "

ORACLE_SID=${db}; export ORACLE_SID;
ORACLE_HOME=${home}; export ORACLE_HOME;
${home}/bin/sqlplus -s /<<!
set pages 9999;
set heading off;
select value from v"\\""$"parameter
where name='optimizer_mode';
exit
!"
done
done
4.13.通过Internet Mail发送unix文件
下面的语句将oracle目录下的.sh_history文件中的内容发给 turner@itpub.net
cat ~oracle/.sh_history|mailx -s "DBA Activity Report"  turner@itpub.net
注意,要想让上面的命令正确执行,需要在unix服务器下配置好邮件地址等信息,可以和系统管理员联系。
4.14.修改某目录下的所有文件的某字符串
这个脚本在某路径下查找符合条件的文件,将文件中的特定字符串替换成其它的字符串,替换之前做备份。我们在脚本中用到for loop循环和流编辑器sed。字符串的替换工作是用sed来完成的。这个脚本名字是chg_all.ksh
#!/bin/ksh       
tmpdir=tmp.$$
mkdir $tmpdir.new
for f in $*
do
sed -e 's/oldstring/newstring/g'\
< $f > $tmpdir.new/$f
done
# Make a backup first!
mkdir $tmpdir.old
mv $* $tmpdir.old/
cd $tmpdir.new
mv $* ../
cd ..
rmdir $tmpdir.new
编辑好这个脚本之后,我们来测试一下。
$ cat abc.sql
oldstring
test replace
oldstring
$ chg_all.ksh *.sql
$ cat abc.sql
newstring
test replace
newstring
$

5 进程管理

本节介绍如何在Unix环境下管理oracle进程。我们知道,Oracle实例由一组进程组成,如PMON,SMON,DBWR,LGWn等。此外还有我们需要注意和管理的进程,如果使用了deticated listener,也会生成此监听器的进程。
5.1.显示Oracle的Unix进程
$ ps -ef|grep "ora_"|grep -v grep
UID         PID   PPID    C STIME    TTY             TIME CMD
oracle      898      1  0.0   Sep 22 ??           0:02.20 ora_pmon_gaxz
oracle      900      1  0.0   Sep 22 ??           0:06.11 ora_dbw0_gaxz
oracle      902      1  0.0   Sep 22 ??           0:06.90 ora_lgwr_gaxz
oracle      904      1  0.0   Sep 22 ??           1:01.29 ora_ckpt_gaxz
oracle      906      1  0.0   Sep 22 ??           0:12.56 ora_smon_gaxz
oracle      908      1  0.0   Sep 22 ??           0:00.17 ora_reco_gaxz
oracle      910      1  0.0   Sep 22 ??           0:28.05 ora_cjq0_gaxz
oracle      912      1  0.0   Sep 22 ??           5:28.37 ora_qmn0_gaxz
oracle      914      1  0.0   Sep 22 ??           0:00.16 ora_s000_gaxz
oracle      916      1  0.0   Sep 22 ??           0:00.07 ora_d000_gaxz
UID:代表用户
PID:代表进程
PPID:父进程。如果父进程是1,则代表该进程是由init进程调用的。
STIME:启动时间
CMD:被执行的Unix命令
5.2.查看消耗CPU时间最长的进程:
$ ps -ef|grep oracle|sort +6|tail
oracle      914      1  0.0   Sep 22 ??           0:00.19 ora_s000_gaxz
oracle      908      1  0.0   Sep 22 ??           0:00.20 ora_reco_gaxz
oracle      898      1  0.0   Sep 22 ??           0:02.94 ora_pmon_gaxz
oracle      900      1  0.0   Sep 22 ??           0:07.89 ora_dbw0_gaxz
oracle      902      1  0.0   Sep 22 ??           0:08.96 ora_lgwr_gaxz
oracle      906      1  0.0   Sep 22 ??           0:16.17 ora_smon_gaxz
oracle      910      1  0.0   Sep 22 ??           0:37.44 ora_cjq0_gaxz
oracle      904      1  0.0   Sep 22 ??           1:18.16 ora_ckpt_gaxz
oracle      912      1  0.0   Sep 22 ??           7:01.27 ora_qmn0_gaxz

sort +6的作用是按照第6列排序。最左边的是第0列,第6列是CPU消耗的时间,但是如果程序运行了1天以上,那么STIME就会包含两列,因此上面的例子实际上第7列是消耗CPU时间:
ps -ef|grep afis|sort +7|tail
是第6列还是第7列的确是一个麻烦的问题,没有什么太简单的方法,一般各执行一遍。tail的作用是显示输出的后多少行,默认是10
另外一个查找高CPU消耗进程的方法是使用Berkeley的ps auxgs命令。这个命令输出的第3列(sort中的+2)名字叫%CPU,显示的是当前每个进程的CPU持有百分比。你可以按照此列排序来获得当前高CPU占用的用户。例如:
$ ps auxgw|sort +2|tail
oracle    916  0.0  0.5  424M 4.8M ??  I   Sep 22     0:00.07 ora_d000_gaxz
oracle    912  0.0  1.0  421M  11M ??  I   Sep 22     7:03.09 ora_qmn0_gaxz
root     708  0.0  1.0 18.4M  11M ??  S   Sep 22     0:04.90 /usr/sbin/smsd -d
root       0  0.1  4.1 1.27G  42M ??  R <    Sep 22    20:57.87 [kernelidle]
……
我们可以用egrep命令来进一步过滤ps的输出,来从高到底显示高CPU消耗进程。egrep是一个扩展的正则表达式解析器。下面的命令中,egrep的作用是对ps的输出排序过滤。
$ ps auxgw|egrep "RSS| "|head
USER PID %CPU %MEM SZ RSS TTY TIME
root 516 78.9 1.0 16 4 - A Nov 21
oracle 41616 4.4 1.0 8312 6052 - A 07:00:59
oracle 20740 2.7 1.0 8140 5888 - A 08:52:32
oracle 17402 2.4 1.0 8296 6044 - A 07:27:04
oracle 25754 2.4 1.0 8640 6388 - A 08:10:03
oracle 13168 1.6 1.0 8196 5760 - A 05:33:06
oracle 20666 1.0 1.0 8304 6052 - A 08:15:19
oracle 14922 0.6 1.0 8300 5720 - A 01:01:46
oracle 44518 0.6 1.0 8080 5828 - A 08:47:47
head的作用是显示输出的头10行
5.3.显示Oracle的活动连接用户数量
# ps -ef|grep $ORACLE_SID|grep -v grep|grep -v ora_|wc -l
这个命令由以下几个部分组成:
ps -ef
显示所有进程
grep $ORACLE_SID
过滤输出结果,只显示内容包含SID的行
grep -v grep
将grep行从结果中去掉
grep -v ora_
去除输出中的Oracle后台进程
wc -l
对输出行计数
下面是这个命令执行的一个例子:
$ ps -ef|grep $ORACLE_SID|grep -v grep|grep -v ora_|wc -l
         120
5.4.杀掉进程
基本的kill使用方法是
kill -9 pid1 pid2 pid3…
杀掉所有Oracle进程的一个例子:
ps -ef|grep "ora_"|grep -v grep|awk '{print $2}'|xargs -i kill -9 {}
5.5.将Oracle SGA定在内存中
在HP-UX,Solaris和一些SVR4版本的Unix中,我们可以把Oracle的SGA钉在内存中,这样就永远不会产生page-in,也就是不会因为page-in而带来性能问题。page-in在SGA将内存写入磁盘然后又读回的时候发生。这个方法不能用于AIX。根据系统的不同,我们需要在INIT.ORA中设置不同的参数:
# For HP-UX, use lock_sga:
LOCK_SGA=true
# For Sun Solaris, use USE_ISM.
# ISM is an acronym for "Intimate
# Shared Memory".
USE_ISM=true

6 Server Values

Unix有很多系统配置参数值,如核心参数等,例如有的配置值是关于内存、磁盘等的信息。核心参数对Unix操作系统影响非常大,有一些参数对在Unix下安装Oracle非常有用。
6.1.显示HP-UX中的服务设备信息
通过使用lsdev命令,可以显示出连接到服务器上的所有设备信息。包括磁盘驱动器、内存、CPU、总线等等。下面的命令中,lsdev列出了所有的mount到服务器的设备。
$ lsdev
Character        Block        Driver             Class
0                        -1                cn                        pseudo
3                        -1                mm                        pseudo
16                        -1                ptym                ptym
17                        -1                ptys                        ptys
27                        -1                dmem                pseudo
28                        -1                diag0                diag
46                        -1                netdiag1                unknown
52                        -1                lan2                        lan
6.2.显示aix中的服务器设备信息
在AIX中也可以使用lsdev命令来查看硬件设备信息。
$ lsdev -C
sys0 ... System Object
sysplanar0 ... System Planar
pci0 ... PCI Bus
pci1 ... PCI Bus
isa0 ... ISA Bus
sa0 ... Standard I/O Serial Port
sa1 ... Standard I/O Serial Port
scsi0 ... Wide SCSI I/O Controller
hdisk0 ... 16 Bit SCSI Disk Drive
hdisk1 ... 16 Bit SCSI Disk Drive
...       
6.3.显示HP-UX中的系统核心参数
我们可以通过kmtune命令来显示HP-UX Version 11以后的所有核心佩值参数。有的核心参数,如semmni和maxusers等,对Oracle能否正确运行来说极其重要。
$ kmtune
Parameter Value
NSTREVENT 50
NSTRPUSH 16
NSTRSCHED 0
STRCTLSZ 1024
STRMSGSZ 65535
acctresume 4
acctsuspend 2
semmni 200
semmns 800
semmnu 30
semume 10
semvmx 32767
……       
我们当然可以对输出结果用grep来进行过滤,获得我们关心的部分。例如:
$ kmtune|grep -i shm
shmem 1
shmmax 1073741824
shmmni 500
shmseg 300
6.4.在AIX下查看系统核心参数
我们需要使用lsattr命令。例如:
$ lsattr -El sys0
maxbuf 20 Maximum number of pages in block...
maxmbuf 0 Maximum Kbytes of real memory al...
maxuproc 200 Maximum number of PROCESSES allo...
iostat true Continuously maintain DISK I/O h...
realmem 3137536 Amount of usable physical mem...
modelname IBM,9076-WCN Machine name ...  
systemid IBM,010013864 Hardware system ide...
...
这个命令在我们显示max开头的参数很有用,如maxbuf、maxuproc等。
6.5.在TRU64下显示核心参数
TRU64下核心参数文件是/etc/sysconfigtab,是一个可以用vi来编辑的文件。我们可以使用sysconfig命令查看核心参数,例如:
# sysconfig -q ipc
ipc:
msg_max = 8192
msg_mnb = 16384
msg_mni = 64
msg_tql = 40
shm_max = 4278190080
shm_min = 256
shm_mni = 1024
shm_seg = 1024
sem_mni = 16
sem_msl = 2600
sem_opm = 10
sem_ume = 10
sem_vmx = 32767
sem_aem = 16384
sem_broadcast_wakeup = 1
max_kernel_ports = 93728
ssm_threshold = 8388608
ssm_enable_core_dump = 1
shm_allocate_striped = 1
shm_enable_core_dump = 1
6.6.Solaris下核心参数显示
Solaris下的核心参数是/etc/system,我们可以用cat来显示,也可以用vi来编辑。例如:
# cat /etc/system |grep sem
set semsys:seminfo_semmni=100
set semsys:seminfo_semmns=1024
set semsys:seminfo_semmsl=256
set semsys:seminfo_semvmx=32767
set semsys:shminfo_shmmax=4294967295
set semsys:shminfo_shmmni=100

7 内存和CPU管理

7.1.显示TRU64下的内存信息:
$ /bin/vmstat -P | grep "Total Physical Memory"
Total Physical Memory =  1024.00 M
         Total Physical Memory Use:     130730 / 1021.33M
7.2.显示HP-UX下的内存信息:
grep MemTotal /proc/meminfo
7.3.Solaris下显示内存大小:
/usr/sbin/prtconf | grep "Memory size"
7.4.Aix下显示内存大小:
/usr/sbin/lsattr -E -l sys0 -a realmem
7.5.使用Aix的svmon工具

IBM AIX提供一个叫做svmon的工具。这个工具显示服务器上的所有内存的使用情况,包括页交换和内存使用。例如:
# svmon
               size      inuse       free        pin    virtual
memory      1048576     961861      86715     115058     165229
pg space     131072        315
               work       pers       clnt      lpage
pin          115058          0          0          0
in use       165244      14559     782058          0
size:真实内存的帧(frame)大小。在Unix下,一帧等于一页。Unix下页大小一般是4k。
inuse:使用的frame数量
free:可用的frame数量
pin:钉住(pin)的的frame数量
virtual:总的可用虚拟内存数量
svmon命令还可以用来查看某具体进程的内存信息,例如:
# svmon -P 17322
-------------------------------------------------------------------------------
   Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage
   17322 unixsvr          17604     2423        0    14099      N     Y     N
    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual
       0         0 work kernel seg                   -   5359  2409    0  5359
   6801a         d work shared library text          -   4729     0    0  4729
   24669         2 work process private              -   3887     2    0  3887
   60678         - clnt /dev/fslv00:1510             -   3090     0    -     -
    85e2         1 clnt code,/dev/fslv00:164867      -    398     0    -     -
   7107e         f work shared library data          -     77     0    0    77

7.6.Linux下显示内存大小:
   /usr/sbin/dmesg | grep "Physical:"
7.7.显示分配的内存段
# ipcs -pmb
IPC status from /dev/mem as of Thu May 11 09:40:59 EDT 2000
T ID KEY ... OWNER GROUP SEGSZ CPID
Shared Memory:
m 4096 0x670610c5 ... root system 12 45082
m 4097 0x680610c5 ... root system 106496 45082
m 4098 0x78041249 ... root system 777216 47010
m 4099 0x78061865 ... root system 7536 47880
m 4 0x0d05014f ... root system 1440 16968
m 368645 0x0fe2eb3d ...oracle dba 35610624 17760
m 401414 0x0f97693e ...oracle dba 229863424 61820
m 274439 0x0fefeae2 ...oracle dba 35610624 21992
m 184328 0x0fefeb6e ...oracle dba 35610624 46690
m 151561 0x0fe2eb03 ...oracle dba 4972544 71116
m 8202 0x0f956d88 ...oracle dba 31117312 72448
m 143371 0x0f96e941 ...oracle dba 21200896 83662
7.8.手动移除内存段分配
有的情况下内存实例崩溃,但是Oracle的内存段却没释放。可以使用ipcrm来手动完成这个工作。例如:
ipcrm -m 96
上面的96是内存段id,我们可以用ipcs命令查到。注意,一定要慎重使用这个命令。这个命令可以很轻松的使Oracle瘫痪。只有在后台进程异常死掉的时候才考虑用这个命令。

Oracle DBA 的常用Unix参考手册(一)的更多相关文章

  1. Oracle DBA 的常用Unix参考手册(二)

    9.AIX下显示CPU数量    # lsdev -C|grep Process|wc -l10.Solaris下显示CPU数量# psrinfo -v|grep "Status of pr ...

  2. LoadRunner中常用函数参考手册

    基础篇1:LoadRunner中常用函数参考手册 常用函数列表 web_url web_submmit_form VS web_submmit_data VS web_custom_request w ...

  3. Oracle DBA最常用的269条命令

    1 运行SQLPLUS工具 sqlplus 2 以OS的默认身份连接 / as sysdba 3 显示当前用户名 show user 4 直接进入SQLPLUS命令提示符 sqlplus /nolog ...

  4. Oracle EBS R12 电子技术参考手册 - eTRM (电子文档)

    http://etrm.oracle.com/pls/etrm/etrm_search.search

  5. Git常用命令参考手册

    配置 # 查看全局配置列表 git config -l # 查看局部配置列表 git config --local --list # 查看已设置的全局用户名/邮箱 git config --globa ...

  6. 8个DBA最常用的监控Oracle数据库的常用shell脚本

    本文介绍了8个常用的监控数据shell脚本.首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DBA脚本.网上也有好多类似的文章,但基本上都不能正常运行,花点时间重 ...

  7. Oracle DBA常用查询

    Oracle DBA常用查询 –1. 查询系统所有对象select owner, object_name, object_type, created, last_ddl_time, timestamp ...

  8. Oracle DBA面试突击题

    一份ORACLE DBA面试题 一:SQL tuning 类 1:列举几种表连接方式 答: Oracle的多表连接算法有Nest Loop.Sort Merge和Hash Join三大类,每一类又可以 ...

  9. oracle+110个常用函数

    1.ASCII  返回与指定的字符对应的十进制数;  SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from du ...

随机推荐

  1. JsRender系列demo(2)多模板-template

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. hdu 4586 Play the Dice

    思路:设期望值为s,前m个是再来一次机会,则有 s=(a[1]+s)/n+(a[2]+s)/n+……+(a[m]+s)/n+a[m+1]/n…… 化简:(n-m)s=sum 当sum=0时,为0: 当 ...

  3. 关于DotNetBar中DataGridViewX 自动全屏 Anchor属性无效问题

    由于在DataGridViewX 中使用了控件DataGridViewCheckBoxXColumn会导致 Anchor属性无效问题化,具体原因未知,建议改换为系统自带的DataGridViewChe ...

  4. http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html

    http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html http://jingyan.baidu.com/article/414e ...

  5. 【Linux高频命令专题(5)】rmdir

    简述 rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删除某目录时也必须具有对父目录的写权限. 命 ...

  6. Linux下使用mail命令发送邮件

    因为需要经常备份网站的数据,所以了解并学习了下linux下如何通过shell来发送邮件,这里以CentOS为例,使用mail命令来进行外部邮件的发送.mail命令的语法如下: Usage: mail ...

  7. How to learn linux device driver

    To learn device driver development, like any other new knowledge, the bestapproach for me is to lear ...

  8. NDK 提示"undefined reference to xxx“的解决办法

    在Android.mk文件的 LOCAL_SRC_FILES后面加入包含该类或函数的文件,用\隔开,\后换行继续添加 例如 LOCAL_SRC_FILES := NDKTest.cpp\bncore. ...

  9. Java语言基本语法

    Java语言基本语法 一.标识符和关键字 标识符 在java语言中,用来标志类名.对象名.变量名.方法名.类型名.数组名.包名的有效字符序列,称为“标识符”: 标识符由字母.数字.下划线.美元符号组成 ...

  10. Lists of network protocols

    https://en.wikipedia.org/wiki/Lists_of_network_protocols Protocol stack: List of network protocol st ...