存档

‘Oracle’ 分类的存档

[重发]Pro*C实现导出Oracle表为文本文件

2009年9月9日 ern 没有评论

旧文重发,原文刊载于2006年6月8日

近日工作需要,要大批量导出数据,开始用SQL*Plus的SPOOL功能。结果老是提示“xrealloc: cannot reallocate XXX bytes”。而且每次发生的时间还不同,有时候是到文件1G就出错,有时候是2G多出错。怀疑是32位Linux问题,换到Solaris 8上还是如故。客户端都是9201的,到Metalink上搜索没有结果。郁闷之余到Oracle-l上发了个邮件,收到一位高手的指点,说可能是内存泄露问题,SQL*Plus的开发人员估计也不会想到有人会导出如此大量数据。在邮件往复之间,那位高手提醒可以用UTL_FILE来导出。忽然想起Tom的两本书里都有提到用PL/SQL来导出,于是翻出书里的那个网址http://asktom.oracle.com/~tkyte/flat/index.html,进去一看,PL/SQL的效率比SQL*Plus要高,缺点是生成的文件必须在主机上。SQL*Plus可以调整arraysize来提高效率(当然经我实践大数据量时还有内存泄露之虞)。Pro*C是高效的方法,缺点是需要写程序、编译。
硬着头皮看Pro*C咯,好在Tom给了原始代码,抓下来放到一台Linux的机器上proc报错,应该是proc配置include库的问题,找到一个makefile,倒是没啥问题了,但是最后链接失败,报无法识别’sqlca’。到网上一搜,和我一样晕的人还有,要修改代码,多include进,但是看Tom的帖子似乎没提到这个问题,不知道为什么。
下面是修改后的源代码,我顺便在里面修改了会话的一些参数,以处理中文和时间格式:

阅读全文…

分类: Oracle 标签: , ,

[重发]如何真正NOLOGGING

2009年9月9日 ern 没有评论

旧文重发,原文发表于2007年2月1日

从前几天bigboar要做一个大表更新的项目引发的讨论,CTAS还是INSERT产生redo多。后来在fsm启发下又复习了遍Tom的结论。具体内容就不翻译了,转贴一下:
Table Mode    Insert Mode     ArchiveLog mode      result
———–   ————-   —————–    ———-
LOGGING       APPEND          ARCHIVE LOG          redo generated
NOLOGGING     APPEND          ARCHIVE LOG          no redo
LOGGING       no append       “”                   redo generated
NOLOGGING     no append       “”                   redo generated
LOGGING       APPEND          noarchive log mode   no redo
NOLOGGING     APPEND          noarchive log mode   no redo
LOGGING       no append       noarchive log mode   redo generated
NOLOGGING     no append       noarchive log mode   redo generated

简单来讲,就是表的模式和归档模式具有优先决定权,当表本身NOLOGGING时,指定了APPEND的hint才不产生redo(direct模式的sqlldr应该是一样的),另外就是非归档下则无论表状态只要APPEND总会生效。
其实也就是一个规律,具体的测试就不做了。呵呵。
BTW:在后来的讨论中其实还涉及到UNDO,CTAS产生UNDO方面还是有优势的,INSERT毕竟要记录rowid作为UNDO信息,而CTAS是DDL,立即提交,应该只是在涉及修改数据字典的地方产生UNDO而已。所以Tom在他的帖子里也是推荐用CTAS代替大量UPDATE。当然啦,CTAS也是有弱点的,毕竟表结构不能自定义,这样如果原表设计并不合理的时候就无法顺便改表结构了。
CTAS+PARALLEL(如果可以并行的话)是目前我能想到的最快速度了。

分类: Oracle 标签: ,

[重发]ORA-04030的一种原因

2009年9月8日 ern 2 条评论

旧文新发,原文发表于2007年4月6日

4030的错误往往也挺吓人的,一看就涉及内存问题啊。今天在一个内部使用的数据库上遇到了。往往4030的解决方法都是增加PGA,或者反之,减少SORT_AREA_SIZE/HASH_AREA_SIZE。根本原因其实就是当Oracle试图向OS申请会话内存(session memory)时,OS返回错误,一般是内存不足之类。所以上来就提高PGA_AGGREGATE_TARGET也是不合适的。今天就是这个情况。


在客户端跑一个稍微复杂点的查询时候,出现了ORA-04030,其它同事也反映这个情况出现几天了,即便程序可以运行也慢得像头牛。今天我是忍无可忍了,决心花点时间了解一下。连上服务器,alert.log里果然不少报错。show parameter pga一看,600M,作为这个数据库倒也挺合适。再查询V$PGASTAT,真正花费的内存空间都是150M左右,并不大啊。仔细查查V$SESSTAT,只有三四个占内存超过10M的会话,实时统计总共也就是120M。看来并不是PGA设置太小。忽然想到这台服务器是Win2000 32bit,配置8G内存,联想到了1.7G的限制。不过当初装机器的同事已经设置了AWE,应该可以用到3G啊。


又是一阵show parameter,终于发现了问题,猜想是对的。DB_BLOCK_BUFFERS设置了307000+,也就是2.4G的DB_CACHE,然后SHARED_POOL_SIZE=100M,这加起来都3.1G,突破限制了,居然还不知道为什么设置了JAVA_POOL_SIZE=100M。赶紧改……于是将DB_CACHE调整到了2G(调低DB_BLOCK_BUFFERS),由于没有Java程序或过程,所以JAVA_POOL_SIZE=0,顺手又将SGA_MAX_SIZE降到2.2G,这样数据库就不会盲目相信参数,突破OS进程限制申请空间了。通知同事重新启动数据库,果然再没出现错误了,查V$PGASTAT果然可以分配更多空间了,一般都稳定在200-300M了,程序运行快了不少。

分类: Oracle 标签: , ,

[重发]分组连接列字符串方法

2009年9月8日 ern 没有评论

又翻了一把,顺便转自己文章一篇过来。原文发表于2007年6月20日
共享一个Oracle技巧吧。在以前一篇blog里我写过自定义聚集函数——一条语句将多行的列中字符串连接起来,技术总是在进步的。在这一期的Oracle Magazine中的AskTom,学到了一个不错的方法。从8i开始Oracle增加了分析函数,从9iR1开始,又有了SYS_CONNECT_BY_PATH函数,于是,产生了下面一个更加简单的方法。

阅读全文…

分类: Oracle 标签: ,

SQLDeveloper的一些bug

2009年5月6日 ern 没有评论

虽然不搞数据库了,不过最近做些分析的时候还是祭出了Oracle这把牛刀,顺便用了下Oracle的这款官方工具。我用的最新版本是1.5.4,出乎意料的强大。唯一不好是基于Java的,对大数据量导入导出想必是不行的(除非有超大内存做后盾)。过程中也发现了不少bug,不过到官方论坛瞄了瞄,还是有开发人员重视的。

  1. 导出结果为Excel(XLS文件)可能遇到ORA-00936。似乎问题是出在解析语句上,如果你的SELECT中存在比如a.*的别名前缀,那么就会触发这个bug。暂时的解决方法有两个,一是重写你的语句,去掉别名前缀(两表关联时候有点麻烦了);再就是把你的结果建成一张表,到时候直接导出表就可以了。
  2. 与中文输入法偶有冲突。在用QIM,如果进入SQLDeveloper时是英文输入,打开程序才切换到中文输入,似乎就一切OK;如果打开前就是中文输入,很大机会只能输入英文了,无法输入中文。
  3. 导入Excel文件时要注意,首行可以冻结,但是不能筛选,否则认不到整个表格。
  4. 不支持导入导出LONG一类的字段。这个大概算功能问题吧,倒也不能完全说是bug。

另外还有一个始终萦绕非Windows系统的字符集问题。在我的MAC OS X 10.5.6上推荐保存导出的Excel和SQL脚本为UTF-8,否则和文本编辑器(比如TextWrangler)可能有些冲突。导出的UTF-8文件在Windows Office 2007是可以正常打开的。

进化!Oracle官方工具导入Excel数据

2009年5月1日 ern 2 条评论

Oracle导入Excel数据一直是个挺麻烦的事情,毕竟Excel的格式是微软所有,SQLServer的支持要更好些。以前常见的解决方法就是在Excel里另存为CSV文件,CSV实际上就是逗号或者TAB分隔的TXT文件,因此可以通过sqlldr(sqlloader)来导入。有一个比较麻烦的问题就是,如果字段中间有逗号就会被识别成两个字段。一个workaround就是另存成CSV的时候设置把文本字段用双引号引上,在sqlldr的ctl文件里可以设置enclosed by ‘”‘。但遇到字段内容复杂的文本,依然很难解决。

然后看到了第三方工具的进化,PL/SQL Developer里面可以select * from table_name for update或者select a.*,rowid from table_name来打开表进行编辑,直接拷贝整个Excel数据然后贴进去并提交。以前我基本都是用这个方法,还是比较简单易行的。这个方法不方便的地方就是如果数据量大,耗内存不少,因为数据要全部进剪贴板,数据量大的时候还是容易出问题的。PL/SQL Developer的实现方式也是提交时逐行插入。另外如果你需要导入的Excel与表的格式不一致,就比较麻烦了,得先在Excel里做好数据库表的形式才行。

最近不搞数据库了,今天要整理点数据,又琢磨着用数据库来减轻工作量,正好MacBook上的Oracle也刚装好。MAC OS X下就没有第三方工具的选择了,直接下载了一个Oracle自己的SQLDeveloper 1.5.4,安装就觉得比以前大了很多。刚出测试版的时候我还写过一篇博客,当时基本只能运行SQL语句而已。现在的功能确实强大很多,管理功能也不比TOAD差太多,跑SQL也算顺手,不过是基于JAVA的,我估计处理大数据量对内存消耗还是很猛。言归正传,在里面果然找到了导入数据的功能,一试,可以导入XLS和CSV!而且既可以直接导入然后过程中选择新建表和字段的属性等等,也可以导入到已经存在的表里,可以选择字段的对应关系,还是非常方便。可惜好事多磨,一上来实战就晕了,总是报错。提示我源数据和导入的表字段格式不一致,甚至我导出表为Excel文件然后进行修改后也无法导入。搜索一番发现,国内用这个官方工具的还真少。英文搜索咯……果然在Oracle Forum找到了反映类似问题的帖子。老外们研究得还真细,琢磨出1.5.2和以前的版本导入不完善,无法正常处理,到1.5.3修正了,但到1.5.4反而总提示出错。立刻准备换1.5.3,可惜官方下载居然失效了。回到论坛一看置顶,原来1.5.4已经进行了修正!哈哈,即刻升级(顺便说一句,如果下载进度条没有显示直接跳过,那是没有下载成功,我最终是翻%墙出去搞定的)!果然一次性导入成功(14000+行,含复杂中文、特殊字符等)。现在非Win平台上也有Oracle开发利器了,赞一下Oracle!

[重发]RedHat Enterprise Linux 5(RHEL5)安装Oracle 11.1.0.6(11gR1)简要

2009年4月28日 ern 没有评论

原文刊载于2007年8月18日晚

新鲜出炉的Oracle 11.1.0.6的文档中对以下Linux发行版提供了
Asianux 2.0
Asianux 3.0
Oracle Enterprise Linux 4.0
Oracle Enterprise Linux 5.0
Red Hat Enterprise Linux 4.0
Red Hat Enterprise Linux 5.0
SUSE Enterprise Linux 10.0
估计现在用得最多就是RHEL4和5了。关于在RHEL5上安装Oracle11g,在ITPUBfenng的Blog上已经有所说明,前者有具体截图,后者有简洁说明。我还是简单写个流程吧:
一、 安装RHEL5的时候要注意对硬盘空间的规划,根据Oracle的推荐,Oracle11g要求1G内存(如果达不到那就调小各种参数,反正自己测试用, 问题也不大),对应的swap就需要1.5G(如果小于512MB,那么swap=2*RAM,如果大于2G,那么swap=RAM,如果大于8G,那么 swap=0.75*RAM,512-2G之间的,1.5*RAM就OK了),/tmp需要400MB,安装企业版的Oracle需要3.47GB,默认 库又需要1.6GB。可以用grep MemTotal /proc/meminfo检查。如下可以临时转移/tmp到有空闲资源的地方:
su – root
mkdir /<AnotherFilesystem>/tmp
chown root.root /<AnotherFilesystem>/tmp
chmod 1777 /<AnotherFilesystem>/tmp
export TEMP=/<AnotherFilesystem> # used by Oracle
export TMPDIR=/<AnotherFilesystem> # used by Linux programs like the linker “ld”
结束后恢复:
su – root
rmdir /<AnotherFilesystem>/tmp
unset TEMP
unset TMPDIR

阅读全文…

分类: Oracle 标签: , ,

MAC OS X安装Oracle 10.2.0.4简要[更新至OS X 10.6]

2009年4月26日 ern 32 条评论

今天突发奇想在苹果上安装个Oracle数据库,到OTN主页一查,居然Oracle 10.2.0.4 for MAC还刚刚发布不及,立刻下载按照文档动手。结果还是发现不少问题,简单记录一下吧。

第一个步骤自然是下载db.zip,然后解压缩。

之后就是为安装Oracle建立用户组和用户。一般需要建立一个安装用户组oinstall,一个DBA用户组dba,用户oracle,它们都应当具有admin组的权限。在官方文档和一些帖子里都是推荐用dscl增加用户,这需要root权限。更简单的方法就是在系统偏好设置——账户里添加,可以看看下面的图,分别是增加群组和对用户进行设置。
图片 1 图片 2
安装过Linux平台Oracle的可能知道Oracle对组件和Java环境有一些要求。Leopard上就简单很多,只需要安装DVD里自带的Xcode(当然也可以下载最新版本),并将Java 1.4.2环境放到Java应用程序第一优先顺序就可以了。[MAC OS X 10.6以后没有了1.4.2,后续需要修改一些内容,将在方括号中提示]

下面就是准备系统内核参数了。这里建议大家还是开启root用户。在应用程序——实用工具——目录实用工具——编辑中启用。命令行su到root用户,然后建立/etc/sysctl.conf:
kern.sysv.shmmax=1073741824
kern.sysv.shmall=2097152
kern.maxfiles=65536
kern.maxfilesperproc=65536
kern.maxproc=2068
kern.maxprocperuid=2068
net.inet.ip.portrange.first=1024

重新启动系统就生效了。其他参数在Leopard(10.5.6)下不用更改。具体还可以参考安装文档(在下载的db.zip里就有)。特别提醒一点,如果真的完全按照安装文档上进行修改,有可能会出现这个错误:
TNS-01114: LSNRCTL could not perform local OS authentication with the listener
TNS-01115: OS error 22 creating shared memory segment of 127 bytes with key xxxxxxx

这个问题困扰了我很久,最后进行广泛搜索,受到一个Linux安装求助贴的启发,将kern.sysv.shmmin重新修改为1,就恢复了(文档上要求修改为4096)。

继续看文档,又会发现IPServices是找不到的,不管了,改/etc/rc.common咯,在最后增加:
ulimit -Hu 2068
ulimit -Su 2068
ulimit -Hn 65536
ulimit -Sn 65536

现在把db.zip解压的文件夹放到oracle用户下,并chown给oracle,su – oracle。给自己建立一个.bash_profile吧,可以参照下面内容设定环境参数:
ORACLE_BASE=/Users/oracle/oracle
ORACLE_SID=macora
ORACLE_HOME=/Users/oracle/oracle/product/10.2.0
PATH=/usr/local/bin:/Users/oracle/oracle/product/10.2.0/bin:$PATH
export ORACLE_BASE
export ORACLE_SID
export ORACLE_HOME
export PATH
DYLD_LIBRARY_PATH=$ORACLE_HOME/lib
export DYLD_LIBRARY_PATH
DISPLAY=127.0.0.1:0
export DISPLAY
ulimit -Hn 65536
ulimit -Sn 65536
export NLS_LANG="AMERICAN_AMERICA.UTF8"

如果最后不设置DISPLAY,就会在启动runInstaller的时候报错,提示无法创建窗口。如果不设置DYLD_LIBRARY_PATH就会在创建数据库中提示没有监听器等错误。这些参数需要重启shell环境生效,比如重新su – oracle。

到这里基本就完成了准备工作,命令行进入目录,运行./runInstaller[10.6以后,请手工修改runInstaller,将其中的/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2改为/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0。另一种解决思路是

sudo ln -s /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0 /System/Library/Frameworks/JavaVM.framework/Versions/1.4.2
./runInstaller -J-d32

]。后面就和其他平台安装一样了,安装到最后,需要开一个窗口以root权限运行$ORACLE_HOME/root.sh。

[继续补充10.6一些问题:
如果链接时遇到调用目标 ‘all_no_orcl ipc_g ihsodbc32' 错误,那么不要退出安装程序,直接打开终端,修改文件$ORACLE_HOME/rdbms/lib/ins_rdbms.mk,用#号注释掉$(HSODBC_LINKLINE)开头的行,然后返回安装程序,点击 “Retry”。

Java GUI工具(NETCA和DBCA)运行时也可能出错。那么修改 $ORACLE_HOME/jdk/bin/java脚本,将"java -Xbootclasspath…"改成"java -d32 -Xbootclasspath…"

安装时还可能提示ORA-3113错误,此问题Raimonds Simanovskis通过提供补丁文件解决了。

cd $ORACLE_HOME/bin
curl -O http://rayapps.com/downloads/oracle_ee.zip
unzip oracle_se.zip
chmod ug+s oracle
rm oracle_se.zip

]

最后再提供一些安装帮助:

在 Mac OS X 上安装 Oracle 数据库 10g 和 PHP by Matt Rohrerhttp://www.oracle.com/technology/global/cn/pub/articles/rohrer_macosx_10g.html

how to install oracle 10.2.0.4 on mac os x by Ronald Rood: http://ronr.blogspot.com/2009/04/how-to-install-oracle-10204-on-intel.html

另一个英文版安装指南,on MAC Intel,推荐:http://blog.rayapps.com/2009/04/12/how-to-install-oracle-database-10g-on-mac-os-x-intel/

最后提供两个版本上的快速安装指南 by Raimonds Simanovskis[本文关于10.6的修改就是来源于此,当然,感谢留言的网友Alan,促使我更新此文档,并提供了最新进展]:http://www.pythian.com/news/1937/quick-install-guide-for-oracle-10g-release-2-on-mac-os-x-leopard-intel/

10.6上:http://blog.rayapps.com/2009/09/14/how-to-install-oracle-database-10g-on-mac-os-x-snow-leopard/