【Oracle开发】关于11.2上WMSYS.WM_CONCAT的workaround

有很多人问关于新版本中WMSYS.WM_CONCAT函数无法使用的问题。

 

对于该函数,Oracle官方的态度是其从来没有将该函数列入任何官方文档中,这个函数仅仅是让Oracle Dev研发在针对内部对象例如SYS的存储过程、字典表等使用的,并没有鼓励普通的应用开发者去使用该WMSYS.WM_CONCAT函数,但是由于部分应用开发者发现了这个函数,而且觉得较为好用,所以在应用程序编写过程中大量使用该函数,其结果是由于Oracle对该函数在后续版本中的修改(包括fix、增强)乃至于完全去掉这个函数都是有可能的。

 

不少人就遇到了这个问题,在新的11.2中没有找到该WMSYS.WM_CONCAT函数,也就意味着其应用程序无法在11.2上正常运行。

这里可以说最初发现这个WMSYS.WM_CONCAT函数的人,即做了一件好事,同时又做了一件坏事。

Oracle官方的态度是在11.2中应当使用 listagg函数而非WMSYS.WM_CONCAT。

关于LISTAGG:

Oracle® Database SQL Language Reference 11g Release 2 (11.2)

Oracle® Database SQL Language Reference 12c Release 1 (12.1)

但国内的一些朋友肯定还会坚持要在11.2中使用WMSYS.WM_CONCAT,这里提供一种workaround,自己用source来创建WMSYS.WM_CONCAT

 

 

SQL>  CREATE OR REPLACE
type       WM_CONCAT_IMPL wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
d
270 160
bg9hz+fBwa888VEZGViHFs/oOP0wg433f64df3QCWE7VehmhTFcUe3y+JrsniV3cSuvmnE3g
Y93dtR+cCsU1N+UQDGbtzhCf2HIdr8lPzfgF2bmCTvmGlHQbTAjTftNrDq3p093ncwb32OyX
3ZFDTeH2jpjm3uWYyT8kZBfJIYxRwgLfRApoW32cpy0eRnvDBt2XfTAMXKCSNnqSoTiGA83W
6deKW+rWyBu9L/EPyFkmQZeBncNsiNDF8fa1Sm6vdQiEanlCQnaPJ11a0na8hK6psDSaey+x
fdMupCwSvg6gMrSV4QCguhOCqW2AmxRVMqpXJootPpTBxBFZc7hORGbriUI=
/
Type created.

#www.askmaclean.com
SQL>  CREATE OR REPLACE function wm_concat wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
58 96
+CuW1MAfZPVR6NOnXKVmXY2o9pswg8eZgcfLCNL+XhZy8K7/cgzcVrPnfMPnx3TAM7h0ZSXD
j57Asr2ym9ZtFldFmFu+RdpAU8VGORKSvtVG+DmAOR4C+NTa+Pit2kDbEpI5zhZUgqameSkE
DQ==
/
Function created.

#http://www.askmaclean.com/archives/wmsys-wm_concat.html 
#www.askmaclean.com
SQL>  select wm_concat(object_id) from sys.user_objects
/
WM_CONCAT(OBJECT_ID)                                                            
--------------------------------------------------------------------------------
108674,108672,53144,53147,53150,53151,53162                                     
1 row selected.

 

【Oracle数据库恢复】I_OBJ1、I_OBJ2、I_OBJ3、I_OBJ4、I_OBJ5等SYS索引的修复

I_OBJ1、I_OBJ2、I_OBJ3、I_OBJ4、I_OBJ5这几个都是OBJ$基表的索引,如果损坏会非常麻烦,因为ORACLE 对这些对象的DDL做了严格限制,你没有办法简单修复他们。
如下面的例子:

*** 2012-01-31 05:59:24.837
Doing block recovery for file 25 block 2256706
Block header before block recovery:
buffer tsn: 0 rdba: 0x06626f42 (25/2256706)
scn: 0x08b7.b1dff478 seq: 0x01 flg: 0x04 tail: 0xf4780601
frmt: 0x02 chkval: 0x8da3 type: 0x06=trans data
Doing block recovery for file 25 block 2256706
Block header before block recovery:
buffer tsn: 0 rdba: 0x06626f42 (25/2256706)


--------------------
It looks like PMON is trying to recover a block, and is unable to do so.
select * from dba_extents where 2256706 between block_id and block_id +
blocks
SQL> i
2 and file_id = 25;
SYS I_OBJ5
INDEX SYSTEM
70 25
2256640 1048576 128
25


以上确认了25号文件2256706出现了问题,对应对象为SYS的索引i_obj5 ,但是由于这个是字典基表OBJ$上的索引,所以无法直接重建的:

 

 

No ddl is allowed for i_obj5 as it is needed for warm start:
SQL> drop index i_obj5;
drop index i_obj5
*
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered

alter system set events '10293 trace name context forever, level 1';
and also get 3 PMON errorstack at level 5133 in 1 min intervals.
dbv userid=sys/pass file= blocksize= start=2256706 end=2256706

 

以上可以看到对索引做任何操作都会报ORA-701错误,这里我们需要特殊的手段才能真正意义上修复I_OBJ1、I_OBJ2、I_OBJ3、I_OBJ4、I_OBJ5等SYS索引。

 

 

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 400-690-3643   备用电话: 18501767907    邮箱:service@parnassusdata.com

 

ORACLE DB数据库常见问题解决及诊断技巧集锦-ORACLE DBA故障修复必备手册

ORACLE DB数据库常见问题解决及诊断技巧集锦-ORACLE DBA故障修复必备手册下载

#ORACLE 12c in-memory#

#ORACLE 12c in-memory# IBM这次很敏捷,马上就DB2 BLU和Oracle 12c in-memory做对比。其攻击矛头指向几点:Oracle磁盘上的数据仍以行row形式存,存放重复列存数据,O必须把所有列存数据放入内存,内存列存让重启预热变长。Oracle说我只是蛋糕上加了草莓而已,别整那些没用的。

ORACLE DUL/PRM常见问题汇总FAQ

FAQ 常见问题解答

  1. 我不知道我的数据库的字符集信息怎么办?

你可以通过ORACLE告警日志alert.log来大致了解你的数据库字符集信息,例如:

[oracle@mlab2 trace]$ grep  -i character alert_Parnassus.log

Database Characterset is US7ASCII

Database Characterset is US7ASCII

alter database character set INTERNAL_CONVERT AL32UTF8

Updating character set in controlfile to AL32UTF8

Synchronizing connection with database character set information

Refreshing type attributes with new character set information

Completed: alter database character set INTERNAL_CONVERT AL32UTF8

alter database national character set INTERNAL_CONVERT UTF8

Completed: alter database national character set INTERNAL_CONVERT UTF8

Database Characterset is AL32UTF8

Database Characterset is AL32UTF8

Database Characterset is AL32UTF8

  1. 为什么我使用PRM总是闪退或者报一些例如” gc warning: Repeated allocation of very large block (appr.size 512000)”的GC报错?

就目前ParnassuData看到的案例而言,绝大多数此类问题都是由于使用了非推荐的JAVA环境所造成的;特别是在Linux平台上使用了redhat gcj java的话很容易造成该问题。ParnassusData建议用户使用ORACLE提供的JDK1.6以上环境运行PRM,可以直接使用$JAVA_HOME/bin/java –jar prm.jar来启动PRM。

各个操作系统平台的JDK 1.6的下载连接如下:

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR

  1. 如果我发现了PRM的bug,我应当如何report bug给ParnassusData?

ParnassusData欢迎任何人给我们report bug,只需要发邮件到report_bugs@parnassusdata.com就好了, 建议提交bug时附上您详细的运行环境 包括操作系统、JAVA运行环境和ORACLE数据库版本的环境信息。

  1. 我启动PRM出现下面的错误怎么办?

Error: no `server’ JVM at `D:\Program Files (x86)\Java\jre1.5.0_22\bin\server\jvm.dll’.

这是由于用户的环境中安装的是JAVA Runtime Environment JRE,而没有安装JDK。而启动PRM的脚本中加入了-sever的选项,该选项在JRE 版本1.5之前是没有的,所以会出现该错误。

ParnassusData建议用户使用ORACLE提供的JDK1.6以上环境运行PRM。

各个操作系统平台的JDK 1.6的下载连接如下:

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR

  1. 为什么我在使用PRM时中文显示乱码?

目前已知有2种可能导致该中文显示乱码问题:

l  PRM所运行操作系统环境没有安装中文语言包,例如PRM运行在没有安装中文语言包的Linux平台上,那么PRM作为一个软件是无法正常显示中文的。

l  操作系统已经安装了必要的语言包,但启动PRM使用的是JDK 1.4的JAVA运行环境,同样可能出现中文乱码,该问题建议使用JDK 1.6或以上版本来解决

  1. PRM是否支持LOB大对象字段?

PRM支持CLOB、NCLOB、BLOB等大对象字段,包括分区表、Disable/Enable Storage in ROW等情况均支持对LOB的数据搭桥模式,LOB数据一样无需落地,就可以应用到远程目标数据库中。

对于LOB大对象字段不支持普通的UNLOAD抽取方式,因为抽取方式在数据导入时会十分麻烦;所以我们也推荐用户尽可能使用DataBridge数据搭桥模式。

  1. PRM有什么讨论的论坛吗?

目前我们有中文的PRM讨论BBS版面,地址为:

http://t.askmaclean.com/forum-24-1.html

  1. 为什么我运行PRM遇到以下的报错?

JVMJ9GC020E -Xms too large for heap

JVMJ9VM015W Initialization error for library j9gc23(2): Failed to initialize

Could not create the Java virtual machine.

这是因为AIX上IBM的JVM无法分配prm.sh所指定的JAVA虚拟机分配内存,之所以在prm.sh中指定-Xms最小分配内存大小是为了获得更好的性能和稳定性。

对于上述错误 可以直接运行 java –jar prm.jar 来绕过。

但诗檀仍推荐用户安装JDK 1.6或以上版本。  下为部分平台上的JDK下载地址:

AIX JAVA SDK 7 http://pan.baidu.com/s/1i3JvAlv
Linux JDK 7 64bit http://pan.baidu.com/s/1jGl3AT4
Linux JDK 7 32bit http://pan.baidu.com/s/1mg6ymnQ
Solaris JDK 7 x86-64bit http://pan.baidu.com/s/1gdzgSvh
Solaris JDK 7 x86-32bit http://pan.baidu.com/s/1mgjxFlQ
Solaris JDK 7 Sparc http://pan.baidu.com/s/1pJjX3Ft

其他下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

9.  为什么我运行PRM并加载数据文件LOAD后报错说 “据文件版本不一致!请检查输出内容以确认“

首先确认加入的数据文件是否都属于同一个数据库,如果不属于同一个数据库那么出现上述错误是正常的。

其次检查后台输出的信息(启动PRM的终端如cmd,terminal):

D:\Software\Management Tools\ParnassusData_PRMforOracle_2001>java -Xms1024M -server -jar  prm.jar

Error in checkDBFFilesVersion(). E:\app\oracle\oradata\orcl\SYSTEM01.DBF (拒绝访问。)

java.io.FileNotFoundException: E:\app\oracle\oradata\orcl\SYSTEM01.DBF (拒绝访问。)

at java.io.RandomAccessFile.open(Native Method)

at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)

at java.io.RandomAccessFile.<init>(RandomAccessFile.java:98)

at com.zeradata.k.a(k.java:1)

at com.zeradata.k.<init>(k.java:12)

at com.zeradata.A.a(A.java:6)

at com.zeradata.A.a(A.java:186)

at com.zeradata.B.a(B.java:2214)

at com.zeradata.B.<init>(B.java:2511)

at com.zeradata.o.<init>(o.java:90)

at com.zeradata.zrm.gui.a4.b(a4.java:69)

at com.zeradata.zrm.gui.a4.c(a4.java:128)

at com.zeradata.zrm.gui.q.actionPerformed(q.java:2)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:5517)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)

at java.awt.Component.processEvent(Component.java:5282)

at java.awt.Container.processEvent(Container.java:1966)

at java.awt.Component.dispatchEventImpl(Component.java:3984)

at java.awt.Container.dispatchEventImpl(Container.java:2024)

at java.awt.Component.dispatchEvent(Component.java:3819)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)

at java.awt.Container.dispatchEventImpl(Container.java:2010)

at java.awt.Window.dispatchEventImpl(Window.java:1791)

at java.awt.Component.dispatchEvent(Component.java:3819)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

DB file version info:

File: E:\app\oracle\oradata\orcl\SYSTEM01.DBF, db version: 0

如发现上述类似信息,则说明是因为PRM无权限访问输入的数据文件所致,由于Window下的文件权限管理,可能导致上述由于权限而无法访问数据文件的错误。

对于上述问题,可以通过 以“管理员身份“ 启动cmd命令行,然后在有管理员权限的cmd下启动prm.bat来解决。

分享一张Oracle CBO(cost based optimizer)的图 从APP到DB到HW

分享一张Oracle CBO(cost based optimizer)的图 从APPlication 到DB数据库到Hardware 硬件

cbo sql performance

PRM for Oracle Database灾难恢复工具,Schema级别数据恢复。JAVA图形化界面版Oracle DUL

图片4

Oracle DBA神器:PRM灾难恢复工具,Schema级别数据恢复。PRM For Oracle Database – schema级别oracle数据库数据恢复特性 ,PRM即ParnassusData Recovery Manager是企业级别Oracle数据库灾难恢复工具。PRM可以在无备份的情况下恢复被truncated掉的表,也可以恢复无法打开的Oracle数据库(Alter Database Open失败)中的数据。 PRM是图形化增强版的Oracle DUL工具,同时具备很多Oracle DUL不具备的特性

深入了解PRM(PanassusData Recovery Manager) For Oracle Database

PRM 是开放的Oracle灾难恢复软件,任何人均可以下载并传播。  PRM = GUI版的Oracle DUL+ 更多免费特性

 
 
一个标准的绿色JAVA工具软件

 

 

 

PRM(PanassusData Recovery Manager) 是基于标准JAVA语言开发的Oracle数据库灾难恢复软件,可以直接从Oracle数据文件中抽取表的完整数据行,而完全无需通过Oracle数据库软件。 由于PRM绕过了UNDO,所以其读取的数据中少量可能是事务中的数据。同时PRM不要求数据文件已经恢复到了一致性的状态。

 
 

Oracle数据库损坏仍可以拯救出数据的工具

 
 
 

数据库可能部分损坏了,但大多数数据块仍是完好的。在数据拯救过程中,PRM会最大程度从数据块中可用的部分把行数据读取出来,如果确认遇到损坏非常严重的数据块,PRM则会将问题数据块的信息打印到日志中去。

 
 

可以抽取TABLE/CLUSTER中的数据

 

PRM主要抽取TABLE/CLUSTER中的数据。PRM从设计角度不是用来抽取如触发器、存储过程或者视图这些对象。 当然由于PRM能够拯救SOURCE$基表的数据,所以变相地可以恢复上述这些对象了。 PRM不恢复索引数据,因为仅仅恢复索引数据一般是没有意义的,除非是IOT索引组织表。

 
 

独创的DataBridge技术

 
 

为什么要引入数据搭桥模式呢?
  • 普通的unload+sqlldr恢复方式意味着要保存一份源数据,一份抽取数据,和一份目标数据,即在恢复过程中可能需要扩容2倍于原来的存储空间,这对于甚至无法腾出备份空间的企业来说十分困难
  • 数据搭桥与普通unload+sqlldr模式的最大区别在于,数据搭桥直接从源库中抽取数据并传送到目标数据库中,无需在文件系统上保留一份抽取数据
  • 通过数据搭桥传送到目标数据库中的数据本身就是结构化的,可以立即使用SQL语句来验证其完整性和一致性
  • 如果数据搭桥的目标数据库库位于异机上,那么源数据库上仅仅做读取操作,读写IO将分布于2台服务器上,PRM恢复的速度将更快
  • 如果用户所需要恢复的是Truncate数据的话,那么可以马上搭桥回到源库中,恢复仅仅是鼠标点几下的工作


完备的多语言支持

 

 

PRM在开发过程中充分考虑了多语言支持的问题,利用JAVA语言的全球化特性,PRM几乎支持所有主流的Oracle数据库字符集,以下为PRM支持的语言和字符集CharacterSet列表:

语言 字符集 对应的编码
中文 简体/繁体 ZHS16GBK GBK
中文 简体/繁体 ZHS16DBCS CP935
中文 简体/繁体 ZHT16BIG5 BIG5
中文 简体/繁体 ZHT16DBCS CP937
中文 简体/繁体 ZHT16HKSCS CP950
中文 简体/繁体 ZHS16CGB231280 GB2312
中文 简体/繁体 ZHS32GB18030 GB18030
日文 JA16SJIS SJIS
日文 JA16EUC EUC_JP
日文 JA16DBCS CP939
韩语 KO16MSWIN949 MS649
韩语 KO16KSC5601 EUC_KR
韩语 KO16DBCS CP933
法语 WE8MSWIN1252 CP1252
法语 WE8ISO8859P15 ISO8859_15
法语 WE8PC850 CP850
法语 WE8EBCDIC1148 CP1148
法语 WE8ISO8859P1 ISO8859_1
法语 WE8PC863 CP863
法语 WE8EBCDIC1047 CP1047
法语 WE8EBCDIC1147 CP1147
德语 WE8MSWIN1252 CP1252
德语 WE8ISO8859P15 ISO8859_15
德语 WE8PC850 CP850
德语 WE8EBCDIC1141 CP1141
德语 WE8ISO8859P1 ISO8859_1
德语 WE8EBCDIC1148 CP1148
意大利语 WE8MSWIN1252 CP1252
意大利语 WE8ISO8859P15 ISO8859_15
意大利语 WE8PC850 CP850
意大利语 WE8EBCDIC1144 CP1144
泰语 TH8TISASCII CP874
泰语 TH8TISEBCDIC TIS620
阿拉伯语 AR8MSWIN1256 CP1256
阿拉伯语 AR8ISO8859P6 ISO8859_6
阿拉伯语 AR8ADOS720 CP864
西班牙语 WE8MSWIN1252 CP1252
西班牙语 WE8ISO8859P1 ISO8859_1
西班牙语 WE8PC850 CP850
西班牙语 WE8EBCDIC1047 CP1047
葡萄牙语 WE8MSWIN1252 CP1252
葡萄牙语 WE8ISO8859P1 ISO8859_1
葡萄牙语 WE8PC850 CP850
葡萄牙语 WE8EBCDIC1047 CP1047
葡萄牙语 WE8ISO8859P15 ISO8859_15
葡萄牙语 WE8PC860 CP860