|
作者: 江南白衣,原文出处: http://www.blogjava.net/calvin/archive/2007/01/27/96318.html,转载请保留出处。
Unix系统永远只会越来越多,开发人员就没必要特意学习它们的安装、配置和管理了,就全部交给集成人员吧。 但开发人员行走于Unix之间,依然有四样东西要熟练。 一、VI 虽然Unix上的文本编辑器已经越来越好用,但不在Console前面,网速也不够连XWindows的时候,还是要依赖VI。 回想VI的时代背景,发现VI对开发人员已经周到得离谱了,热键多到你双手不离键盘就能完成大半编辑工作。 建议自己制作一张自己认为有用,但又经常忘记的命令的sheet--参见附录A,拿出考试的力气把它背熟。 二、文本处理 开发人员在Unix下干得最多的除了Make和除Bug外,大概就是处理日志文件、业务文件的查错和统计了。 只会more和grep是不够的,开发老手会把awk,sed,grep,sort,uniq,wc,head,tail这些文本处理命令,通过管道玩具式的拆卸拼装,最后完成一件原本以为非编写大段代码不可的工作。周到的参数设定,让人再一次感叹那个简单的年代,这样复杂到极致的设计.......怪不得《Unix 编程艺术》的作者有那么骄傲的自觉。 比如车东的每月访问TOP10 统计脚本: awk -F '\t' '{print $4}' 2004_2.txt| grep chedong.com/tech/|uniq -c|sort -rn|head -10 以上命令的具体用法--参见附录B:文本处理命令小结,大概说明如下: - awk -F '\t' 将2004_2.txt访问纪录文件,用TAB分割,打印第4列
- grep chedong.com/tech 只列出chedong.com/tech笔记目录下的文档
- uniq -c 汇总计数
- sort -rn 按数值排序
- head -10 TOP 10
补充:这些命令几乎都支持正则表达式,学正则比较好的书是OReilly的《Mastering.Regular.Expressions.3rd 2006》 三、Bash Shell 编程 上面的纯粹命令管道拼装完成不了所有的事情,有时需要用Shell编程来配合调度。
编程是开发人员的天赋本能,不论什么语言,看看参考手册应该就能上手。 见《Bash新手指南中文版》 ,一份快速的Bash Shell编程指南。 更进一步,可以学习perl。
四、Make or AutoMake 用过Java的Ant后,想起Make就觉得很烦,很厌倦。总归还是会的,见《GNU Make 3.8.0 中文手册》 不过即使make已经精通到变态,每个人写出来的MakeFile还是千奇百怪,再看看开源项目们个个都是automake+autoconf了,我们自己也长进一点吧。手工编写MakeFile.am,让auotomake变成MakeFile.in,再让用户./configure 生成最终的MakeFile。 autotools既能跨越平台,又是标准的写法,最重要的是,编写MakeFile.am的工作量比MakeFile少多了,只要简单的定义目标文件,先要处理的子目录,需要的源文件,头文件与库文件就可以了。 入门文章 使用AutoMake轻松生成Makefile IBM DW:例解 autoconf 和 automake 生成 Makefile 文件
上面两文只作入门了解,实际的操作步骤--参见附录C:我的automake1.9步骤小结。
完整的免费电子书: 《GNU Autoconf, Automake and Libtool》 另外,ACE里还贡献了一个更厉害的MPC(Makefile, Project, and Workspace Creator ), 自动的生成MakeFile.am或者VC的项目文件。
附录A:我的VI易忘命令手册 上下左右: ctrl+u/d 上下半屏,ctrl+f/b,上下一屏 H/G屏幕头/文章末 ,0/$ 行首行末 增删改: yy/dd 复制/删除 一行,p/P:将yy/dd的内容paste出来 I/A 在行首/末添加, o/O 开新行,d0/d$ 删除到行首,行末 u:undo 查: ? 向前查找, n/N 重复上一次查找 附录B: 文本处理命令小结 awk:处理结构化的文本(每行以固定符号分成若干列),提取打印某些字段,如: ls -l|awk '{print $1}' --将ls-l结果的第一列打印出来 awk -F":" '{print $1" "$6}' /etc/passwd ,将以:分割的/etc/passwd文件的第1,6列打印出来,中间以空格分开 详见IBM DW中国的AWK实例(共3篇) 或 Bash新手指南中文版第6章。 grep:过滤,大家用得最多的命令,支持正则表达式。参数有: -i忽略大小写,-n显示line number,-c 统计在每个文件的出现次数,-l只显示符合的文件的名字。 sed:流编辑器,主要用于替换,如: sed -e '1,10s/foo/bar/g' myfile2.txt 将1到10行的文本中的foo 替换成bar,s代表替换,g代表全局替换 支持正则的替换字符串,可以只替换某个范围内的内容。 用法不算简单,详见IBM DW中国的Sed实例(共3篇)或 Bash新手指南中文版第5章。 sort:排序,参数有: -r逆序, -n 数字比较 , -M 日历比较 Feb,Dec, -f 忽略大小写 同样支持结构化文件,如 sort -t : -k 1,1 /etc/passwd,以: 分割,只按第1列排序 sort -t : -k 1,1 -k2.2,3.4 /etc/passwd ,以:分割,先按第1列排序,再按第2列的第二个字符到第3列的第4个字符排序。 uniq:去除重复行。 除了正常用法外,还有-c统计重复次数,和-u (唯一)和 -d (重复)两个参数,只显示唯一的和重复的行。 wc: 统计。 -l 行,-m 字符,-w 单词
附录C: 我的automake1.9步骤小结- 先编写MakeFile.am
- 运行autoscan,生成configure.scan
- 修改configure.scan,同时把文件改名为configure.in :
去除AC_CONFIG_HEADER([config.h])那行 加入AM_INIT_AUTOMAKE([1.9 foreign]) (其中1.9是automake的版本号) 加入AC_PROG_LIBTOOL (如果用libtool的话) 检查AC_CONFIG_FILES,如果之前没有先写齐所有MakeFile.am,autoscan就不会帮你加入,需要自己手工补充。
- libtoolize (如果用libtool的话)
- aclocal
- autoconf
- automake --add-missing
- ./configure
- make
大家需要编写的文件从Makefile转为了Makefile.am 和configure.in, ACE的Examples是很好的参考。
查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name;
====================================
set pages 100 col ts_name form a20 head 'Tablespace' col pieces form 9990 head 'Pcs' col ts_size form 999,990 head 'SizeMb' col largestpc form 999,990 head 'LrgMB' col totalfree form 999,990 head 'FreeMb' col pct_free form 990 head '%Free' col whatsused form 999,990 head 'Used' col pct_used form 990 head '%Used' col problem head 'Prob??' --spool /tmp/tbs_size.log
select q2.other_tname ts_name, pieces, ts_size ts_size, nvl(largest_chunk,0) largestpc, nvl(total_free,0) totalfree, nvl(round((total_free/ts_size)*100,2),0) pct_free, ts_size-total_free whatsused, nvl(100-round((total_free/ts_size)*100,2),100) pct_used, decode(nvl(100-round((total_free/ts_size)*100,0),100), 85,'+',86,'+',87,'+',88,'+',89,'++',90,'++',91,'++', 92,'++',93,'++',94,'+++',95,'+++',96,'+++',97,'++++', 98,'+++++',99,'+++++',100,'+++++','') problem from (select dfs.tablespace_name,count(*) pieces, round(max(dfs.bytes)/1024/1024,2) largest_chunk, round(sum(dfs.bytes)/1024/1024,2) total_free from dba_free_space dfs group by tablespace_name) q1, (select tablespace_name other_tname, round(sum(ddf2.bytes)/1024/1024,2) ts_size from dba_data_files ddf2 group by tablespace_name) q2 where q2.other_tname = q1.tablespace_name(+) order by nvl(100-round((total_free/ts_size)*100,0),100) desc;
====================================
查看表空间使用情况的SQL语句: SELECT a.tablespace_name "表空间名",total 表空间大小,free 表空间剩余大小, (total-free) 表空间使用大小, ROUND((total-free)/total,4)*100 "使用率 %" FROM (SELECT tablespace_name,SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name ) a, (SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES GROUP BY tablespace_name) b WHERE a.tablespace_name=b.tablespace_name
===================================== rem fsfi value compute rem fsfi.sql column fsfi format 999,99 select tablespace_name,sqrt(max(blocks)/sum(blocks))* (100/sqrt(sqrt(count(blocks)))) fsfi from dba_free_space group by tablespace_name order by 1; spool fsfi.rep; / spool off;
今天,做了一个oracle数据库的存储过程,可当中一个游标将表给锁住了。
弄了半天,一开始用kill 3444直接将进程杀死。可是命令对它没有一点作用,数据库锁一直呆在那里。
后来在google一搜,发现一篇很好文章。摘录在后面。
即刻杀死了数据库锁。方法如下:
1、查看数据库锁,诊断锁的来源及类型:
select object_id,session_id,locked_mode from v$locked_object;
2、找出数据库的serial#,以备杀死:
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
3、杀死该session
alter system kill session 'sid,serial#'
4、that't all, it's right!
'===============================================================================
ORACLE锁的管理
2003-03 余枫
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。
一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。
select ... from ... for update; 是2的锁。
当对话使用for update子串打开一个游标时,
所有返回集中的数据行都将处于行级(Row-X)独占式锁定,
其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。
insert / update / delete ... ; 是3的锁。
没有commit之前插入同样的一条记录会没有反应,
因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
创建索引的时候也会产生3,4级别的锁。
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作会提示ora-00054错误。
有主外键约束时 update / delete ... ; 可能会产生4,5的锁。
DDL语句时是6的锁。
以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:
select object_id,session_id,locked_mode from v$locked_object;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有长期出现的一列,可能是没有释放的锁。
我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial#';
如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
当你采用的是直接连接数据库的方式,
也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,
因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。
记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。
条件
1
在分析
(analyze)
指定索引之后,查询
index_stats
的
height
字段的值,如果这个值
>=4 ,
则最好重建(
rebuild
)这个索引。虽然这个规则不是总是正确,但如果这个值一直都是不变的,则这个索引也就不需重建。
条件
2
在分析
(analyze)
指定索引之后,查询
index_stats
的
del_lf_rows
和
lf_rows
的值
,
如果
(del_lf_rows/lf_rows)*100 > = 20
,则这个索引也需要重建。
例子
:
SQL > analyze index IND_PK validate structure;
SQL > select name,height,del_lf_rows,lf_rows,(del_lf_rows/lf_rows) *100 from index_stats;
NAME HEIGHT DEL_LF_ROWS LF_ROWS (DEL_LF_ROWS/LF_ROWS)*100
------------------------------ ---------- ----------- ---------- -------------------------
INDX_PK 4 277353 990206 28.0096263
SQL> alter index IND_PK rebuild;
|