Chinaunix首页 | 论坛 | 博客
  • 博客访问: 980973
  • 博文数量: 358
  • 博客积分: 8185
  • 博客等级: 中将
  • 技术积分: 3751
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:27
个人简介

The views and opinions expressed all for my own,only for study and test, not reflect the views of Any Company and its affiliates.

文章分类

全部博文(358)

文章存档

2012年(8)

2011年(18)

2010年(50)

2009年(218)

2008年(64)

我的朋友

分类: Oracle

2009-06-20 11:36:44

作为一名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
2445
2447
2449
2451
2453
2455
2457
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 \
<#_days> (where value is > 100)"
exit 99
fi
# Exit if no second parameter $2.
if [ -z "$2" ]
then
echo "Usage: check_parms.ksh \
<#_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"
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瘫痪。只有在后台进程异常死掉的时候才考虑用这个命令。
9.AIX下显示CPU数量
# lsdev -C|grep Process|wc -l
10.Solaris下显示CPU数量
# psrinfo -v|grep "Status of processor"|wc -l
如果是显示结果是中文,可能上面的命令显示有误。可以用psrinfo -v 来代替。
10 服务器监控
1.使用top
使用命令来显示Unix服务器的高CPU资源占用会话。top显示每个CPU的使用情况。top的输出分两部分。第一部分显示每个处理器的负载情况,第二部分显示使用CPU最多的会话信息。
# top
load averages: 0.23, 0.53, 0.49
64 processes: 1 running, 21 sleeping, 42 idle
CPU states: 7.5% user, 0.0% nice, 2.9% system, 89.4% idle
Memory: Real: 772M/991M act/tot Virtual: 1965M use/tot Free: 15M
PID USERNAME PRI NICE SIZE RES STATE TIME CPU COMMAND
837 afis 42 0 34M 29M sleep 128:39 11.70% unixsvr
824 afis 44 0 10M 1826K sleep 26:40 0.70% dtterm
5121 oracle 42 0 435M 15M sleep 0:01 0.60% oracle
717 root 44 0 10M 4358K sleep 13:43 0.30% Xdec
5120 root 44 0 5832K 3203K run 0:00 0.10% top
558 root 44 0 3640K 180K sleep 34:13 0.00% os_mibs
715 root 42 0 18M 11M sleep 0:02 0.00% smsd
775 afis 44 0 11M 1843K sleep 0:01 0.00% dtsession
5117 afis 54 10 8248K 565K sleep 0:00 0.00% dtscreen
5097 oracle 44 0 423M 3465K sleep 0:00 0.00% oracle
5101 oracle 44 0 427M 2793K sleep 0:00 0.00% oracle
5105 oracle 44 0 421M 2621K sleep 0:00 0.00% oracle
5103 oracle 44 0 421M 2138K sleep 0:00 0.00% oracle
562 root 44 0 2960K 851K sleep 0:00 0.00% cpq_mibs
5055 root 44 0 1936K 303K sleep 0:00 0.00% telnetd
作为一个DBA应该关心的内容有:
----Load averages:平均负载。如果大于1说明服务器负荷过重。
----CPU states:CPU信息概要。7.5% user的意思是CPU有7.5%是用户占用,其他可按字面类推。
----Memory:Free表明可用的内存数量。本例子中可用内存是15M。
----IDLE:CPU空闲百分比
2. 使用sar
sar在SVR4环境中,例如HP-UX、Solaris中很普及,在aix中也可以用。Sar命令可以查看整体CPU消耗情况,磁盘、内存、JFS buffer使用情况等。常见的sar使用例子:
----sar -u
显示CPU活动情况。例如:
# sar -u 2 5
AIX TSXJ 2 5 0052E51D4C00 10/09/06
System Configuration: lcpu=2
16:12:10 %usr %sys %wio %idle
16:12:12 100 0 0 0
16:12:14 99 1 0 0
16:12:16 99 0 0 0
16:12:18 41 1 26 31
16:12:20 46 1 0 53
Average 77 1 5 17
上面的命令每2秒显示一次cpu情况,显示5次。
----sar -w 
显示交换(swapping)活动。例如5秒钟显示一次,显示5次:
# sar -w 5 5
HP-UX corp-hp1 B.11.00 U 9000/800 08/09/00 
19:37:57 swpin/s bswin/s swpot/s bswot/s pswch/s 
19:38:02 0.00 0.0 0.00 0.0 222 
19:38:07 0.00 0.0 0.00 0.0 314 

Average 0.00 0.0 0.00 0.0 294
上面的输出列的含义:
swpin/s 每秒钟交换进(sawp-in)的进程数量 
swpot/s 每秒钟交换出(sawp-out)的进程数量 
bswin/s 每秒钟交换进的块数(每块512字节)
bswot/s 每秒钟交换出的块数(每块512字节)
pswch/s 每秒钟上下文交换数量
----sar -b 
显示buffer活动情况 
# sar -b 1 6
HP-UX corp-hp1 B.11.00 U 9000/800 08/09/00
19:44:53 lread/s %rcache bwrit/s lwrit/s... 
19:44:54 91 100 9 19... 
19:44:55 0 0 0 5... 
19:44:56 6 100 9 8... 
19:44:57 30 100 9 20... 
19:44:58 1 100 0 3... 
19:44:59 1 100 9 4... 
Average 22 100 6 10... 
%wcache pread/s pwrit/s... 
53 0 0... 
100 0 0... 
0 0 0... 
55 0 0... 
100 0 0... 
0 0 0... 
39 0 0...
各个列的含义: 
lread/s 
Number of reads per second from the Unix JFS buffer cache 
%rcache 
Buffer cache hit ratio (for the Unix JFS buffer cache) for read requests 
bwrit/s 
Number of physical writes to disk per second 
lwrit/s 
Number of writes per second to the Unix JFS buffer cache 
%wcache 
Buffer cache hit ratio (for the Unix JFS buffer cache) for write requests 
pread/s 
Number of reads per second from disk 
pwrit/s 
Number of writes per second to disk
3. 使用vmstat
vmstat是通用的UNIX监控工具,vmstat在IRIX操作系统中是osview。vmstat的第一个参数是间隔的秒数,也可以带第二个参数,表明显示多少次。vmstat不同操作系统输出结果不一样,含义也可能有区别,具体要看man帮助。
# vmstat 3
kthr memory cpu 
---- ... --------------- ... -------------- 
r b ... fre re pi sr ... cs us sy id wa 
0 0 ... 207 0 1 0 ... 142 18 4 75 4 
0 0 ... 187 0 4 0 ... 70 2 1 91 6 
0 0 ... 184 0 0 0 ... 99 5 2 89 4 
0 0 ... 165 0 0 0 ... 98 1 8 52 40 
0 0 ... 150 0 3 0 ... 136 4 2 87 6 
0 0 ... 141 0 1 0 ... 192 5 0 91 4
在HP-UX或AIX下vmstat输出中一些重要的信息:

运行队列。当这个值超过CPU数量的时候,服务器就有CPU瓶颈(可以通过lsdev -C|grep Process|wc -l 来获取CPU数量) 
pi 
page-in数量。这个参数非0暗示着系统缺少内存,内存被交换到磁盘。然而当程序刚使用的时候也可能导致page-in非0。为了找到真正原因,则检查sr列。如果sr也是非0,那么的确意味着缺少内存。
sr 
扫描速率。如果扫描速率持续增加,那么页交换后台程序忙于分配内存页。
下面是CPU的一些信息: 
us 
用户占用CPU的百分比 
sy 
系统占用CPU的百分比 
id 
空闲CPU百分比 
wa 
等待CPU的百分比 
用户和系统百分比之和(us+sy)接近100时,说明CPU繁忙,但并不意味着CPU过载。sr超过CPU数量的时候意味着CPU过载。当CPU等待(wa)超过20的时候,那么20%或者更多的处理时间在等待资源,通常是I/O。通常在备份或者导出等I/O操作的时候这个百分比比较大;但如果正常的时候这个值一直挺高则也可能有I/O瓶颈。
4.AIX下显示交换区(Swap)使用情况
lsps -a 可用来显示交换使用情况。之前我们讨论过,Oracle数据库在消耗过多的服务器内存的时候有可能产生很多交换,而PGA的内存需求引起内存移动到交换盘的操作。
# lsps -a
Page Space Physical Volume Volume Group Size %Used Active Auto Type
hd6 hdisk0 rootvg 512MB 1 yes yes lv
上面%Used是1,说明有1%的交换。
5.显示HP-UX下的交换区使用情况
# swapinfo -tam 
Mb Mb Mb... 
TYPE AVAIL USED FREE... 
dev 1024 25 999... 
reserve - 999 -999... 
memory 3966 3547 419... 
total 4990 4571 419... 
... PCT Mb 
... USED RESERVE PRI NAME 
... 2% 1 /dev/vg00/lvol2 
... 
... 89% 
... 92% 0 - 
6.显示服务器平均负载情况(w命令)。
Unix的w命令用来显示高资源会话简单的信息。大多数的有经验的Oracle DBA都会首先用这个命令来快速查看一下服务器负载情况,因为w命令在几乎所有的Unix下都可以用。
# w 
10:02AM up 60 days, 18:46, 3 users, 
load average: 0.32, 0.39, 0.43 
User tty login@ idle JCPU PCPU what 
Oracle pts/0 08:17AM 0 80:18 80:16 w 
oracle pts/1 09:15AM 5 2 0 ftp 
miltonrv pts/2 01May 009days 0 0 -ksh
上面的输出中的load average分别是过去1分钟、5分钟、15分钟的负载情况。如果大于1说明CPU紧张。
7.使用iostat
iostat显示物理磁盘I/O情况。下面的3表明3秒钟显示一次。
# iostat 3
System configuration: lcpu=2 disk=5
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.0 1302.0 1.8 0.6 89.3 8.3
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk0 0.4 2.8 0.7 15919 15112048
dac0 0.0 0.8 0.2 643384 3730076
dac0-utm 0.0 0.0 0.0 0 0
hdisk1 0.0 0.8 0.2 643384 3730076
cd0 0.0 0.0 0.0 0 0
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.3 3176.3 0.7 1.8 64.3 33.2
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk0 71.0 501.3 123.7 0 1504
dac0 0.0 0.0 0.0 0 0
dac0-utm 0.0 0.0 0.0 0 0
hdisk1 0.0 0.0 0.0 0 0
cd0 0.0 0.0 0.0 0 0
上面比较重要的列:
Kb_read:过去的时间区间内读取得K字节数。(第一个显示的是历史总计,因此要看变化情况,应该看其它的时间区间。)
Kb_wrtn: 过去的时间区间内写入得K字节数。

11 文件管理

1.列出最近动过(touched)的文件
作为一个DBA,你经常会需要查看最近被动过的文件。当Oracle文件被读或者写的时候都是被动过。ls命令可以查看那些文件是最近被动过的。注意,使用head是为了限制输出数量,只输出最近动过的文件(默认10个)
$ ls -alt|head
total 29837
-rw------- 1 afis system 592 Oct 10 10:12 .sh_history
-rw-r--r-- 1 afis system 75 Oct 10 10:08 errlog.txt
-rwxr-xr-x 1 afis system 1467 Oct 9 09:48 .profile
drwxr-x--x 11 afis system 8192 Oct 8 13:21 .
drwxr-xr-x 2 afis system 8192 Sep 26 13:21 unixsvr20060925
drwxr-xr-x 2 afis system 8192 Sep 25 16:59 unixsvr20060921
-rw-r--r-- 1 afis system 15 Sep 22 16:52 logfile.txt
-rw------- 1 afis system 15 Sep 22 15:15 nohup.out
-rw-r--r-- 1 afis system 506 Sep 22 11:32 .dxhanziim780.tmp
-l 选项显示文件的详请,包括修改时间,-t 选项会让结果按照被动过的日期排序,但是显示中的时间仍然是修改时间。-t 会按照被动过的时间倒排序,因此用head。-a 选项显示你目录下的所有文件。 
2.显示最近修改过的文件
$ ls -alc|tail
total 3
-rw-r--r-- 1 afis system 2 Oct 10 10:34 1.txt
-rw-r--r-- 1 afis system 2 Oct 10 10:35 2.txt
-rw-r--r-- 1 afis system 2 Oct 10 10:35 3.txt
3.删除未修改的文件
例如,删除5天以上未修改的归档文件:
/usr/bin/find $DBA/$ORACLE_SID/arch/arch_prod*.arc -ctime +5 -exec rm {} \
注意,试验上面的命令的时候要慎重。另外也要检查路径是否的确存在。
4.显示文件大小(512字节块)
有的时候我们需要快速找到比较大的trace或者core dump文件。通过使用du命令,可以显示文件的大小,单位是512字节。如果要以kb来显示,那么可以用 -k 参数
# du -s * |sort -n|tail
31288 archlog269.arc.Z 
34000 archlog253.arc.Z 
34480 archlog256.arc.Z 
35464 archlog252.arc.Z 
36696 archlog255.arc.Z 
37400 archlog258.arc.Z 
37456 archlog263.arc.Z 
38576 archlog270.arc.Z 
39248 archlog267.arc.Z 
102408 archlog272.arc.Z
如果我们要查看某个目录的总大小,可以用 du -sk 命令。例如
# du -sk /home/oracle
2353
5.定位包含特定字符串的文件
可以通过使用find和grep命令来查找文件中含有特定字符串的文件。例如,假设你想查脚本中含有v$session的文件。你可以执行下面的命令,Unix将会在你当前目录和所有子目录下在扩展名是sql的文件中查找:
HBZW> find . -name "*.sql" -print|xargs grep -i v\$session
./script/test.sql:select * from v$session;
下面是这条命令的解释:
find . 
在当前目录和所有子目录下查找
-name "*.sql" 
查找扩展名是sql的文件
-print 
实际显示文件列表。输出被piped 到xargs
xargs
将每个文件的内容传给后面的命令
grep -i v\$session
过滤文件内容,只显示含有v$sessoin的行,-i 选项的含义是不区分大小写。
6.查找最近创建的文件
下面的命令查找1天内创建的文件。
HBZW> find . -mtime -1 -print
./script
./script/test.sql
./script/watch.sql
./script/haha.txt
举一反三,如果想查1天以上创建的文件,就用+1选项
7.查找系统中的大文件
下面的命令查找大于10000字节的文件:
# find . -size +10000c -print
如果不加c,那么就是查文件大于10000个块(512字节)的文件。有的Unix下可以加k,单位就是kb。
8.查找大小在某个区间内的文件:
例如,查找大小在100到120个字节的文件
# find . -size +100c -size -120c -print 
如果要查找大小正好是多大的文件,可以这样:
# find . -size 100c -print 
上面的命令查找大小正好是100个字节的文件。
9.批量删除修改时间大于7天的文件
find . -mtime +7 -exec rm {} \;
10.批量删除过期的trace文件和审计文件脚本(deltrcandaudit.ksh)
#!/bin/ksh
for ORACLE_SID in `cat /etc/oratab|\
egrep ':N|:Y'|grep -v \*|cut -f1 -d':'`
do
ORACLE_HOME=`cat /etc/oratab|\
grep ^$ORACLE_SID:|cut -d":" -f2`
DBA=`echo $ORACLE_HOME | sed -e\
's:/product/.*::g'`/admin
find $DBA/$ORACLE_SID/bdump -name "*.trc" \
-mtime +14 -exec rm {} \;
find $DBA/$ORACLE_SID/udump -name \
"*.trc" -mtime +14 -exec rm {} \;
find $ORACLE_HOME/rdbms/audit -name \*.aud \
-mtime +14 -exec rm {} \;
done
上面的脚本在所有的实例中查找符合条件的trc文件并删除。
11.生成空文件(touch)
touch 命令可以用来生成空文件,例如:
# touch test.txt
12.修改默认的文件访问权限(Permissions)
使用umask命令来设置默认的文件访问权限。掩码的值是服务器默认值(通常是777或者644)和实际的Unix用户默认文件权限的差值。例如,如果系统默认777,用户创建文件的时候访问权限是755,那么掩码就是022。下面让我们先来理解Unix下文件访问权限。
Unix下文件访问权限分为3部分。每一部分代表不同类别用户的访问权限。这三类用户是:
----文件所有者
----和文件所有者在同一个组中的成员
----其它的Unix用户
因此,如果一个文件的访问权限是751,那么7分配给所有者,5分配给和所有者在同一个组中的其他成员,1分配给其他用户。那么,这些数字到底代表什么意思呢?
访问权限值 含义
4 读权限
2 写权限
1 执行权限
通过上表我们可以推算出,7代表全部权限,5代表读和执行权限,以此类推。下面,让我们来看一个文件的具体权限。
$ ls -l test.txt
-rwxr-x--x 1 oracle system 0 Oct 10 16:45 test.txt
这个例子中test.txt的文件访问权限就是751,但是显示的确是字母-rwxr-x--x。下面我们来解释一下。
-----
表明这是一个plain文件。如果是d则表明是路径
----rwx
文件所有者拥有读、写、执行的权限
----r-x
同组的其他成员拥有读、执行的权限
------x
其它用户拥有执行的权限。
----
13.不同的umask的效果
假设系统默认的用户权限是777,而我们不希望这样,就应该设置合适的umask。下面是不同的umask的效果。
系统默认 777 666 777
umask 值 022 022 143
新的文件访问权限 755 644 634
设置umask的例子:
# umask 022
14.修改文件所有者
Unix的chown命令可以修改文件的所有者。例如:
# chown oracle:oinstall *
# ls -al
-rw------- 1 oracle oinstall ... .bash_history 
drwxr-xr-x 11 oracle oinstall ... .dt 
-rwxr-xr-x 1 oracle oinstall ... .dtprofile 
-rwxr-xr-x 1 oracle oinstall ... .profile 
-rwxr-xr-x 1 oracle oinstall ... .profile_old 
-rw------- 1 oracle oinstall ... .sh_history 
drwx------ 2 oracle oinstall ... .solregis 
-rw------- 1 oracle oinstall ... .TTauthority 
-rw------- 1 oracle oinstall ... .Xauthority
上面的命令将文件所有者改成oracle,所属的组改成oinstall。如果想将所有子目录及其下面的都改掉,那么用-R选项。
15.修改文件的访问权限
Unix的chmod命令可以修改文件的访问权限。例如:
# chmod 755 *
# chmod +x *
# chmod -r *
同样,如果想带子目录修改所有权限,也可以用 -R 选项
12 磁盘管理
1.在HP-UX下列出所有逻辑卷
# df -k
/home(/dev/vg00/lvol5): 20166 total allocated Kb 
4945 free allocated Kb 
15221 used allocated Kb 
75 % allocation used 
/opt (/dev/vg00/lvol6):615914 total allocated Kb 
227403 free allocated Kb 
388511 used allocated Kb 
63 % allocation used 
/tmp (/dev/vg00/lvol4):64215 total allocated Kb 
20564 free allocated Kb 
43651 used allocated Kb 
67 % allocation used 
/u01 (/dev/vg01/u01 ):17580720 total allocated Kb 
12117048 free allocated Kb 
5463672 used allocated Kb 
31 % allocation used
df -k命令是比较通用的查看逻辑卷信息的命令,在tru64、aix下都可以使用。
2.在HP-UX下显示卷的具体信息:
# lvdisplay /dev/vg00/u01
--- Logical volumes ---
LV Name /dev/vg00/lvol3
VG Name /dev/vg00
LV Permission read/write
LV Status available/syncd
Mirror copies 1
Consistency Recovery MWC
Schedule parallel
LV Size (Mbytes) 140
Current LE 35
Allocated PE 70
Stripes 0
Stripe Size (Kbytes) 0
Bad block off
Allocation strict/contiguous
IO Timeout (Seconds) default
3.一个根据不同的Unix使用不同的命令来查看磁盘挂接位置的脚本
HP-UX下查看磁盘mount位置可用bdf命令,而其他好多版本都可以用df -k命令。我们这个脚本的名字就叫做dialect_df.ksh。
#!/bin/ksh
#**************************************************
# Set up the dialect changes for
# HP-UX and AIX (df -k) vs (bdf)
#**************************************************
os=`uname -a|awk '{ print $1 }'`
if [ $os = "OSF1" ]
then
df -k
fi
if [ $os = "AIX" ]
then
df -k
fi
if [ $os = "IRIX64" ]
then
df -k
fi
if [ $os = "HP-UX" ]
then
bdf
fi
13 其它杂项

1.创建软连接
Unix下的所有文件或者目录都可以创建软连接,访问这个软连接实际上就是访问真正的文件/目录。可以用ln -s 来创建软连接。例如:
# ln -s /poll/PU-AFIS30 PU-AFIS30
上面的命令中,软连接文件是PU-AFIS30,指向/poll/PU-AFIS30。可以用file命令看出来:
$ file PU-AFIS30
PU-AFIS30: symbolic link to /poll/PU-AFIS30
2.根据日期创建目录:
$ date
Wed Oct 11 14:38:07 CST 2006
$ mkdir `date|awk '{print $6$2$1}'`
$ ls -l
total 8192
drwxr-xr-x 2 oracle system 8192 Oct 11 14:38 2006OctWed
3.用crontab来创建计划任务
大多数Unix都支持一个叫做cron的实用程序。术语cron是chronological的缩写。cron实用程序可以用来创建定期运行的任务。cron有两个主要的命令:
----crontab -l
显示现有的任务
----crontab -e 
编辑修改crontab文件。
4.查看现有的执行计划
# crontab -l
#************** # Daily Cleanup Tasks of old trace, # audit, and log files #****
00 6 2 * * /usr/local/bin/scripts/cleanup.ksh > /usr/local/bin/scripts/cleanup.log 
#********************************** # Shutdown of Oracle APPS#**********
00 2 * * * /usr/local/bin/scripts/apps_stop.ksh PROD > /usr/local/bin/scripts/logs/apps_stop_PROD 
05 2 * * * /usr/local/bin/scripts/apps_stop.ksh TEST > /usr/local/bin/scripts/logs/apps_stop_TEST 
#*********** # Shutdown of Oracle Databases #*************
30 2 * * * /usr/local/bin/scripts/database_stop.ksh PROD > /usr/local/bin/scripts/logs/db_stop_PROD 
40 2 * * * /usr/local/bin/scripts/db_stop.ksh TEST > /usr/local/bin/scripts/logs/database_stop_TEST
我们来分析一下下面这句话:
00 6 2 * * /usr/local/bin/scripts/cleanup.ksh > /usr/local/bin/scripts/cleanup.log
这一行中共6组,前面有5组数字,分别代表不同的时间。按照顺序含义如下:
minute:分钟。1到60时
hour:小时。0到23
monthday:每个月的第多少天。1到31
monthday:每年的第几个月。1到12
weekday:每周的星期几。0到6。0代表Sunday
第六组是要执行的程序。因此这条命令的意思就是每个月的2号早6点执行cleanup.ksh脚本,并且写入日志。
5.编辑定时任务:
用crontab -e 按照规则来编辑即可。
6.删除定时任务:
crontab -r
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pengle/archive/2006/12/15/1444478.aspx
阅读(1010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~