<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Read ERN &#187; Oracle</title>
	<atom:link href="http://www.readern.com/category/oracle/feed" rel="self" type="application/rss+xml" />
	<link>http://www.readern.com</link>
	<description>生命不息折腾不止</description>
	<lastBuildDate>Sat, 31 Dec 2011 16:18:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[重发]Pro*C实现导出Oracle表为文本文件</title>
		<link>http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html</link>
		<comments>http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html#comments</comments>
		<pubDate>Wed, 09 Sep 2009 00:49:32 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[导出]]></category>
		<category><![CDATA[文本文件]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=157</guid>
		<description><![CDATA[旧文重发，原文刊载于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，倒是没啥问题了，但是最后链接失败，报无法识别&#8217;sqlca&#8217;。到网上一搜，和我一样晕的人还有，要修改代码，多include进，但是看Tom的帖子似乎没提到这个问题，不知道为什么。 下面是修改后的源代码，我顺便在里面修改了会话的一些参数，以处理中文和时间格式： #include #include #include #include #define MAX_VNAME_LEN     30 #define MAX_INAME_LEN     30 static char *   USERID = NULL; static char *   SQLSTMT = NULL; static char *   ARRAY_SIZE = "10"; #define vstrcpy( a, b ) \ (strcpy( a.arr, b ), a.len = strlen( a.arr ), a.arr) EXEC SQL [...]]]></description>
			<content:encoded><![CDATA[<p>旧文重发，原文刊载于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!777.entry" target="_blank">2006年6月8日</a>。</p>
<p>近日工作需要，要大批量导出数据，开始用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是高效的方法，缺点是需要写程序、编译。<br />
硬着头皮看Pro*C咯，好在Tom给了原始代码，抓下来放到一台Linux的机器上proc报错，应该是proc配置include库的问题，找到一个makefile，倒是没啥问题了，但是最后链接失败，报无法识别&#8217;sqlca&#8217;。到网上一搜，和我一样晕的人还有，要修改代码，多include进，但是看Tom的帖子似乎没提到这个问题，不知道为什么。<br />
下面是修改后的源代码，我顺便在里面修改了会话的一些参数，以处理中文和时间格式：</p>
<p><span id="more-157"></span></p>
<pre>#include

#include

#include

#include

#define MAX_VNAME_LEN     30

#define MAX_INAME_LEN     30

static char *   USERID = NULL;

static char *   SQLSTMT = NULL;

static char *   ARRAY_SIZE = "10";

#define vstrcpy( a, b ) \

(strcpy( a.arr, b ), a.len = strlen( a.arr ), a.arr)

EXEC SQL INCLUDE SQLCA;

EXEC SQL INCLUDE sqlda;

extern SQLDA *sqlald();

extern void   sqlclu();

static void die( char * msg )

{

fprintf( stderr, "%s\n", msg );

exit(1);

}

/*

this array contains a default mapping

I am using to constrain the

lengths of returned columns.  It is mapping,

for example, the Oracle

NUMBER type (type code = 2) to be 45 characters

long in a string.

*/

static int lengths[] =

{ -1, 0, 45, 0, 0, 0, 0, 0, 2000, 0, 0,

18, 25, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 512, 2000 };

static void process_parms( argc, argv )

int    argc;

char *    argv[];

{

int    i;

for( i = 1; i &lt; argc; i++ )

{

if ( !strncmp( argv[i], "userid=", 7 ) )

USERID = argv[i]+7;

else

if ( !strncmp( argv[i], "sqlstmt=", 8 ) )

SQLSTMT = argv[i]+8;

else

if ( !strncmp( argv[i], "arraysize=", 10 ) )

ARRAY_SIZE = argv[i]+10;

else

{

fprintf( stderr,

"usage: %s %s %s\n",

argv[0],

"userid=xxx/xxx sqlstmt=query ",

"arraysize=\n" );

exit(1);

}

}

if ( USERID == NULL  || SQLSTMT == NULL )

{

fprintf( stderr,

"usage: %s %s %s\n",

argv[0],

"userid=xxx/xxx sqlstmt=query ",

"arraysize=\n" );

exit(1);

}

}

static void sqlerror_hard()

{

EXEC SQL WHENEVER SQLERROR CONTINUE;

fprintf(stderr,"\nORACLE error detected:");

fprintf(stderr,"\n% .70s \n", sqlca.sqlerrm.sqlerrmc);

EXEC SQL ROLLBACK WORK RELEASE;

exit(1);

}

static SQLDA * process_1(char * sqlstmt, int array_size )

{

SQLDA *    select_dp;

int     i;

int        j;

int        null_ok;

int        precision;

int        scale;

int        size = 10;

fprintf( stderr, "Unloading '%s'\n", sqlstmt );

fprintf( stderr, "Array size = %d\n", array_size );

EXEC SQL WHENEVER SQLERROR DO sqlerror_hard();

EXEC SQL PREPARE S FROM :sqlstmt;

EXEC SQL DECLARE C CURSOR FOR S;

if ((select_dp = sqlald(size,MAX_VNAME_LEN,MAX_INAME_LEN))

== NULL )

die( "Cannot allocate  memory for select descriptor." );

select_dp-&gt;N = size;

EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;

if ( !select_dp-&gt;F ) return NULL;

if (select_dp-&gt;F &lt; 0)     {         size = -select_dp-&gt;F;

sqlclu( select_dp );

if ((select_dp =

sqlald (size, MAX_VNAME_LEN, MAX_INAME_LEN))

== NULL )

die( "Cannot allocate  memory for descriptor." );

EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;

}

select_dp-&gt;N = select_dp-&gt;F;

for (i = 0; i &lt; select_dp-&gt;N; i++)

select_dp-&gt;I[i] = (short *) malloc(sizeof(short) *

array_size );

for (i = 0; i &lt; select_dp-&gt;F; i++)

{

sqlnul (&amp;(select_dp-&gt;T[i]),

&amp;(select_dp-&gt;T[i]), &amp;null_ok);

if ( select_dp-&gt;T[i] &lt;                      sizeof(lengths)/sizeof(lengths[0]) )         {             if ( lengths[select_dp-&gt;T[i]] )

select_dp-&gt;L[i]  = lengths[select_dp-&gt;T[i]];

else select_dp-&gt;L[i] += 5;

}

else select_dp-&gt;L[i] += 5;

select_dp-&gt;T[i] = 5;

select_dp-&gt;V[i] = (char *)malloc( select_dp-&gt;L[i] *

array_size );

for( j = MAX_VNAME_LEN-1;

j &gt; 0 &amp;&amp; select_dp-&gt;S[i][j] == ' ';

j--);

fprintf (stderr,

"%s%.*s", i?",":"", j+1, select_dp-&gt;S[i]);

}

fprintf( stderr, "\n" );

EXEC SQL OPEN C;

return select_dp;

}

static void process_2( SQLDA * select_dp, int array_size )

{

int    last_fetch_count;

int        row_count = 0;

short    ind_value;

char    * char_ptr;

int    i,

j;

for ( last_fetch_count = 0;

;

last_fetch_count = sqlca.sqlerrd[2] )

{

EXEC SQL FOR :array_size FETCH C

USING DESCRIPTOR select_dp;

for( j=0; j &lt; sqlca.sqlerrd[2]-last_fetch_count; j++ )

{

for (i = 0; i &lt; select_dp-&gt;F; i++)

{

ind_value = *(select_dp-&gt;I[i]+j);

char_ptr  = select_dp-&gt;V[i] +

(j*select_dp-&gt;L[i]);

printf( "%s%s", i?",":"",

ind_value?"(null)":char_ptr );

}

row_count++;

printf( "\n" );

}

if ( sqlca.sqlcode &gt; 0 ) break;

}

sqlclu(select_dp);

EXEC SQL CLOSE C;

EXEC SQL COMMIT WORK;

fprintf( stderr, "%d rows extracted\n", row_count );

}

main( argc, argv )

int    argc;

char *    argv[];

{

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR   oracleid[50];

EXEC SQL END DECLARE SECTION;

SQLDA    * select_dp;

process_parms( argc, argv );

/* Connect to ORACLE. */

vstrcpy( oracleid, USERID );

EXEC SQL WHENEVER SQLERROR DO sqlerror_hard();

EXEC SQL CONNECT <img src='http://www.readern.com/wordpress/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> racleid;

fprintf(stderr, "\nConnected to ORACLE as user: %s\n\n",

oracleid.arr);

EXEC SQL ALTER SESSION

SET NLS_DATE_FORMAT = 'YYYYMMDDHH24:MI:SS';

EXEC SQL ALTER SESSION

SET NLS_LANGUAGE = "SIMPLIFIED CHINESE";

select_dp = process_1( SQLSTMT, atoi(ARRAY_SIZE) );

process_2( select_dp , atoi(ARRAY_SIZE));

/* Disconnect from ORACLE. */

EXEC SQL COMMIT WORK RELEASE;

exit(0);

}</pre>
<p>顺便附上我的makefile，在RHEL AS3上用的：</p>
<pre>
CC=gcc
LD=ld
OBJ=obj/

##########数据库编译选项###########
PROCFLAGS=unsafe_null=yes dynamic=ansi mode=oracle dbms=V8 parse=full\
release_cursor=no sqlcheck=SEMANTICS ireclen=512 include=./.\
sys_include=/usr/include sys_include=/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include \
def_sqlcode=yes

INCL=-I/usr/include -I./. -I${ORACLE_HOME}/precomp/public
BIN_LIBS= -lc -L${ORACLE_HOME}/lib -lclntsh

##########编译规则################
.SUFFIXES: .pc .o .c
.c.o:
${CC} -g -c $*.c ${INCL}

.pc.o:
proc $(PROCFLAGS) iname=$*.pc
$(CC) -g -c $*.c ${INCL}
rm -f $*.c $*.lis

all:unload

unload:unload.o
rm -f $@
${CC} -o $@ unload.o  \
$(BIN_LIBS)

#########################################################
#编译公用目标文件
#########################################################

########清理目标文件###########################
clean:
rm -f *.o *.lis
</pre>
<p>编译以后生成unload程序，执行如下：</p>
<pre>
unload userid=XXX/XXX sqlstmt='select * from dual' arraysize=100&gt;XXX.DAT
</pre>
<p>这样DAT文件里就是数据了。</p>
<p>经我测试，在数据库主机上，30分钟导出了7GB的文件，强啊！效率上可以调整的一个是arraysize参数，这个一般100-200都可以，更大的除非你IO超强，不然也没有意义；另一个是所谓并行，其实这个C程序也就是执行SELECT语句，因此将原表改为PARALLEL就可以充分利用系统资源了^_^。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html">Permalink</a> |
<a href="http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html&title=[重发]Pro*C实现导出Oracle表为文本文件">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%87%ba" rel="tag">导出</a>, <a href="http://www.readern.com/tag/%e6%96%87%e6%9c%ac%e6%96%87%e4%bb%b6" rel="tag">文本文件</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[重发]如何真正NOLOGGING</title>
		<link>http://www.readern.com/oracle-nologging.html</link>
		<comments>http://www.readern.com/oracle-nologging.html#comments</comments>
		<pubDate>Wed, 09 Sep 2009 00:40:18 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[nologging]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=152</guid>
		<description><![CDATA[旧文重发，原文发表于2007年2月1日。 从前几天bigboar要做一个大表更新的项目引发的讨论，CTAS还是INSERT产生redo多。后来在fsm启发下又复习了遍Tom的结论。具体内容就不翻译了，转贴一下： Table Mode    Insert Mode     ArchiveLog mode      result &#8212;&#8212;&#8212;&#8211;   &#8212;&#8212;&#8212;&#8212;-   &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;    &#8212;&#8212;&#8212;- 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 [...]]]></description>
			<content:encoded><![CDATA[<p>旧文重发，原文发表于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!939.entry" target="_blank">2007年2月1日</a>。</p>
<p>从前几天bigboar要做一个大表更新的项目引发的讨论，CTAS还是INSERT产生redo多。后来在fsm启发下又复习了遍<a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5280714813869" target="_blank">Tom的结论</a>。具体内容就不翻译了，转贴一下：<br />
Table Mode    Insert Mode     ArchiveLog mode      result<br />
&#8212;&#8212;&#8212;&#8211;   &#8212;&#8212;&#8212;&#8212;-   &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;    &#8212;&#8212;&#8212;-<br />
LOGGING       APPEND          ARCHIVE LOG          redo generated<br />
NOLOGGING     APPEND          ARCHIVE LOG          no redo<br />
LOGGING       no append       “”                   redo generated<br />
NOLOGGING     no append       “”                   redo generated<br />
LOGGING       APPEND          noarchive log mode   no redo<br />
NOLOGGING     APPEND          noarchive log mode   no redo<br />
LOGGING       no append       noarchive log mode   redo generated<br />
NOLOGGING     no append       noarchive log mode   redo generated</p>
<p>简单来讲，就是表的模式和归档模式具有优先决定权，当表本身NOLOGGING时，指定了APPEND的hint才不产生redo（direct模式的sqlldr应该是一样的），另外就是非归档下则无论表状态只要APPEND总会生效。<br />
其实也就是一个规律，具体的测试就不做了。呵呵。<br />
BTW：在后来的讨论中其实还涉及到UNDO，CTAS产生UNDO方面还是有优势的，INSERT毕竟要记录rowid作为UNDO信息，而CTAS是DDL，立即提交，应该只是在涉及修改数据字典的地方产生UNDO而已。所以Tom在他的帖子里也是推荐用CTAS代替大量UPDATE。当然啦，CTAS也是有弱点的，毕竟表结构不能自定义，这样如果原表设计并不合理的时候就无法顺便改表结构了。<br />
CTAS+PARALLEL（如果可以并行的话）是目前我能想到的最快速度了。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/oracle-nologging.html">Permalink</a> |
<a href="http://www.readern.com/oracle-nologging.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/oracle-nologging.html&title=[重发]如何真正NOLOGGING">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/nologging" rel="tag">nologging</a>, <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/oracle-nologging.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[重发]ORA-04030的一种原因</title>
		<link>http://www.readern.com/an-ora-4030-error.html</link>
		<comments>http://www.readern.com/an-ora-4030-error.html#comments</comments>
		<pubDate>Tue, 08 Sep 2009 14:37:52 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[MAC OS X]]></category>
		<category><![CDATA[ora-04030]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=145</guid>
		<description><![CDATA[旧文新发，原文发表于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了，程序运行快了不少。 © ern for Read ERN, 2009. &#124; Permalink &#124; 2 comments &#124; Add to del.icio.us Post tags: error, MAC OS X, ora-04030 Feed enhanced by Better Feed from Ozh]]></description>
			<content:encoded><![CDATA[<p>旧文新发，原文发表于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!983.entry" target="_blank">2007年4月6日</a>。</p>
<p>4030的错误往往也挺吓人的，一看就涉及内存问题啊。今天在一个内部使用的数据库上遇到了。往往4030的解决方法都是增加PGA，或者反之，减少SORT_AREA_SIZE/HASH_AREA_SIZE。根本原因其实就是当Oracle试图向OS申请会话内存（session memory）时，OS返回错误，一般是内存不足之类。所以上来就提高PGA_AGGREGATE_TARGET也是不合适的。今天就是这个情况。</p>
<p><br style="line-height: 22px;" /> 在客户端跑一个稍微复杂点的查询时候，出现了ORA-04030，其它同事也反映这个情况出现几天了，即便程序可以运行也慢得像头牛。今天我是忍无可忍了，决心花点时间了解一下。连上服务器，alert.log里果然不少报错。show parameter pga一看，600M，作为这个数据库倒也挺合适。再查询V$PGASTAT，真正花费的内存空间都是150M左右，并不大啊。仔细查查V$SESSTAT，只有三四个占内存超过10M的会话，实时统计总共也就是120M。看来并不是PGA设置太小。忽然想到这台服务器是Win2000 32bit，配置8G内存，联想到了1.7G的限制。不过当初装机器的同事已经设置了AWE，应该可以用到3G啊。</p>
<p><br style="line-height: 22px;" /> 又是一阵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了，程序运行快了不少。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/an-ora-4030-error.html">Permalink</a> |
<a href="http://www.readern.com/an-ora-4030-error.html#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/an-ora-4030-error.html&title=[重发]ORA-04030的一种原因">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/error" rel="tag">error</a>, <a href="http://www.readern.com/tag/mac-os-x" rel="tag">MAC OS X</a>, <a href="http://www.readern.com/tag/ora-04030" rel="tag">ora-04030</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/an-ora-4030-error.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[重发]分组连接列字符串方法</title>
		<link>http://www.readern.com/oracle-group-by-connect-string.html</link>
		<comments>http://www.readern.com/oracle-group-by-connect-string.html#comments</comments>
		<pubDate>Tue, 08 Sep 2009 13:53:19 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[sys_connect_by_path]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=135</guid>
		<description><![CDATA[又翻了一把，顺便转自己文章一篇过来。原文发表于2007年6月20日 共享一个Oracle技巧吧。在以前一篇blog里我写过自定义聚集函数——一条语句将多行的列中字符串连接起来，技术总是在进步的。在这一期的Oracle Magazine中的AskTom，学到了一个不错的方法。从8i开始Oracle增加了分析函数，从9iR1开始，又有了SYS_CONNECT_BY_PATH函数，于是，产生了下面一个更加简单的方法。 CREATE TABLE test AS SELECT rownum office, chr(ascii(&#8216;a&#8217;) + rownum &#8211; 1) staff FROM all_objects WHERE rownum &#60; 10; INSERT INTO test SELECT rownum, chr(ascii(&#8216;o&#8217;) + rownum &#8211; 1) FROM all_objects WHERE rownum &#60; 10; SELECT * FROM test; 1 a 2 b 3 c 4 d 5 e 6 f 7 [...]]]></description>
			<content:encoded><![CDATA[<p>又翻了一把，顺便转自己文章一篇过来。原文发表于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!1057.entry" target="_blank">2007年6月20日</a><br />
共享一个Oracle技巧吧。在以前一篇blog里我写过<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!497.entry" target="_blank">自定义聚集函数——一条语句将多行的列中字符串连接起来</a>，技术总是在进步的。在<a href="http://www.oracle.com/technology/oramag/oracle/07-jul/o47asktom.html" target="_blank">这一期的Oracle Magazine中的AskTom</a>，学到了一个不错的方法。从8i开始Oracle增加了分析函数，从9iR1开始，又有了SYS_CONNECT_BY_PATH函数，于是，产生了下面一个更加简单的方法。</p>
<p><span id="more-135"></span></p>
<p>CREATE TABLE test AS</p>
<p>SELECT rownum office, chr(ascii(&#8216;a&#8217;) + rownum &#8211; 1) staff</p>
<p>FROM all_objects</p>
<p>WHERE rownum &lt; 10;</p>
<p>INSERT INTO test</p>
<p>SELECT rownum, chr(ascii(&#8216;o&#8217;) + rownum &#8211; 1)</p>
<p>FROM all_objects</p>
<p>WHERE rownum &lt; 10;</p>
<p>SELECT * FROM test;</p>
<p>1 a</p>
<p>2 b</p>
<p>3 c</p>
<p>4 d</p>
<p>5 e</p>
<p>6 f</p>
<p>7 g</p>
<p>8 h</p>
<p>9 i</p>
<p>1 o</p>
<p>2 p</p>
<p>3 q</p>
<p>4 r</p>
<p>5 s</p>
<p>6 t</p>
<p>7 u</p>
<p>8 v</p>
<p>9 w</p>
<p>SELECT office, ltrim(MAX(sys_connect_by_path(staff, &#8216;,&#8217;)), &#8216;,&#8217;) namelist</p>
<p>FROM (SELECT office,</p>
<p>staff,</p>
<p>row_number() over(PARTITION BY office ORDER BY staff) rn</p>
<p>FROM test) v</p>
<p>START WITH rn = 1</p>
<p>CONNECT BY PRIOR rn = rn &#8211; 1</p>
<p>AND PRIOR office = office</p>
<p>GROUP BY office</p>
<p>ORDER BY office;</p>
<p>1 a,o</p>
<p>2 b,p</p>
<p>3 c,q</p>
<p>4 d,r</p>
<p>5 e,s</p>
<p>6 f,t</p>
<p>7 g,u</p>
<p>8 h,v</p>
<p>9 i,w<br />
其实原理并不复杂，就是通过ROW_NUMBER()函数实现分组编号，然后根据编号递增来分组连接，将SYS_CONNECT_BY_PATH函数第二个参数以及外面的LTRIM参数替换成你需要的符号就可以了。不过注意两点哦，一个，这个方法只有在Oracle9iR1之后才能用；第二，如果你想用空（”）连接，那不能直接在SYS_CONNECT_BY_PATH里用空（”）作为参数，而要用其他字符然后在外面用REPLACE替换，否则就可能遇到ORA-30003错误，即SYS_CONNECT_BY_PATH的参数非法。<br />
有了这个法子，原来那个复杂的方法基本可以抛弃咯^_^</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/oracle-group-by-connect-string.html">Permalink</a> |
<a href="http://www.readern.com/oracle-group-by-connect-string.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/oracle-group-by-connect-string.html&title=[重发]分组连接列字符串方法">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/sys_connect_by_path" rel="tag">sys_connect_by_path</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/oracle-group-by-connect-string.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQLDeveloper的一些bug</title>
		<link>http://www.readern.com/sqldeveloper-bugs-and-tricks.html</link>
		<comments>http://www.readern.com/sqldeveloper-bugs-and-tricks.html#comments</comments>
		<pubDate>Wed, 06 May 2009 13:18:53 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[SQLDeveloper]]></category>
		<category><![CDATA[导入]]></category>
		<category><![CDATA[导出]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=52</guid>
		<description><![CDATA[虽然不搞数据库了，不过最近做些分析的时候还是祭出了Oracle这把牛刀，顺便用了下Oracle的这款官方工具。我用的最新版本是1.5.4，出乎意料的强大。唯一不好是基于Java的，对大数据量导入导出想必是不行的（除非有超大内存做后盾）。过程中也发现了不少bug，不过到官方论坛瞄了瞄，还是有开发人员重视的。 导出结果为Excel（XLS文件）可能遇到ORA－00936。似乎问题是出在解析语句上，如果你的SELECT中存在比如a.*的别名前缀，那么就会触发这个bug。暂时的解决方法有两个，一是重写你的语句，去掉别名前缀（两表关联时候有点麻烦了）；再就是把你的结果建成一张表，到时候直接导出表就可以了。 与中文输入法偶有冲突。在用QIM，如果进入SQLDeveloper时是英文输入，打开程序才切换到中文输入，似乎就一切OK；如果打开前就是中文输入，很大机会只能输入英文了，无法输入中文。 导入Excel文件时要注意，首行可以冻结，但是不能筛选，否则认不到整个表格。 不支持导入导出LONG一类的字段。这个大概算功能问题吧，倒也不能完全说是bug。 另外还有一个始终萦绕非Windows系统的字符集问题。在我的MAC OS X 10.5.6上推荐保存导出的Excel和SQL脚本为UTF－8，否则和文本编辑器（比如TextWrangler）可能有些冲突。导出的UTF－8文件在Windows Office 2007是可以正常打开的。 © ern for Read ERN, 2009. &#124; Permalink &#124; No comment &#124; Add to del.icio.us Post tags: bug, excel, export, import, Oracle, SQLDeveloper, 导入, 导出 Feed enhanced by Better Feed from Ozh]]></description>
			<content:encoded><![CDATA[<p>虽然不搞数据库了，不过最近做些分析的时候还是祭出了Oracle这把牛刀，顺便用了下Oracle的这款官方工具。我用的最新版本是1.5.4，出乎意料的强大。唯一不好是基于Java的，对大数据量导入导出想必是不行的（除非有超大内存做后盾）。过程中也发现了不少bug，不过到<a href="http://forums.oracle.com/forums/forum.jspa?forumID=260" target="_blank">官方论坛</a>瞄了瞄，还是有开发人员重视的。</p>
<ol>
<li>导出结果为Excel（XLS文件）可能遇到ORA－00936。似乎问题是出在解析语句上，如果你的SELECT中存在比如a.*的别名前缀，那么就会触发这个bug。暂时的解决方法有两个，一是重写你的语句，去掉别名前缀（两表关联时候有点麻烦了）；再就是把你的结果建成一张表，到时候直接导出表就可以了。</li>
<li>与中文输入法偶有冲突。在用QIM，如果进入SQLDeveloper时是英文输入，打开程序才切换到中文输入，似乎就一切OK；如果打开前就是中文输入，很大机会只能输入英文了，无法输入中文。</li>
<li>导入Excel文件时要注意，首行可以冻结，但是不能筛选，否则认不到整个表格。</li>
<li>不支持导入导出LONG一类的字段。这个大概算功能问题吧，倒也不能完全说是bug。</li>
</ol>
<p>另外还有一个始终萦绕非Windows系统的字符集问题。在我的MAC OS X 10.5.6上推荐保存导出的Excel和SQL脚本为UTF－8，否则和文本编辑器（比如TextWrangler）可能有些冲突。导出的UTF－8文件在Windows Office 2007是可以正常打开的。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/sqldeveloper-bugs-and-tricks.html">Permalink</a> |
<a href="http://www.readern.com/sqldeveloper-bugs-and-tricks.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/sqldeveloper-bugs-and-tricks.html&title=SQLDeveloper的一些bug">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/bug" rel="tag">bug</a>, <a href="http://www.readern.com/tag/excel" rel="tag">excel</a>, <a href="http://www.readern.com/tag/export" rel="tag">export</a>, <a href="http://www.readern.com/tag/import" rel="tag">import</a>, <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/sqldeveloper" rel="tag">SQLDeveloper</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%85%a5" rel="tag">导入</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%87%ba" rel="tag">导出</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/sqldeveloper-bugs-and-tricks.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>进化！Oracle官方工具导入Excel数据</title>
		<link>http://www.readern.com/oracle-sqldeveloper-import-excel.html</link>
		<comments>http://www.readern.com/oracle-sqldeveloper-import-excel.html#comments</comments>
		<pubDate>Fri, 01 May 2009 14:42:31 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[PL/SQL Developer]]></category>
		<category><![CDATA[SQLDeveloper]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=47</guid>
		<description><![CDATA[Oracle导入Excel数据一直是个挺麻烦的事情，毕竟Excel的格式是微软所有，SQLServer的支持要更好些。以前常见的解决方法就是在Excel里另存为CSV文件，CSV实际上就是逗号或者TAB分隔的TXT文件，因此可以通过sqlldr（sqlloader）来导入。有一个比较麻烦的问题就是，如果字段中间有逗号就会被识别成两个字段。一个workaround就是另存成CSV的时候设置把文本字段用双引号引上，在sqlldr的ctl文件里可以设置enclosed by &#8216;”&#8216;。但遇到字段内容复杂的文本，依然很难解决。 然后看到了第三方工具的进化，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！ © ern for Read ERN, 2009. &#124; Permalink &#124; 2 comments &#124; Add to del.icio.us Post tags: excel, import, load, Oracle, PL/SQL Developer, SQLDeveloper Feed enhanced by Better Feed from Ozh]]></description>
			<content:encoded><![CDATA[<p>Oracle导入Excel数据一直是个挺麻烦的事情，毕竟Excel的格式是微软所有，SQLServer的支持要更好些。以前常见的解决方法就是在Excel里另存为CSV文件，CSV实际上就是逗号或者TAB分隔的TXT文件，因此可以通过sqlldr（sqlloader）来导入。有一个比较麻烦的问题就是，如果字段中间有逗号就会被识别成两个字段。一个workaround就是另存成CSV的时候设置把文本字段用双引号引上，在sqlldr的ctl文件里可以设置enclosed by &#8216;”&#8216;。但遇到字段内容复杂的文本，依然很难解决。</p>
<p>然后看到了第三方工具的进化，PL/SQL Developer里面可以select * from table_name for update或者select a.*,rowid from table_name来打开表进行编辑，直接拷贝整个Excel数据然后贴进去并提交。以前我基本都是用这个方法，还是比较简单易行的。这个方法不方便的地方就是如果数据量大，耗内存不少，因为数据要全部进剪贴板，数据量大的时候还是容易出问题的。PL/SQL Developer的实现方式也是提交时逐行插入。另外如果你需要导入的Excel与表的格式不一致，就比较麻烦了，得先在Excel里做好数据库表的形式才行。</p>
<p>最近不搞数据库了，今天要整理点数据，又琢磨着用数据库来减轻工作量，正好MacBook上的Oracle也刚装好。MAC OS X下就没有第三方工具的选择了，直接下载了一个Oracle自己的SQLDeveloper 1.5.4，安装就觉得比以前大了很多。刚出测试版的时候我还写过一篇博客，当时基本只能运行SQL语句而已。现在的功能确实强大很多，管理功能也不比TOAD差太多，跑SQL也算顺手，不过是基于JAVA的，我估计处理大数据量对内存消耗还是很猛。言归正传，在里面果然找到了导入数据的功能，一试，可以导入XLS和CSV！而且既可以直接导入然后过程中选择新建表和字段的属性等等，也可以导入到已经存在的表里，可以选择字段的对应关系，还是非常方便。可惜好事多磨，一上来实战就晕了，总是报错。提示我源数据和导入的表字段格式不一致，甚至我导出表为Excel文件然后进行修改后也无法导入。搜索一番发现，国内用这个官方工具的还真少。英文搜索咯……果然在<a href="http://forums.oracle.com/forums/forum.jspa?forumID=260&amp;start=0" target="_blank">Oracle Forum</a>找到了反映类似问题的帖子。老外们研究得还真细，琢磨出1.5.2和以前的版本导入不完善，无法正常处理，到1.5.3修正了，但到1.5.4反而总提示出错。立刻准备换1.5.3，可惜官方下载居然失效了。回到论坛一看置顶，原来1.5.4已经进行了修正！哈哈，即刻升级（顺便说一句，如果下载进度条没有显示直接跳过，那是没有下载成功，我最终是翻％墙出去搞定的）！果然一次性导入成功（14000+行，含复杂中文、特殊字符等）。现在非Win平台上也有Oracle开发利器了，赞一下Oracle！</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/oracle-sqldeveloper-import-excel.html">Permalink</a> |
<a href="http://www.readern.com/oracle-sqldeveloper-import-excel.html#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/oracle-sqldeveloper-import-excel.html&title=进化！Oracle官方工具导入Excel数据">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/excel" rel="tag">excel</a>, <a href="http://www.readern.com/tag/import" rel="tag">import</a>, <a href="http://www.readern.com/tag/load" rel="tag">load</a>, <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/plsql-developer" rel="tag">PL/SQL Developer</a>, <a href="http://www.readern.com/tag/sqldeveloper" rel="tag">SQLDeveloper</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/oracle-sqldeveloper-import-excel.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[重发]RedHat Enterprise Linux 5(RHEL5)安装Oracle 11.1.0.6(11gR1)简要</title>
		<link>http://www.readern.com/install-oracle-11gr1-on-rhel5.html</link>
		<comments>http://www.readern.com/install-oracle-11gr1-on-rhel5.html#comments</comments>
		<pubDate>Tue, 28 Apr 2009 11:59:03 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[red hat]]></category>
		<category><![CDATA[安装]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=42</guid>
		<description><![CDATA[原文刊载于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，在ITPUB和fenng的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 &#8211; root mkdir /&#60;AnotherFilesystem&#62;/tmp chown root.root /&#60;AnotherFilesystem&#62;/tmp chmod 1777 /&#60;AnotherFilesystem&#62;/tmp export TEMP=/&#60;AnotherFilesystem&#62; # used by Oracle export [...]]]></description>
			<content:encoded><![CDATA[<p>原文刊载于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!1081.entry" target="_blank">2007年8月18日晚</a></p>
<p>新鲜出炉的<a href="http://www.oracle.com/technology/software/products/database/oracle11g/111060_linuxsoft.html" target="_blank">Oracle 11.1.0.6</a>的文档中对以下Linux发行版提供了<br />
Asianux 2.0<br />
Asianux 3.0<br />
Oracle Enterprise Linux 4.0<br />
Oracle Enterprise Linux 5.0<br />
Red Hat Enterprise Linux 4.0<br />
Red Hat Enterprise Linux 5.0<br />
SUSE Enterprise Linux 10.0<br />
估计现在用得最多就是RHEL4和5了。关于在RHEL5上安装Oracle11g，在<a href="http://www.itpub.net/showthread.php?threadid=831835&amp;pagenumber=" target="_blank">ITPUB</a>和<a href="http://www.dbanotes.net/database/rhel_5_oracle_11g.html" target="_blank">fenng的Blog</a>上已经有所说明，前者有具体截图，后者有简洁说明。我还是简单写个流程吧：<br />
一、 安装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到有空闲资源的地方：<br />
su &#8211; root<br />
mkdir /&lt;AnotherFilesystem&gt;/tmp<br />
chown root.root /&lt;AnotherFilesystem&gt;/tmp<br />
chmod 1777 /&lt;AnotherFilesystem&gt;/tmp<br />
export TEMP=/&lt;AnotherFilesystem&gt; # used by Oracle<br />
export TMPDIR=/&lt;AnotherFilesystem&gt; # used by Linux programs like the linker “ld”<br />
结束后恢复：<br />
su &#8211; root<br />
rmdir /&lt;AnotherFilesystem&gt;/tmp<br />
unset TEMP<br />
unset TMPDIR</p>
<p><span id="more-42"></span></p>
<p>二、在正常安装完成RHEL5之后，首先建议停掉SELinux和防火墙，然后检查如下的包是否装全了（rpm -qa | grep 包名）<br />
binutils-2.17.50.0.6-2.el5<br />
compat-libstdc++-33-3.2.3-61<br />
elfutils-libelf-0.125-3.el5<br />
elfutils-libelf-devel-0.125<br />
glibc-2.5-12<br />
glibc-common-2.5-12<br />
glibc-devel-2.5-12<br />
gcc-4.1.1-52<br />
gcc-c++-4.1.1-52<br />
libaio-0.3.106<br />
libaio-devel-0.3.106<br />
libgcc-4.1.1-52<br />
libstdc++-4.1.1<br />
libstdc++-devel-4.1.1-52.e15<br />
make-3.81-1.1<br />
sysstat-7.0.0<br />
unixODBC-2.2.11<br />
unixODBC-devel-2.2.11<br />
三、增加用户：<br />
su &#8211; root<br />
groupadd dba<br />
groupadd oinstall<br />
useradd -c “Oracle Owner” -g oinstall -G dba oracle<br />
passwd oracle<br />
之后安装路径的路径，比如：<br />
su &#8211; root<br />
mkdir -p /u01/app/oracle<br />
chown -R oracle.oinstall /u01/app<br />
chmod -R 775 /u01/app<br />
四、对各类参数，fenng提供了一个简洁的说明，修改 /etc/sysctl.conf，追加如下内容：<br />
# First line:SEMMSL SEMMNS SEMOPM SEMMNI<br />
kernel.sem=1055 32000 100 128<br />
kernel.shmmax=2147483648<br />
kernel.shmall = 2097152<br />
net.ipv4.tcp_sack = 0<br />
net.ipv4.tcp_timestamps = 0<br />
net.ipv4.conf.default.rp_filter = 0<br />
net.core.optmem_max = 65535<br />
net.core.rmem_default = 4194304<br />
net.core.wmem_default = 262144<br />
net.core.rmem_max = 4194304<br />
net.core.wmem_max = 262144<br />
fs.file-max = 6553600<br />
net.ipv4.ip_local_port_range = 1024 65000<br />
上述值中fs.file-max一项，Oracle的建议是512 * PROCESSES。<br />
然后执行/sbin/sysctl -p激活（root用户）。<br />
五、修改Shell限制。<br />
在/etc/security/limits.conf中增加：<br />
oracle              soft    nproc   2047<br />
oracle              hard    nproc   16384<br />
oracle              soft    nofile  1024<br />
oracle              hard    nofile  65536<br />
在/etc/pam.d/login增加或创建：<br />
session    required     /lib/security/pam_limits.so  //对64位系统这条不需要<br />
session    required     pam_limits.so<br />
对Bourne、Bash或Korn shell，编辑/etc/profile增加：<br />
if [ $USER = "oracle" ]; then<br />
if [ $SHELL = "/bin/ksh" ]; then<br />
ulimit -p 16384<br />
ulimit -n 65536<br />
else<br />
ulimit -u 16384 -n 65536<br />
fi<br />
fi<br />
对C shell，编辑/etc/csh.login增加：<br />
if ( $USER == “oracle” ) then<br />
limit maxproc 16384<br />
limit descriptors 65536<br />
endif<br />
六、修改环境变量。选择好你的安装目录后，直接编辑上面提到的shell环境文件，增加类似如下，就可以了：<br />
export ORACLE_BASE=/u01/app/oracle  //安装路径<br />
export ORACLE_SID=orcl11<br />
export DISPLAY=你的IP:0.0(如果是在本地安装，不要加IP，直接DISPLAY=:0.0就可以了)<br />
完成安装以后还要加上：<br />
export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1  //HOME路径<br />
export PATH=$PATH:$ORACLE_HOME/bin<br />
export LD_LIBRARY_PATH=$ORACLE_HOME/lib<br />
七、执行./runInstaller，大功告成。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/install-oracle-11gr1-on-rhel5.html">Permalink</a> |
<a href="http://www.readern.com/install-oracle-11gr1-on-rhel5.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/install-oracle-11gr1-on-rhel5.html&title=[重发]RedHat Enterprise Linux 5(RHEL5)安装Oracle 11.1.0.6(11gR1)简要">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/red-hat" rel="tag">red hat</a>, <a href="http://www.readern.com/tag/%e5%ae%89%e8%a3%85" rel="tag">安装</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/install-oracle-11gr1-on-rhel5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MAC OS X安装Oracle 10.2.0.4简要[更新至OS X 10.6]</title>
		<link>http://www.readern.com/install-oracle-10gr2-on-mac-os-x.html</link>
		<comments>http://www.readern.com/install-oracle-10gr2-on-mac-os-x.html#comments</comments>
		<pubDate>Sun, 26 Apr 2009 14:11:47 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[MAC OS X]]></category>
		<category><![CDATA[Snow Leopard]]></category>
		<category><![CDATA[安装]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=33</guid>
		<description><![CDATA[今天突发奇想在苹果上安装个Oracle数据库，到OTN主页一查，居然Oracle 10.2.0.4 for MAC还刚刚发布不及，立刻下载按照文档动手。结果还是发现不少问题，简单记录一下吧。 第一个步骤自然是下载db.zip，然后解压缩。 之后就是为安装Oracle建立用户组和用户。一般需要建立一个安装用户组oinstall，一个DBA用户组dba，用户oracle，它们都应当具有admin组的权限。在官方文档和一些帖子里都是推荐用dscl增加用户，这需要root权限。更简单的方法就是在系统偏好设置——账户里添加，可以看看下面的图，分别是增加群组和对用户进行设置。 安装过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 [...]]]></description>
			<content:encoded><![CDATA[<p>今天突发奇想在苹果上安装个Oracle数据库，到OTN主页一查，居然Oracle 10.2.0.4 for MAC还刚刚发布不及，立刻下载按照文档动手。结果还是发现不少问题，简单记录一下吧。</p>
<p>第一个步骤自然是下载db.zip，然后解压缩。</p>
<p>之后就是为安装Oracle建立用户组和用户。一般需要建立一个安装用户组oinstall，一个DBA用户组dba，用户oracle，它们都应当具有admin组的权限。在官方文档和一些帖子里都是推荐用dscl增加用户，这需要root权限。更简单的方法就是在系统偏好设置——账户里添加，可以看看下面的图，分别是增加群组和对用户进行设置。<br />
<a class="tt-flickr" href="http://www.flickr.com/photos/yaoyp/3475640491"><img class="tt-flickr" src="http://farm4.static.flickr.com/3537/3475640491_ee6a6b1432_m.jpg" alt="图片 1" width="240" height="191" /></a> <a class="tt-flickr" href="http://www.flickr.com/photos/yaoyp/3476450164"><img class="tt-flickr" src="http://farm4.static.flickr.com/3589/3476450164_b5caa7efd3_m.jpg" alt="图片 2" width="240" height="194" /></a><br />
安装过Linux平台Oracle的可能知道Oracle对组件和Java环境有一些要求。Leopard上就简单很多，只需要安装DVD里自带的Xcode（当然也可以下载最新版本），并将Java 1.4.2环境放到Java应用程序第一优先顺序就可以了。[MAC OS X 10.6以后没有了1.4.2，后续需要修改一些内容，将在方括号中提示]</p>
<p>下面就是准备系统内核参数了。这里建议大家还是开启root用户。在应用程序——实用工具——目录实用工具——编辑中启用。命令行su到root用户，然后建立/etc/sysctl.conf：<br />
<code>kern.sysv.shmmax=1073741824<br />
kern.sysv.shmall=2097152<br />
kern.maxfiles=65536<br />
kern.maxfilesperproc=65536<br />
kern.maxproc=2068<br />
kern.maxprocperuid=2068<br />
net.inet.ip.portrange.first=1024</code></p>
<p>重新启动系统就生效了。其他参数在Leopard（10.5.6）下不用更改。具体还可以参考安装文档（在下载的db.zip里就有）。特别提醒一点，如果真的完全按照安装文档上进行修改，有可能会出现这个错误：<br />
<code>TNS-01114: LSNRCTL could not perform local OS authentication with the listener<br />
TNS-01115: OS error 22 creating shared memory segment of 127 bytes with key xxxxxxx</code><br />
这个问题困扰了我很久，最后进行广泛搜索，受到一个Linux安装求助贴的启发，将kern.sysv.shmmin重新修改为1，就恢复了（文档上要求修改为4096）。</p>
<p>继续看文档，又会发现IPServices是找不到的，不管了，改/etc/rc.common咯，在最后增加：<br />
<code>ulimit -Hu 2068<br />
ulimit -Su 2068<br />
ulimit -Hn 65536<br />
ulimit -Sn 65536</code></p>
<p>现在把db.zip解压的文件夹放到oracle用户下，并chown给oracle，su &#8211; oracle。给自己建立一个.bash_profile吧，可以参照下面内容设定环境参数：<br />
<code>ORACLE_BASE=/Users/oracle/oracle<br />
ORACLE_SID=macora<br />
ORACLE_HOME=/Users/oracle/oracle/product/10.2.0<br />
PATH=/usr/local/bin:/Users/oracle/oracle/product/10.2.0/bin:$PATH<br />
export ORACLE_BASE<br />
export ORACLE_SID<br />
export ORACLE_HOME<br />
export PATH<br />
DYLD_LIBRARY_PATH=$ORACLE_HOME/lib<br />
export DYLD_LIBRARY_PATH<br />
DISPLAY=127.0.0.1:0<br />
export DISPLAY<br />
ulimit -Hn 65536<br />
ulimit -Sn 65536<br />
export NLS_LANG="AMERICAN_AMERICA.UTF8"</code></p>
<p>如果最后不设置DISPLAY，就会在启动runInstaller的时候报错，提示无法创建窗口。如果不设置DYLD_LIBRARY_PATH就会在创建数据库中提示没有监听器等错误。这些参数需要重启shell环境生效，比如重新su &#8211; oracle。</p>
<p>到这里基本就完成了准备工作，命令行进入目录，运行./runInstaller[10.6以后，请手工修改runInstaller，将其中的/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2改为/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0。另一种解决思路是</p>
<blockquote><p>sudo ln -s /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0 /System/Library/Frameworks/JavaVM.framework/Versions/1.4.2<br />
./runInstaller -J-d32</p></blockquote>
<p>]。后面就和其他平台安装一样了，安装到最后，需要开一个窗口以root权限运行$ORACLE_HOME/root.sh。</p>
<p>[继续补充10.6一些问题：<br />
如果链接时遇到调用目标 ‘all_no_orcl ipc_g ihsodbc32' 错误，那么不要退出安装程序，直接打开终端，修改文件$ORACLE_HOME/rdbms/lib/ins_rdbms.mk，用#号注释掉$(HSODBC_LINKLINE)开头的行，然后返回安装程序，点击 “Retry”。</p>
<p>Java GUI工具（NETCA和DBCA）运行时也可能出错。那么修改 $ORACLE_HOME/jdk/bin/java脚本，将"java -Xbootclasspath…"改成"java -d32 -Xbootclasspath…"</p>
<p>安装时还可能提示ORA-3113错误，此问题Raimonds Simanovskis通过提供补丁文件解决了。</p>
<blockquote><p>cd $ORACLE_HOME/bin<br />
curl -O http://rayapps.com/downloads/oracle_ee.zip<br />
unzip oracle_se.zip<br />
chmod ug+s oracle<br />
rm oracle_se.zip</p></blockquote>
<p>]</p>
<p>最后再提供一些安装帮助：</p>
<p><span class="topstoryhead">在 Mac OS X 上安装 Oracle 数据库 10<em>g</em> 和 PHP by </span><span class="italicbodycopy">Matt Rohrer</span><span class="topstoryhead">：<a href="http://www.oracle.com/technology/global/cn/pub/articles/rohrer_macosx_10g.html" target="_blank">http://www.oracle.com/technology/global/cn/pub/articles/rohrer_macosx_10g.html</a></span></p>
<p><span class="topstoryhead">how to install oracle 10.2.0.4 on mac os x by Ronald Rood: <a href="http://ronr.blogspot.com/2009/04/how-to-install-oracle-10204-on-intel.html" target="_blank">http://ronr.blogspot.com/2009/04/how-to-install-oracle-10204-on-intel.html</a></span></p>
<p><span class="topstoryhead">另一个英文版安装指南，on MAC Intel，推荐：<a href="http://blog.rayapps.com/2009/04/12/how-to-install-oracle-database-10g-on-mac-os-x-intel/" target="_blank">http://blog.rayapps.com/2009/04/12/how-to-install-oracle-database-10g-on-mac-os-x-intel/</a></span></p>
<p>最后提供两个版本上的快速安装指南 by Raimonds Simanovskis[本文关于10.6的修改就是来源于此，当然，感谢留言的网友Alan，促使我更新此文档，并提供了最新进展]：<a href="http://www.pythian.com/news/1937/quick-install-guide-for-oracle-10g-release-2-on-mac-os-x-leopard-intel/" target="_blank">http://www.pythian.com/news/1937/quick-install-guide-for-oracle-10g-release-2-on-mac-os-x-leopard-intel/</a></p>
<p>10.6上：<a href="http://blog.rayapps.com/2009/09/14/how-to-install-oracle-database-10g-on-mac-os-x-snow-leopard/" target="_blank">http://blog.rayapps.com/2009/09/14/how-to-install-oracle-database-10g-on-mac-os-x-snow-leopard/</a></p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/install-oracle-10gr2-on-mac-os-x.html">Permalink</a> |
<a href="http://www.readern.com/install-oracle-10gr2-on-mac-os-x.html#comments">97 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/install-oracle-10gr2-on-mac-os-x.html&title=MAC OS X安装Oracle 10.2.0.4简要[更新至OS X 10.6]">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/mac-os-x" rel="tag">MAC OS X</a>, <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/snow-leopard" rel="tag">Snow Leopard</a>, <a href="http://www.readern.com/tag/%e5%ae%89%e8%a3%85" rel="tag">安装</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/install-oracle-10gr2-on-mac-os-x.html/feed</wfw:commentRss>
		<slash:comments>97</slash:comments>
		</item>
	</channel>
</rss>

