<?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>半瓶</title>
	<atom:link href="http://www.banping.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.banping.com</link>
	<description>一瓶子不满  半瓶子晃荡</description>
	<lastBuildDate>Fri, 12 Mar 2010 02:45:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Oracle手动建库的步骤</title>
		<link>http://www.banping.com/2010/03/11/handon_create_database/</link>
		<comments>http://www.banping.com/2010/03/11/handon_create_database/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 04:59:21 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=639</guid>
		<description><![CDATA[Oracle除了用DBCA可以建库外，也可以手动来建立数据库，手动建库能够更了解数据库的一些启动过程和运作机制，对深入学习oracle 很有帮助，本文演示了10g下手动建库的流程和可能碰到的问题。
第一步：建立参数文件，这个文件可以从其他地方已有的数据库复制过来修改，也可以从init.ora的基础上修改，主要内容如下：
*.audit_file_dest='/u01/app/oracle/admin/erpwh/adump'
*.background_dump_dest='/u01/app/oracle/admin/erpwh/bdump'
*.compatible='10.2.0.1.0'
*.control_files='+DGWH/erpwh/control01.ctl','+DGWH/erpwh/control02.ctl','+DGWH/erpwh/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/erpwh/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='erpwh'
*.db_recovery_file_dest='+DGWH'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=erpoptmXDB)'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=1073741824
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=2147483648
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/erpwh/udump'
可以看到参数文件主要是指定了数据库名、跟踪文件的位置、控制文件的位置、数据块大小、内存参数等。Linux 系统中，该文件位置应在$ORACLE_HOME/dbs目录下。
第二步：建立密码文件，该文件用于sys用户以sysdba身份远程管理登录，这里的密码可以和建立数据库脚本理的sys密码不同，如果是远程以sysdba身份登录则需要使用这里的密码。密码文件和参数文件在相同的目录下：
[oracle@erpdevdb dbs]$ orapwd file=/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/orapwerpwh password=erpwh entries=5
第三步：建立跟踪、日志等文件的路径：
[oracle@erpdevdb dbs]$ cd /u01/app/oracle/admin/
[oracle@erpdevdb admin]$ mkdir erpwh
[oracle@erpdevdb admin]$ cd erpwh
[oracle@erpdevdb erpwh]$ ll
total 0
[oracle@erpdevdb erpwh]$ mkdir adump bdump udump cdump
[oracle@erpdevdb erpwh]$ ll
total 32
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 15:16 adump
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 15:16 bdump
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle除了用DBCA可以建库外，也可以手动来建立数据库，手动建库能够更了解数据库的一些启动过程和运作机制，对深入学习oracle 很有帮助，本文演示了10g下手动建库的流程和可能碰到的问题。</p>
<p>第一步：建立参数文件，这个文件可以从其他地方已有的数据库复制过来修改，也可以从init.ora的基础上修改，主要内容如下：</p>
<blockquote><p>*.audit_file_dest='/u01/app/oracle/admin/erpwh/adump'<br />
*.background_dump_dest='/u01/app/oracle/admin/erpwh/bdump'<br />
*.compatible='10.2.0.1.0'<br />
*.control_files='+DGWH/erpwh/control01.ctl','+DGWH/erpwh/control02.ctl','+DGWH/erpwh/control03.ctl'<br />
*.core_dump_dest='/u01/app/oracle/admin/erpwh/cdump'<br />
*.db_block_size=8192<br />
*.db_domain=''<br />
*.db_file_multiblock_read_count=16<br />
*.db_name='erpwh'<br />
*.db_recovery_file_dest='+DGWH'<br />
*.db_recovery_file_dest_size=2147483648<br />
*.dispatchers='(PROTOCOL=TCP) (SERVICE=erpoptmXDB)'<br />
*.job_queue_processes=10<br />
*.open_cursors=300<br />
*.pga_aggregate_target=1073741824<br />
*.processes=150<br />
*.remote_login_passwordfile='EXCLUSIVE'<br />
*.sga_target=2147483648<br />
*.undo_management='AUTO'<br />
*.undo_tablespace='UNDOTBS1'<br />
*.user_dump_dest='/u01/app/oracle/admin/erpwh/udump'</p></blockquote>
<p>可以看到参数文件主要是指定了数据库名、跟踪文件的位置、控制文件的位置、数据块大小、内存参数等。Linux 系统中，该文件位置应在$ORACLE_HOME/dbs目录下。</p>
<p>第二步：建立密码文件，该文件用于sys用户以sysdba身份远程管理登录，这里的密码可以和建立数据库脚本理的sys密码不同，如果是远程以sysdba身份登录则需要使用这里的密码。密码文件和参数文件在相同的目录下：</p>
<blockquote><p>[oracle@erpdevdb dbs]$ orapwd file=/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/orapwerpwh password=erpwh entries=5</p></blockquote>
<p>第三步：建立跟踪、日志等文件的路径：</p>
<blockquote><p>[oracle@erpdevdb dbs]$ cd /u01/app/oracle/admin/</p>
<p>[oracle@erpdevdb admin]$ mkdir erpwh<br />
[oracle@erpdevdb admin]$ cd erpwh<br />
[oracle@erpdevdb erpwh]$ ll<br />
total 0<br />
[oracle@erpdevdb erpwh]$ mkdir adump bdump udump cdump<br />
[oracle@erpdevdb erpwh]$ ll<br />
total 32<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 15:16 adump<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 15:16 bdump<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 15:16 cdump<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar 10 15:16 udump</p></blockquote>
<p>第四步：启动数据库到nomount状态：</p>
<blockquote><p>[oracle@erpdevdb dbs]$ export ORACLE_SID=erpwh<br />
[oracle@erpdevdb dbs]$ sqlplus " / as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 10 15:18:09 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.</p>
<p>Connected to an idle instance.</p>
<p>SQL&gt; startup nomount<br />
ORA-27102: out of memory<br />
Linux-x86_64 Error: 28: No space left on device</p></blockquote>
<p>如果出现以上错误，是操作系统参数设置的内存不够，参见<a href="http://www.banping.com/2009/05/05/ora-27102/">这篇文章</a>修改即可：</p>
<blockquote><p>[root@erpdevdb ~]# vi /etc/sysctl.conf</p>
<p>kernel.shmall = 4718592</p></blockquote>
<p>或者调小参数文件里的内存参数也可以，取决于系统资源情况。</p>
<blockquote><p>SQL&gt; startup nomount<br />
ORACLE instance started.</p>
<p>Total System Global Area 2147483648 bytes<br />
Fixed Size                  2022144 bytes<br />
Variable Size             486540544 bytes<br />
Database Buffers         1644167168 bytes<br />
Redo Buffers               14753792 bytes</p></blockquote>
<p>第五步，运行建立数据库的脚本</p>
<blockquote><p>CREATE DATABASE erpwh<br />
USER SYS IDENTIFIED BY sys<br />
USER SYSTEM IDENTIFIED BY sys<br />
LOGFILE GROUP 1 ('+DGWH/erpwh/redo01.log') SIZE 100M,<br />
GROUP 2 ('+DGWH/erpwh/redo02.log') SIZE 100M,<br />
GROUP 3 ('+DGWH/erpwh/redo03.log') SIZE 100M<br />
MAXLOGFILES 16<br />
MAXLOGMEMBERS 5<br />
MAXDATAFILES 100<br />
MAXINSTANCES 8<br />
MAXLOGHISTORY 2<br />
CHARACTER SET ZHS16GBK<br />
NATIONAL CHARACTER SET AL16UTF16<br />
DATAFILE '+DGWH/erpwh/system01.dbf' SIZE 2048M REUSE<br />
EXTENT MANAGEMENT LOCAL<br />
SYSAUX DATAFILE '+DGWH/erpwh/sysaux01.dbf' SIZE 1024M REUSE<br />
DEFAULT TEMPORARY TABLESPACE temptbs1<br />
TEMPFILE '+DGWH/erpwh/temp01.dbf'<br />
SIZE 2048M REUSE<br />
UNDO TABLESPACE undotbs1<br />
DATAFILE '+DGWH/erpwh/undotbs01.dbf'<br />
SIZE 1024M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;</p></blockquote>
<p>脚本主要是指定sys和system的密码，redo文件，字符集，数据文件，临时表空间和回滚段等信息。</p>
<p>但有时候在建库脚本里指定默认表空间DEFAULT TABLESPACE erp会报错：</p>
<blockquote><p>SQL&gt; CREATE DATABASE erpwh<br />
2     USER SYS IDENTIFIED BY sys<br />
3     USER SYSTEM IDENTIFIED BY sys<br />
4     LOGFILE GROUP 1 ('+DGWH/erpwh/redo01.log') SIZE 100M,<br />
5             GROUP 2 ('+DGWH/erpwh/redo02.log') SIZE 100M,<br />
6             GROUP 3 ('+DGWH/erpwh/redo03.log') SIZE 100M<br />
7      MAXLOGFILES 16<br />
8      MAXLOGMEMBERS 5<br />
9      MAXDATAFILES 100<br />
10      MAXINSTANCES 8<br />
11      MAXLOGHISTORY 29200<br />
12     CHARACTER SET ZHS16GBK<br />
13     NATIONAL CHARACTER SET AL16UTF16<br />
14     DATAFILE '+DGWH/erpwh/system01.dbf' SIZE 2048M REUSE<br />
15     EXTENT MANAGEMENT LOCAL<br />
16     SYSAUX DATAFILE '+DGWH/erpwh/sysaux01.dbf' SIZE 1024M REUSE<br />
17     DEFAULT TABLESPACE erp<br />
18     DEFAULT TEMPORARY TABLESPACE temptbs1<br />
19        TEMPFILE '+DGWH/erpwh/temp01.dbf'<br />
20        SIZE 2048M REUSE<br />
21     UNDO TABLESPACE undotbs1<br />
22        DATAFILE '+DGWH/erpwh/undotbs01.dbf'<br />
23        SIZE 1024M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;<br />
CREATE DATABASE erpwh<br />
*<br />
ERROR at line 1:<br />
ORA-01092: ORACLE instance terminated. Disconnection forced</p></blockquote>
<p>这种情况一般是建库脚本哪里写的不对，需要检查。从asm存储来看各种数据文件都建立了，但是数据库并没有创建成功，这时把已经建立的数据文件删掉，并删除建库脚本理的默认表空间这行就可以了：</p>
<blockquote><p>SQL&gt; CREATE DATABASE erpwh<br />
2     USER SYS IDENTIFIED BY sys<br />
3     USER SYSTEM IDENTIFIED BY sys<br />
4     LOGFILE GROUP 1 ('+DGWH/erpwh/redo01.log') SIZE 100M,<br />
5             GROUP 2 ('+DGWH/erpwh/redo02.log') SIZE 100M,<br />
6             GROUP 3 ('+DGWH/erpwh/redo03.log') SIZE 100M<br />
7      MAXLOGFILES 16<br />
8      MAXLOGMEMBERS 5<br />
9      MAXDATAFILES 100<br />
10      MAXINSTANCES 8<br />
11      MAXLOGHISTORY 2<br />
12     CHARACTER SET ZHS16GBK<br />
13     NATIONAL CHARACTER SET AL16UTF16<br />
14     DATAFILE '+DGWH/erpwh/system01.dbf' SIZE 2048M REUSE<br />
15     EXTENT MANAGEMENT LOCAL<br />
16     SYSAUX DATAFILE '+DGWH/erpwh/sysaux01.dbf' SIZE 1024M REUSE<br />
17     DEFAULT TEMPORARY TABLESPACE temptbs1<br />
18        TEMPFILE '+DGWH/erpwh/temp01.dbf'<br />
19        SIZE 2048M REUSE<br />
20     UNDO TABLESPACE undotbs1<br />
21        DATAFILE '+DGWH/erpwh/undotbs01.dbf'<br />
22        SIZE 1024M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;</p>
<p>Database created.</p></blockquote>
<p>第六步，建立其他表空间和数据字典：</p>
<blockquote><p>SQL&gt; create tablespace erp datafile '+DGWH' size 30720m;</p>
<p>Tablespace created.</p>
<p>SQL&gt; @?/rdbms/admin/catalog.sql</p>
<p>......</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; @?/rdbms/admin/catproc.sql</p>
<p>......</p>
<p>PL/SQL procedure successfully completed.</p></blockquote>
<p>第七步，建立spfile：</p>
<blockquote><p>SQL&gt; create spfile='+DGWH/ERPWH/spfileerpwh.ora' from pfile;</p>
<p>File created.</p></blockquote>
<p>要注意的是，Oracle下次启动的时候不不会默认使用这种方式建立的spfile，</p>
<blockquote><p>SQL&gt; show parameter spfile</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
spfile                               string</p></blockquote>
<p>不指定spfile路径的时候就可以了：</p>
<blockquote><p>SQL&gt; create spfile from pfile;</p>
<p>File created.</p>
<p>SQL&gt; shutdown immediate<br />
Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.<br />
SQL&gt; startup<br />
ORACLE instance started.</p>
<p>Total System Global Area 2147483648 bytes<br />
Fixed Size                  2022144 bytes<br />
Variable Size             486540544 bytes<br />
Database Buffers         1644167168 bytes<br />
Redo Buffers               14753792 bytes<br />
Database mounted.<br />
Database opened.<br />
SQL&gt; show parameter spfile</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
spfile                               string      /u01/app/oracle/oracle/product<br />
/10.2.0/db_1/dbs/spfileerpwh.o<br />
ra</p></blockquote>
<p>第八步，建立用户</p>
<blockquote><p>SQL&gt; create user erp identified by erp default tablespace ERP temporary tablespace temptbs1 profile DEFAULT;</p>
<p>User created.</p>
<p>SQL&gt; grant dba to erp;</p>
<p>Grant succeeded.</p>
<p>SQL&gt; connect erp/erp<br />
Error accessing PRODUCT_USER_PROFILE<br />
Warning:  Product user profile information not loaded!<br />
You may need to run PUPBLD.SQL as SYSTEM<br />
Connected.</p></blockquote>
<p>出现这个错误提示并不会影响数据库的使用，手动建库一般会有这个警告出现。 PRODUCT_USER_PROFILE是SYSTEM用户的一个表，存储客户端程序执行命令方面的限制信息，可以根据提示用system用户执行脚本来消除：</p>
<blockquote><p>SQL&gt; connect system/sys<br />
Connected.<br />
SQL&gt;<br />
SQL&gt; @$ORACLE_HOME/sqlplus/admin/pupbld.sql</p>
<p>.......</p>
<p>SQL&gt; connect erp/erp<br />
Connected.<br />
SQL&gt;<br />
SQL&gt;<br />
SQL&gt; show user<br />
USER is "ERP"</p></blockquote>
<p>第九步，配置网络服务：</p>
<blockquote><p>[oracle@erpdevdb admin]$ vi tnsnames.ora</p>
<p>ERPWH =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = erpdevdb)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = erpwh)<br />
)<br />
)</p></blockquote>
<p>至此手动建立数据库完成，客户端可以连接上来使用了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/03/11/handon_create_database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何快速克隆一个Oracle数据库</title>
		<link>http://www.banping.com/2010/03/09/clone_database/</link>
		<comments>http://www.banping.com/2010/03/09/clone_database/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 07:41:07 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=633</guid>
		<description><![CDATA[有时候为了测试方便，需要建立一个和源库一样的数据库来操作，这时候一个简单的做法是直接克隆，通过配置参数文件和直接复制数据文件来快速建立一个新的库，本文演示了基于10g版本ASM存储下的一个操作过程。
源库SID：erptest    目标库SID：erpoptm
第一步，首先获取源库的参数文件
SQL&#62; CREATE PFILE='/tmp/init_temp.ora' from spfile;
File created.
参照以上文件建立一个目标库的参数文件initerpoptm.ora如下：
erptest.__db_cache_size=1828716544
erptest.__java_pool_size=16777216
erptest.__large_pool_size=16777216
erptest.__shared_pool_size=268435456
erptest.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/erpoptm/adump'
*.background_dump_dest='/u01/app/oracle/admin/erpoptm/bdump'
*.compatible='10.2.0.1.0'
*.control_files='+DGOPTM/erpoptm/control01.ctl','+DGOPTM/erpoptm/control02.ctl','+DGOPTM/erpoptm/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/erpoptm/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='erptest'
*.db_recovery_file_dest='+DGOPTM'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=erpoptmXDB)'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=1073741824
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=2147483648
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS2'
*.user_dump_dest='/u01/app/oracle/admin/erpoptm/udump'
改动的内容都是各种文件的路径，注意这里的db_name不要修改，否则无法mount数据库，因为db_name要和数据文件头记录的db_name一致。
第二步，建立对应的日志、跟踪等文件的路径
[oracle@erpdevdb tmp]$ cd /u01/app/oracle/admin/
[oracle@erpdevdb admin]$ mkdir erpoptm
[oracle@erpdevdb admin]$ cd erpoptm
[oracle@erpdevdb erpoptm]$ ll
total 0
[oracle@erpdevdb erpoptm]$ mkdir adump
[oracle@erpdevdb erpoptm]$ mkdir bdump
[oracle@erpdevdb erpoptm]$ mkdir udump
[oracle@erpdevdb erpoptm]$ mkdir cdump
[oracle@erpdevdb erpoptm]$ ll
total 32
drwxr-xr-x  2 oracle oinstall 4096 Mar  8 11:45 adump
drwxr-xr-x  2 oracle oinstall 4096 Mar  8 11:45 bdump
drwxr-xr-x  2 oracle oinstall 4096 [...]]]></description>
			<content:encoded><![CDATA[<p>有时候为了测试方便，需要建立一个和源库一样的数据库来操作，这时候一个简单的做法是直接克隆，通过配置参数文件和直接复制数据文件来快速建立一个新的库，本文演示了基于10g版本ASM存储下的一个操作过程。</p>
<p>源库SID：erptest    目标库SID：erpoptm</p>
<p>第一步，首先获取源库的参数文件</p>
<blockquote><p>SQL&gt; CREATE PFILE='/tmp/init_temp.ora' from spfile;</p>
<p>File created.</p></blockquote>
<p>参照以上文件建立一个目标库的参数文件initerpoptm.ora如下：</p>
<blockquote><p>erptest.__db_cache_size=1828716544<br />
erptest.__java_pool_size=16777216<br />
erptest.__large_pool_size=16777216<br />
erptest.__shared_pool_size=268435456<br />
erptest.__streams_pool_size=0<br />
*.audit_file_dest='/u01/app/oracle/admin/erpoptm/adump'<br />
*.background_dump_dest='/u01/app/oracle/admin/erpoptm/bdump'<br />
*.compatible='10.2.0.1.0'<br />
*.control_files='+DGOPTM/erpoptm/control01.ctl','+DGOPTM/erpoptm/control02.ctl','+DGOPTM/erpoptm/control03.ctl'<br />
*.core_dump_dest='/u01/app/oracle/admin/erpoptm/cdump'<br />
*.db_block_size=8192<br />
*.db_domain=''<br />
*.db_file_multiblock_read_count=16<br />
*.db_name='erptest'<br />
*.db_recovery_file_dest='+DGOPTM'<br />
*.db_recovery_file_dest_size=2147483648<br />
*.dispatchers='(PROTOCOL=TCP) (SERVICE=erpoptmXDB)'<br />
*.job_queue_processes=10<br />
*.open_cursors=300<br />
*.pga_aggregate_target=1073741824<br />
*.processes=150<br />
*.remote_login_passwordfile='EXCLUSIVE'<br />
*.sga_target=2147483648<br />
*.undo_management='AUTO'<br />
*.undo_tablespace='UNDOTBS2'<br />
*.user_dump_dest='/u01/app/oracle/admin/erpoptm/udump'</p></blockquote>
<p>改动的内容都是各种文件的路径，注意这里的db_name不要修改，否则无法mount数据库，因为db_name要和数据文件头记录的db_name一致。</p>
<p>第二步，建立对应的日志、跟踪等文件的路径</p>
<blockquote><p>[oracle@erpdevdb tmp]$ cd /u01/app/oracle/admin/</p>
<p>[oracle@erpdevdb admin]$ mkdir erpoptm</p>
<p>[oracle@erpdevdb admin]$ cd erpoptm<br />
[oracle@erpdevdb erpoptm]$ ll<br />
total 0<br />
[oracle@erpdevdb erpoptm]$ mkdir adump<br />
[oracle@erpdevdb erpoptm]$ mkdir bdump<br />
[oracle@erpdevdb erpoptm]$ mkdir udump<br />
[oracle@erpdevdb erpoptm]$ mkdir cdump<br />
[oracle@erpdevdb erpoptm]$ ll<br />
total 32<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar  8 11:45 adump<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar  8 11:45 bdump<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar  8 11:45 cdump<br />
drwxr-xr-x  2 oracle oinstall 4096 Mar  8 11:45 udump</p></blockquote>
<p>第三步，获取源库的控制文件内容并修改</p>
<blockquote><p>SQL&gt; alter database backup controlfile to trace;</p>
<p>Database altered.</p></blockquote>
<p>在udump目录下查看生成的trace文件，找到建立控制文件的部分脚本并修改如下：</p>
<blockquote><p>CREATE CONTROLFILE REUSE DATABASE "ERPTEST" NORESETLOGS  NOARCHIVELOG<br />
MAXLOGFILES 16<br />
MAXLOGMEMBERS 3<br />
MAXDATAFILES 100<br />
MAXINSTANCES 8<br />
MAXLOGHISTORY 29200<br />
LOGFILE<br />
GROUP 1 '+DGOPTM/erpoptm/redo01.log'  SIZE 50M,<br />
GROUP 2 '+DGOPTM/erpoptm/redo02.log'  SIZE 50M,<br />
GROUP 3 '+DGOPTM/erpoptm/redo03.log'  SIZE 50M<br />
-- STANDBY LOGFILE<br />
DATAFILE<br />
'+DGOPTM/erpoptm/system01.dbf',<br />
'+DGOPTM/erpoptm/undotbs01.dbf',<br />
'+DGOPTM/erpoptm/sysaux01.dbf',<br />
'+DGOPTM/erpoptm/users01.dbf',<br />
'+DGOPTM/erpoptm/datafile/erp_ht.268',<br />
'+DGOPTM/erpoptm/datafile/erp_ht.269',<br />
'+DGOPTM/erpoptm/datafile/erp_index.270',<br />
'+DGOPTM/erpoptm/datafile/erp_wl.271',<br />
'+DGOPTM/erpoptm/datafile/erp.272',<br />
'+DGOPTM/erpoptm/datafile/erp_sp.273',<br />
'+DGOPTM/erpoptm/datafile/erp_cw.274',<br />
'+DGOPTM/erpoptm/datafile/erp_zj.275',<br />
'+DGOPTM/erpoptm/datafile/erp_xm.276',<br />
'+DGOPTM/erpoptm/datafile/erp_ht.277'<br />
CHARACTER SET ZHS16GBK</p></blockquote>
<p>第四步，拷贝源库的数据文件到目标库的对应路径：</p>
<p>先要为目标库建立好ASM磁盘组，建立的详细步骤可参考<a href="http://www.banping.com/2010/02/25/linux_create_asm/">这篇文章</a>：</p>
<blockquote><p>[root@erpdevdb ~]# oracleasm createdisk VOL5 /dev/sda10<br />
Writing disk header: done<br />
Instantiating disk: done</p>
<p>[oracle@erpdevdb ~]$ export ORACLE_SID=+ASM</p>
<p>SQL&gt; create diskgroup DGOPTM external redundancy disk 'ORCL:VOL5';</p>
<p>Diskgroup created.</p>
<p>[oracle@erpdevdb ~]$ asmcmd<br />
ASMCMD&gt; ls<br />
DGDEV/<br />
DGOPTM/<br />
DGPAPER/<br />
DGSTUDY/<br />
DGTEST/<br />
ASMCMD&gt; cd DGOPTM/</p>
<p>ASMCMD&gt; mkdir ERPOPTM/</p></blockquote>
<p>然后在源库的实例中用<a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_ftran.htm" target="_blank">DBMS_FILE_TRANSFER.COPY_FILE</a>包拷贝文件：</p>
<blockquote><p>SQL&gt; create directory DGFROM as '+DGTEST/ERPTEST/DATAFILE';</p>
<p>Directory created.</p>
<p>SQL&gt; create directory DGTO as '+DGOPTM/ERPOPTM/DATAFILE';</p>
<p>Directory created.</p></blockquote>
<p>执行以下命令拷贝数据文件：</p>
<blockquote><p>exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_ht.268.711907283','DGTO','erp_ht.268');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_ht.269.711907397','DGTO','erp_ht.269');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_ht.277.711972029','DGTO','erp_ht.277');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_index.270.711907487','DGTO','erp_index.270');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_wl.271.711907545','DGTO','erp_wl.271');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp.272.711907565','DGTO','erp.272');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_sp.273.711907695','DGTO','erp_sp.273');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_cw.274.711907757','DGTO','erp_cw.274');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_xm.276.711907831','DGTO','erp_xm.276');<br />
exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','erp_zj.275.711907801','DGTO','erp_zj.275');</p></blockquote>
<p>要注意的是，这里的目标文件名不能带有ASM自身生成的那一串数字，否则会报错如下：</p>
<blockquote><p>ORA-19504: failed to create file<br />
"+DGOPTM/ERPOPTM/DATAFILE/erp_zj.275.711907801"<br />
ORA-17502: ksfdcre:4 Failed to create file<br />
+DGOPTM/ERPOPTM/DATAFILE/erp_zj.275.711907801<br />
ORA-15046: ASM file name '+DGOPTM/ERPOPTM/DATAFILE/erp_zj.275.711907801' is not<br />
in single-file creation form<br />
ORA-06512: at "SYS.DBMS_FILE_TRANSFER", line 84<br />
ORA-06512: at "SYS.DBMS_FILE_TRANSFER", line 193<br />
ORA-06512: at line 1</p></blockquote>
<p>这是因为这串数字是ASM用来进行标识的信息，文档Doc ID: Note:452158.1中有说明。老杨的<a href="http://space.itpub.net/4227/viewspace-445584" target="_blank">一篇文章</a>描述了类似的问题。</p>
<p>然后再拷贝system等表空间和redo等文件：</p>
<blockquote><p>SQL&gt; drop directory DGFROM;</p>
<p>Directory dropped.</p>
<p>SQL&gt; create directory DGFROM as '+DGTEST/ERPTEST';</p>
<p>Directory created.</p>
<p>SQL&gt; drop directory DGTO;</p>
<p>Directory dropped.</p>
<p>SQL&gt; create directory DGTO as '+DGOPTM/ERPOPTM';</p>
<p>Directory created.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','redo01.log','DGTO','redo01.log');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','redo02.log','DGTO','redo02.log');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','redo03.log','DGTO','redo03.log');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','system01.dbf','DGTO','system01.dbf');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','undotbs01.dbf','DGTO','undotbs01.dbf');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','sysaux01.dbf','DGTO','sysaux01.dbf');</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; exec DBMS_FILE_TRANSFER.COPY_FILE('DGFROM','users01.dbf','DGTO','users01.dbf');</p>
<p>PL/SQL procedure successfully completed.</p></blockquote>
<p>需要注意的是，copy过来的文件并不是文件存储的实际路径，而是按原有的路径组织的，新的文件名只是一个alias而已：</p>
<blockquote><p>ASMCMD&gt; cd ERPOPTM/<br />
ASMCMD&gt; ls -l<br />
Type         Redund  Striped  Time             Sys  Name<br />
N    DATAFILE/<br />
N    control01.ctl =&gt; +DGOPTM/ERPTEST/CONTROLFILE/Current.273.713177855<br />
N    control02.ctl =&gt; +DGOPTM/ERPTEST/CONTROLFILE/Current.274.713177855<br />
N    control03.ctl =&gt; +DGOPTM/ERPTEST/CONTROLFILE/Current.275.713177855<br />
N    redo01.log =&gt; +DGOPTM/ERPTEST/ONLINELOG/group_0.266.713120427<br />
N    redo02.log =&gt; +DGOPTM/ERPTEST/ONLINELOG/group_0.267.713120435<br />
N    redo03.log =&gt; +DGOPTM/ERPTEST/ONLINELOG/group_0.268.713120441<br />
N    sysaux01.dbf =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.271.713120497<br />
N    system01.dbf =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.269.713120449<br />
N    undotbs01.dbf =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.270.713120467<br />
N    users01.dbf =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.272.713120509</p>
<p>ASMCMD&gt; cd DATAFILE/<br />
ASMCMD&gt; ls -l<br />
Type      Redund  Striped  Time             Sys  Name<br />
N    erp.272 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.261.713119325<br />
N    erp_cw.274 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.263.713119613<br />
N    erp_ht.268 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.257.713118643<br />
N    erp_ht.269 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.256.713118843<br />
N    erp_ht.277 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.258.713119001<br />
N    erp_index.270 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.259.713119135<br />
N    erp_sp.273 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.262.713119553<br />
N    erp_wl.271 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.260.713119275<br />
N    erp_xm.276 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.264.713119665<br />
N    erp_zj.275 =&gt; +DGOPTM/ERPTEST/DATAFILE/COPY_FILE.265.713119693</p></blockquote>
<p>至此文件拷贝完成。</p>
<p>第五步，建立密码文件</p>
<blockquote><p>[oracle@erpdevdb dbs]$ orapwd file=/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/orapwerpoptm password=erpoptm entries=5</p></blockquote>
<p>第六步，启动数据库</p>
<p>先启动到nomount状态，这时会用到参数文件：</p>
<blockquote><p>[oracle@erpdevdb dbs]$ sqlplus " / as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 8 14:01:08 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.</p>
<p>Connected to an idle instance.</p>
<p>SQL&gt; startup nomount<br />
ORACLE instance started.</p>
<p>Total System Global Area 2147483648 bytes<br />
Fixed Size                  2022144 bytes<br />
Variable Size             486540544 bytes<br />
Database Buffers         1644167168 bytes<br />
Redo Buffers               14753792 bytes<br />
SQL&gt;<br />
SQL&gt; alter database mount<br />
2  /<br />
alter database mount<br />
*<br />
ERROR at line 1:<br />
ORA-00205: error in identifying control file, check alert log for more info</p></blockquote>
<p>oracle会先找spfile，然后找pfile，找若没有参数文件，则会报错：</p>
<blockquote><p>[oracle@erpdevdb dbs]$ export ORACLE_SID=erpoptm<br />
[oracle@erpdevdb dbs]$ sqlplus " / as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 8 14:00:10 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.</p>
<p>Connected to an idle instance.</p>
<p>SQL&gt; startup nomount<br />
ORA-01078: failure in processing system parameters<br />
LRM-00109: could not open parameter file '/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/initerpoptm.ora'</p></blockquote>
<p>mount时会找控制文件，没有则会出现如上所示的错误，可以在nomount阶段来建立控制文件，先关闭源库，然后在目标库启动到nomount阶段来建立控制文件：</p>
<blockquote><p>SQL&gt; CREATE CONTROLFILE REUSE DATABASE "ERPTEST" NORESETLOGS  NOARCHIVELOG<br />
2      MAXLOGFILES 16<br />
3      MAXLOGMEMBERS 3<br />
4      MAXDATAFILES 100<br />
5      MAXINSTANCES 8<br />
6      MAXLOGHISTORY 29200<br />
7  LOGFILE<br />
8    GROUP 1 '+DGOPTM/erpoptm/redo01.log'  SIZE 50M,<br />
9    GROUP 2 '+DGOPTM/erpoptm/redo02.log'  SIZE 50M,<br />
10    GROUP 3 '+DGOPTM/erpoptm/redo03.log'  SIZE 50M<br />
11  -- STANDBY LOGFILE<br />
12  DATAFILE<br />
13    '+DGOPTM/erpoptm/system01.dbf',<br />
14    '+DGOPTM/erpoptm/undotbs01.dbf',<br />
15    '+DGOPTM/erpoptm/sysaux01.dbf',<br />
16    '+DGOPTM/erpoptm/users01.dbf',<br />
17    '+DGOPTM/erpoptm/datafile/erp_ht.268',<br />
18    '+DGOPTM/erpoptm/datafile/erp_ht.269',<br />
19    '+DGOPTM/erpoptm/datafile/erp_index.270',<br />
20    '+DGOPTM/erpoptm/datafile/erp_wl.271',<br />
21    '+DGOPTM/erpoptm/datafile/erp.272',<br />
22    '+DGOPTM/erpoptm/datafile/erp_sp.273',<br />
23    '+DGOPTM/erpoptm/datafile/erp_cw.274',<br />
24    '+DGOPTM/erpoptm/datafile/erp_zj.275',<br />
25    '+DGOPTM/erpoptm/datafile/erp_xm.276',<br />
26    '+DGOPTM/erpoptm/datafile/erp_ht.277'<br />
27  CHARACTER SET ZHS16GBK<br />
28  /</p>
<p>Control file created.</p></blockquote>
<p>为什么要先关闭源库呢，这是因为二者有相同的db_name，oracle通过一个lk开头的文件来在运行阶段lock某个库，如果不关闭会在alert日志中看到以下错误：</p>
<blockquote><p>Tue Mar  9 08:53:20 2010<br />
sculkget: failed to lock /u01/app/oracle/oracle/product/10.2.0/db_1/dbs/lkERPTEST exclusive<br />
sculkget: lock held by PID: 29747<br />
Tue Mar  9 08:53:21 2010<br />
ORA-09968: unable to lock file<br />
Linux-x86_64 Error: 11: Resource temporarily unavailable<br />
Additional information: 29747<br />
Tue Mar  9 08:53:21 2010<br />
Errors in file /u01/app/oracle/admin/erpoptm/udump/erpoptm_ora_26143.trc:<br />
ORA-01158: database  already mounted</p></blockquote>
<p>由于现在在同一个主机上有两个相同db_name的数据库，那么如何能同时启动呢，这需要指定参数db_unique_ name来区分开来，这个参数在standby环境也是必须设置的。</p>
<p>修改源库的db_unique_name如下：</p>
<blockquote><p>SQL&gt; alter system set db_unique_name=erptest scope=spfile;</p>
<p>System altered.</p>
<p>SQL&gt; shutdown immediate<br />
Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.</p>
<p>SQL&gt; startup<br />
ORACLE instance started.</p></blockquote>
<p>回到正题，在创建控制文件的过程中会验证数据文件是否存在，如果不存在则报以下错误：</p>
<blockquote><p>ERROR at line 1:<br />
ORA-01503: CREATE CONTROLFILE failed<br />
ORA-01565: error in identifying file '+DGOPTM/erpoptm/system01.dbf'<br />
ORA-17503: ksfdopn:2 Failed to open file +DGOPTM/erpoptm/system01.dbf<br />
ORA-15173: entry 'system01.dbf' does not exist in directory 'erpoptm'</p></blockquote>
<p>也会检查参数文件中的db_name和数据文件头的db_name是否相同，否则报以下错误:</p>
<blockquote><p>ERROR at line 1:<br />
ORA-01503: CREATE CONTROLFILE failed<br />
ORA-01161: database name ERPTEST in file header does not match given name of<br />
ERPOPTM<br />
ORA-01110: data file 1: '+DGOPTM/erpoptm/system01.dbf'</p></blockquote>
<p>接着打开数据库：</p>
<blockquote><p>SQL&gt; alter database open<br />
2  /<br />
alter database open<br />
*<br />
ERROR at line 1:<br />
ORA-01113: file 1 needs media recovery<br />
ORA-01110: data file 1: '+DGOPTM/erpoptm/system01.dbf'</p></blockquote>
<p>这说明需要介质恢复，可以一个一个数据文件的来recover，也可以直接recover database：</p>
<blockquote><p>SQL&gt; recover database;<br />
Media recovery complete.<br />
SQL&gt; alter database open;</p>
<p>Database altered.</p>
<p>SQL&gt; show parameter db_name</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
db_name                              string      erptest<br />
SQL&gt; show parameter instance_name</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
instance_name                        string      erpoptm</p></blockquote>
<p>注意这种情况下启动的数据库会做实例恢复，因为redo和数据文件等都是copy过来的。这样就建立了一个db_name为erptest，而instance_name和SID为erpoptm的数据库。</p>
<p>然后要马上建立临时表空间：</p>
<blockquote><p>SQL&gt; ALTER TABLESPACE TEMP ADD TEMPFILE '+DGOPTM/erpoptm/temp01.dbf' SIZE 8192M REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;</p>
<p>Tablespace altered.</p></blockquote>
<p>但是事情并没有结束，很快就发些这个新搭建的库会很快死掉，alert日志记录了如下的信息：</p>
<blockquote><p>Tue Mar  9 10:11:24 2010<br />
Errors in file /u01/app/oracle/admin/erpoptm/bdump/erpoptm_mmon_30564.trc:<br />
ORA-00600: internal error code, arguments: [504], [0x06000AD18], [1], [0], [ksv instance], [0], [0], [0x0DCFCE590]<br />
Tue Mar  9 10:11:26 2010<br />
Errors in file /u01/app/oracle/admin/erpoptm/bdump/erpoptm_mmon_30564.trc:<br />
ORA-00600: internal error code, arguments: [504], [0x06000AD18], [1], [0], [ksv instance], [0], [0], [0x0DCFCE590]<br />
Tue Mar  9 10:11:26 2010<br />
Errors in file /u01/app/oracle/admin/erpoptm/bdump/erpoptm_mmon_30564.trc:<br />
ORA-00600: internal error code, arguments: [4193], [2887], [2890], [], [], [], [], []</p></blockquote>
<p>碰到很多4193的600错误，这种一般和undo有关，重建一下undo即可：</p>
<blockquote><p>SQL&gt; show parameter  undo</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
undo_management                      string      AUTO<br />
undo_retention                       integer     900<br />
undo_tablespace                      string      UNDOTBS1</p>
<p>SQL&gt; create undo tablespace undotbs2 datafile '+DGOPTM/ERPOPTM/undotbs2.dbf' size 1024m;</p>
<p>Tablespace created.</p>
<p>SQL&gt; alter system set undo_tablespace=undotbs2;</p>
<p>System altered.</p>
<p>SQL&gt; show parameter undo</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
undo_management                      string      AUTO<br />
undo_retention                       integer     900<br />
undo_tablespace                      string      UNDOTBS2</p></blockquote>
<p>再修改一下参数文件initerpoptm.ora，修改这里的undo：</p>
<blockquote><p>*.undo_tablespace='UNDOTBS2'</p></blockquote>
<p>重新启动数据库，设置db_unique_name和spfile：</p>
<blockquote><p>SQL&gt; show parameter spfile</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
spfile                               string<br />
SQL&gt;<br />
SQL&gt; create spfile from pfile;</p>
<p>File created.</p>
<p>SQL&gt; shutdown immediate</p>
<p>SQL&gt; startup<br />
ORACLE instance started.<br />
Database mounted.<br />
Database opened.<br />
SQL&gt; show parameter spfile</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
spfile                               string      /u01/app/oracle/oracle/product<br />
/10.2.0/db_1/dbs/spfileerpoptm<br />
.ora<br />
SQL&gt; alter system set db_unique_name=erpoptm scope=spfile;</p>
<p>System altered.</p>
<p>SQL&gt; shutdown immediate<br />
SQL&gt; startup<br />
SQL&gt;<br />
SQL&gt; show parameter db_name</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
db_name                              string      erptest<br />
SQL&gt;<br />
SQL&gt;<br />
SQL&gt;<br />
SQL&gt; show parameter instance_name;</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
instance_name                        string      erpoptm<br />
SQL&gt;<br />
SQL&gt;<br />
SQL&gt;<br />
SQL&gt; show parameter db_unique_name</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
db_unique_name                       string      ERPOPTM</p></blockquote>
<p>可以看到spfile默认会放到dbs目录下。至此这个数据库应该是可用了，当然还要配置一下网络监听等服务：</p>
<blockquote><p>[oracle@erpdevdb admin]$ vi tnsnames.ora</p>
<p>ERPOPTM =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = erpdevdb)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = erpoptm)<br />
)<br />
)</p>
<p>[oracle@erpdevdb admin]$ lsnrctl</p>
<p>LSNRCTL&gt; help<br />
The following operations are available<br />
An asterisk (*) denotes a modifier or extended command:</p>
<p>start               stop                status<br />
services            version             reload<br />
save_config         trace               spawn<br />
change_password     quit                exit<br />
set*                show*</p>
<p>LSNRCTL&gt; reload<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))<br />
The command completed successfully</p>
<p>[oracle@erpdevdb admin]$ vi /etc/oratab</p>
<p>erpoptm:/u01/app/oracle/oracle/product/10.2.0/db_1:Y</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/03/09/clone_database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle中如何建立触发器</title>
		<link>http://www.banping.com/2010/03/02/oracle_trigger/</link>
		<comments>http://www.banping.com/2010/03/02/oracle_trigger/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 09:45:28 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=631</guid>
		<description><![CDATA[Oracle 中建立触发器的语法如下，图片引自Oracle网站：

其中DML Event Clause为：

其中referencing_clause为：

一般来说建立after的触发器效率比较高，为了提高效率，我们应该细化限制触发的条件，比如指定字段和值的范围才触发：
CREATE TRIGGER hr.salary_check
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees
FOR EACH ROW
WHEN (new.job_id &#60;&#62; 'AD_VP')
pl/sql_block ......

触发器和引起触发的SQL是同一个事务，除非用PRAGMA AUTONOMOUS_TRANSACTION参数指定自治事务，但可能会出现数据结果不一致的问题。
]]></description>
			<content:encoded><![CDATA[<p>Oracle 中建立触发器的语法如下，图片引自Oracle网站：</p>
<p><img class="alignnone" title="oracle trigger" src="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/img/create_trigger.gif" alt="" width="687" height="367" /></p>
<p>其中DML Event Clause为：</p>
<p><img class="alignnone" title="dml" src="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/img/DML_event_clause.gif" alt="" width="640" height="371" /></p>
<p>其中referencing_clause为：</p>
<p><img class="alignnone" title="referencing_clause" src="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/img/referencing_clause.gif" alt="" width="409" height="162" /></p>
<p>一般来说建立after的触发器效率比较高，为了提高效率，我们应该细化限制触发的条件，比如指定字段和值的范围才触发：</p>
<blockquote><p>CREATE TRIGGER hr.salary_check</p>
<p>BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees</p>
<p>FOR EACH ROW</p>
<p>WHEN (new.job_id &lt;&gt; 'AD_VP')</p>
<p><span>pl/sql_block ......<br />
</span></p></blockquote>
<p>触发器和引起触发的SQL是同一个事务，除非用PRAGMA AUTONOMOUS_TRANSACTION参数指定自治事务，但可能会出现数据结果不一致的问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/03/02/oracle_trigger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rac环境下禁用oracle实例对vip的依赖</title>
		<link>http://www.banping.com/2010/03/01/rac_instance_required_vip/</link>
		<comments>http://www.banping.com/2010/03/01/rac_instance_required_vip/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 09:12:11 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=629</guid>
		<description><![CDATA[为了保证RAC环境下如果一个节点出问题，客户端能漂移到其他节点，Oracle引入了VIP的配置。但在个别版本中，实例对VIP的依赖却可能因为VIP出现问题导致实例崩溃。从10203开始可以手动取消实例对VIP的依赖，而10204已经取消了这个依赖关系。
以下信息是数据库实例crash的记录：
Sun Feb 14 20:07:18 2010
Shutting down instance (abort)
License high water mark = 381
Instance terminated by USER, pid = 619164
取消实例依赖VIP的方法是导出实例部分的资源配置，修改后再注册回去。步骤如下：
DB1@/home/oracle&#62;crs_stat -p ora.racdb.rac1.inst &#62;&#62; /tmp/ora.racdb.rac1.inst.cap
然后编辑这个文件，去掉对vip的依赖：
DB1@/home/oracle&#62;vi /tmp/ora.racdb.rac1.inst.cap
REQUIRED_RESOURCES= 这里设为空
然后再注册回去：
DB1@/home/oracle&#62;crs_register -u ora.racdb.rac1.inst -dir /tmp
所有的节点都需要修改，再用crs_stat -p命令查看已经生效了。如果RAC环境中断网引起的实例崩溃，很可能就是这个问题。
]]></description>
			<content:encoded><![CDATA[<p>为了保证RAC环境下如果一个节点出问题，客户端能漂移到其他节点，Oracle引入了VIP的配置。但在个别版本中，实例对VIP的依赖却可能因为VIP出现问题导致实例崩溃。从10203开始可以手动取消实例对VIP的依赖，而10204已经取消了这个依赖关系。</p>
<p>以下信息是数据库实例crash的记录：</p>
<blockquote><p>Sun Feb 14 20:07:18 2010<br />
Shutting down instance (abort)<br />
License high water mark = 381<br />
Instance terminated by USER, pid = 619164</p></blockquote>
<p>取消实例依赖VIP的方法是导出实例部分的资源配置，修改后再注册回去。步骤如下：</p>
<blockquote><p><a>DB1@/home/oracle&gt;crs_stat</a> -p ora.racdb.rac1.inst &gt;&gt; /tmp/ora.racdb.rac1.inst.cap</p></blockquote>
<p>然后编辑这个文件，去掉对vip的依赖：</p>
<blockquote><p><a>DB1@/home/oracle&gt;vi</a> /tmp/ora.racdb.rac1.inst.cap</p>
<p>REQUIRED_RESOURCES= 这里设为空</p></blockquote>
<p>然后再注册回去：</p>
<blockquote><p><a>DB1@/home/oracle&gt;crs_register</a> -u ora.racdb.rac1.inst -dir /tmp</p></blockquote>
<p>所有的节点都需要修改，再用crs_stat -p命令查看已经生效了。如果RAC环境中断网引起的实例崩溃，很可能就是这个问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/03/01/rac_instance_required_vip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Linux上创建ASM存储分区</title>
		<link>http://www.banping.com/2010/02/25/linux_create_asm/</link>
		<comments>http://www.banping.com/2010/02/25/linux_create_asm/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 07:21:21 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=620</guid>
		<description><![CDATA[本文描述了在Linux 服务器上创建分区、建立oracle ASM存储和创建数据库实例的过程。
查看当前分区：
[root@erpdevdb ~]# fdisk -l
Disk /dev/sda: 1048.5 GB, 1048576000000 bytes
255 heads, 63 sectors/track, 127482 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          65      522081   83  Linux
/dev/sda2              66        2676    20972857+  8e  Linux LVM
/dev/sda3            2677        5287    20972857+  8e  Linux LVM
/dev/sda4            5288      127482   981531337+   5  Extended
/dev/sda5            [...]]]></description>
			<content:encoded><![CDATA[<p>本文描述了在Linux 服务器上创建分区、建立oracle ASM存储和创建数据库实例的过程。</p>
<p>查看当前分区：</p>
<blockquote><p>[root@erpdevdb ~]# fdisk -l</p>
<p>Disk /dev/sda: 1048.5 GB, 1048576000000 bytes<br />
255 heads, 63 sectors/track, 127482 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>   Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1          65      522081   83  Linux<br />
/dev/sda2              66        2676    20972857+  8e  Linux LVM<br />
/dev/sda3            2677        5287    20972857+  8e  Linux LVM<br />
/dev/sda4            5288      127482   981531337+   5  Extended<br />
/dev/sda5            5288        7898    20972826   8e  Linux LVM<br />
/dev/sda6            7899       20400   100422283+  8e  Linux LVM<br />
/dev/sda7           20401       32850   100004593+  8e  Linux LVM<br />
/dev/sda8           32851       57750   200009218+  8e  Linux LVM</p>
<p>Disk /dev/sdb: 1198.8 GB, 1198899855360 bytes<br />
255 heads, 63 sectors/track, 145757 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>   Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdb1               1       37349   300005811   83  Linux<br />
/dev/sdb2           37350       74698   300005842+  83  Linux<br />
/dev/sdb3           74699      136946   500007060   83  Linux</p></blockquote>
<p>在/dev/sda设备上创建一个新的分区：</p>
<blockquote><p>[root@erpdevdb ~]# fdisk /dev/sda</p>
<p>The number of cylinders for this disk is set to 127482.<br />
There is nothing wrong with that, but this is larger than 1024,<br />
and could in certain setups cause problems with:<br />
1) software that runs at boot time (e.g., old versions of LILO)<br />
2) booting and partitioning software from other OSs<br />
   (e.g., DOS FDISK, OS/2 FDISK)</p>
<p>Command (m for help): m<br />
Command action<br />
   a   toggle a bootable flag<br />
   b   edit bsd disklabel<br />
   c   toggle the dos compatibility flag<br />
   d   delete a partition<br />
   l   list known partition types<br />
   m   print this menu<br />
   n   add a new partition<br />
   o   create a new empty DOS partition table<br />
   p   print the partition table<br />
   q   quit without saving changes<br />
   s   create a new empty Sun disklabel<br />
   t   change a partition's system id<br />
   u   change display/entry units<br />
   v   verify the partition table<br />
   w   write table to disk and exit<br />
   x   extra functionality (experts only)</p>
<p>Command (m for help): p</p>
<p>Disk /dev/sda: 1048.5 GB, 1048576000000 bytes<br />
255 heads, 63 sectors/track, 127482 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>   Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1          65      522081   83  Linux<br />
/dev/sda2              66        2676    20972857+  8e  Linux LVM<br />
/dev/sda3            2677        5287    20972857+  8e  Linux LVM<br />
/dev/sda4            5288      127482   981531337+   5  Extended<br />
/dev/sda5            5288        7898    20972826   8e  Linux LVM<br />
/dev/sda6            7899       20400   100422283+  8e  Linux LVM<br />
/dev/sda7           20401       32850   100004593+  8e  Linux LVM<br />
/dev/sda8           32851       57750   200009218+  8e  Linux LVM</p>
<p>Command (m for help): n<br />
First cylinder (57751-127482, default 57751):<br />
Using default value 57751<br />
Last cylinder or +size or +sizeM or +sizeK (57751-127482, default 127482): +300000M</p>
<p>Command (m for help): p</p>
<p>Disk /dev/sda: 1048.5 GB, 1048576000000 bytes<br />
255 heads, 63 sectors/track, 127482 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>   Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1          65      522081   83  Linux<br />
/dev/sda2              66        2676    20972857+  8e  Linux LVM<br />
/dev/sda3            2677        5287    20972857+  8e  Linux LVM<br />
/dev/sda4            5288      127482   981531337+   5  Extended<br />
/dev/sda5            5288        7898    20972826   8e  Linux LVM<br />
/dev/sda6            7899       20400   100422283+  8e  Linux LVM<br />
/dev/sda7           20401       32850   100004593+  8e  Linux LVM<br />
/dev/sda8           32851       57750   200009218+  8e  Linux LVM<br />
/dev/sda9           57751       94224   292977373+  83  Linux</p>
<p>Command (m for help): w<br />
The partition table has been altered!</p>
<p>Calling ioctl() to re-read partition table.</p>
<p>WARNING: Re-reading the partition table failed with error 16: Device or resource busy.<br />
The kernel still uses the old table.<br />
The new table will be used at the next reboot.<br />
Syncing disks.<br />
[root@erpdevdb ~]#</p></blockquote>
<p>这时能看到新的分区：</p>
<blockquote><p>[root@erpdevdb ~]# fdisk -l</p>
<p>Disk /dev/sda: 1048.5 GB, 1048576000000 bytes<br />
255 heads, 63 sectors/track, 127482 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>   Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1          65      522081   83  Linux<br />
/dev/sda2              66        2676    20972857+  8e  Linux LVM<br />
/dev/sda3            2677        5287    20972857+  8e  Linux LVM<br />
/dev/sda4            5288      127482   981531337+   5  Extended<br />
/dev/sda5            5288        7898    20972826   8e  Linux LVM<br />
/dev/sda6            7899       20400   100422283+  8e  Linux LVM<br />
/dev/sda7           20401       32850   100004593+  8e  Linux LVM<br />
/dev/sda8           32851       57750   200009218+  8e  Linux LVM<br />
/dev/sda9           57751       94224   292977373+  83  Linux<br />
/dev/sda10          94225      127482   267144853+  83  Linux</p>
<p>Disk /dev/sdb: 1198.8 GB, 1198899855360 bytes<br />
255 heads, 63 sectors/track, 145757 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>   Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdb1               1       37349   300005811   83  Linux<br />
/dev/sdb2           37350       74698   300005842+  83  Linux<br />
/dev/sdb3           74699      136946   500007060   83  Linux<br />
/dev/sdb4          136947      145757    70774357+  83  Linux</p></blockquote>
<p>查看当前的ASM磁盘组：</p>
<blockquote><p>[root@erpdevdb ~]# /etc/init.d/oracleasm listdisks<br />
VOL1<br />
VOL2<br />
VOL3</p></blockquote>
<p>这时创建新的ASM磁盘组会报错，正如前面创建分区保存时提示的，需要重启后才生效。</p>
<blockquote><p>[root@erpdevdb ~]# /etc/init.d/oracleasm createdisk VOL4 /dev/sda9<br />
Marking disk "VOL4" as an ASM disk: [FAILED]</p></blockquote>
<p>关闭已有的oracle 实例和ASM实例：</p>
<blockquote><p>[oracle@erpdevdb ~]$ export ORACLE_SID=devdb<br />
[oracle@erpdevdb ~]$ sqlplus " / as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 25 12:52:48 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.<br />
Connected to:<br />
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production<br />
With the Partitioning, OLAP and Data Mining options</p>
<p>SQL&gt; shutdown immediate<br />
Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.<br />
SQL&gt; exit<br />
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production<br />
With the Partitioning, OLAP and Data Mining options</p>
<p>[oracle@erpdevdb ~]$ export ORACLE_SID=+ASM<br />
[oracle@erpdevdb ~]$ sqlplus " /  as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 25 12:57:24 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.<br />
Connected to:<br />
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production<br />
With the Partitioning, OLAP and Data Mining options</p>
<p>SQL&gt; shutdown immediate<br />
ASM diskgroups dismounted<br />
ASM instance shutdown<br />
SQL&gt; exit<br />
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production<br />
With the Partitioning, OLAP and Data Mining options</p></blockquote>
<p>关闭listener ：</p>
<blockquote><p>[oracle@erpdevdb ~]$ lsnrctl</p>
<p>LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 25-FEB-2010 12:58:32</p>
<p>Copyright (c) 1991, 2005, Oracle.  All rights reserved.</p>
<p>Welcome to LSNRCTL, type "help" for information.</p>
<p>LSNRCTL&gt; stat   <br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))<br />
STATUS of the LISTENER<br />
------------------------<br />
Alias                     LISTENER<br />
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
Start Date                29-NOV-2009 13:13:31<br />
Uptime                    87 days 23 hr. 45 min. 5 sec<br />
Trace Level               off<br />
Security                  ON: Local OS Authentication<br />
SNMP                      OFF<br />
Listener Parameter File   /u01/app/oracle/oracle/product/10.2.0/db_1/network/admin/listener.ora<br />
Listener Log File         /u01/app/oracle/oracle/product/10.2.0/db_1/network/log/listener.log<br />
Listening Endpoints Summary...<br />
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))<br />
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=erpdevdb.chinacnd.com)(PORT=1521)))<br />
Services Summary...<br />
Service "PLSExtProc" has 1 instance(s).<br />
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...<br />
The command completed successfully<br />
LSNRCTL&gt; stop<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))<br />
The command completed successfully<br />
LSNRCTL&gt; exit</p></blockquote>
<p>重启服务器：</p>
<blockquote><p>[root@erpdevdb ~]# reboot</p>
<p>Broadcast message from root (pts/1) (Thu Feb 25 12:59:17 2010):</p>
<p>The system is going down for reboot NOW!</p></blockquote>
<p>重启后启动Listerner：</p>
<blockquote><p>[root@erpdevdb ~]# su - oracle<br />
[oracle@erpdevdb ~]$ lsnrctl start</p>
<p>LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 25-FEB-2010 13:03:58</p>
<p>Copyright (c) 1991, 2005, Oracle.  All rights reserved.</p>
<p>Starting /u01/app/oracle/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...</p>
<p>TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
System parameter file is /u01/app/oracle/oracle/product/10.2.0/db_1/network/admin/listener.ora<br />
Log messages written to /u01/app/oracle/oracle/product/10.2.0/db_1/network/log/listener.log<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=erpdevdb.chinacnd.com)(PORT=1521)))</p>
<p>Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))<br />
STATUS of the LISTENER<br />
------------------------<br />
Alias                     LISTENER<br />
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
Start Date                25-FEB-2010 13:03:58<br />
Uptime                    0 days 0 hr. 0 min. 0 sec<br />
Trace Level               off<br />
Security                  ON: Local OS Authentication<br />
SNMP                      OFF<br />
Listener Parameter File   /u01/app/oracle/oracle/product/10.2.0/db_1/network/admin/listener.ora<br />
Listener Log File         /u01/app/oracle/oracle/product/10.2.0/db_1/network/log/listener.log<br />
Listening Endpoints Summary...<br />
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))<br />
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=erpdevdb.chinacnd.com)(PORT=1521)))<br />
Services Summary...<br />
Service "PLSExtProc" has 1 instance(s).<br />
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...<br />
The command completed successfully<br />
[oracle@erpdevdb ~]$</p></blockquote>
<p>启动Asm实例：</p>
<blockquote><p>[oracle@erpdevdb ~]$ export ORACLE_SID=+ASM<br />
[oracle@erpdevdb ~]$ sqlplus  "/  as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 25 13:04:17 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.</p>
<p>Connected to an idle instance.</p>
<p>SQL&gt; startup<br />
ASM instance started</p>
<p>Total System Global Area  130023424 bytes<br />
Fixed Size                  2019032 bytes<br />
Variable Size             102838568 bytes<br />
ASM Cache                  25165824 bytes<br />
ASM diskgroups mounted<br />
SQL&gt; exit<br />
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production<br />
With the Partitioning, OLAP and Data Mining options</p></blockquote>
<p>启动其他数据库实例：</p>
<blockquote><p>[oracle@erpdevdb ~]$ export ORACLE_SID=devdb<br />
[oracle@erpdevdb ~]$ sqlplus  "/  as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 25 13:04:40 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.</p>
<p>Connected to an idle instance.</p>
<p>SQL&gt; startup<br />
ORACLE instance started.</p>
<p>Total System Global Area 4294967296 bytes<br />
Fixed Size                  2026296 bytes<br />
Variable Size             285213896 bytes<br />
Database Buffers         3992977408 bytes<br />
Redo Buffers               14749696 bytes<br />
Database mounted.<br />
Database opened.<br />
SQL&gt; exit</p></blockquote>
<p>创建Asm设备：</p>
<blockquote><p>[root@erpdevdb ~]# /etc/init.d/oracleasm createdisk VOL4 /dev/sda9<br />
Marking disk "VOL4" as an ASM disk: [  OK  ]<br />
[root@erpdevdb ~]#<br />
[root@erpdevdb ~]#<br />
[root@erpdevdb ~]#<br />
[root@erpdevdb ~]# /etc/init.d/oracleasm listdisks<br />
VOL1<br />
VOL2<br />
VOL3<br />
VOL4</p></blockquote>
<p>创建ASM磁盘组：</p>
<blockquote><p>[root@erpdevdb ~]# su - oracle<br />
[oracle@erpdevdb ~]$ export ORACLE_SID=+ASM<br />
[oracle@erpdevdb ~]$ sqlplus  "/ as sysdba"</p>
<p>SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 25 13:52:44 2010</p>
<p>Copyright (c) 1982, 2005, Oracle.  All rights reserved.<br />
Connected to:<br />
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production<br />
With the Partitioning, OLAP and Data Mining options</p>
<p>SQL&gt;<br />
SQL&gt;<br />
SQL&gt; create diskgroup DGTEST external redundancy disk 'ORCL:VOL4';</p>
<p>Diskgroup created.</p>
<p>SQL&gt;<br />
SQL&gt; select name,group_number,disk_number,mode_status from v$asm_disk;</p>
<p>NAME                           GROUP_NUMBER DISK_NUMBER MODE_ST<br />
------------------------------ ------------ ----------- -------<br />
VOL1                                      3           0 ONLINE<br />
VOL2                                      1           0 ONLINE<br />
VOL3                                      2           0 ONLINE<br />
VOL4                                      4           0 ONLINE</p>
<p>SQL&gt; select group_number,name,total_mb,free_mb from v$asm_diskgroup;</p>
<p>GROUP_NUMBER NAME                             TOTAL_MB    FREE_MB<br />
------------ ------------------------------ ---------- ----------<br />
           1 DGDEV                              292974     151815<br />
           2 DGPAPER                            488288     328379<br />
           3 DGSTUDY                            292974     168839<br />
           4 DGTEST                             286110     286058</p>
<p>SQL&gt; exit</p></blockquote>
<p>然后通过dbca工具创建新的实例，在创建过程中存储选择这里新建的DGTEST磁盘组即可：</p>
<p><img class="aligncenter size-full wp-image-625" title="asm" src="http://www.banping.com/wp-content/uploads/2010/02/asm.jpg" alt="asm" width="768" height="614" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/02/25/linux_create_asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Linux下安装JDK和tomcat</title>
		<link>http://www.banping.com/2010/02/23/install_jdk_tomcat/</link>
		<comments>http://www.banping.com/2010/02/23/install_jdk_tomcat/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:03:00 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[主机及存储]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=617</guid>
		<description><![CDATA[在Linux 安装JDK和Tomcat 很简单，简要介绍如下：
首先去下载软件，地址分别是
http://java.sun.com/javase/downloads/index.jsp
和
http://tomcat.apache.org/
注意选择自己需要的合适的版本，比如我下载的是apache-tomcat-5.5.23.tar.gz和jdk-6u18-linux-x64-rpm.bin.gz，然后上传到/tmp目录下。
安装JDK：
[root@tomcat1 tmp]# sh jdk-6u18-linux-x64-rpm.bin
Sun Microsystems, Inc. Binary Code License Agreement
for the JAVA SE DEVELOPMENT KIT (JDK), VERSION 6
......
Do you agree to the above license terms? [yes or no]
           yes
Unpacking...
Checksumming...
Extracting...
......
Press Enter to continue.....
Done.
安装完成后，JDK被安装在/usr/java目录下。这个版本会在当前路径下安装javaDB，以前的版本不会。
安装tomcat ：
[root@tomcat1 tmp]# tar -zxvf apache-tomcat-5.5.23.tar.gz
然后会在当前路径下生成apache-tomcat-5.5.23文件夹，把它mv或cp到你想要的路径即可。
[root@tomcat1 tmp]# cp -a apache-tomcat-5.5.23 /usr/local/
然后配置环境变量：
[root@tomcat1 tmp]# vi /etc/profile
#set java environment
JAVA_HOME=/usr/java/jdk1.6.0_18
export TOMCAT_HOME=/usr/local/apache-tomcat-5.5.23
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
[root@tomcat1 tmp]# source [...]]]></description>
			<content:encoded><![CDATA[<p>在Linux 安装JDK和Tomcat 很简单，简要介绍如下：</p>
<p>首先去下载软件，地址分别是</p>
<p><a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a></p>
<p>和</p>
<p><a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a></p>
<p>注意选择自己需要的合适的版本，比如我下载的是apache-tomcat-5.5.23.tar.gz和jdk-6u18-linux-x64-rpm.bin.gz，然后上传到/tmp目录下。</p>
<p>安装JDK：</p>
<blockquote><p>[root@tomcat1 tmp]# sh jdk-6u18-linux-x64-rpm.bin</p>
<p>Sun Microsystems, Inc. Binary Code License Agreement</p>
<p>for the JAVA SE DEVELOPMENT KIT (JDK), VERSION 6</p>
<p>......</p>
<p>Do you agree to the above license terms? [yes or no]<br />
           yes<br />
Unpacking...<br />
Checksumming...<br />
Extracting...</p>
<p>......</p>
<p>Press Enter to continue.....<br />
Done.</p></blockquote>
<p>安装完成后，JDK被安装在/usr/java目录下。这个版本会在当前路径下安装javaDB，以前的版本不会。</p>
<p>安装tomcat ：</p>
<blockquote><p>[root@tomcat1 tmp]# tar -zxvf apache-tomcat-5.5.23.tar.gz</p></blockquote>
<p>然后会在当前路径下生成apache-tomcat-5.5.23文件夹，把它mv或cp到你想要的路径即可。</p>
<blockquote><p>[root@tomcat1 tmp]# cp -a apache-tomcat-5.5.23 /usr/local/</p></blockquote>
<p>然后配置环境变量：</p>
<blockquote><p>[root@tomcat1 tmp]# vi /etc/profile</p>
<p>#set java environment<br />
JAVA_HOME=/usr/java/jdk1.6.0_18<br />
export TOMCAT_HOME=/usr/local/apache-tomcat-5.5.23</p>
<p>CLASSPATH=.:$JAVA_HOME/lib/tools.jar<br />
PATH=$JAVA_HOME/bin:$PATH<br />
export JAVA_HOME CLASSPATH PATH</p>
<p>[root@tomcat1 tmp]# source /etc/profile</p></blockquote>
<p>查看java的版本号已经生效了：</p>
<blockquote><p>[root@tomcat1 tmp]# java -version<br />
java version "1.6.0_18"<br />
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)<br />
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)</p></blockquote>
<p>测试tomcat ：</p>
<blockquote><p>[root@tomcat1 tmp]# cd /usr/local/apache-tomcat-5.5.23/bin/</p>
<p>[root@tomcat1 bin]# ./startup.sh<br />
Using CATALINA_BASE:   /usr/local/apache-tomcat-5.5.23<br />
Using CATALINA_HOME:   /usr/local/apache-tomcat-5.5.23<br />
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-5.5.23/temp<br />
Using JRE_HOME:       /usr/java/jdk1.6.0_18</p></blockquote>
<p>打开网页查看8080端口就能看到可爱的猫了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/02/23/install_jdk_tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>年底事故多发－ORA-00600之kcbz_check_objd_typ_3</title>
		<link>http://www.banping.com/2010/02/09/ora_00600_kcbz_check_objd_typ_3/</link>
		<comments>http://www.banping.com/2010/02/09/ora_00600_kcbz_check_objd_typ_3/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 02:23:40 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=611</guid>
		<description><![CDATA[最近给小型机加了内存，调整了SGA参数，以应付明年到来的重压，昨天在alert日志发现了600错误：
Mon Feb  8 10:00:54 2010
Errors in file  /u01/admin/erpdb/bdump/erpdb2_m001_598774.trc:
ORA-00600: internal  error code, arguments: [kcbz_check_objd_typ_3], [0], [0], [1], [], [], [],  []
Mon Feb  8 10:00:58 2010
Trace dumping is performing  id=[cdmp_20100208100058]
检查trace文件，发现了执行的SQL语句如下：
*** 2010-02-08 10:00:54.825
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [kcbz_check_objd_typ_3], [0], [0], [1], [], [], [], []
Current SQL statement for this session:
SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>最近给小型机加了内存，调整了SGA参数，以应付明年到来的重压，昨天在alert日志发现了600错误：</p>
<blockquote><p>Mon Feb  8 10:00:54 2010<br />
Errors in file  /u01/admin/erpdb/bdump/erpdb2_m001_598774.trc:<br />
ORA-00600: internal  error code, arguments: [kcbz_check_objd_typ_3], [0], [0], [1], [], [], [],  []<br />
Mon Feb  8 10:00:58 2010<br />
Trace dumping is performing  id=[cdmp_20100208100058]</p></blockquote>
<p>检查trace文件，发现了执行的SQL语句如下：</p>
<blockquote><p>*** 2010-02-08 10:00:54.825<br />
ksedmp: internal or fatal error<br />
ORA-00600: internal error code, arguments: [kcbz_check_objd_typ_3], [0], [0], [1], [], [], [], []<br />
Current SQL statement for this session:</p>
<p>SELECT count(*) over() as total_count,<br />
sd_xe_ash_nm.event_name,<br />
sd_xe_ash_nm.event_id,<br />
sd_xe_ash_nm.parameter1 as p1text,<br />
(CASE<br />
WHEN (sd_xe_ash_nm.parameter1 is NULL OR<br />
sd_xe_ash_nm.parameter1 = '0') THEN<br />
0<br />
ELSE<br />
1<br />
END) as p1valid,<br />
sd_xe_ash_nm.parameter2 as p2text,<br />
(CASE<br />
WHEN (sd_xe_ash_nm.parameter2 is NULL OR<br />
sd_xe_ash_nm.parameter2 = '0') THEN<br />
0<br />
ELSE<br />
1<br />
END) as p2valid,<br />
sd_xe_ash_nm.parameter3 as p3text,<br />
(CASE<br />
WHEN (sd_xe_ash_nm.parameter3 is NULL OR<br />
sd_xe_ash_nm.parameter3 = '0') THEN<br />
0<br />
ELSE<br />
1<br />
END) as p3valid,<br />
sd_xe_ash_nm.keh_evt_id,<br />
nvl(xc.class#, 0) as class_num,<br />
sd_xe_ash_nm.wait_class_id,<br />
nvl(xc.keh_id, 0) as keh_ecl_id,<br />
sd_xe_ash_nm.ash_cnt,<br />
sd_xe_ash_nm.tot_wts_diff,<br />
sd_xe_ash_nm.tot_tmo_diff,<br />
sd_xe_ash_nm.tim_wait_diff<br />
FROM (SELECT sd_xe_ash.*,<br />
evtname.event_name,<br />
evtname.wait_class_id,<br />
evtname.parameter1,<br />
evtname.parameter2,<br />
evtname.parameter3<br />
FROM (SELECT sd_xe.*, nvl(ash.cnt, 0) as ash_cnt<br />
FROM (SELECT nvl(xe.keh_id, 0) as keh_evt_id,<br />
nvl(sd.event_id, xe.event_hash) as event_id,<br />
nvl(sd.tot_wts_diff, 0) as tot_wts_diff,<br />
nvl(sd.tot_tmo_diff, 0) as tot_tmo_diff,<br />
nvl(sd.tim_wait_diff, 0) as tim_wait_diff<br />
FROM (SELECT endsn.event_id as event_id,<br />
(endsn.total_waits -<br />
nvl(begsn.total_waits, 0)) as tot_wts_diff,<br />
(endsn.total_timeouts -<br />
nvl(begsn.total_timeouts, 0)) as tot_tmo_diff,<br />
(endsn.time_waited_micro -<br />
nvl(begsn.time_waited_micro, 0)) as tim_wait_diff<br />
FROM (SELECT end_snap.*<br />
FROM (SELECT t1.*<br />
FROM WRH$_SYSTEM_EVENT t1,<br />
WRM$_SNAPSHOT     s1<br />
WHERE t1.dbid = s1.dbid<br />
AND t1.instance_number =<br />
s1.instance_number<br />
AND t1.snap_id = s1.snap_id<br />
AND s1.bl_moved = 0<br />
UNION ALL<br />
SELECT t2.*<br />
FROM WRH$_SYSTEM_EVENT_BL t2,<br />
WRM$_SNAPSHOT        s2<br />
WHERE t2.dbid = s2.dbid<br />
AND t2.instance_number =<br />
s2.instance_number<br />
AND t2.snap_id = s2.snap_id<br />
AND s2.bl_moved &lt;&gt; 0) end_snap<br />
WHERE end_snap.dbid = :dbid<br />
and end_snap.instance_number =<br />
:instance_number<br />
and end_snap.snap_id = :end_snap) endsn<br />
LEFT OUTER JOIN (SELECT beg_snap.*<br />
FROM (SELECT t1.*<br />
FROM WRH$_SYSTEM_EVENT t1,<br />
WRM$_SNAPSHOT     s1<br />
WHERE t1.dbid =<br />
s1.dbid<br />
AND t1.instance_number =<br />
s1.instance_number<br />
AND t1.snap_id =<br />
s1.snap_id<br />
AND s1.bl_moved = 0<br />
UNION ALL<br />
SELECT t2.*<br />
FROM WRH$_SYSTEM_EVENT_BL t2,<br />
WRM$_SNAPSHOT        s2<br />
WHERE t2.dbid =<br />
s2.dbid<br />
AND t2.instance_number =<br />
s2.instance_number<br />
AND t2.snap_id =<br />
s2.snap_id<br />
AND s2.bl_moved &lt;&gt; 0) beg_snap<br />
WHERE beg_snap.dbid = :dbid<br />
and beg_snap.instance_number =<br />
:instance_number<br />
and beg_snap.snap_id =<br />
:beg_snap) begsn ON endsn.event_id =<br />
begsn.event_id) sd<br />
FULL OUTER JOIN X$KEHEVTMAP xe ON sd.event_id =<br />
xe.event_hash) sd_xe<br />
LEFT OUTER JOIN (SELECT a.event_id, count(*) as cnt<br />
FROM (SELECT t1.*<br />
FROM WRH$_ACTIVE_SESSION_HISTORY t1,<br />
WRM$_SNAPSHOT               s1<br />
WHERE t1.dbid = s1.dbid<br />
AND t1.instance_number =<br />
s1.instance_number<br />
AND t1.snap_id = s1.snap_id<br />
AND s1.bl_moved = 0<br />
UNION ALL<br />
SELECT t2.*<br />
FROM WRH$_ACTIVE_SESSION_HISTORY_BL t2,<br />
WRM$_SNAPSHOT                  s2<br />
WHERE t2.dbid = s2.dbid<br />
AND t2.instance_number =<br />
s2.instance_number<br />
AND t2.snap_id = s2.snap_id<br />
AND s2.bl_moved &lt;&gt; 0) a<br />
WHERE a.dbid = :dbid<br />
and a.instance_number = :instance_number<br />
and a.snap_id &gt; :beg_snap<br />
and a.snap_id &lt;= :end_snap<br />
and a.wait_time = 0<br />
GROUP BY a.event_id) ash ON sd_xe.event_id =<br />
ash.event_id) sd_xe_ash,<br />
WRH$_EVENT_NAME evtname<br />
WHERE evtname.event_id = sd_xe_ash.event_id<br />
and evtname.event_id &gt; 0<br />
and evtname.dbid = :dbid) sd_xe_ash_nm,<br />
X$KEHECLMAP xc<br />
WHERE sd_xe_ash_nm.wait_class_id = xc.class_hash<br />
ORDER BY sd_xe_ash_nm.wait_class_id,<br />
sd_xe_ash_nm.tim_wait_diff DESC,<br />
sd_xe_ash_nm.event_id</p></blockquote>
<p>到了晚上，收集统计信息的时候日志再次出现提示：</p>
<blockquote><p>Mon Feb  8 22:05:29 2010<br />
Errors in file  /u01/admin/erpdb/bdump/erpdb2_j000_270930.trc:<br />
ORA-00600: internal  error code, arguments: [kcbz_check_objd_typ_3], [2], [0], [7], [], [], [],  []<br />
Mon Feb  8 22:05:32 2010<br />
Trace dumping is performing  id=[cdmp_20100208220532]<br />
Mon Feb  8 22:05:36 2010<br />
Errors in file  /u01/admin/erpdb/bdump/erpdb2_j000_270930.trc:<br />
ORA-00600: internal  error code, arguments: [ORA-00600: internal error code, arguments:  [kcbz_check_objd_typ_3], [2], [0], [7], [], [], [], []<br />
ORA-06512: at  "SYS.DBMS_STATS", line 19089<br />
], [], [], [], [], [], [], []</p></blockquote>
<p>而从trace文件查看这次是执行了以下SQL语句：</p>
<blockquote><p>insert /*+ append */<br />
into sys.ora_temp_2_ds_1073343<br />
select /*+ no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring */<br />
"PLSQL_ENTRY_OBJECT_ID",<br />
"PLSQL_ENTRY_SUBPROGRAM_ID",<br />
"PLSQL_OBJECT_ID",<br />
"PLSQL_SUBPROGRAM_ID",<br />
"SNAP_ID",<br />
"DBID",<br />
"INSTANCE_NUMBER",<br />
"SAMPLE_ID",<br />
"SAMPLE_TIME",<br />
"SESSION_ID",<br />
"SESSION_SERIAL#",<br />
"USER_ID",<br />
"SQL_ID",<br />
"SQL_CHILD_NUMBER",<br />
"SQL_PLAN_HASH_VALUE",<br />
"SERVICE_HASH",<br />
"SESSION_TYPE",<br />
"SQL_OPCODE",<br />
"QC_SESSION_ID",<br />
"QC_INSTANCE_ID",<br />
"CURRENT_OBJ#",<br />
"CURRENT_FILE#",<br />
"CURRENT_BLOCK#",<br />
"SEQ#",<br />
"EVENT_ID",<br />
"P1",<br />
"P2",<br />
"P3",<br />
"WAIT_TIME",<br />
"TIME_WAITED",<br />
"PROGRAM",<br />
"MODULE",<br />
"ACTION",<br />
"CLIENT_ID",<br />
"FORCE_MATCHING_SIGNATURE",<br />
"BLOCKING_SESSION",<br />
"BLOCKING_SESSION_SERIAL#",<br />
"XID"<br />
from "SYS"."WRH$_ACTIVE_SESSION_HISTORY" sample(6.1241078288) t</p></blockquote>
<p>从metalink查看这个错误可能是以下原因：</p>
<p>一、并行查询导致的，解决办法就是改用串行查询</p>
<blockquote><p>Bug# 6405339   See Note:6405339.8<br />
Corruption / OERI[kcbz_check_objd_typ_3] / OERI:5400 / OERI:5357 from PQ<br />
Fixed: 10.2.0.5, 11.1.0.7, 11.2</p>
<p>Bug 6405339  Corruption / OERI[kcbz_check_objd_typ_3] / OERI:5400 / OERI:5357 from PQ<br />
A parallel query which uses TEMP segments can suffer corruption<br />
within temporary segments between the slaves leading to various ORA-600<br />
errors like:</p>
<p>ORA-600 [kcbz_check_objd_typ_3]<br />
ORA-600 [5400]<br />
ORA-600 [5357]</p>
<p>Workaround<br />
Run the query serially</p></blockquote>
<p>二、基于SCN的恢复之后</p>
<blockquote><p>Bug# 5689412   See Note:5689412.8<br />
ORA-600 [kcbz_check_objd_typ_3] after SCN based recovery<br />
Fixed: 10.2.0.5</p>
<p>Bug 5689412  ORA-600 [kcbz_check_objd_typ_3] after SCN based recovery</p>
<p>ORA-600 [kcbz_check_objd_typ_3] after SCN based recovery to SCN just before<br />
a TRUNCATE operation.</p>
<p>eg:<br />
On primary<br />
create table y (d date, v varchar2(30));<br />
insert into y values (SYSDATE, 'test1');<br />
insert into y values (SYSDATE, 'test2');<br />
truncate table y;</p>
<p>Recover the standby to a point just prior to the<br />
truncate to recover this specific table. (Detemine<br />
the SCN by mining the redo)</p>
<p>recover standby database until change &lt;SCN&gt;;<br />
-&gt; media recovery completes successfully</p>
<p>alter database open read only;<br />
select * from y;<br />
^<br />
ORA-600 [kcbz_check_objd_typ_3]</p></blockquote>
<p>三、using a multi-table insert SQL with direct load operations</p>
<blockquote><p>Bug# 4592596   See Note:4592596.8<br />
Corruption (ORA-1410 / ORA-8103) from multi-table insert with direct load<br />
Fixed: 10.2.0.4, 11.1.0.6, 10.2.0.2.P01, 10.2.0.2.P08, 10.2.0.3.P03<br />
Bug 4592596  Corruption (ORA-1410 / ORA-8103) from multi-table insert with direct load</p>
<p>Corruption can occur using a multi-table insert SQL with<br />
direct load operations. Eg: If the SQL goes parallel.</p>
<p>This can result in subsequent ORA-1410 / ORA-8103 type errors on selects<br />
from the target table/s.</p>
<p>In the case of an internal error like ORA-600 [kcbz_check_objd_typ_3] the<br />
trace file may contain a redo dump with OP:19.1 for the affected object:</p>
<p>OP:19.1 Direct Loader block redo entry</p>
<p>It may affect AWR tables as some of them are populated with Direct Load.</p></blockquote>
<p>四、Segment advisor带来的buffer坏块，这应该也是本案例的原因所在，可以禁用AUTO_SPACE_ADVISOR_JOB并清空buffer来解决。</p>
<blockquote><p>Bug# 4430244 +  See Note:4430244.8<br />
Segment advisor can load blocks of dropped objects into buffer cache (KCB OERI errors)<br />
Fixed: 10.2.0.4, 11.1.0.6, 10.2.0.2.P11, 10.2.0.3.P11<br />
Bug 4430244  Segment advisor can load blocks of dropped objects into buffer cache (KCB OERI errors)</p>
<p>Segment advisor code (eg: DBMS_SPACE.OBJECT_GROWTH_TREND)<br />
can load blocks into the cache for DROPped objects as<br />
CURRENT leading to subsequent operations seeing an incorrect<br />
(old) version of a block.<br />
This can lead to various internal buffer cache related<br />
errors such as ORA-600 [kcbnew_3] / ORA-600 [kcbz_check_objd_typ_3].<br />
The exact error depends on which code sees the block.</p>
<p>eg:<br />
If the segment advisor decides to scan table USER1.TAB1<br />
then this table is concurrently dropped then the advisor<br />
may read blocks for the dropped object into the cache as<br />
"CURRENT" block images.<br />
A seperate session may do a direct load of a block from<br />
the dropped object so the block now belongs to USER2.TAB2.<br />
A subsequent select from USER2.TAB2 can see the old<br />
USER1.TAB1 block in the cache so fails.</p>
<p>Workaround<br />
Do not use segment advisor to prevent the problem occurring.<br />
eg:  connect / as sysdba;<br />
exec dbms_scheduler.disable('AUTO_SPACE_ADVISOR_JOB');</p>
<p>Use "alter system flush buffer_cache" to clear bad blocks<br />
from the cache (In RAC the block may have sourced from a<br />
different instance so you need to flush all buffer caches).</p></blockquote>
<p>另外一个Bug 和这个类似，解决办法相同：5218905  OERI[kcbnew_3] when segment advisor has been used。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/02/09/ora_00600_kcbz_check_objd_typ_3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有惊无险－遭遇600错误</title>
		<link>http://www.banping.com/2010/01/29/ora600_17285/</link>
		<comments>http://www.banping.com/2010/01/29/ora600_17285/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 01:48:32 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=608</guid>
		<description><![CDATA[昨天上午数据库alert日志突然出现600错误：
Thu Jan 28 10:29:48 2010
Errors in file  /u01/admin/erpdb/udump/erpdb1_ora_447360.trc:
ORA-00600: internal error  code, arguments: [17285], [0x110467578], [4294967295], [0x7000003EB46A690], [],  [], [], []
ORA-00604: error occurred at recursive SQL level 1
ORA-01013:  user requested cancel of current operation
Thu Jan 28 10:29:50 2010
Trace  dumping is performing id=[cdmp_20100128102950]
Thu Jan 28 10:30:03 2010
Errors in file  /u01/admin/erpdb/udump/erpdb1_ora_447360.trc:
ORA-00600: internal [...]]]></description>
			<content:encoded><![CDATA[<p>昨天上午数据库alert日志突然出现600错误：</p>
<blockquote><p>Thu Jan 28 10:29:48 2010<br />
Errors in file  /u01/admin/erpdb/udump/erpdb1_ora_447360.trc:<br />
ORA-00600: internal error  code, arguments: [17285], [0x110467578], [4294967295], [0x7000003EB46A690], [],  [], [], []<br />
ORA-00604: error occurred at recursive SQL level 1<br />
ORA-01013:  user requested cancel of current operation<br />
Thu Jan 28 10:29:50 2010<br />
Trace  dumping is performing id=[cdmp_20100128102950]</p>
<p>Thu Jan 28 10:30:03 2010<br />
Errors in file  /u01/admin/erpdb/udump/erpdb1_ora_447360.trc:<br />
ORA-00600: internal error  code, arguments: [17285], [0x110467578], [4294967295], [0x7000003EB46A690], [],  [], [], []<br />
Thu Jan 28 10:30:04 2010<br />
Errors in file  /u01/admin/erpdb/udump/erpdb1_ora_447360.trc:<br />
ORA-07445: exception  encountered: core dump [] [] [] [] [] []<br />
ORA-00600: internal error code,  arguments: [17285], [0x110467578], [4294967295], [0x7000003EB46A690], [], [],  [], []</p></blockquote>
<p>这里也明确提示了是执行SQL导致的问题，而用户取消了这个操作。通过查看trace文件也确实发现了干坏事的人：</p>
<blockquote><p>O/S info: user: sxw, term: ITB_SXW_XP, ospid: 5392:4416, machine: XC\ITB_SXW_XP<br />
program: plsqldev.exe<br />
application name: PL/SQL Developer, hash value=1190136663<br />
action name: Test Window - Script for procedu, hash value=3367543201</p></blockquote>
<p>经过确认确实是有开发人员执行一个大存储过程，长时间没出来结果后强制取消了操作。通过AWR报告也印证了这一点：</p>
<p><img class="aligncenter size-full wp-image-609" title="awr20100128" src="http://www.banping.com/wp-content/uploads/2010/01/awr.JPG" alt="awr20100128" width="859" height="221" /></p>
<p>可见这个SQL花费了13分钟，而执行次数确是0次。</p>
<p>虽然没引起实例崩溃，但在生产环境调试程序仍然要小心，数据库是脆弱的，我们必须对其心存敬畏。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/01/29/ora600_17285/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>收集IBM小型机的snap信息</title>
		<link>http://www.banping.com/2010/01/20/collect_ibm_snap/</link>
		<comments>http://www.banping.com/2010/01/20/collect_ibm_snap/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 02:48:47 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[主机及存储]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=604</guid>
		<description><![CDATA[用root用户登录，首先清除原来的snap信息：
p5a1@/#snap -r
The following directories and files will be deleted:
-----------------------------------------------------------
/tmp/ibmsupt/general (directory)
/tmp/ibmsupt/other (directory)
/tmp/ibmsupt/testcase (directory)
/tmp/ibmsupt/ssa (directory)
/tmp/ibmsupt/pcixscsi (directory)
/tmp/ibmsupt/snap.pax.Z (file)
Do you want me to remove these directories (y/n)? y
Removing... done.
如果以前未做过snap，会提示：
nothing to clean up
清理完成后可以开始收集：
p5a1@/#snap -gbLc
/var/adm/ras/trcfile: No such file or directory
Checking space requirement for general information.... done.
.********Checking and initializing directory structure
Creating /tmp/ibmsupt/svCollect directory tree... done.
Creating /tmp/ibmsupt/client_collect directory tree... done.
Creating /tmp/ibmsupt/lvm directory tree... [...]]]></description>
			<content:encoded><![CDATA[<p>用root用户登录，首先清除原来的snap信息：</p>
<blockquote><p>p5a1@/#snap -r</p>
<p>The following directories and files will be deleted:<br />
-----------------------------------------------------------<br />
/tmp/ibmsupt/general (directory)<br />
/tmp/ibmsupt/other (directory)<br />
/tmp/ibmsupt/testcase (directory)<br />
/tmp/ibmsupt/ssa (directory)<br />
/tmp/ibmsupt/pcixscsi (directory)<br />
/tmp/ibmsupt/snap.pax.Z (file)</p>
<p>Do you want me to remove these directories (y/n)? y<br />
Removing... done.</p></blockquote>
<p>如果以前未做过snap，会提示：</p>
<blockquote><p>nothing to clean up</p></blockquote>
<p>清理完成后可以开始收集：</p>
<blockquote><p>p5a1@/#snap -gbLc<br />
/var/adm/ras/trcfile: No such file or directory<br />
Checking space requirement for general information.... done.<br />
.********Checking and initializing directory structure<br />
Creating /tmp/ibmsupt/svCollect directory tree... done.<br />
Creating /tmp/ibmsupt/client_collect directory tree... done.<br />
Creating /tmp/ibmsupt/lvm directory tree... done.<br />
Creating /tmp/ibmsupt/ssa directory tree... done.<br />
Creating /tmp/ibmsupt/general directory tree... done.<br />
Creating /tmp/ibmsupt/general/diagnostics directory tree... done.<br />
Creating /tmp/ibmsupt/pcixscsi directory tree... done.<br />
Creating /tmp/ibmsupt/testcase directory tree... done.<br />
Creating /tmp/ibmsupt/other directory tree... done.<br />
********Finished setting up directory /tmp/ibmsupt</p>
<p>Checking Space requirement for svCollect<br />
The script svCollect is not executable in /usr/lib/ras/snapscripts<br />
Checking Space requirement for client_collect<br />
Checking space requirement for ssa information.......... done.<br />
Checking space requirement for logical volume manager information......<br />
Checking space requirement for Enhanced CLVM information..../tmp/ch.log.* not found<br />
done.<br />
Checking for enough free space in filesystem... done.</p>
<p>/var/adm/ras/trcfile: No such file or directory<br />
Gathering general system information............ done.<br />
Gathering platform/scanout information.done.<br />
Gathering svCollect data<br />
The script svCollect is not executable in /usr/lib/ras/snapscripts<br />
Gathering client_collect data<br />
Gathering pcixscsi system information........... done.<br />
Gathering ssa system information.......... done.<br />
Gathering logical volume manager information..........<br />
Gathering Enhanced CLVM information..../tmp/ch.log.* not found<br />
done.</p>
<p>Creating compressed pax file...<br />
Starting pax/compress process... Please wait... done.</p>
<p>-rw-------   1 0        0           1259857 Jan 20 09:24 snap.pax.Z</p></blockquote>
<p>收集完成后，通过ftp就可以拿下这个文件了：</p>
<blockquote><p>Microsoft Windows XP [版本 5.1.2600]<br />
(C) 版权所有 1985-2001 Microsoft Corp.</p>
<p>C:\Documents and Settings\banping&gt;ftp 172.16.0.62<br />
Connected to 172.16.0.62.<br />
220 p5a1 FTP server (Version 4.2 Thu Jul 12 13:39:06 CDT 2007) ready.<br />
User (172.16.0.62:(none)): root<br />
331 Password required for root.<br />
Password:<br />
230-Last unsuccessful login: Sat Jan 16 09:43:39 BEIST 2010 on /dev/pts/0 from i<br />
user.banping.com<br />
230-Last login: Tue Jan 19 09:10:37 BEIST 2010 on ftp from user.banping.com<br />
230 User root logged in.<br />
ftp&gt; bin<br />
200 Type set to I.<br />
ftp&gt; get /tmp/ibmsupt/snap.pax.Z<br />
200 PORT command successful.<br />
150 Opening data connection for /tmp/ibmsupt/snap.pax.Z (1259857 bytes).<br />
226 Transfer complete.<br />
ftp: 收到 1259857 字节，用时 0.09Seconds 13402.73Kbytes/sec.</p></blockquote>
<p>去user用户的document目录下就能拿到这个文件了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/01/20/collect_ibm_snap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新年遭遇data guard故障之案例处理</title>
		<link>http://www.banping.com/2010/01/19/temporary_table_data_guard/</link>
		<comments>http://www.banping.com/2010/01/19/temporary_table_data_guard/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 08:50:37 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=599</guid>
		<description><![CDATA[新年上班第一天就忙于处理一起data guard故障，最近太忙了，今天抽空整理一下。
话说那时是2010年第一个工作日，早上来发现备份库小型机一个目录占满了：
p55a@/home/oracle&#62; df -g
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/fslv01       53.50      0.00  100%     1167    68% /stb_arch
查看可用的存储空间：
p55a@/home/oracle&#62; lsvg
rootvg
backvg
p55a@/home/oracle&#62; lsvg backvg
VOLUME GROUP:       backvg                   VG IDENTIFIER:  000221f30000d600000001141bb7ac12
VG STATE:           active                   PP SIZE:        256 megabyte(s)
VG PERMISSION:      read/write               TOTAL PPs:      546 (139776 megabytes)
MAX LVs:            256                      FREE PPs:       0 (0 megabytes)
LVs:                4                        USED PPs:       546 (139776 megabytes)
OPEN LVs:           3                        QUORUM:         [...]]]></description>
			<content:encoded><![CDATA[<p>新年上班第一天就忙于处理一起data guard故障，最近太忙了，今天抽空整理一下。</p>
<p>话说那时是2010年第一个工作日，早上来发现备份库小型机一个目录占满了：</p>
<blockquote><p>p55a@/home/oracle&gt; df -g</p>
<p>Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on</p>
<p>/dev/fslv01       53.50      0.00  100%     1167    68% /stb_arch</p></blockquote>
<p>查看可用的存储空间：</p>
<blockquote><p>p55a@/home/oracle&gt; lsvg<br />
rootvg<br />
backvg</p>
<p>p55a@/home/oracle&gt; lsvg backvg<br />
VOLUME GROUP:       backvg                   VG IDENTIFIER:  000221f30000d600000001141bb7ac12<br />
VG STATE:           active                   PP SIZE:        256 megabyte(s)<br />
VG PERMISSION:      read/write               TOTAL PPs:      546 (139776 megabytes)<br />
MAX LVs:            256                      FREE PPs:       0 (0 megabytes)<br />
LVs:                4                        USED PPs:       546 (139776 megabytes)<br />
OPEN LVs:           3                        QUORUM:         2<br />
TOTAL PVs:          1                        VG DESCRIPTORS: 2<br />
STALE PVs:          0                        STALE PPs:      0<br />
ACTIVE PVs:         1                        AUTO ON:        yes<br />
MAX PPs per VG:     32512<br />
MAX PPs per PV:     1016                     MAX PVs:        32<br />
LTG size (Dynamic): 256 kilobyte(s)          AUTO SYNC:      no<br />
HOT SPARE:          no                       BB POLICY:      relocatable</p></blockquote>
<p>已经没有足够的空间可以分配，而这个/stb_arch是存放主库传过来的归档日志，很显然备库在apply这些归档时出现了阻塞，导致主库过来的归档文件不断积压，最终占满了空间。</p>
<p>先去主库暂停到备库的日志同步：</p>
<blockquote><p>SQL&gt; show parameter log_archive_dest</p>
<p>NAME                                 TYPE        VALUE<br />
------------------------------------ ----------- ------------------------------<br />
log_archive_dest                     string<br />
log_archive_dest_1                   string      LOCATION=/ora_arch VALID_FOR=(<br />
ALL_LOGFILES,ALL_ROLES) DB_UNI<br />
QUE_NAME=erpdb<br />
log_archive_dest_10                  string<br />
log_archive_dest_2                   string      SERVICE=bkdb VALID_FOR=(ONLIN<br />
E_LOGFILES,PRIMARY_ROLE) DB_UN<br />
IQUE_NAME=bkdb</p>
<p>SQL&gt; alter system set log_archive_dest_state_2=defer;</p>
<p>System altered.</p></blockquote>
<p>在备库查看DBA_LOGSTDBY_EVENTS视图：</p>
<blockquote><p>SELECT EVENT_TIME,EVENT,XIDUSN, XIDSLT, XIDSQN FROM DBA_LOGSTDBY_EVENTS order by 1 desc;</p></blockquote>
<p>发现有建立临时表的操作引起了阻塞：</p>
<blockquote><p>create global temporary table sntempStoreOut090407 on commit preserve rows as<br />
select<br />
g.islcode,idx,g.bcode as bcode1,g.bcode<br />
,g.scode,g.hcode,g.receivecode,g.ihcode,g.ecode<br />
,g.gcode,g.gattr1,g.gattr2,g.gattr3,g.gattr4,<br />
,g.qtx,g.qtp,g.qtpunit,g.qtycount,g.qtyunit,g.qty,g.iodate as iodate,g.ratifydate as ratifydate,g.stockfrom,g.piecewt,g.slstatus<br />
,g.rmb2,upric0 as upric0<br />
,g.rmb0 as rmb0<br />
,g.gtcode1 as gtcode1<br />
,g.slcode<br />
,g.ecode2<br />
,g.busimode1<br />
,busimode2<br />
,bcode as vpreapre<br />
,g.ccode as ccode<br />
,g.gcode as gcode0<br />
,g.sbcode<br />
,g.upislcode<br />
,g.slcodex,g.etrdcode,g.busimode3,g.inoutmode<br />
from<br />
storeslistg g where 1 &lt;&gt; 1</p></blockquote>
<p>先停止standby，跳过这个事务，kill使用原来的临时表的session，手动执行以上SQL，然后开启standby：</p>
<blockquote><p>SQL&gt; alter database stop logical standby apply;</p>
<p>Database altered.</p>
<p>SQL&gt; exec dbms_logstdby.skip_transaction(9,27,994864);</p>
<p>PL/SQL procedure successfully completed.</p>
<p>SQL&gt; alter database start logical standby apply;</p></blockquote>
<p>这样这个引起阻塞的事务就能过去了，但是由于空间占满了，应用仍然有问题，这时可以手动转移走一些比较靠后的不会马上应用的归档，然后有足够的空间后再还原回来，要注意的就是要保证这些文件的属主是Oracle用户。</p>
<blockquote><p># cd /tmp/log_2010<br />
# ls -l<br />
total 1025568<br />
-rw-r-----   1 root     system      1547264 Jan 04 08:52 1_118088_640266118.dbf<br />
-rw-r-----   1 root     system       110080 Jan 04 08:52 1_118089_640266118.dbf<br />
-rw-r-----   1 root     system        52224 Jan 04 08:52 1_118090_640266118.dbf<br />
-rw-r-----   1 root     system        52736 Jan 04 08:52 1_118091_640266118.dbf<br />
-rw-r-----   1 root     system        65024 Jan 04 08:52 1_118092_640266118.dbf<br />
-rw-r-----   1 root     system        56832 Jan 04 08:52 1_118093_640266118.dbf<br />
-rw-r-----   1 root     system      1138688 Jan 04 08:52 1_118094_640266118.dbf<br />
-rw-r-----   1 root     system        52736 Jan 04 08:52 1_118095_640266118.dbf<br />
-rw-r-----   1 root     system        59904 Jan 04 08:52 1_118096_640266118.dbf<br />
-rw-r-----   1 root     system        57344 Jan 04 08:52 1_118097_640266118.dbf<br />
-rw-r-----   1 root     system    520338944 Jan 04 08:52 2_125502_640266118.dbf<br />
-rw-r-----   1 root     system      1545216 Jan 04 08:52 2_125518_640266118.dbf<br />
# chown oracle.oinstall *<br />
# ls -l<br />
total 1025568<br />
-rw-r-----   1 oracle   oinstall    1547264 Jan 04 08:52 1_118088_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall     110080 Jan 04 08:52 1_118089_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      52224 Jan 04 08:52 1_118090_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      52736 Jan 04 08:52 1_118091_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      65024 Jan 04 08:52 1_118092_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      56832 Jan 04 08:52 1_118093_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall    1138688 Jan 04 08:52 1_118094_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      52736 Jan 04 08:52 1_118095_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      59904 Jan 04 08:52 1_118096_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall      57344 Jan 04 08:52 1_118097_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall  520338944 Jan 04 08:52 2_125502_640266118.dbf<br />
-rw-r-----   1 oracle   oinstall    1545216 Jan 04 08:52 2_125518_640266118.dbf<br />
# pwd<br />
/tmp/log_2010<br />
# cp * /stb_arch</p></blockquote>
<p>之后在备库的同步继续进行，然后又经历了2个临时表的手动干预后，终于腾出了足够的空间，这时可以打开主库的同步：</p>
<blockquote><p>SQL&gt; alter system set log_archive_dest_state_2=enable;</p>
<p>System altered.</p></blockquote>
<p>后来又发现备库出现了停滞，而并没有引起阻塞的事务，仔细查看DBA_LOGSTDBY_LOG视图发现有些归档丢失，没有传到备库，去主库找归档时发现已经删除了，这时只能从RMAN中恢复这些文件。根据缺失的sequence来找对应的RMAN备份片：</p>
<blockquote><p>ERPDB2@/orabak/arch/transmited&gt;rman target /</p>
<p>RMAN&gt; list backup of archivelog from sequence 125504 until sequence 125554 thread 2;</p>
<p>List of Backup Sets<br />
===================</p>
<p>BS Key  Size       Device Type Elapsed Time Completion Time<br />
------- ---------- ----------- ------------ ---------------<br />
16862   1.14G      DISK        00:04:57     04-JAN-10<br />
BP Key: 19677   Status: AVAILABLE  Compressed: YES  Tag: TAG20100104T130015<br />
Piece Name: /orabak/arch/ERPDB_arch_20100104_707403929_16929_1</p>
<p>List of Archived Logs in backup set 16862<br />
Thrd Seq     Low SCN    Low Time  Next SCN   Next Time<br />
---- ------- ---------- --------- ---------- ---------<br />
2    125504  11523639376 04-JAN-10 11523954045 04-JAN-10<br />
. . . . . .<br />
2    125509  11525286806 04-JAN-10 11525631638 04-JAN-10</p>
<p>BS Key  Size       Device Type Elapsed Time Completion Time<br />
------- ---------- ----------- ------------ ---------------<br />
16864   453.25M    DISK        00:01:57     04-JAN-10<br />
BP Key: 19679   Status: AVAILABLE  Compressed: YES  Tag: TAG20100104T130015<br />
Piece Name: /orabak/arch/ERPDB_arch_20100104_707404542_16931_1</p>
<p>List of Archived Logs in backup set 16864<br />
Thrd Seq     Low SCN    Low Time  Next SCN   Next Time<br />
---- ------- ---------- --------- ---------- ---------<br />
2    125510  11525631638 04-JAN-10 11525981043 04-JAN-10<br />
. . . . . .<br />
2    125522  11526443719 04-JAN-10 11526475093 04-JAN-10</p>
<p>BS Key  Size       Device Type Elapsed Time Completion Time<br />
------- ---------- ----------- ------------ ---------------<br />
16867   401.53M    DISK        00:01:42     04-JAN-10<br />
BP Key: 19682   Status: AVAILABLE  Compressed: YES  Tag: TAG20100104T213015<br />
Piece Name: /orabak/arch/ERPDB_arch_20100104_707434218_16935_1</p>
<p>List of Archived Logs in backup set 16867<br />
Thrd Seq     Low SCN    Low Time  Next SCN   Next Time<br />
---- ------- ---------- --------- ---------- ---------<br />
2    125523  11526475093 04-JAN-10 11526613894 04-JAN-10<br />
. . . . . .<br />
2    125554  11529391158 04-JAN-10 11529453386 04-JAN-10</p>
<p>RMAN&gt; exit</p></blockquote>
<p>从这里的Piece Name可以看出缺少3个备份片文件，找到这3个文件，放到RMAN备份的目的地/orabak/arch/目录下。写到这里我发现《Oracle DBA手记》书稿里一个类似的操作被我写成了放到默认的归档日志路径下，可能是晚上赶稿神志不清吧，道歉先。</p>
<p>然后恢复出来归档日志到指定的目录：</p>
<blockquote><p>RMAN&gt; run {<br />
2&gt; set archivelog destination to '/orabak/testarch';<br />
3&gt; restore archivelog from sequence 125504 until sequence 125554 thread 2;<br />
4&gt; }</p></blockquote>
<p>在恢复的过程中会自动把这些归档同时传到备库，无需手动再传。</p>
<p>备库端归档日志全了，就能顺利的同步了。至此这个问题得到解决。这个案例和我在<a href="http://www.banping.com/2009/12/25/oracle_dba_handbook/">《Oracle DBA手记》</a>里记录的一个案例类似，可互相参看印证。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2010/01/19/temporary_table_data_guard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
