blogjava-凯发k8网页登录http://www.blogjava.net/badboyryan/
在恰当的时间、地点以恰当的方式表达给恰当的人...  阅读的时候请注意分类,佛曰我日里面是谈笑文章,其他是各个分类的文章,积极的热情投入到写博的队伍中来,支持blogjava做大做强!向dudu站长致敬>> >
zh-cnsat, 08 apr 2023 20:38:51 gmtsat, 08 apr 2023 20:38:51 gmt602017年1月1日的闰秒是怎么来的http://www.blogjava.net/badboyryan/archive/2016/12/30/432219.html坏男孩坏男孩fri, 30 dec 2016 07:38:00 gmthttp://www.blogjava.net/badboyryan/archive/2016/12/30/432219.htmlhttp://www.blogjava.net/badboyryan/comments/432219.htmlhttp://www.blogjava.net/badboyryan/archive/2016/12/30/432219.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/432219.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/432219.html新华社天津12月30日电(记者周润健)“多希望世界给我多一分钟、多一秒钟,让我再好好爱你……”歌词里曾苦苦哀求的一秒钟,真的可以实现了。因为,2016年还真的多出了“1秒”。

这多出的“1秒”将加在格林尼治时间12月31日23时59分后,通过增加闰秒实现。由于北京处于东八时区,所以将在2017年1月1日7时59分59秒后面增加1秒,届时会出现7时59分60秒的特殊现象。

为什么要增加1秒?这1秒从何而来?据天文专家介绍,为了确定时间,世界上有两种时间计量系统,基于地球自转得出的“世界时”和基于原子振荡周期确定的“原子时”。由于两种时间尺度对秒的测量方法不同,随着时间的推移,这两个时间系统之间就会出现差异,所以有了“协调世界时”的概念。

“协调世界时”以原子时秒长为基础,在时刻上尽量接近于世界时。1972年,国际计量大会决定,当“世界时”与“原子时”之间时刻相差超过0.9秒时,就在协调世界时上加上或减去1秒(正闰秒或负闰秒),以尽量接近世界时,这就是闰秒。

    计算机的时间只要不使用ntp就没什么大问题。



坏男孩 2016-12-30 15:38 发表评论
]]>
管理员权限真的很重要http://www.blogjava.net/badboyryan/archive/2016/11/09/431966.html坏男孩坏男孩wed, 09 nov 2016 02:08:00 gmthttp://www.blogjava.net/badboyryan/archive/2016/11/09/431966.htmlhttp://www.blogjava.net/badboyryan/comments/431966.htmlhttp://www.blogjava.net/badboyryan/archive/2016/11/09/431966.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/431966.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/431966.html
处理过程:重启笔记本,重启手机,重启91手机助手。打开91助手,发现速度依旧那么慢。


我用的win10的电脑啊,64位的系统,直接右击91助手的桌面快捷方式,选中“以管理员身份运行”,再次选中一个月的照片,速度发现,神速啊。





坏男孩 2016-11-09 10:08 发表评论
]]>
rac的rman备份需要连接两个实例吗http://www.blogjava.net/badboyryan/archive/2015/12/17/428699.html坏男孩坏男孩thu, 17 dec 2015 01:18:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/12/17/428699.htmlhttp://www.blogjava.net/badboyryan/comments/428699.htmlhttp://www.blogjava.net/badboyryan/archive/2015/12/17/428699.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/428699.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/428699.html归档日志放在asm上,rman脚本中不用连接2个实例,归档放在asm上是共享存储,只需要在一个实例备份即可。

坏男孩 2015-12-17 09:18 发表评论
]]>
aix修改时间http://www.blogjava.net/badboyryan/archive/2015/12/11/428607.html坏男孩坏男孩thu, 10 dec 2015 21:18:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/12/11/428607.htmlhttp://www.blogjava.net/badboyryan/comments/428607.htmlhttp://www.blogjava.net/badboyryan/archive/2015/12/11/428607.html#feedback1http://www.blogjava.net/badboyryan/comments/commentrss/428607.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/428607.htmllinux下用date -s "yyyymmdd hh:mm:ss"

aix  date -n mmddhhmmyy,mm表示月分,dd表示日期,hh表示小时,mm表示分钟,yy表示年份。




坏男孩 2015-12-11 05:18 发表评论
]]>
while inserting a large blob using jdbc, the application fails with:ora-22990http://www.blogjava.net/badboyryan/archive/2015/08/25/426974.html坏男孩坏男孩tue, 25 aug 2015 05:56:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/08/25/426974.htmlhttp://www.blogjava.net/badboyryan/comments/426974.htmlhttp://www.blogjava.net/badboyryan/archive/2015/08/25/426974.html#feedback1http://www.blogjava.net/badboyryan/comments/commentrss/426974.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/426974.html

cause

the oracle oracle.sql.blob outputstream writes the data in chunks. since autocommit defaults to true, the first chunk is committed. this results in the write operation for the next chunk of the blob to fail since it appears to be in the next transaction.
in those conditions, the ora-22990 exception will occur with any version of oracle jdbc driver.

solution


issue the setautocommit(false) command. then, explicitly commit the transaction after all of the blob chunks have been written to the row and the stream.close() method has been executed.

if using the oracle 10g jdbc driver (or greater version), a second solution consists of using the standard jdbc api (setbinarystream method of java.sql.preparedstatement interface). and in this case, autocommit can be set to true.

here is an example:

preparedstatement stmt = conn.preparestatement("insert into blobtest values (?,?)"); 
file fd = new file(testfile); 
fis = new fileinputstream(fd); 
stmt.setint(1,1); 
stmt.setbinarystream(2,fis,(int)fd.length());



where blobtest is a table defined as the following:

sql> create table blobtest (id number (4), data blob);


坏男孩 2015-08-25 13:56 发表评论
]]>
ftp批量上传不需要提示yeshttp://www.blogjava.net/badboyryan/archive/2015/08/25/426973.html坏男孩坏男孩tue, 25 aug 2015 05:42:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/08/25/426973.htmlhttp://www.blogjava.net/badboyryan/comments/426973.htmlhttp://www.blogjava.net/badboyryan/archive/2015/08/25/426973.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/426973.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/426973.html1、就是用mput。传之前先拍prompt,这样不会每传一个文件就要你确认。然后lcd到目录下用mput *上传。
2、将目录打包上传。 

坏男孩 2015-08-25 13:42 发表评论
]]>
enq: tx - row lock contention 等待事件http://www.blogjava.net/badboyryan/archive/2015/03/20/423679.html坏男孩坏男孩fri, 20 mar 2015 07:20:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/03/20/423679.htmlhttp://www.blogjava.net/badboyryan/comments/423679.htmlhttp://www.blogjava.net/badboyryan/archive/2015/03/20/423679.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/423679.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/423679.htmlos环境:windows server 2008 64位

数据库版本:11.2.0

 

今天在使用rman备份的时候随意的查看了一下等待事件,除了了我们现在系统遇到的io瓶颈外,还额外的发了enq: tx - row lock contention等待事件

 

1:查询当前系统的等待事件

 

select event,sid,p1,p2,p3 from v$session_wait where event not like 'sql*%' and event not like 'rdbms%';


event                                   sid         p1              p2             p3
----------------------------------     ----      ----------       ----------    ----------
enq: tx - row lock contention     4    1415053318     196638        55836
rman backup & recovery i/o      5            1               256       2147483647
enq: tx - row lock contention    12    1415053318     524293        51153
rman backup & recovery i/o     25           1                256      2147483647
db file sequential read             27          16             2876703         1
pmon timer                             33         300                0               0
db file scattered read               39          33              790536         128
vktm logical idle wait            49           0                   0               0
streams aq: qmn slave idle wait         50          1          0          0
asynch descriptor resize           53          1              4294967295    1237
jobq slave wait                       54          0                     0          0

 

event                                   sid         p1           p2                 p3
-------------------------------------------    -------       ----------          ----------
db file sequential read             170         33         1100519            1
direct path read                      181         44          469892           124
enq: tx - row lock contention    212 1415053318     524293         51153
smon timer                             225        300          0       0
enq: tx - row lock contention    232 1415053318     524293         51153
direct path read                      234         16           1099776         128
streams aq: qmn coordinator idle wait  242          0          0         0

 

 

上面的等待事件说明session4,12,212,232想加锁,但是有别的session占着,所以等待。

 

 

enq是一种保护共享资源的锁定机制,一个排队机制,先进先出(fifo)

发生tx锁的原因一般有几个

1.不同的session更新或删除同一个记录。

2.唯一索引有重复索引

3.位图索引多次更新

4.同时对同一个数据块更新

5.等待索引块分裂

 

 

2:下面我们通过enq: tx - row lock contention来看看这些session都在等什么

 

select row_wait_obj#,row_wait_file#,row_wait_block#,row_wait_row# from v$session where event='enq: tx - row lock contention';

 

row_wait_obj# row_wait_file# row_wait_block# row_wait_row#
------------- -------------- --------------- -------------
        87556             57             395            88
        87564             57             435             0
        87564             57             435             0
        87564             57             435             0
        87564             57             435             0

 

 

 


3:通过上面sql查找出来的对象编号找到对应的对象名称

 

sql> select object_name from dba_objects where object_id in (87564);

object_name
-----------
qrtz_locks

 

 

4:通过对象名称找出该对象的对应属性,对象属性为table

 

sql> select owner,object_name,object_id,data_object_id, object_type from all_objects where object_name='qrtz_locks';

 

owner      object_name  object_id data_object_id object_type

schedule   qrtz_locks     87564          87564               table 

 

5:通过正在等待的sid查看它们都在执行什么操作

sql> select sid,sql_text from v$session a,v$sql b where sid in(4,12,41,212,232) and (b.sql_id=a.sql_id or b.sql_id=a.prev_sql_id);

 sid sql_text
---- ----------------------------------------------------------------------------------------------------
   4 update qrtz_cron_triggers set cron_expression = :1 where trigger_name = :2 and trigger_group = :3
  12 select * from qrtz_locks where lock_name = :1 for update
  41 select * from qrtz_locks where lock_name = :1 for update
 212 select * from qrtz_locks where lock_name = :1 for update
 232 select * from qrtz_locks where lock_name = :1 for update

 

从上面的结果可以看出,schedule用户下的五个session同时在执行一条相同的sql语句,对应的对象则是qrtz_locks 这个表, 所以发生了锁,从而产生等待,通过和同事的交流,得知这个一个etl程序要访问的表,里面只有五条数据,但是却要时时调度。  

6:下面我们去找一下对应sid产生的锁

 

sql> select sid,ty,id1,id2,lmode,request,ctime,block from v$lock where block=1 or request<>0;
         sid ty        id1        id2      lmode    request      ctime      block
 ---------------- ---- -- ---------- ---------- ---------- ---------- ---------- ----------
         41  tx     524293      51153          0          6       3846             0
         12  tx     524293      51153          0          6       4190             0
         232 tx     524293      51153          0          6       4626             0
         212 tx     524293      51153          0          6       4749             0
      
    4  tx     196638      55836          0          6       4755              1
         44  tx     196638      55836          6          0       4765              1

 

由此可以查看,block=1的sid是该等待事件的根源,其他session则等待该锁被释放。

解决方法:

1:通过v$session找到block=1的用户,告知用户提交事务

2:通过sid找到pid,kill掉该进程

3:更改sql语句,select * from qrtz_locks where lock_name = :1 for update no wait

加nowait的意思是得到或者得不到,不会等待



坏男孩 2015-03-20 15:20 发表评论
]]>
ora-39097http://www.blogjava.net/badboyryan/archive/2015/03/20/423678.html坏男孩坏男孩fri, 20 mar 2015 07:14:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/03/20/423678.htmlhttp://www.blogjava.net/badboyryan/comments/423678.htmlhttp://www.blogjava.net/badboyryan/archive/2015/03/20/423678.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/423678.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/423678.html该报错我并没有查找到根本的原因,去metalink上看到有解决办法,则是加大streams_pool_size即可,导出恢复正常 alter system set streams_pool_size = 48m;

坏男孩 2015-03-20 15:14 发表评论
]]>
ora-39095http://www.blogjava.net/badboyryan/archive/2015/03/20/423677.html坏男孩坏男孩fri, 20 mar 2015 07:13:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/03/20/423677.htmlhttp://www.blogjava.net/badboyryan/comments/423677.htmlhttp://www.blogjava.net/badboyryan/archive/2015/03/20/423677.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/423677.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/423677.html出现该报错的原因一般分为两种情况。
第一种情况是因为在expdp的时候给才转储空间太小,数据无法写入转储文件内,所以报错,这种报错很好解决,只需要进入交互模式下,可以用add_file来增加转储文件,然后restart该job即可。
第二种情况则是因为设置参数parallel大于转储文件数目引起的,官方文档的解释是parallel io server processes写文件不能同时写一个,如果只有一个dumpfile(或少于parallel)就会影响性能。不但如此,当一个io server process在等待从而不能写dumpfile的时候就会报ora-39095
解决该问题一共两种办法
1:进入到交互模式,减少parallel的数量,使其等于dmp文件的数量或增加dmp文件,使其与parallel数量相等。
2:在写导出语句的时候指定dumpfile中使用变量 %u(大小写均可),让其自由分配转储文件即可。


坏男孩 2015-03-20 15:13 发表评论
]]>
ora-00600http://www.blogjava.net/badboyryan/archive/2015/03/20/423676.html坏男孩坏男孩fri, 20 mar 2015 07:08:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/03/20/423676.htmlhttp://www.blogjava.net/badboyryan/comments/423676.htmlhttp://www.blogjava.net/badboyryan/archive/2015/03/20/423676.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/423676.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/423676.html机房环境:
os:windows 2008
数据库版本:oracle 11g

事件起因:

昨天公司运维说机房的hp服务器磁盘坏了,我当时冷汗一下子就出来了,因为这是测试库,没有备份,没有归档,但是里面可是有1.5t的数据啊,下午他们修了一下午,系统可以进去了,但是数据库在启动到open的时候报错system01数据文件缺失一千多个数据块,由于没有备份和归档,所以这个数据库是挂掉了。(dba们一定要做好备份,否则最后全是自己的事情),幸好我们还有一个一周前的冷备库,所以我直接物理迁移,把数据库恢复到一周以前了,恢复的过程非常简单,因为数据库必须的那些文件路径都已存在(如参数文件内的dump文件等),我只是把参数文件,密码文件,控制文件,数据文件恢复到指定的目录,然后直接startup,在nomount和mount阶段都是比较顺利的,而到open阶段的时候,则报错了让我闹心的ora-600ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr]的错误,因为大家都知道,ora-600是数据库自己内部的bug,我也是第一次遇到,问了很多人大家都不会,所以只能自己去摸索解决,值得庆幸的是在摸索了一个小时后,我终于把数据库open了,以下就是我恢复的步骤,如果感觉对您有所帮助,那么请支持我一下。
//报错:ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
//因为ora-600的错误没有具体提示,所以很多人无从下手,别着急,我们可以先去告警日志去看看,以下是我的告警日志信息:
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], [ 

incident details in: d:/app/administrator/diag/rdbms/ccxe/ccxe/incident/incdir_2570/ccxe_ora_2164_i2570.trc
aborting crash recovery due to error 600
errors in file d:/app/administrator/diag/rdbms/ccxe/ccxe/trace/ccxe_ora_2164.trc:
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
errors in file d:/app/administrator/diag/rdbms/ccxe/ccxe/trace/ccxe_ora_2164.trc:
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
ora-600 signalled during: alter database open...
tue may 10 10:13:10 2011
trace dumping is performing id=[cdmp_20110510101310]
tue may 10 10:13:11 2011
sweep [inc][2570]: completed
sweep [inc2][2570]: completed
tue may 10 10:29:52 2011
shutting down instance (immediate)
shutting down instance: further logons disabled

//我们通过告警日志文件好像也没查到什么有用的信息,别着急,我们还可以再查找对应的trc文件,我的对应trc文件则是ccxe_ora_2788_i2164.trc,以下是我的trc信息

warning! crash recovery of thread 1 seq 1770 is

ending at redo block 779181 but should not have ended before

redo block 779205

//看,有警告了,意思是我在恢复的时候,丢失了redo日志,当时我很纳闷,怎么会丢失redo呢?最后我把这个问题定位在传输redo的时候可能造成数据块的丢失,因为我以前发生过这类事情,所以我重新拷贝redo日志,再次将数据库启动。

incident 3771 created, dump file: d:/app/administrator/diag/rdbms/ccxe/ccxe/incident/incdir_3771/ccxe_ora_2164_i3771.trc

ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []

ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []

ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []

*** 2011-05-10 10:47:11.138

stopping background process mmnl

*** 2011-05-10 10:47:12.139

stopping background process mmon

*** 2011-05-10 10:47:13.259

ksukia: starting kill, flags = 1

ksukia: killed 0 out of 0 processes.

*** 2011-05-10 10:47:14.652

*** 2011-05-10 10:47:14.652 4132 krsh.c

arch: archival disabled due to shutdown: 1089

*** 2011-05-10 10:47:15.653

*** 2011-05-10 10:47:15.653 4132 krsh.c

arch: archival disabled due to shutdown: 1089

//重新拷贝redo日志到指定目录,再次启动数据库。

total system global area 6413680640 bytes

fixed size                  2187728 bytes

variable size             754978352 bytes

database buffers         5637144576 bytes

redo buffers               19369984 bytes

database mounted.

ora-00338: log 4 of thread 1 is more recent than control file

ora-00312: online log 4 thread 1:

'd:/app/administrator/oradata/ccxe/redo04.log'

//报错果然不一样了,这次报错的意思是我的日志比我的控制文件新,要我恢复控制文件。
sql>  recover database using backup controlfile until cancel; 指定日志文件恢复

specify log: {=suggested | filename | auto | cancel}

d:/app/administrator/oradata/ccxe/redo04.log

ora-00279: change 128488612 generated at 05/10/2011 11:13:52 needed for thread

ora-00289: suggestion :

d:/app/administrator/flash_recovery_area/ccxe/archivelog/2011_05_10/o1_mf_1_1771_%u_.arc

ora-00280: change 128488612 for thread 1 is in sequence #1771

ora-00278: log file 'd:/app/administrator/oradata/ccxe/redo04.log' no longer

needed for this recovery

specify log: {=suggested | filename | auto | cancel}

d:/app/administrator/oradata/ccxe/redo05.log

log applied.

media recovery complete.

sql> alter database open; -必须以resetlogs方式打开数据库

alter database open

error at line 1:

ora-01589: must use resetlogs or noresetlogs option for database open

sql> alter database open resetlogs ;

database altered.


ok,现在数据库起来了,通过这次出错我总结了几点,希望对大家有帮助

1:数据库不管是不是测试,都尽量备份,否则出问题哭都来不及。

2:数据库尽量归档,这样就可以恢复数据库在任何时刻。

3:出错时不要慌,要仔细查看报错信息,分析报错,根据自己所掌握的知识一步一步解决,当你把问题解决

时,你会发现排错的过程真的是一个非常提升自己的过程。

4:平常一定要有几个在这方面很强的朋友,因为有的时候并不是自己查资料就能查到的,更多的是需要朋友的

经验与帮助。

注:以上就是这次错误的全部过程,过段时间我会把近期所遇到的错误都整理一下,都分享给大家,通过近期的工作我感觉数据库真的是一个非常庞大的系统,每次遇到新错的时候我都会很郁闷的解决,因为我发现我的懂的还是太少了,学习毕竟是一个由点到线,由线到网的过程,一个问题由模糊到清晰,由清晰再模糊,反复来几遍最终都会很明白的。我们要有清晰的理论知识,出错的时候才会找到出题所在,作为一个dba冷静,清晰的头脑也很重要,通过dba的这个行业,也是非常锻炼自己的性格,希望大家都可以在dba的这条职场之路,越走越远,祝大家好运。



坏男孩 2015-03-20 15:08 发表评论
]]>
解决ora-01555报错http://www.blogjava.net/badboyryan/archive/2015/03/20/423675.html坏男孩坏男孩fri, 20 mar 2015 07:03:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/03/20/423675.htmlhttp://www.blogjava.net/badboyryan/comments/423675.htmlhttp://www.blogjava.net/badboyryan/archive/2015/03/20/423675.html#feedback1http://www.blogjava.net/badboyryan/comments/commentrss/423675.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/423675.htmlos环境:windows2008

数据库版本:oracle 11.2.0

 

今天同事需要执行一个拥有大批量运算的存储过程,当执行的时候报错,报错信息如下:

 

error at line 1:
ora-01555: snapshot too old: rollback segment number 18 with name
"_syssmu18_671080725$" too small
ora-06512: at "tranuser.tran_etl_load_j2s_main", line 22
ora-06512: at "tranuser.tran_etl_load_jst_pre", line 5
ora-06512: at line 2

 

--精彩解释

不知道是从哪里转的了, 假设有张表,叫table1,里面有5000万行数据,假设预计全表扫描1次需要1个小时,我们从过程来看: 

1、在1点钟,有个用户a发出了select * from table1;此时不管将来table1怎么变化,正确的结果应该是用户a会看到在1点钟这个时刻的内容。这个是没有疑问的。 
2、在1点30分,有个用户b执行了update命令,更新了table1表中的第4000万行的这条记录,这时,用户a的全表扫描还没有到达第4000万条。毫无疑问,这个时候,第4000万行的这条记录是被写到了回滚段里去了的,我假设是回滚段rbs1,如果用户a的全表扫描到达了第4000万行,是应该会正确的从回滚段rbs1中读取出1点钟时刻的内容的。 
3、这时,用户b将他刚才做的操作commit了,但是这时,系统仍然可以给用户a提供正确的数据,因为那第4000万行记录的内容仍然还在回滚段rbs1里,系统可以根据scn来到回滚段里找到正确的数据,但是大家注意到,这时记录在rbs1里的第4000万行记录已经发生了一点重大的改变:就是这个第4000万行的在回滚段rbs1里的数据有可能随时被覆盖掉,因为这条记录已经被提交了!!! 
4、由于用户a的查询时间漫长,而业务在一直不断的进行,rbs1回滚段在被多个不同的tracnsaction使用着,这个回滚段里的extent循环到了第4000万行数据所在的extent,由于这条记录已经被标记提交了,所以这个extent是可以被其他transaction覆盖掉的! 
5、到了1点40分,用户a的查询终于到了第4000万行,而这时已经出现了第4条说的情况,需要到回滚段rbs1去找数据,但是已经被覆盖掉了,于是01555就出现了。

--错误提示

数据库报错 ora-01555 什么回滚段 '_syssmu168' is too small.很明显 是可用的回滚段太小了 满足不了那个大事物的需要 具体的sql我就不提供了

还有一种可能,一般伴随着ora-22924出现就是lob上的问题

辨别ora-01555是不是发生在lob上的,一般来说,普通的01555错误会指明发生01555的rollback segment,而lob的则没有,而是伴随着ora-22924出现
http://www.dbafan.com/blog/?p=11

辨别ora-01555是不是发生在lob上的,一般来说,普通的01555错误会指明发生01555的rollback segment,而lob的则没有,而是伴随着ora-22924出现

 

--回滚原理

回退段中存放的信息被称为“前照”(pre-image),也就是说当一个进程对某个表进行了dml操作以后,
更改前的纪录信息被存放于回滚段,其作用有两个:

1、当进程要求回滚(rollback)的时候,使用回滚段中信息是纪录复原;

2、保持数据读的一致性,当一个进程从某个表中读纪录的时候,oracle返回的是当读开始或者进程开始时的纪录,如果在读取过程中有其他进程更改了表纪录,oracle就会从回滚段中读取当读操作开始时的数据。回滚段中信息并不是持久有效的,当进程提交(commit)或者回滚(rollback)的时候,回滚段就被释放了。当一个进程在执行一个大查询的时候,如果在查询的过程中所读取得的表被更改而且更改commit太久,那回滚段中的“前照”就有可能会被其他的进程覆盖,从而导致ora-01555错误。

 

--解决方法

1、增加回滚段的大小,因为oracle总是覆盖最旧的回滚段,所以大的回滚段能有效的降低数据被覆盖的可能性。
2、检查你的程序,避免在一个大查询的过程中对所查询的表执行太多更新操作。

下面回顾下关于ora-01555的解决方法 10g默认是使用aum 这里就不说了. 下面是几个解决方式来自总结的很不错 大家可用参考下:

1、扩大回滚段: 因为回滚段是循环使用的,如果回滚段足够大,那么那些被提交的数据信息就能保存足够长的时间是那些大事务完成一致性读取

2、增加undo_retention时间:在undo_retention规定的时间内,任何其他事务都不能覆盖这些数据。

3、优化相关查询语句,减少一致性读:减少查询语句的一致性读,就降低读取不到回滚段数据的风险。这一点非常重要!

4、减少不必要的事务提交:提交的事务越少,产生的回滚段信息就越少。

5、对大事务指定回滚段,通过以下语句可以指定事务的回滚段:set transaction use rollback segment rollback_segment; 给大事务指定回滚段,即降低大事务回滚信息覆盖其他事务的回滚信息的几率,又降低了他自身的回滚信息被覆盖的几率。大事务的存在,往往是1555错误产生的诱因。

6、使用游标时尽量使用显式游标,并且只在需要的时候打开游标,同时将所有可以在游标外做的操作从游标循环中拿出。当游标打开时,查询就开始了,直到游标关闭。减少游标的打开时间,就减少了1555错误发生的几率。

 

--一些实例

我的回答是先看看到底是哪个sql有这个问题,再确定不是因为sql本身太糟糕导致snapshot too old。再跟他们说我不相信把undo_retention加大会有效地解决问题。最后给几个cases来支持我的观点。
(1)reduce the frequency of commit
(2)set initialization paramter undo_retention(9i)
(3)alter system set retention guarrantee (10g)
(4)increase the size of the undo tablespace
(5)assign a large rollback segment for the large transaction
(6)tuning the long run sql
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
the root cause of the error ora-01555:the long run query can not find a consistent image, because the undo blocks that used to construct the consistent image were wrapped by other active transaction.

遇到这个问题,首先可以看是维护需要执行的sql或者应用执行的sql报的

1、如果平时不报,只是维护人员执行的sql报的,一般是sql写得不好,运行执行过长,超过了参数 redo_retention所设置的时间造成的。这种情况可以协助他们进行sql分析和优化,减少运行时间,这个情况下系统不需要对系统进行调整

2、如果是应用程序报的,比如批量程序,则需要通知相关人员进行重做,否则批量运行失败,业务可能会因为数据遗漏出现问题。如果出现的频率较多,则需要在优化应用程序(优化的手段有sql优化、适当增加commit的次数等)。在应用新版本上线前,可通过调整系统配置临时解决问题方法如:

1)增大undo表空间

2)增大redo_retention

3)为此大事物指定专门的undo 段

新鲜出炉的案例:apps的人下午回馈说今天一个db的job一直报snapshot too old。这是过去几个月这个数据库第一次有这种回馈。到alert log中看看,有好多这种error:wed jul 16 10:30:44 2008 ora-01555 caused by sql statement below (query duration=884 sec, scn: 0x0018.bef62785):wed jul 16 10:30:44 2008

wed jul 16 10:57:29 2008 ora-01555 caused by sql statement below (query duration=149 sec, scn: 0x0018.bf0d3e47):wed jul 16 10:57:29 2008

嗯,884s,149s,不可能吧?看看undo settings,很大啊:

sql> show parameter undo
name                                 type        value
------------------------------------ ----------- ------------------------------
undo_management                      string      auto
undo_retention                       integer     10800
undo_suppress_errors                 boolean     false
undo_tablespace                      string      undotbs2

sql> select sum(bytes)/(1024*1024*1024) as gbytes from dba_data_files;
    gbytes
----------
300.654297

sql> select sum(bytes)/(1024*1024*1024) as gbytes from dba_data_files where tablespace_name='undotbs2';
    gbytes
----------
  9.765625

自己试试:
create table mytab as where 1=0
16:12:14 sql> insert into mytab
insert into mytab
            *

error at line 1:
ora-01555: snapshot too old: rollback segment number 27 with name "_syssmu27$"
too small
elapsed: 00:10:08.83

奇怪了。看看今天这个untotbs2 utilization怎样。

sql> select snap_time, free_mb from tbs_usage_hist where database='' and tbs='undotbs2' and snap_time>sysdate-1 order by snap_time;
snap_time              free_mb
------------------- ----------
2008-07-15 18:00:00    9172.56
2008-07-15 19:00:00    9172.56
2008-07-15 20:00:00    9156.56
2008-07-15 21:00:00    9188.56
2008-07-15 22:00:00    9204.56
2008-07-15 23:00:00    9212.56
2008-07-16 00:00:00    9228.56
2008-07-16 01:00:00    9228.56
2008-07-16 02:00:00    9236.56
2008-07-16 03:00:00    9228.56
2008-07-16 04:00:00    9252.56
2008-07-16 05:00:00    9252.56
2008-07-16 06:00:00    9252.56
2008-07-16 07:00:00    9260.56
2008-07-16 08:00:00    9244.56
2008-07-16 09:00:00    8486.56
2008-07-16 10:00:00    1683.56
2008-07-16 11:00:00       2.31
2008-07-16 12:00:00       1.94
2008-07-16 13:00:00       2.44
2008-07-16 14:00:00       2.44
2008-07-16 15:00:00       1.25
2008-07-16 16:00:00      17.75

那 问题应当是很明了了,自今天十点多undotbs2一直是highly utilized。打个电话给app owner,原来他今天早上十点左右做了一个很大的delete。即然这个报错的app只要在二十四小时内能再执行完就可以,而oltp app没报错,那就再等等吧。在四点半时,undotbs2就差不多是85% free。再试试:
16:37:49 sql> insert into mytab
182 rows created.
elapsed: 00:34:47.39
17:12:37 sql>
现在的undotbs2 utilization:
snap_time              free_mb
------------------- ----------
2008-07-16 17:00:00    8523.63
问题解决。snapshot too old从来就不是一个过时的题目,也没有一个简单的答案。



坏男孩 2015-03-20 15:03 发表评论
]]>
ora--27100http://www.blogjava.net/badboyryan/archive/2015/03/20/423674.html坏男孩坏男孩fri, 20 mar 2015 06:58:00 gmthttp://www.blogjava.net/badboyryan/archive/2015/03/20/423674.htmlhttp://www.blogjava.net/badboyryan/comments/423674.htmlhttp://www.blogjava.net/badboyryan/archive/2015/03/20/423674.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/423674.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/423674.html
分类: 2011-05-19 15:49 1220人阅读 (0)  

os环境:windows pc

数据库版本:oracle 10.0.2.1

 

这是一次小打小闹的报错,原因是帮同事改他自己玩的测试库sga,原sga_max_size大小为600m,我修改为2g,重启时报错。

 

ora-27100 shared memory realm already exists

 

通过查询官方文档,解释该原因是因为windows pc 32位机最大支持分配oracle内存为1.7g,所以导致报错,这是一次缺少经验的教训。

 

解决案例:

  

1:sql> show parameter sga

     name                                 type        value
------------------------------------ ----------- ------------------------------
     lock_sga                             boolean     false
     pre_page_sga                    boolean     false
     sga_max_size                    big integer 568m
     sga_target                         big integer 568m

 

2:sql> alter system set sga_max_size=2048m scope=spfile; -将sga设置为2g

     sql> alter system set sga_target=2048m scope=spfile;

 

3:sql> shutdown immediate  -重启数据库报错

     sql> startup

 

     ora-27100 shared memory realm already exists

     osd-00029: ????????????
     o/s-error: (os 8) ??????????????????????????????     

 

4:sql> create pfile from spfile; -使用spfile生成pfile,修改参数文件内的以下两个参数,

    将参数调小。

     *.sga_max_size=600000000
     *.sga_target=600000000

 

5:sql> startup pfile='e:/oracle/product/10.2.0/db_1/database/initorcl.ora' -这时候启动

     依然报错,这是因为windows机器需要重启后台服务,否则无法生效(郁闷)
     ora-27100 shared memory realm already exists

     osd-00029: ????????????
     o/s-error: (os 8) ??????????????????????????????

 

7:找到管理/服务/oracleserviceorcl 重启

 

8:sql> startup pfile='e:/oracle/product/10.2.0/db_1/database/initorcl.ora'
     oracle 例程已经启动。

     total system global area  603979776 bytes
     fixed size                  1250428 bytes
     variable size             163580804 bytes
     database buffers          432013312 bytes
     redo buffers                7135232 bytes
     数据库装载完毕。
     数据库已经打开。

 

9:sql> create spfile from pfile; -根据启动的pfile生成spfile,下次启动时候则主动读取spfile

     参数文件

     sql> startup force
     sql> show parameter spfile

     name                                 type        value
     ------------------------------------ ----------- ------------------------------
     spfile                               string      e:/oracle/product/10.2.0/db_1/
                                                 database/spfileorcl.ora
     sql> show parameter sga;

     name                                 type        value
     ----------------------------------- ----------- ------------------------------
     lock_sga                             boolean     false
     pre_page_sga                      boolean     false
     sga_max_size                      big integer 576m
     sga_target                          big integer 576m



坏男孩 2015-03-20 14:58 发表评论
]]>
修改myeclipse里面编辑器的字体http://www.blogjava.net/badboyryan/archive/2014/01/04/408510.html坏男孩坏男孩sat, 04 jan 2014 14:55:00 gmthttp://www.blogjava.net/badboyryan/archive/2014/01/04/408510.htmlhttp://www.blogjava.net/badboyryan/comments/408510.htmlhttp://www.blogjava.net/badboyryan/archive/2014/01/04/408510.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/408510.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/408510.html 

jsp字体

window-->preferences-->general-->appearance-->colors and fonts-->basic-->text font-->chang

里面的“text font”。直接在jsp文件编辑器上点击右键,然后选择属性,就可以设置了

java代码字体

window-->preferences-->general-->appearance-->colors and fonts-->java->java editor text font然后点那个change按钮选字体大小和类型


坏男孩 2014-01-04 22:55 发表评论
]]>
总结一下todo的用法http://www.blogjava.net/badboyryan/archive/2013/12/29/408179.html坏男孩坏男孩sun, 29 dec 2013 09:48:00 gmthttp://www.blogjava.net/badboyryan/archive/2013/12/29/408179.htmlhttp://www.blogjava.net/badboyryan/comments/408179.htmlhttp://www.blogjava.net/badboyryan/archive/2013/12/29/408179.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/408179.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/408179.html1.设置任务的标签
window->preference->java->complier->task tags
加一个 done:normal表示已经完成的任务
2. java代码里面加入//todo 需要处理的任务
这是需要完成的任务
3.代码里面加入//fixme 表示优先级别比较高,需要处理的缺陷问题的任务
4.代码里面加入//xxx 表示虽然任务已经完成但是还需要优化处理的任务
5.代码里面加入//done表示这个任务已经处理完了,其实可以删除这个标签了

6.加的这些任务再哪里可以看到呢,window — show view — tasks
html xml

jsp 
<%-- todo mytask -->
java javascript
//todo mytask
css
/*todo mytask */

打开 (window->preferences) 

选择 general->editors->structured text edit->task tags.

勾选 "enable searching for task tags" setting. 

在“filters”标签页中,要保证jsp是选中的。


在任务视图里面可以看到任务的状态。

在发布项目之前,需要管伫一下这个视图防止有未完成的任务就发布了项目。



 


坏男孩 2013-12-29 17:48 发表评论
]]>
ueditor上传图片失败以及上传附件显示“网络错误500”的解决方法http://www.blogjava.net/badboyryan/archive/2013/09/18/404201.html坏男孩坏男孩wed, 18 sep 2013 02:09:00 gmthttp://www.blogjava.net/badboyryan/archive/2013/09/18/404201.htmlhttp://www.blogjava.net/badboyryan/comments/404201.htmlhttp://www.blogjava.net/badboyryan/archive/2013/09/18/404201.html#feedback2http://www.blogjava.net/badboyryan/comments/commentrss/404201.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/404201.htmlueditor上传图片失败以及上传附件显示“网络错误500

”的解决方法
1、ueditor目录jsp目录下面有一个java文件

uploader.java
2、把这个文件放到src/ueditor包里面
3、把ueditor/jsp/目录下面的两个jar包放到工程里面
4 重新编译项目ok,可以上传附件,图片了!

有点小高兴



坏男孩 2013-09-18 10:09 发表评论
]]>
win8安装sqlserver 2008的时候居然验证不通过解决办法http://www.blogjava.net/badboyryan/archive/2013/08/27/403366.html坏男孩坏男孩tue, 27 aug 2013 07:21:00 gmthttp://www.blogjava.net/badboyryan/archive/2013/08/27/403366.htmlhttp://www.blogjava.net/badboyryan/comments/403366.htmlhttp://www.blogjava.net/badboyryan/archive/2013/08/27/403366.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/403366.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/403366.html
经典吧,账户名都选择下面一样的,,,密码不用管!验证通过!!!

坏男孩 2013-08-27 15:21 发表评论
]]>
解决win2k3server安装sql2000时提示无法验证产品密钥的问题http://www.blogjava.net/badboyryan/archive/2013/08/20/403081.html坏男孩坏男孩tue, 20 aug 2013 05:06:00 gmthttp://www.blogjava.net/badboyryan/archive/2013/08/20/403081.htmlhttp://www.blogjava.net/badboyryan/comments/403081.htmlhttp://www.blogjava.net/badboyryan/archive/2013/08/20/403081.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/403081.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/403081.html在windows 2003 server 以前版本的操作系统上好像从来没有出现过要输入cd key,但在windows 2003 server打上sp1和域控制器环境下却在安装过程中出现输入cdkey的界面,提示提示无法验证产品密钥,cdkey不对?

解决办法如下:

方法一:   环境: windows 2003 server sp1企业vol版 域控环境
安装数据库: sql 2000

在给出的输入cdkey的界面中,输入你已经安装的windows server 2003 的cdkey即可以继续安装,而不是sql 2000的cdkey。

方法二: 在开始>运行>输入“regedit"; 打开注册表编辑器。
浏览到
hkey_local_machine\system\currentcontrolset\control\session manager

将safedllsearchmode的dword值并将值从 1 更改为 0。
如果safedllsearchmode值不存在, 新建一个dword类型的safedllsearchmode键值。
重新启动 sql server 2000 安装,这时就不会出现提示“无法验证产品密钥”。
应用最新 sql servicepack 然后重新启动服务器。



坏男孩 2013-08-20 13:06 发表评论
]]>
在字符界面安装gnome桌面http://www.blogjava.net/badboyryan/archive/2012/06/20/381202.html坏男孩坏男孩wed, 20 jun 2012 12:37:00 gmthttp://www.blogjava.net/badboyryan/archive/2012/06/20/381202.htmlhttp://www.blogjava.net/badboyryan/comments/381202.htmlhttp://www.blogjava.net/badboyryan/archive/2012/06/20/381202.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/381202.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/381202.html如果你是字符界面安装的系统的话,因为不让你选择软件包,所以你需要在安装好系统后,安装需要的软件,比如说桌面。

在rhel6.1中,gonme桌面包的名字变成了desktop,这算是rhel6.1默认的桌面了。但如果只安装这个组的话,也是不行的,他缺少了x协议的支持,在启动桌面的时候,会出现下面和x相关的错误提示。


xinit: no such file or directory (errno 2): no server "/usr/bin/x" in path xinit: no such file or directory (errno 2): unable to connect to x server xinit: no such process (errno 3): server error.
所以说,要在字符界面下安装gnome桌面,你需要安装两个组。


yum groupinstall "x window system" yum groupinstall "desktop"

 

如果说,你安装系统的时候,选择了中文语言包的支持的话,那么系统会以中文显示。如果在终端使用的话,有点不方便,告别是用yum group*这些命令的时候,可能无法安装。

解决的办法就是编辑

/etc/sysconfig/i18n


把zh_cn换成en_us lang="en_us.utf-8" 然后执行一次下面的命令 source /etc/sysconfig/i18n

 

 



坏男孩 2012-06-20 20:37 发表评论
]]>
用exp无法导出空表解决方法http://www.blogjava.net/badboyryan/archive/2012/06/11/380485.html坏男孩坏男孩mon, 11 jun 2012 02:29:00 gmthttp://www.blogjava.net/badboyryan/archive/2012/06/11/380485.htmlhttp://www.blogjava.net/badboyryan/comments/380485.htmlhttp://www.blogjava.net/badboyryan/archive/2012/06/11/380485.html#feedback1http://www.blogjava.net/badboyryan/comments/commentrss/380485.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/380485.html

最早的一次使用oracle 11g导出数据发现有的表丢失了,感觉莫名其妙的,后来终于找到原因了。
找到问题以后,再看看凯发天生赢家一触即发官网的解决方案。

11gr2中有个新特性,当表无数据时,不分配segment,以节省空间,可是在用export导出时,空表也不能导出,这就导致迁移时候丢失了一些表,存储过程也失效了。本以为exp能有相应的控制开关,可以切换是否导出空表,看了下帮助,没有太大的改变。有些奇怪,难道11gr2不更新exp的功能了,还看有的帖子说11gr1作为客户端去卸载11gr2的,都会出现ora-1455d的错误,得换成11gr2的exp才没事了,心中感慨阿,怎么版本间的兼容这么脆弱了!

  解决方法:

blogjava-凯发k8网页登录

  该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。

该参数值默认是true,当改为false时,无论是空表还是非空表,都分配segment。修改语句:

alter system set deferred_segment_creation=false scope=both;

  需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,只能用第一种方法。

select 'alter '||table_name||' allocate extent;' from user_tables where num_rows=0;

  把sql查询的结果导出,然后执行导出的语句,强行为表分配空间修改segment值,然后再导出即可导出空表了。





坏男孩 2012-06-11 10:29 发表评论
]]>
解决web应用和数据库在一起,应用服务启动报错http://www.blogjava.net/badboyryan/archive/2012/06/05/380071.html坏男孩坏男孩tue, 05 jun 2012 14:20:00 gmthttp://www.blogjava.net/badboyryan/archive/2012/06/05/380071.htmlhttp://www.blogjava.net/badboyryan/comments/380071.htmlhttp://www.blogjava.net/badboyryan/archive/2012/06/05/380071.html#feedback0http://www.blogjava.net/badboyryan/comments/commentrss/380071.htmlhttp://www.blogjava.net/badboyryan/services/trackbacks/380071.htmlnet stop tomcat
rem ping 20个包,实现延时
ping 127.0.0.1 -n 20
net start tomcat

做成bat文件,开机的时候运行这个批处理,这样oracle就有足够的时间启动了

坏男孩 2012-06-05 22:20 发表评论
]]>
网站地图