分类目录归档:数据

ORA-01439:要更改数据类型,则要修改的列必须为空

假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:

/*修改原字段名name为name_tmp*/
alter table tb rename column name to name_tmp;
/*增加一个和原字段名同名的字段name*/
alter table tb add name varchar2(40);
/*将原字段name_tmp数据更新到增加的字段name*/
update tb set name=trim(name_tmp);
/*更新完,删除原字段name_tmp*/
alter table tb drop column name_tmp;

总结:
1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。

ORACLE常用性能监控SQL

Temp表空间上进程的查询

1
2
3
4
5
select a.tablespace, b.sid, b.serial#, a.blocks,c.sql_text
  from v$sort_usage a,v$session b,v$sqltext c
 where a.session_addr = b.saddr
   and b.sql_address = c.address
 order by a.tablespace,b.sid,b.serial#,c.address, c.piece;

查看表锁

1
select * from sys.v_$sqlarea where disk_reads>100;

监控事例的等待

1
2
3
4
select event,sum(decode(wait_Time,0,0,1)) "Prev",
sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot"
from v$session_Wait
group by event order by 4 ;

回滚段的争用情况

1
2
3
select name, waits, gets, waits/gets "Ratio"
from v$rollstat a, v$rollname b
where a.usn = b.usn;

查看前台正在发出的SQL语句

1
2
3
4
5
select user_name,sql_text
   from v$open_cursor
   where sid in (select sid from (select sid,serial#,username,program
   from v$session
   where status='ACTIVE'));

数据表占用空间大小情况

1
2
3
4
select segment_name,tablespace_name,bytes,blocks
from user_segments
where segment_type='TABLE'
ORDER BY bytes DESC ,blocks DESC;

查看表空间碎片大小

1
2
3
4
select tablespace_name,round(sqrt(max(blocks)/sum(blocks))*
          (100/sqrt(sqrt(count(blocks)))),2) FSFI
   from dba_free_space
   group by tablespace_name order by 1;

查看表空间占用磁盘情况

1
2
3
4
5
6
7
8
9
10
11
select
         b.file_id                                 文件ID号,
         b.tablespace_name                         表空间名,
         b.bytes                                 字节数,
         (b.bytes-sum(nvl(a.bytes,0)))                 已使用,
         sum(nvl(a.bytes,0))                         剩余空间,
         sum(nvl(a.bytes,0))/(b.bytes)*100         剩余百分比
         from dba_free_space a,dba_data_files b
         where a.file_id=b.file_id
         group by b.tablespace_name,b.file_id,b.bytes
         order by b.file_id;

查看Oracle 表空间使用率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SELECT D.TABLESPACE_NAME, 
       SPACE || 'M' "SUM_SPACE(M)"
       SPACE - NVL (FREE_SPACE, 0) || 'M' "USED_SPACE(M)"
       ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) || '%'
          "USED_RATE(%)"
       FREE_SPACE || 'M' "FREE_SPACE(M)"
  FROM SELECT TABLESPACE_NAME, 
                 ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE
                 SUM (BLOCKS) BLOCKS 
            FROM DBA_DATA_FILES 
        GROUP BY TABLESPACE_NAME) D, 
       SELECT TABLESPACE_NAME, 
                 ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE 
            FROM DBA_FREE_SPACE 
        GROUP BY TABLESPACE_NAME) F 
 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
UNION ALL                                                           --如果有临时表空间 
SELECT D.TABLESPACE_NAME, 
       SPACE || 'M' "SUM_SPACE(M)"
       USED_SPACE || 'M' "USED_SPACE(M)"
       ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || '%' "USED_RATE(%)"
       NVL (FREE_SPACE, 0) || 'M' "FREE_SPACE(M)"
  FROM SELECT TABLESPACE_NAME, 
                 ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE
                 SUM (BLOCKS) BLOCKS 
            FROM DBA_TEMP_FILES 
        GROUP BY TABLESPACE_NAME) D, 
       SELECT TABLESPACE_NAME, 
                 ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE, 
                 ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE 
            FROM V$TEMP_SPACE_HEADER 
        GROUP BY TABLESPACE_NAME) F 
 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
ORDER BY 1;

查看Temp 表空间实际使用磁盘大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Select f.tablespace_name,
       d.file_name "Tempfile name",
       round((f.bytes_free + f.bytes_used) / 1024 / 1024, 2) "total MB",
       round(((f.bytes_free + f.bytes_used) - nvl(p.bytes_used, 0)) / 1024 / 1024,
             2) "Free MB",
       round(nvl(p.bytes_used, 0) / 1024 / 1024, 2) "Used MB",
       round((round(nvl(p.bytes_used, 0) / 1024 / 1024, 2) /
             round((f.bytes_free + f.bytes_used) / 1024 / 1024, 2)) * 100,
             2) as "Used_Rate(%)"
  from SYS.V_$TEMP_SPACE_HEADER f,
       DBA_TEMP_FILES           d,
       SYS.V_$TEMP_EXTENT_POOL  p
 where f.tablespace_name(+) = d.tablespace_name
   and f.file_id(+) = d.file_id
   and p.file_id(+) = d.file_id;

查看session使用回滚段

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT  r.name 回滚段名,
        s.sid,
        s.serial#,
        s.username 用户名,
        t.status,
        t.cr_get,
        t.phy_io,
        t.used_ublk,
        t.noundo,
        substr(s.program, 1, 78) 操作程序
FROM   sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r
WHERE  t.addr = s.taddr and t.xidusn = r.usn
ORDER  BY t.cr_get,t.phy_io;

查看SGA区剩余可用内存

1
2
3
4
5
6
select name,
      sgasize/1024/1024        "Allocated(M)",
      bytes/1024            "**空间(K)",
      round(bytes/sgasize*100, 2)   "**空间百分比(%)"
   from   (select sum(bytes) sgasize from sys.v_$sgastat) s, sys.v_$sgastat f
   where  f.name = 'free memory';

–监控表空间I/O比例
select df.tablespace_name name,df.file_name “file”,f.phyrds pyr,
f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw
from v$filestat f, dba_data_files df
where f.file# = df.file_id
order by df.tablespace_name;

监控SGA命中率

1
2
3
4
5
6
7
select a.value + b.value "logical_reads",
       c.value "phys_reads",
       round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.statistic# = 38 and
      b.statistic# = 39 and
      c.statistic# = 40 ;

监控 SGA 中字典缓冲区的命中率

1
2
3
4
5
select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
from v$rowcache
where gets+getmisses <>0
group by parameter, gets, getmisses ;

监控 SGA **享缓存区的命中率,应该小于1%

1
2
3
select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
sum(reloads)/sum(pins) *100 libcache
from v$librarycache;

监控 SGA 中重做日志缓存区的命中率,应该小于1%

1
2
3
4
5
SELECT name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
FROM v$latch WHERE name IN ('redo allocation', 'redo copy');

监控内存和硬盘的排序比率,最好使它小于 .10

1
2
3
SELECT name, value
FROM v$sysstat
WHERE name IN ('sorts (memory)', 'sorts (disk)') ;

监控字典缓冲区

1
2
SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
FROM V$ROWCACHE ;

系统用户建在system表空间中的表”>非系统用户建在SYSTEM表空间中的表

1
2
3
4
SELECT owner,table_name
FROM DBA_TABLES
WHERE tablespace_name in('SYSTEM','USER_DATA') AND
      owner NOT IN('SYSTEM','SYS','OUTLN', 'ORDSYS','MDSYS','SCOTT', 'HOSTEAC');

性能最差的SQL

1
2
3
4
SELECT * FROM ( SELECT PARSING_USER_ID EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text
                FROM v$sqlarea
                ORDER BY disk_reads DESC)
WHERE ROWNUM<100;

读磁盘数超100次的sql

1
select * from sys.v_$sqlarea where disk_reads>100;

最频繁执行的sql

1
select * from sys.v_$sqlarea where executions>100;

查询使用CPU多的用户session

1
2
3
4
5
6
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and
      c.sid=a.sid and
      a.paddr=b.addr
order by value desc;

当前每个会话使用的对象数

1
2
3
4
5
SELECT a.sid,s.terminal,s.program,count(a.sid)
FROM V$ACCESS a,V$SESSION s
WHERE a.owner <> 'SYS'AND s.sid = a.sid
GROUP BY a.sid,s.terminal,s.program
ORDER BY count(a.sid) ;

我怎么走上IT项目管理这条路的

低调、学历一般、内外向兼有的性格。对,这就是我。十年前为了就业进入IT领域。从当初的菜鸟程序员、数据库开发人员、需求分析人员成长为如今五年经验的项目经理。在这十年历程中经历过很多困难,有职业发展迷茫的、有技术的、有为人处世的等等。另外我也经常关注多个论坛中技术贴、职业规划贴等等来学习弥补自己的不足。今天再也按捺不住自己,将自己的奋斗过程简单写来与大家共勉。菜鸟经过自己的努力也可以在IT领域小有作为。文笔不周,请大家见谅。
本人于2006年毕业于一所普通大专院校,电子商务专业(偏文)。毕业前就知道就业形势严峻(主要还是缺乏技术、没有工作经验)。在老师和同学的建议下到一所培训机构学习了半年java等课程。面试十几家公司以失败告终,听了辅导老师的指导后修改了简历(改为1-1.5年工作经验),同时面试的时候吹了牛x成功入职某公司成为菜鸟程序员。如今回忆当初自己面试的场景结合现在面试他人的经验做了一些面试总结。一,如果缺乏真正的公司工作经验和实操经验,面试的时候要适当的夸大一点工作经验,表现出不急不躁、自信的状态。作为初级开发人员,面试官并不会要求技术精湛、理解深入,但是面试者要表现出积极端正的态度;二是要理解网络等方式给出的笔试面试题。只有理解后背诵能使知识系统化、理论化,面试官会感觉你基础好,是可培养的人才(背诵使用官方的术语回答面试题会显得高大上,如果你学历一般的话这样会显得科班一些)。三是如果面试官问你相对比较复杂的问题时如果没有具体的方法可以说出自己的思路,如果没有思路的情况下,可以坦诚的说明关于这个知识点暂未未涉足到。切勿胡吹乱说,这样会给人不踏实可靠的感觉。
2009年跳槽到第二家公司。本人出身草根,经济拮据还是主要跳槽原因。这时已经有了2年工作经验,关于技术、和同事合作沟通等等也积累了一定经验。在这个公司主要做oracle数据库开发(面试时吹了牛x说自己做过电信项目的清账程序)。其实数据库后台开发没有真正做过,无奈从头学起。一是对新领域业务的不理解,二是对数据库后台开发没有实际经验,三又是在试用期。为了当初面试时自己吹下的牛x也为了表现自己,除了每天正常工作8小时外,我晚上自觉加班连续两个多月,每天晚上死磕学习到半夜。包括存储过程的开发、触发器的开发、程序调用数据库后台程序、job的开发等等。之后成功交付数据库后台开发的三个模块到测试组。三个月后项目成功上线。由于自己的心劲还比较大,加上自己经常主动和领导同事沟通,领导对我逐渐信任。将更多的工作分配给我。那段时间真的每天筋疲力尽,付出总算有了一点回报。说好听点叫领导器重,反过来说叫压榨员工(一个人干三个人的活)。但是看你自己怎么看吧。我呢就是每天给自己积极的心理暗示我可以做好,我要坚持做好。我把多做的工作就当成领导的器重而不是在压榨我的劳动力。载后来我负责辅导两位新人,那时我算是一个小组长的角色吧。再后来我们部门经理离职了,而我还在那七八个人的团队工作了两年多。经过这个公司的经历我总结的几点。一,不要担心自己没有做过的东西做不好,而且要敢于勇敢主动承担,开发就是学习和实践的过程,而且能证明自己有较强研发能力;二,不要过多计较个人得失,多付出(比如没有完成工作任务自觉加班,其实就是当初面试吹牛逼,哈哈。)就有能力和经验的提高。三,做程序是相对枯燥的工作,开发过程中以及其他工作内容中和领导、同事多沟通,提高自己的沟通能力,既能调节氛围以后又能有机会做开发以外的工作,四,工作中不断死磕自己,无论是技术还是沟通要提高自己,一定要提高。要注重沟通能力,这样职业发展的面会越来越广。
2012年跳槽到第三家公司。也可能是机遇,也可能是自己的付出有了回报。正是由于上家公司一起工作的经历使我和领导间建立了较深的信任。我到第三家公司就是上一家公司部门经理给我打的电话说正组建项目团队。我呢,又比较好强,有了近五年的工作经历,感觉自己沟通能力还行。当时我就提出我要面试项目经理。当时他还感觉有些迟疑,经过我主动沟通。从语言开发、数据库开发、主动沟通等多个方面和领导协商他给了我这个机会(说实话又是没有实际带项目经验,自己是有担心的)。我开始了我的项目经理之旅,带领4位研发人员开发了一个小型B/S结构的系统。研发中经常有技术问题,有些组员问我时,也是我没遇见的问题,我经过思考求证提供了方法,但是因为是新的团队,经常有组员不服的情况,我开始就自己编写代码解决问题。经历几次后团队成员磨合的越来越好,我也得到组员的认可有了一定号召力。再者,研发过程中项目经理也要跟踪进度,控制时间、人力成本。一次两个组员之间因为一个问题争执的面红耳赤,其实解决问题方法都差不多。为了团队的和谐氛围要安抚组员的情绪,不能让情绪影响了工作。即便如此在项目管理中我还有些问题没有解决方法和思路,这时候就请教其他同事,经过单独谈话请教获得处理问题的方法和思路,在这也感谢部门老大了。经过这个带领研发人员开发项目的过程,我总结了几点。一,技术团队主要以技术服人,起码在新的同事之前要有几次证明自己的机会,没有机会要创造出机会,这样团队中成员才会拥护你的带领,其实国内好多公司项目经理就是技术经理,比如我在这家公司的岗位和工作内容,软件开发的项目经理是最不像经理的经理。二,控制成本、人力等重要要素,公司都是压榨劳动力的,实际中人员都是缺少紧张的(我们领导说人力充裕项目就不挣钱了,现在想来有一点道理)。所以要合理搭配人力、分配模块和合理安排时间、把控进度。三,团队是由人构成的,有人的地方就更容易生出来问题。要定期和不定期的和团队成员沟通,了解他们真正想法和诉求,把团队的稳定性、团队的氛围建设的更好。四,在讨论问题的时候要放低姿态不能把自己的想法强加给组员,要以理服人;但是相反,公司制度及管理方面该严肃要严肃,增加威望方便管理团队。
2013年至今,在第四家公司担任项目经理、产品经理岗位,由猎头公司推荐而来。主要带领项目团队近二十余人研发了一个大项目和两个产品。我面试的时候是项目经理的岗位,到团队后又是新的面孔多,刚开始也是大家不服气,也会向我的领导反映凭什么就招个新人直接担任项目经理,让老人怎么看,甚至有个别同事直接给我说你刚来就是项目经理,我都待五年还是中级开发人员(我们已经相处三个月,我心想工作6-7年了还是中级开发,技术不行、整天嘴上胡说,一写代码就不行了)。后来我和他单独吃了一次饭,放低姿态和他敞开心扉的深入的交流,慢慢他放低戒备接纳了我。项目和产品研发的思路还是有较大的差别。项目有被需求调研的具体对象,而产品研发刚开始的需求都是从项目延伸而来,有时候是闭门造车,后续要经过市场的印证。项目经常有明确的工期要求,而产品的研发则不一定。项目的svn版本简单,而产品经常会出现多个分支的管理。经过自己的沉淀和对产品的精心思考研究对公司的产品定位有了新的理解和建议,成功研发两套产品部署全国20余个省份,期间出差也多,也终于理解了出差的辛酸。如今孩子也快出生了,继续死磕自己,为了我们更好的生活。
经过十年的奋斗,当前我成长为一个有一点阅历的项目、产品经理。项目经理,其实在欧美IT公司是team leader的角色,而中国的项目经理其实好多偏向于技术经理,而大点的公司或者团队才更侧重于真正意义的项目管理。以我现在公司的角色是管理、技术大约各一半。但其实我还有很多不足的地方,技术和管理都有。下面是我送给成长为项目经理和正在做项目经理工作的同僚的几条个人心得或建议,与大家分享和请教:
一、要有较好的技术背景和成长经历,死磕自己,学习技术和管理(注重沟通、协调学习项目管理的铁三角),这样才能服务于团队成员,让团队成员心服口服。
二、交流问题时要放低姿态,此时不能把自己当成项目经理,要以技术服人、以理服人,切记摆出领导的架势;而在公司制度、管理方面要严肃,管理方面不能和大家嘻嘻哈哈,这样不利于项目和团队成员的管理。
三、定期和不定期和各位成员沟通,察言观色,了解成员的真正诉求和内心想法,能帮助他们解决的问题尽量帮助。及时疏导心里承受差的同事,排除不顺的情绪,关心特别个性、比较内向的同事,让他们感觉到大家是个整体,没有被边缘化。让他知道除了工作大家是同事,可以一起说说笑笑。
四、向上级领导(部门经理或者总监等角色)定期和不定期的汇报工作,让领导知道我们的项目进度和人力各方面的状态,尽量少给领导添麻烦,要想办法自己解决问题替领导分忧。项目经理要让上级领导真正放心,主动找领导汇报工作成果、进度。不要等领导来问你。
五、沟通、管理等要不卑不亢、不急不躁,表现出沉着稳定的状态。遇到问题不能急不能慌,团队成员或者领导告知你突发状况的时候不能自己都慌慌张张,这样不仅会让领导同事担心你的能力,更有可能被替代。你需要做的是时刻准备着问题的到来,遇到问题时拿出解决方法。技术问题有能力指导尽量指导,没有能力时要协调高级工程师、架构师等人员来解决;沟通问题要自己把握,要和直属领导沟通、和本项目组成员紧密沟通。有需要的情况下还要跨级沟通、跨部门沟通等等(要特别注意跨级汇报,紧急需要时一定要注意技巧。比如紧急情况需要领导决策而直属领导联系不上,这时候越级请示要事先说明直属领导联系几次联系不上等具体情况。总之要灵活对待)。
以上也是基于自己的项目经历和成长经历写下的,不周之处也请大家反馈、见谅,大家一起成长进步。在IT领域我也希望我们把日子过的更好。大家也可以加我微信一起交流进步,我有时间也在微信发布软件需求、职业发展、技术动向等多类行业信息,期待与大家共成长。

团队运营一个平台

团队运营一个平台不应该说比较难,而是团队的情况,没办法去培养团队,也没办法去运营一个团队,更别说要这个团队去处理这个平台,这是一个相当难的事情。

在团队起步的时候,开始还没办法去处理这个问题或者遇见这个问题,一切都是以天真为主,导致无法完成一件事情,放弃团队,重新组件一个新的团队。