搬砖头

Knocking on Heaven's Door
posts - 34, comments - 6, trackbacks - 0, articles - 0

 作者:江南白衣,原文出处: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步骤小结

  1. 先编写MakeFile.am
  2. 运行autoscan,生成configure.scan
  3. 修改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就不会帮你加入,需要自己手工补充。
  4. libtoolize (如果用libtool的话)
  5. aclocal
  6. autoconf
  7. automake --add-missing
  8. ./configure
  9. make

    大家需要编写的文件从Makefile转为了Makefile.am 和configure.in, ACE的Examples是很好的参考。

posted @ 2007-03-05 22:53 生活在别处 阅读(257) | 评论 (0)编辑 收藏

查看表空间的名称及大小
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;

posted @ 2007-03-05 22:45 生活在别处 阅读(9721) | 评论 (0)编辑 收藏

今天,做了一个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#';杀掉不正常的锁。

posted @ 2007-03-05 09:51 生活在别处 阅读(330) | 评论 (0)编辑 收藏


条件
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;

posted @ 2007-03-05 09:46 生活在别处 阅读(474) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4