Oracle DBA的 UNIX 袖珍参考手册


《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner Oracle DBA 的 UNIX 袖珍参考手册 作者:Donald K.Burleson 译者:turner 3 构建Unix命令 ..............................................................................................................................2 4 Unix服务器环境 ........................................................................................................................5 5 进程管理 ........................................................................................................................................12 6 Server Values .........................................................................................................................15 7 内存和CPU管理 .........................................................................................................................18 10 服务器监控 ...............................................................................................................................20 11 文件管理 .....................................................................................................................................25 12 磁盘管理 .....................................................................................................................................29 13 其它杂项 .....................................................................................................................................31 1 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 2 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 的文件或者路径 3 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner # find ./ -print |grep rdbms 查找当前目录及所有目录下的文件的文件内容中含有特定字符串 比如我们要查找当前目录下哪个文件的内容里含有 good 这个单词: # find ./ -print|xargs grep -i good 总而言之,通过管道符|,将一个命令的输出作为另外一个命令的输入,是 Unix 下 Oracle 管理中常用的方法。 4 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 语句, 5 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 然后执行/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< 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 脚本 6 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 下面的代码展示怎样阻止不合适的参数传递给 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 是否有效。这个脚本假设第一个参数是 7 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 传入的 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':' 的作用是去除掉:和:后面的内容: 8 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner # 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 " " 9 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 /< $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 $ 11 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 命令。这个命令 12 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 输出的第 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 {} 13 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 14 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 15 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 16 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 17 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 下显示内存大小: 18 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner /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 来代替。 19 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 20 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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... 21 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 输出中一些重要的信息: r 运行队列。当这个值超过CPU数量的时候,服务器就有CPU瓶颈(可以通 过lsdev -C|grep Process|wc -l 来获取CPU数量) pi page-in数量。这个参数非0暗示着系统缺少内存,内存被交换到磁盘。然而 当程序刚使用的时候也可能导致page-in非0。为了找到真正原因,则检查sr 列。如果sr也是非0,那么的确意味着缺少内存。 sr 扫描速率。如果扫描速率持续增加,那么页交换后台程序忙于分配内存页。 22 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 下面是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 23 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 字节数。 24 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 25 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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) 26 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner #!/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 27 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 文件所有者拥有读、写、执行的权限 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 选项 28 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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。 29 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner #!/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 30 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 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 31 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner 第六组是要执行的程序。因此这条命令的意思就是每个月的 2 号早 6 点执行 cleanup.ksh 脚本, 并且写入日志。 5.编辑定时任务: 用 crontab -e 按照规则来编辑即可。 6.删除定时任务: crontab –r 32 《Oracle DBA 的 UNIX 袖珍参考手册》中文版 by turner turner 简介: 王忠海,网名:turner Email:turner@itpub.net 现任 itpub 的《Oracle 入门与认证》版主,喜欢 Oracle 技术及 unix 技术。 我爱好广泛:读书、音乐、跑步;喜欢Oracle和unix技术,在www.itpub.net上 比较活跃。 我为女儿创建了一个博客,记录孩子的成长点滴,欢迎访问: 小百灵唱歌 33
还剩32页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

hellozxjygx

贡献于2011-11-16

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf