Oracle DBA 的Unix参考手册(一)

作为一名 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 的命令看上去很复杂,其实有可能是多个命令合在一起的。
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>
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
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 可能不行。
2
.获取 Oracle 主目录( ksh ):
$ cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'
/poll/oracle/ora92
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
.将 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
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 后程序就终止的问题。
6
.监控后台运行的进程的执行情况
如果你将后台作业的输出重定向到了一个文件,那么你可以通过 tail -f 命令来监控后台进程的运行情况。例如:
tail -f logfile.list
tail -f 命令不断的显示输出文件中的新的行,从而让你很轻松的可以看到进程的执行情况。为了终止 tail -f 命令,可以随时按下 Ctrl-C
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
8
.保证只有 Oracle 用户可以运行脚本

#!/bin/ksh
if [ `whoami` != 'oracle' ]
then
echo "Error: You must be oracle to execute."
exit 99
fi
上面的语句只允许 oracle 用户来执行脚本。虽然 unix 文件权限可能允许任何用户来执行,但是经验丰富的 DBA 应该在脚本上加上限制,只允许 oracle 用户来运行特定的脚本,如关闭数据库等操作。
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` 语句去掉。
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
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
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
13
.通过 Internet Mail 发送 unix 文件
下面的语句将 oracle 目录下的 .sh_history 文件中的内容发给 turner@itpub.net
cat ~oracle/.sh_history|mailx -s "DBA Activity Report"  turner@itpub.net
注意,要想让上面的命令正确执行,需要在 unix 服务器下配置好邮件地址等信息,可以和系统管理员联系。
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 ,也会生成此监听器的进程。
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 命令
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
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
4
.杀掉进程
基本的 kill 使用方法是
kill -9 pid1 pid2 pid3…
杀掉所有 Oracle 进程的一个例子:
ps -ef|grep "ora_"|grep -v grep|awk '{print $2}'|xargs -i kill -9 {}
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 非常有用。
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
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
...       
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
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 等。
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
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 管理

1 .显示 TRU64 下的内存信息:
$
/bin/vmstat -P | grep "Total Physical Memory"
Total Physical Memory =  1024.00 M
         Total Physical Memory Use:     130730 / 1021.33M
2
.显示 HP-UX 下的内存信息:
grep MemTotal /proc/meminfo
3
Solaris 下显示内存大小:
/usr/sbin/prtconf | grep "Memory size"
4 Aix 下显示内存大小:
/usr/sbin/lsattr -E -l sys0 -a realmem

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

6 Linux 下显示内存大小:
   /usr/sbin/dmesg | grep "Physical:"

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
8
.手动移除内存段分配
有的情况下内存实例崩溃,但是 Oracle 的内存段却没释放。可以使用 ipcrm 来手动完成这个工作。例如:
ipcrm -m 96
上面的 96 是内存段 id ,我们可以用 ipcs 命令查到。注意,一定要慎重使用这个命令。这个命令可以很轻松的使 Oracle 瘫痪。只有在后台进程异常死掉的时候才考虑用这个命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值