<?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>SpookZanG</title>
	<atom:link href="http://www.spookzang.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.spookzang.net</link>
	<description>关注网络安全,数据库调优,IT圈的个人博客</description>
	<lastBuildDate>Mon, 21 May 2012 15:01:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Oracle SCN简单介绍</title>
		<link>http://www.spookzang.net/archives/1621.html</link>
		<comments>http://www.spookzang.net/archives/1621.html#comments</comments>
		<pubDate>Mon, 21 May 2012 15:01:29 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[BUG]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[SCN]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1621</guid>
		<description><![CDATA[本文介绍了什么是Oracle 的 SCN；给出了SCN剩余量的查询脚本、SCN的几种形式：系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN；SCN的一个BUG；SCN剩余量查询以及最大合理SCN。 &#160; 一、什么是SCN &#160; SCN是当Oracle数据库更新后，由DBMS自动维护去累积递增的一个数字。在Oracle中，有四种SCN，分别为：系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN。 1、系统检查点scn 当一个检查点动作完成后，Oracle就把系统检查点的SCN存储到控制文件中。 [crayon-4fbcdb529a50b/] &#160; 2、数据文件检查点scn 当一个检查点动作完成后，Oracle就把每个数据文件的scn单独存放在控制文件中。 [crayon-4fbcdb529a593/] &#160; 3、启动scn Oracle把这个检查点的scn存储在每个数据文件的文件头中，这个值称为启动scn，因为它用于在数据库实例启动时，检查是否需要执行数据库恢复。 [crayon-4fbcdb529a631/] &#160; 4、终止scn 每个数据文件的终止scn都存储在控制文件中。 [crayon-4fbcdb529a6b9/] &#160; &#160; 二、SCN Bug &#160; 在2012年，Oracle依照惯例，发布了一系列的补丁来修复错误，其中就包含了这么一个补丁——BUG 13489660，这个BUG修正了SCN在某些时候，将会被无缘由的大量更新，导致SCN成倍增长，最后使得SCN耗尽，使得数据库没有办法正常的工作，最后只能通过重装数据库来解决。 但是这种情况发生的几率很低，因为在Oracle内部当中，他有一个控制SCN的机制，使得SCN每秒钟最多增长16348。 &#160; 1、SCN最大值是多少 Oracle使用6 Bytes记录SCN，也就是48位，其最大值是：281,474,976,710,656 [crayon-4fbcdb529a743/] 因为Oracle在内部控制每秒增减的SCN不超过 16348个，按照这样计算，这个数值在正常状况下可以使用大约545年 [crayon-4fbcdb529a7d0/] &#160; 2、合理的SCN Oracle数据库当前最大的SCN被称为&#8221;最大合理SCN&#8221;，可以使用SQL语句来计算： [crayon-4fbcdb529a856/] &#160; 3、SCN的剩余量 可以通过脚本来检查当前实例SCN的剩余情况，脚本点击下面链接下载： SCN剩余量查询脚本 [crayon-4fbcdb529a8d7/] 这个脚本执行完毕之后，就能看到。 [crayon-4fbcdb529a966/] &#160;]]></description>
			<content:encoded><![CDATA[<p>本文介绍了什么是<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span> 的 <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/scn" title="SCN">SCN</a></span>；给出了<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/scn" title="SCN">SCN</a></span>剩余量的查询<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%84%9A%E6%9C%AC" title="脚本">脚本</a></span>、SCN的几种形式：系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN；SCN的一个BUG；SCN剩余量查询以及最大合理SCN。</p>
<p><span id="more-1621"></span></p>
<p>&nbsp;</p>
<h1>一、什么是SCN</h1>
<p>&nbsp;</p>
<p>SCN是当<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>更新后，由DBMS自动维护去累积递增的一个数字。在<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span>中，有四种SCN，分别为：系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN。</p>
<h2>1、系统检查点<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/scn" title="scn">scn</a></span></h2>
<p>当一个检查点动作完成后，Oracle就把系统检查点的SCN存储到控制文件中。</p><pre class="crayon-plain-tag"><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>&amp;gt; select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            115711</pre><p>&nbsp;</p>
<h2>2、数据文件检查点<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/scn" title="scn">scn</a></span></h2>
<p>当一个检查点动作完成后，Oracle就把每个数据文件的scn单独存放在控制文件中。</p><pre class="crayon-plain-tag"><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>&amp;gt; select name,checkpoint_change# from v$datafile;

NAME                                                                     CHECKPOINT_CHANGE#  
-------------------------------------------------------------------      ----------------------------------------
/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk5/system01.dbf                          115711
/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk4/undotbs01.dbf                         115711
/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk2/sysaux01.dbf                          115711
/u01/app/oracle/oradata/prod/disk4/example.dbf                           143660
/u01/app/oracle/oradata/prod/disk5/indx.dbf                              143711
/u01/app/oracle/oradata/prod/disk5/users.dbf                             143763
/u01/app/oracle/oradata/prod/disk5/oltp.dbf                              143838</pre><p>&nbsp;</p>
<h2>3、启动scn</h2>
<p>Oracle把这个检查点的scn存储在每个数据文件的文件头中，这个值称为启动scn，因为它用于在<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>启动时，检查是否需要执行<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>恢复。</p><pre class="crayon-plain-tag">select name,checkpoint_change# from v$datafile_header;

NAME                                                                     CHECKPOINT_CHANGE#  
-------------------------------------------------------------------      ----------------------------------------
/u01/app/oracle/oradata/prod/disk5/system01.dbf                          115711
/u01/app/oracle/oradata/prod/disk4/undotbs01.dbf                         115711
/u01/app/oracle/oradata/prod/disk2/sysaux01.dbf                          115711
/u01/app/oracle/oradata/prod/disk4/example.dbf                           143660
/u01/app/oracle/oradata/prod/disk5/indx.dbf                              143711
/u01/app/oracle/oradata/prod/disk5/users.dbf                             143763
/u01/app/oracle/oradata/prod/disk5/oltp.dbf                              143838</pre><p>&nbsp;</p>
<h2>4、终止scn</h2>
<p>每个数据文件的终止scn都存储在控制文件中。</p><pre class="crayon-plain-tag">select name,last_change# from v$datafile;</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h1>二、SCN Bug</h1>
<p>&nbsp;</p>
<p>在2012年，Oracle依照惯例，发布了一系列的<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%A1%A5%E4%B8%81" title="补丁">补丁</a></span>来修复错误，其中就包含了这么一个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%A1%A5%E4%B8%81" title="补丁">补丁</a></span>——BUG 13489660，这个BUG修正了SCN在某些时候，将会被无缘由的大量更新，导致SCN成倍增长，最后使得SCN耗尽，使得数据库没有办法正常的工作，最后只能通过重装数据库来解决。</p>
<p>但是这种情况发生的几率很低，因为在Oracle内部当中，他有一个控制SCN的机制，使得SCN每秒钟最多增长16348。</p>
<p>&nbsp;</p>
<h2>1、SCN最大值是多少</h2>
<p>Oracle使用6 Bytes记录SCN，也就是48位，其最大值是：281,474,976,710,656</p><pre class="crayon-plain-tag">SQL&amp;gt; col scn for 999,999,999,999,999,999
SQL&amp;gt; select power(2,48) scn from dual;

                     SCN
------------------------
     281,474,976,710,656

SQL&amp;gt;</pre><p>因为Oracle在内部控制每秒增减的SCN不超过 16348个，按照这样计算，这个数值在正常状况下可以使用大约545年</p><pre class="crayon-plain-tag">SQL&amp;gt; select power(2,48) / 16 / 1024 / 3600 / 24 / 365 from dual;

POWER(2,48)/16/1024/3600/24/365
-------------------------------
                     544.770078</pre><p>&nbsp;</p>
<h2>2、合理的SCN</h2>
<p>Oracle数据库当前最大的SCN被称为&#8221;最大合理SCN&#8221;，可以使用SQL语句来计算：</p><pre class="crayon-plain-tag">SQL&amp;gt; select 
  2  (
    (
  3    4          (
  5              (
  6                  (   
  7                      (
  8                          to_char(sysdate,'YYYY')-1988
  9                      )*12+
 10                  to_char(sysdate,'mm')-1
 11                  )*31+to_char(sysdate,'dd')-1
 12              )*24+to_char(sysdate,'hh24')
 13          )*60+to_char(sysdate,'mi')
 14      )*60+to_char(sysdate,'ss')
 15  ) * to_number('ffff','XXXXXXXX')/4 scn
 16  from dual;

                     SCN
------------------------
      12,843,262,715,445</pre><p>&nbsp;</p>
<h2>3、SCN的剩余量</h2>
<p>可以通过<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%84%9A%E6%9C%AC" title="脚本">脚本</a></span>来检查当前<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>SCN的剩余情况，<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%84%9A%E6%9C%AC" title="脚本">脚本</a></span>点击下面链接下载：</p>
<p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/SCN.zip">SCN剩余量查询脚本</a></p><pre class="crayon-plain-tag">Rem
Rem $Header: rdbms/admin/scnhealthcheck.sql st_server_tbhukya_bug-13498243/8 2012/01/17 03:37:18 tbhukya Exp $
Rem
Rem scnhealthcheck.sql
Rem
Rem Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 
Rem
Rem    NAME
Rem      scnhealthcheck.sql - Scn Health check
Rem
Rem    DESCRIPTION
Rem      Checks scn health of a DB
Rem
Rem    NOTES
Rem      .
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    tbhukya     01/11/12 - Created
Rem
Rem

define LOWTHRESHOLD=10
define MIDTHRESHOLD=62
define VERBOSE=FALSE

set veri off;
set feedback off;

set serverout on
DECLARE
 verbose boolean:=&amp;amp;&amp;amp;VERBOSE;
BEGIN
 For C in (
  select 
   version, 
   date_time,
   dbms_flashback.get_system_change_number current_scn,
   indicator
  from
  (
   select
   version,
   to_char(SYSDATE,'YYYY/MM/DD HH24:MI:SS') DATE_TIME,
   ((((
    ((to_number(to_char(sysdate,'YYYY'))-1988)*12*31*24*60*60) +
    ((to_number(to_char(sysdate,'MM'))-1)*31*24*60*60) +
    (((to_number(to_char(sysdate,'DD'))-1))*24*60*60) +
    (to_number(to_char(sysdate,'HH24'))*60*60) +
    (to_number(to_char(sysdate,'MI'))*60) +
    (to_number(to_char(sysdate,'SS')))
    ) * (16*1024)) - dbms_flashback.get_system_change_number)
   / (16*1024*60*60*24)
   ) indicator
   from v$instance
  ) 
 ) LOOP
  dbms_output.put_line( '-----------------------------------------------------'
                        || '---------' );
  dbms_output.put_line( 'ScnHealthCheck' );
  dbms_output.put_line( '-----------------------------------------------------'
                        || '---------' );
  dbms_output.put_line( 'Current Date: '||C.date_time );
  dbms_output.put_line( 'Current SCN:  '||C.current_scn );
  if (verbose) then
    dbms_output.put_line( 'SCN Headroom: '||round(C.indicator,2) );
  end if;
  dbms_output.put_line( 'Version:      '||C.version );
  dbms_output.put_line( '-----------------------------------------------------'
                        || '---------' );

  IF C.version &amp;gt; '10.2.0.5.0' and 
     C.version NOT LIKE '9.2%' THEN
    IF C.indicator&amp;gt;&amp;amp;MIDTHRESHOLD THEN 
      dbms_output.put_line('Result: A - SCN Headroom is good');
      dbms_output.put_line('Apply the latest recommended <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%A1%A5%E4%B8%81" title="patch">patch</a></span>es');
      dbms_output.put_line('based on your maintenance schedule');
      IF (C.version &amp;lt; '11.2.0.2') THEN
        dbms_output.put_line('AND set _external_scn_rejection_threshold_hours='
                             || '24 after apply.');
      END IF;
    ELSIF C.indicator&amp;lt;=&amp;amp;LOWTHRESHOLD THEN
      dbms_output.put_line('Result: C - SCN Headroom is low');
      dbms_output.put_line('If you have not already done so apply' );
      dbms_output.put_line('the latest recommended <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E8%A1%A5%E4%B8%81" title="patch">patch</a></span>es right now' );
      IF (C.version &amp;lt; '11.2.0.2') THEN
        dbms_output.put_line('set _external_scn_rejection_threshold_hours=24 '
                             || 'after apply');
      END IF;
      dbms_output.put_line('AND contact Oracle support immediately.' );
    ELSE
      dbms_output.put_line('Result: B - SCN Headroom is low');
      dbms_output.put_line('If you have not already done so apply' );
      dbms_output.put_line('the latest recommended patches right now');
      IF (C.version &amp;lt; '11.2.0.2') THEN
        dbms_output.put_line('AND set _external_scn_rejection_threshold_hours='
                             ||'24 after apply.');
      END IF;
    END IF;
  ELSE
    IF C.indicator&amp;lt;=&amp;amp;MIDTHRESHOLD THEN
      dbms_output.put_line('Result: C - SCN Headroom is low');
      dbms_output.put_line('If you have not already done so apply' );
      dbms_output.put_line('the latest recommended patches right now' );
      IF (C.version &amp;gt;= '10.1.0.5.0' and 
          C.version &amp;lt;= '10.2.0.5.0' and 
          C.version NOT LIKE '9.2%') THEN
        dbms_output.put_line(', set _external_scn_rejection_threshold_hours=24'
                             || ' after apply');
      END IF;
      dbms_output.put_line('AND contact Oracle support immediately.' );
    ELSE
      dbms_output.put_line('Result: A - SCN Headroom is good');
      dbms_output.put_line('Apply the latest recommended patches');
      dbms_output.put_line('based on your maintenance schedule ');
      IF (C.version &amp;gt;= '10.1.0.5.0' and
          C.version &amp;lt;= '10.2.0.5.0' and
          C.version NOT LIKE '9.2%') THEN
       dbms_output.put_line('AND set _external_scn_rejection_threshold_hours=24'
                             || ' after apply.');
      END IF;
    END IF;
  END IF;
  dbms_output.put_line(
    'For further information review MOS document id 1393363.1');
  dbms_output.put_line( '-----------------------------------------------------'
                        || '---------' );
 END LOOP;
end;
/</pre><p>这个脚本执行完毕之后，就能看到。</p><pre class="crayon-plain-tag">SQL&amp;gt; @?/rdbms/scn.sql
--------------------------------------------------------------
ScnHealthCheck
--------------------------------------------------------------
Current Date: 2012/05/21 22:43:48
Current SCN:  145828
Version:      10.2.0.1.0
--------------------------------------------------------------
Result: A - SCN Headroom is good
Apply the latest recommended patches
based on your maintenance schedule
AND set _external_scn_rejection_threshold_hours=24 after apply.
For further information review MOS document id 1393363.1
--------------------------------------------------------------
SQL&amp;gt;</pre><p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1621.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle redolog的简介</title>
		<link>http://www.spookzang.net/archives/1616.html</link>
		<comments>http://www.spookzang.net/archives/1616.html#comments</comments>
		<pubDate>Sat, 19 May 2012 11:56:24 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[redolog]]></category>
		<category><![CDATA[在线重做日志文件]]></category>
		<category><![CDATA[归档日志文件]]></category>
		<category><![CDATA[重做日志文件]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1616</guid>
		<description><![CDATA[在Oracle数据库中，有一种日志文件叫做重做日志文件，他就是大家俗称的：redolog。在redolog中又分为两种：在线重做日志与归档日志。 &#160; 在线重做日志 在线重做日志(online redo log )主要用于：Oracle数据库所在服务器突然掉电、突然重启或者执行shutdown abort等命令使得在服务器重新启动之后，Oracle数据库没有办法正常的启动实例。此时，在线重做日志就派上了用场，Oracle会使用在线重做日志，把数据库恢复到服务器掉电前的那一个时刻，从而使得数据库能正常的启动起来。 在Oracle数据库中，默认情况下，至少会有两个重做日志组，而且每个组里面至少包含了一个重做日志文件。日志组不会自动增加，在一个写满之后，会自动去写下一个。在下一个被写满之后会又从第一个开始写起。 &#160; 归档重做日志 归档日志(archive log)主要用于硬件级别的错误：磁盘的坏道导致无法读写、写入的失败、磁盘受损导致数据库数据丢失。这就要使用归档日志文件，通过归档日志文件，把数据库恢复到归档日志所在的时间点上然后再通过在线重做日志文件把数据库恢复到当前的时间点上。 对于归档日志文件，可以理解为在线重做日志文件的备份。即当一个重做日志文件被填满了之后，归档日志文件就会把其备份保留一份。（因为上面说了，在线重做日志文件会自动的覆盖）所以，归档日志文件就是旧的在线日志文件的备份。 &#160;]]></description>
			<content:encoded><![CDATA[<p>在<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>中，有一种日志文件叫做<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/redolog" title="重做日志文件">重做日志文件</a></span>，他就是大家俗称的：<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/redolog" title="redolog">redolog</a></span>。在<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/redolog" title="redolog">redolog</a></span>中又分为两种：<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E5%9C%A8%E7%BA%BF%E9%87%8D%E5%81%9A%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6" title="在线重做日志">在线重做日志</a></span>与<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E5%BD%92%E6%A1%A3%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6" title="归档日志">归档日志</a></span>。</p>
<p><span id="more-1616"></span></p>
<p>&nbsp;</p>
<h1><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E5%9C%A8%E7%BA%BF%E9%87%8D%E5%81%9A%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6" title="在线重做日志">在线重做日志</a></span></h1>
<p><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E5%9C%A8%E7%BA%BF%E9%87%8D%E5%81%9A%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6" title="在线重做日志">在线重做日志</a></span>(online redo log )主要用于：<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>所在服务器突然掉电、突然重启或者执行shutdown abort等命令使得在服务器重新启动之后，Oracle数据库没有办法正常的启动<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>。此时，在线重做日志就派上了用场，Oracle会使用在线重做日志，把数据库恢复到服务器掉电前的那一个时刻，从而使得数据库能正常的启动起来。</p>
<p>在Oracle数据库中，默认情况下，至少会有两个重做日志组，而且每个组里面至少包含了一个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/redolog" title="重做日志文件">重做日志文件</a></span>。日志组不会自动增加，在一个写满之后，会自动去写下一个。在下一个被写满之后会又从第一个开始写起。</p>
<p>&nbsp;</p>
<h1>归档重做日志</h1>
<p><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E5%BD%92%E6%A1%A3%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6" title="归档日志">归档日志</a></span>(archive log)主要用于硬件级别的错误：磁盘的坏道导致无法读写、写入的失败、磁盘受损导致数据库数据丢失。这就要使用归档日志文件，通过归档日志文件，把数据库恢复到归档日志所在的时间点上然后再通过在线<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/redolog" title="重做日志文件">重做日志文件</a></span>把数据库恢复到当前的时间点上。</p>
<p>对于归档日志文件，可以理解为在线重做日志文件的备份。即当一个重做日志文件被填满了之后，归档日志文件就会把其备份保留一份。（因为上面说了，在线重做日志文件会自动的覆盖）所以，归档日志文件就是旧的在线日志文件的备份。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1616.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Data Guard在命令行下安装和配置</title>
		<link>http://www.spookzang.net/archives/1602.html</link>
		<comments>http://www.spookzang.net/archives/1602.html#comments</comments>
		<pubDate>Sat, 19 May 2012 07:45:33 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DataGuard]]></category>
		<category><![CDATA[GridControl]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[灾备]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1602</guid>
		<description><![CDATA[Data Guard配置方法有多种，一种是用Grid Control的图形化界面配置，另一种为在命令行下配置。 本文讲述的就是在命令行下配置的方法。顺便附上pdf版本的安装手册。 &#160; 一、环境概况 &#160; Oracle数据库 Data Guard 实验环境概况： 在一台机器上建立2个Oracle数据库，prodbak为prod的备份。 &#160; 二、安装流程 &#160; 1、开启Forced Logging [crayon-4fbcdb52a3203/] &#160; &#160; 2、配置Standby Redo Log &#160; 配置Oracle数据库的Standby Redo Log，设置Standby Redo Log的数量与数据库中的 log 数量相同。 [crayon-4fbcdb52a328a/] &#160; &#160; 3、关闭实例为prod数据库 [crayon-4fbcdb52a32fe/] &#160; 4、编辑prod实例的pfile文件 编辑initprod.ora文件，在最后面加入Data Guard的配置。 [crayon-4fbcdb52a3389/] 关于Data Guard配置的解释： [crayon-4fbcdb52a3411/] &#160; 5、拷贝prod实例的配置文件给prodbak实例使用 [crayon-4fbcdb52a349c/] &#160; 6、拷贝全部数据文件到prodbak的文件夹 [crayon-4fbcdb52a3528/] &#160; 7、启动prod实例到mount状态 如果配置文件写的没问题，那么Oracle数据库就能正常启动到mount状态。 [crayon-4fbcdb52a35bb/] &#160; 8、建立prodbak实例的controlfile文件 因为prodbak是prod数据库的备份，所以通过prod数据库直接生成即可。 [...]]]></description>
			<content:encoded><![CDATA[<p><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/DataGuard" title="Data Guard">Data Guard</a></span>配置方法有多种，一种是用<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/GridControl" title="Grid Control">Grid Control</a></span>的图形化界面配置，另一种为在命令行下配置。</p>
<p>本文讲述的就是在命令行下配置的方法。顺便附上pdf版本的安装手册。</p>
<p><span id="more-1602"></span></p>
<p>&nbsp;</p>
<h1>一、环境概况</h1>
<p>&nbsp;</p>
<p><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span> <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/DataGuard" title="Data Guard">Data Guard</a></span> 实验环境概况：</p>
<div id="attachment_1603" class="wp-caption alignnone" style="width: 735px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-0.png"><img class="size-full wp-image-1603" title="DG CMD Install 0" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-0.png" alt="" width="725" height="61" /></a><p class="wp-caption-text">DG CMD Install</p></div>
<p>在一台机器上建立2个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>，prodbak为prod的备份。</p>
<p>&nbsp;</p>
<h1>二、安装流程</h1>
<p>&nbsp;</p>
<h2>1、开启Forced Logging</h2>
<p></p><pre class="crayon-plain-tag">ALTER DATABASE FORCE LOGGING;</pre><p>&nbsp;</p>
<div id="attachment_1604" class="wp-caption alignnone" style="width: 624px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-1.png"><img class="size-full wp-image-1604" title="DG CMD Install 1" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-1.png" alt="" width="614" height="179" /></a><p class="wp-caption-text">Open Forced Logging</p></div>
<p>&nbsp;</p>
<h2>2、配置<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Standby Redo Log">Standby Redo Log</a></span></h2>
<p>&nbsp;</p>
<p>配置Oracle数据库的<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Standby Redo Log">Standby Redo Log</a></span>，设置<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Standby Redo Log">Standby Redo Log</a></span>的数量与数据库中的 log 数量相同。</p><pre class="crayon-plain-tag">ALTER DATABASE ADD STANDBY LOGFILE THREAD 6
('/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk2/log1.rdo') SIZE 20M;</pre><p>&nbsp;</p>
<div id="attachment_1605" class="wp-caption alignnone" style="width: 818px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-3.png"><img class="size-full wp-image-1605" title="DG CMD Install 3" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-3.png" alt="" width="808" height="75" /></a><p class="wp-caption-text">Create Standby Redo Log</p></div>
<p>&nbsp;</p>
<h2>3、关闭<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>为prod数据库</h2>
<p></p><pre class="crayon-plain-tag">shutdown immediate;</pre><p>&nbsp;</p>
<h2>4、编辑prod<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>的pfile文件</h2>
<p>编辑initprod.ora文件，在最后面加入<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/DataGuard" title="Data Guard">Data Guard</a></span>的配置。</p><pre class="crayon-plain-tag">DB_UNIQUE_NAME=prod
LOG_ARCHIVE_CONFIG='DG_CONFIG=(prod,prodbak)'
LOG_ARCHIVE_DEST_1= 'LOCATION=/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/arch/prod/   VALID_FOR=(ALL_LOGFILES,ALL_ROLES)  DB_UNIQUE_NAME=prod'
LOG_ARCHIVE_DEST_2= 'SERVICE=prodbak LGWR ASYNC  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)   DB_UNIQUE_NAME=prodbak'
LOG_ARCHIVE_MAX_PROCESSES=5

FAL_SERVER=prodbak
FAL_CLIENT=prod
DB_FILE_NAME_CONVERT='/u02/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prodbak/','/u01/app/oracle/oradata/prod/'
LOG_FILE_NAME_CONVERT= '/u02/app/oracle/oradata/prodbak/','/u01/app/oracle/oradata/prod/'
STANDBY_FILE_MANAGEMENT=AUTO</pre><p>关于Data Guard配置的解释：</p><pre class="crayon-plain-tag">DB_UNIQUE_NAME=prod                    //当前数据库的SID
LOG_ARCHIVE_CONFIG='DG_CONFIG=(prod,prodbak)'               //主库的SID,备库的SID
LOG_ARCHIVE_DEST_1= 'LOCATION=/u01/app/oracle/arch/prod/   VALID_FOR=(ALL_LOGFILES,ALL_ROLES)  DB_UNIQUE_NAME=prod'                   //设置prod数据库的archivelog的路径
LOG_ARCHIVE_DEST_2= 'SERVICE=prodbak LGWR ASYNC  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)   DB_UNIQUE_NAME=prodbak'             //设置prodbak数据库archivelog的链接方法（与TNS中相对应）
LOG_ARCHIVE_MAX_PROCESSES=5

FAL_SERVER=prodbak              //备库的SID
FAL_CLIENT=prod                    //主库的SID
DB_FILE_NAME_CONVERT='/u02/app/oracle/oradata/prodbak/','/u01/app/oracle/oradata/prod/'                          //备库的数据文件路径,主库数据文件路径
LOG_FILE_NAME_CONVERT= '/u02/app/oracle/oradata/prodbak/','/u01/app/oracle/oradata/prod/'                      //备库的日志文件路径,主库日志文件路径
STANDBY_FILE_MANAGEMENT=AUTO                      //standby 自动管理</pre><p>&nbsp;</p>
<h2>5、拷贝prod实例的配置文件给prodbak实例使用</h2>
<p></p><pre class="crayon-plain-tag">cp initprod.ora initprodbak.ora</pre><p>&nbsp;</p>
<h2>6、拷贝全部数据文件到prodbak的文件夹</h2>
<p></p><pre class="crayon-plain-tag">cp -rf /u01/app/oracle/oradata/prod/* /u02/app/oracle/oradata/prodbak/</pre><p>&nbsp;</p>
<h2>7、启动prod实例到mount状态</h2>
<p>如果配置文件写的没问题，那么Oracle数据库就能正常启动到mount状态。</p><pre class="crayon-plain-tag">startup mount</pre><p>&nbsp;</p>
<h2>8、建立prodbak实例的controlfile文件</h2>
<p>因为prodbak是prod数据库的备份，所以通过prod数据库直接生成即可。</p><pre class="crayon-plain-tag">ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u02/app/oracle/oradata/prodbak/control.ctl';</pre><p></p>
<h2></h2>
<h2>9、编辑prodbak实例的pfile文件</h2>
<p>更改prodbak的control_files这个参数，把其文件路径改为“8”当中所配置的路径。</p>
<p>然后更改Data Guard参数配置。</p>
<p>因为是从prod那里拷贝过来的，所以还带着prod数据库的Data Guard配置参数，我们需要先删除Data Guard配置参数，然后在写入prodbak数据库的Data Guard配置参数。</p><pre class="crayon-plain-tag">DB_UNIQUE_NAME=prodbak
LOG_ARCHIVE_CONFIG='DG_CONFIG=(prod,prodbak)'
LOG_ARCHIVE_DEST_1= 'LOCATION=/u02/app/oracle/arch/prodbak/   VALID_FOR=(ALL_LOGFILES,ALL_ROLES)  DB_UNIQUE_NAME=prodbak'
LOG_ARCHIVE_DEST_2= 'SERVICE=prod LGWR ASYNC  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)   DB_UNIQUE_NAME=prod'
LOG_ARCHIVE_MAX_PROCESSES=5

FAL_SERVER=prod
FAL_CLIENT=prodbak
DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/prod/','/u02/app/oracle/oradata/prodbak/'
LOG_FILE_NAME_CONVERT= '/u01/app/oracle/oradata/prod/','/u02/app/oracle/oradata/prodbak/'
STANDBY_FILE_MANAGEMENT=AUTO</pre><p>其配置与prod的Data Guard基本相同，只是在<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E7%81%BE%E5%A4%87" title="主备库">主备库</a></span>方面，需要改写一下。</p>
<p>&nbsp;</p>
<h2>10、为prodbak实例配置监听</h2>
<p>编辑Oracle数据库的TNS文件，并加入关于prodbak的配置。</p><pre class="crayon-plain-tag">PRODBAK =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = prod)(PORT = 1522))
    (ADDRESS = (PROTOCOL = tcp)(HOST = prod)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = prodbak)
    )
  )

LISTENER_PRODBAK =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = tcp)(HOST = prod)(PORT = 1522))
    (ADDRESS = (PROTOCOL = tcp)(HOST = prod)(PORT = 1521))
  )</pre><p>说明下，因为我做了两种监听，一种是默认端口的即1521，一种是非默认端口的1522，所以这里有2个端口。</p>
<p>配置完毕之后，重启监听。</p><pre class="crayon-plain-tag">lsnrctl stop

lsnrctl start</pre><p></p>
<h2></h2>
<h2>11、配置orapwd文件</h2>
<p>为Oralce数据库中的prodbak实例建立orapwd文件，此文件如果不建立就无法远程连接数据库。且此文件应该放在$ORACLE_HOME/dbs目录下。</p><pre class="crayon-plain-tag">orapwd file=orapwprodbak password=oracle1 entries=3 force=y</pre><p>&nbsp;</p>
<h2>12、启动prodbak实例到mount状态</h2>
<p></p><pre class="crayon-plain-tag">startup mount</pre><p>如果配置文件写的没有问题，则能正常启动到mount状态。</p>
<p>&nbsp;</p>
<h2>13、<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span>监听是否正常</h2>
<p></p><pre class="crayon-plain-tag">sqlplus username/password@SID (as sysdba)  //格式，如果是sys用户必须加上 as sysdba，非sys用户不用加入

sqlplus sys/oracle1@prodbak as sysdba

sqlplus sys/oraclde1@prod as sysdba</pre><p>&nbsp;</p>
<div id="attachment_1606" class="wp-caption alignnone" style="width: 583px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-8.png"><img class="size-full wp-image-1606" title="DG CMD Install 8" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-8.png" alt="" width="573" height="270" /></a><p class="wp-caption-text">DG CMD Install</p></div>
<p>&nbsp;</p>
<h1>三、启动Data Guard</h1>
<p>&nbsp;</p>
<h2>1、启动名为prod实力的数据库</h2>
<p></p><pre class="crayon-plain-tag">alter database open</pre><p>&nbsp;</p>
<h2>2、启动Data Guard</h2>
<p>在实例名为prodbak上执行下面的命令：</p><pre class="crayon-plain-tag">ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;</pre><p>&nbsp;</p>
<div id="attachment_1607" class="wp-caption alignnone" style="width: 640px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-4.png"><img class="size-full wp-image-1607" title="DG CMD Install 4" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-4.png" alt="" width="630" height="73" /></a><p class="wp-caption-text">ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION</p></div>
<p>&nbsp;</p>
<h2>3、进行日志切换</h2>
<p>在实例名为prod数据库上，进行切换日志。</p><pre class="crayon-plain-tag">ALTER SYSTEM SWITCH LOGFILE;</pre><p>&nbsp;</p>
<div id="attachment_1608" class="wp-caption alignnone" style="width: 596px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-5.png"><img class="size-full wp-image-1608" title="DG CMD Install 5" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-5.png" alt="" width="586" height="120" /></a><p class="wp-caption-text">ALTER SYSTEM SWITCH LOGFILE</p></div>
<p>&nbsp;</p>
<h1>四、<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span></h1>
<p>&nbsp;</p>
<p>在prod实例上建立一个表空间，看看prodbak实例是否能同步过去。</p><pre class="crayon-plain-tag">create tablespace new99
datafile '/u01/app/oracle/oradata/prod/disk5/new99.dbf'
size 10m;</pre><p>然后进行日志切换。</p><pre class="crayon-plain-tag">ALTER SYSTEM SWITCH LOGFILE;</pre><p>&nbsp;</p>
<div id="attachment_1609" class="wp-caption alignnone" style="width: 510px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-6.png"><img class="size-full wp-image-1609" title="DG CMD Install 6" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-6.png" alt="" width="500" height="156" /></a><p class="wp-caption-text">Create tablespace and ALTER SYSTEM SWITCH LOGFILE</p></div>
<p>&nbsp;</p>
<p>然后查看prodbak数据库,是否能正常同步。</p>
<div id="attachment_1611" class="wp-caption alignnone" style="width: 451px"><a href="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-7.png"><img class="size-full wp-image-1611" title="DG CMD Install 7" src="http://www.spookzang.net/wp-content/uploads/2012/05/DG-CMD-Install-7.png" alt="" width="441" height="198" /></a><p class="wp-caption-text">Select datafile</p></div>
<p>我们可以看到，实力prodbak上面成功自动建立了new99的tablespace。</p>
<p>&nbsp;</p>
<p>至此，Data Guard的配置完全完成。</p>
<p>&nbsp;</p>
<p>Data Guard 在命令行下配置、安装手册下载：<a href="http://www.spookzang.net/wp-content/uploads/2012/05/Data-Guard-CMD-Install.pdf">Data Guard CMD Install Download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1602.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DataGuard在命令行配置下主备库无法同步解决方法一则</title>
		<link>http://www.spookzang.net/archives/1596.html</link>
		<comments>http://www.spookzang.net/archives/1596.html#comments</comments>
		<pubDate>Fri, 18 May 2012 09:01:03 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[DataGuard]]></category>
		<category><![CDATA[GridControl]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[灾备]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1596</guid>
		<description><![CDATA[最近在实施Oracle DataGuard的时候，发现主备库在无法成功同步。（即主库建立的表空间无法同步到备库上面去）。但是在使用Oracle Grid Control图形化配置的时候，却能正常同步。故此认为是自己在命令行下配置Oracle DataGuard存在瑕疵。 经过测试，发现是我在Oracle 数据库建立Standby Redo Log的时候，建立的过少了。Standby Redo Log 的个数应该与数据库的log个数一样。我数据通过v$log查看有6个，而Standby Redo Log我只建立了3个。当我在配置相同的情况下，建立为6个Standby Redo Log就能正常同步了。]]></description>
			<content:encoded><![CDATA[<p>最近在实施<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span> <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/DataGuard" title="DataGuard">DataGuard</a></span>的时候，发现<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E7%81%BE%E5%A4%87" title="主备库">主备库</a></span>在无法成功同步。（即主库建立的表空间无法同步到备库上面去）。但是在使用<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span> <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/GridControl" title="Grid Control">Grid Control</a></span>图形化配置的时候，却能正常同步。故此认为是自己在命令行下配置Oracle <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/DataGuard" title="DataGuard">DataGuard</a></span>存在瑕疵。</p>
<p>经过<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span>，发现是我在Oracle <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>建立<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Standby Redo Log">Standby Redo Log</a></span>的时候，建立的过少了。<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Standby Redo Log">Standby Redo Log</a></span> 的个数应该与<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>的log个数一样。我数据通过v$log查看有6个，而Standby Redo Log我只建立了3个。当我在配置相同的情况下，建立为6个Standby Redo Log就能正常同步了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1596.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle数据库限制任何DDL操作</title>
		<link>http://www.spookzang.net/archives/1588.html</link>
		<comments>http://www.spookzang.net/archives/1588.html#comments</comments>
		<pubDate>Thu, 17 May 2012 13:36:56 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DDL]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[TRIGGER]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[触发器]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1588</guid>
		<description><![CDATA[有时候，有些数据库为了安全起见，是需要完全禁止DDL操作的，也可以只限制create、alter、drop、truncate之一的操作，或者可以把DDL的操作记录到另一张表里。 我们可以使用CREATE OR REPLACE TRIGGER（建立一个触发器）这条命令，来限制DDL操作。 此操作很危险，请在测试之后在进行实践！ 以下是通过触发器完全限制DDL操作的一个例子，如果只限制一条的话，可以举一反三进行自己撰写： [crayon-4fbcdb52a8b3f/] 然后我们尝试执行DDL语句。 [crayon-4fbcdb52a8bc0/] &#160; 此时，DDL的语句已经被禁止了。]]></description>
			<content:encoded><![CDATA[<p>有时候，有些<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>为了安全起见，是需要完全禁止<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="DDL">DDL</a></span>操作的，也可以只限制create、alter、drop、truncate之一的操作，或者可以把<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="DDL">DDL</a></span>的操作记录到另一张表里。</p>
<p>我们可以使用CREATE OR REPLACE TRIGGER（建立一个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="触发器">触发器</a></span>）这条命令，来限制<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="DDL">DDL</a></span>操作。</p>
<p><strong>此操作很危险，请在<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span>之后在进行实践！</strong></p>
<p>以下是通过<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="触发器">触发器</a></span>完全限制DDL操作的一个例子，如果只限制一条的话，可以举一反三进行自己撰写：</p>
<p><span id="more-1588"></span></p><pre class="crayon-plain-tag">CREATE OR REPLACE TRIGGER fga_ddl
BEFORE create or drop or alter or truncate  ON DATABASE
declare
  l_errmsg varchar2(100):= 'Deny ddl';
BEGIN
   if ora_sysevent = 'CREATE' then
     raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  elsif ora_sysevent = 'DROP' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  elsif ora_sysevent = 'ALTER' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  elsif ora_sysevent = 'TRUNCATE' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  end if;

exception
  when no_data_found then
    null;
end;
/</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/deny-ddl-1.png"><img class="alignnone size-full wp-image-1589" title="deny ddl 1" src="http://www.spookzang.net/wp-content/uploads/2012/05/deny-ddl-1.png" alt="" width="754" height="420" /></a></p>
<p>然后我们尝试执行DDL语句。</p><pre class="crayon-plain-tag"><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>&amp;gt; create table tm1
  2  as
  3  select * from v$instance;
select * from v$instance
              *
ERROR at line 3:
ORA-00604: error occurred at recursive <span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span> level 1
ORA-20001: SYS.TM1 Deny ddl
ORA-06512: at line 5</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/deny-ddl-2.png"><img class="alignnone size-full wp-image-1590" title="deny ddl 2" src="http://www.spookzang.net/wp-content/uploads/2012/05/deny-ddl-2.png" alt="" width="436" height="159" /></a></p>
<p>&nbsp;</p>
<p>此时，DDL的语句已经被禁止了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1588.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac的VMware无法获取SCSI的ID的解决办法</title>
		<link>http://www.spookzang.net/archives/1584.html</link>
		<comments>http://www.spookzang.net/archives/1584.html#comments</comments>
		<pubDate>Wed, 16 May 2012 14:49:17 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[工作相关]]></category>
		<category><![CDATA[虚拟机]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[fdisk]]></category>
		<category><![CDATA[Fusio]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[Vmware]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1584</guid>
		<description><![CDATA[前几天，公司同时买了一个MAC的笔记本，并且安装了VMware Fusio这个MAC中所使用的VM虚拟机。为了工作和学习的需要，他通过VMware Fusio搭建了一个Cent OS的操作系统，并打算在其上面安装Oracle的数据库。 但是，他在练习通过fdisk来查看和划分磁盘的时候，发现无法获取ID号。 [crayon-4fbcdb52a9cf6/] 但是据他描述，他在他女朋友的MAC上，通过VirtualBox来安装，就不会出现这个问题。所以怀疑是虚拟机的问题。后来跟几个朋友交流了下，发现了解决办法。 1、先进入虚拟机，并把虚拟机关闭。 2、然后编辑虚拟机所在目录中的xxxxx.vmx文件（即以vmx结尾的文件，应该只有一个） 3、在vmx文件的最后添加如下内容： [crayon-4fbcdb52a9d80/] 4、 重新启动虚拟机，即可正常。 [crayon-4fbcdb52a9e09/] 5、注意 如果对虚拟机进行如：添加、删除磁盘；添加、删除网卡等硬件级别的操作，此选项又会变为FALSE，需要重新编辑vmx文件来使得其能生效！！但是重启虚拟机，关闭虚拟机等系统级别的操作，就不会导致此类情况的发生。]]></description>
			<content:encoded><![CDATA[<p>前几天，公司同时买了一个MAC的笔记本，并且安装了<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/vmware" title="VMware">VMware</a></span> Fusio这个MAC中所使用的VM虚拟机。为了工作和学习的需要，他通过<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/vmware" title="VMware">VMware</a></span> Fusio搭建了一个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/linux" title="Cent OS">Cent OS</a></span>的操作系统，并打算在其上面安装<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span>的<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>。</p>
<p>但是，他在练习通过fdisk来查看和划分磁盘的时候，发现无法获取ID号。</p>
<p><span id="more-1584"></span></p><pre class="crayon-plain-tag"># fdisk -l /dev/sda

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sda doesn't contain a valid partition table
# /sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sda</pre><p>但是据他描述，他在他女朋友的MAC上，通过<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/category/%E8%99%9A%E6%8B%9F%E6%9C%BA" title="VirtualBox">VirtualBox</a></span>来安装，就不会出现这个问题。所以怀疑是虚拟机的问题。后来跟几个朋友交流了下，发现了解决办法。</p>
<p>1、先进入虚拟机，并把虚拟机关闭。</p>
<p>2、然后编辑虚拟机所在目录中的xxxxx.vmx文件（即以vmx结尾的文件，应该只有一个）</p>
<p>3、在vmx文件的最后添加如下内容：</p><pre class="crayon-plain-tag">disk.EnableUUID = &quot;TRUE&quot;</pre><p>4、 重新启动虚拟机，即可正常。</p><pre class="crayon-plain-tag">[root@prod ~]# fdisk -l /dev/sda

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        1305    10377990   8e  Linux LVM</pre><p><strong>5、注意</strong></p>
<p>如果对虚拟机进行如：添加、删除磁盘；添加、删除网卡等硬件级别的操作，此选项又会变为FALSE，<strong>需要重新编辑</strong>vmx文件来使得其能生效！！但是重启虚拟机，关闭虚拟机等系统级别的操作，就不会导致此类情况的发生。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1584.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>迅雷VIP体验邀请链接</title>
		<link>http://www.spookzang.net/archives/1582.html</link>
		<comments>http://www.spookzang.net/archives/1582.html#comments</comments>
		<pubDate>Wed, 16 May 2012 05:41:03 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[胡说胡写]]></category>
		<category><![CDATA[迅雷]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1582</guid>
		<description><![CDATA[迅雷VIP体验邀请链接： http://act.vip.xunlei.com/tastevip/?code=160bc3d7766dcc6b4590568f03cfa6f8 http://act.vip.xunlei.com/tastevip/?code=80d202a43ab7907036abe487aea22f9f http://act.vip.xunlei.com/tastevip/?code=7412065010a6b5ceefc466154a5eb914 http://act.vip.xunlei.com/tastevip/?code=b0dde96d3672105f12322793c2d5d685 &#160; 截止5.17日，还有1个可用。]]></description>
			<content:encoded><![CDATA[<p>迅雷VIP体验邀请链接：</p>
<p><del>http://act.vip.xunlei.com/tastevip/?code=160bc3d7766dcc6b4590568f03cfa6f8</del></p>
<p>http://act.vip.xunlei.com/tastevip/?code=80d202a43ab7907036abe487aea22f9f</p>
<p><del>http://act.vip.xunlei.com/tastevip/?code=7412065010a6b5ceefc466154a5eb914</del></p>
<p><del>http://act.vip.xunlei.com/tastevip/?code=b0dde96d3672105f12322793c2d5d685</del></p>
<p>&nbsp;</p>
<p>截止5.17日，还有1个可用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1582.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>测试两台服务器之间的网络带宽</title>
		<link>http://www.spookzang.net/archives/1574.html</link>
		<comments>http://www.spookzang.net/archives/1574.html#comments</comments>
		<pubDate>Tue, 15 May 2012 14:09:10 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[*UNIX相关]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[带宽]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1574</guid>
		<description><![CDATA[一、为什么选择了iperf &#160; 之前做了一个项目，说要测试两台服务器之间的带宽，本想通过拷贝来进行测试，后来客户觉得得出的数据没有说服性，于是改拿工具来进行测试。我们这回用的工具名字叫iperf。 iperf它是一款网络性能测试的工具，分为多个版本：Linux版、UNIX版、Windows版。相比之下，Windows版更新的比较慢，而UNIX和Linux版本更新起来更快，现在最新版本是2.05，而他安装简单、方便，而且测试的出的结果很靠谱。 &#160; 二、iperf的安装 &#160; iperf安装起来十分简单，只需要执行几条命令即可，因为下载的是源码，所以我们需要编译一下。 [crayon-4fbcdb52aabdc/] 安装完毕之后，我们应该就能直接使用iperf这个软件了。如果没法正常使用，请到其安装目录下尝试。 其安装路应该为&#8221;/usr/local/bin/&#8221;目录下。 &#160; 三、进行测试 &#160; 环境介绍： 两台服务器，IP地址分别为192.168.0.1和192.168.0.2 在192.168.0.1上执行如下命令： [crayon-4fbcdb52aac65/] 这条命令的意思是，在192.168.0.1的这台服务器上，开启服务模式。 然后在192.168.0.2这台机器上执行如下命令： [crayon-4fbcdb52aace8/] 以此类推，我们也可以测试出从192.168.0.1这台服务器到192.168.0.2这台服务器的网络带宽。 [crayon-4fbcdb52aad6a/] 由此，我们可以推断出，两台服务器之间为百兆带宽。 &#160;]]></description>
			<content:encoded><![CDATA[<h1>一、为什么选择了iperf</h1>
<p>&nbsp;</p>
<p>之前做了一个项目，说要<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span>两台服务器之间的带宽，本想通过拷贝来进行<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span>，后来客户觉得得出的数据没有说服性，于是改拿工具来进行测试。我们这回用的工具名字叫iperf。</p>
<p>iperf它是一款网络性能测试的工具，分为多个版本：Linux版、UNIX版、Windows版。相比之下，Windows版更新的比较慢，而UNIX和Linux版本更新起来更快，现在最新版本是2.05，而他安装简单、方便，而且测试的出的结果很靠谱。</p>
<p><span id="more-1574"></span></p>
<p>&nbsp;</p>
<h1>二、iperf的安装</h1>
<p>&nbsp;</p>
<p>iperf安装起来十分简单，只需要执行几条命令即可，因为下载的是源码，所以我们需要编译一下。</p><pre class="crayon-plain-tag">./configure
make
make install</pre><p>安装完毕之后，我们应该就能直接使用iperf这个软件了。如果没法正常使用，请到其安装目录下尝试。</p>
<p>其安装路应该为&#8221;/usr/local/bin/&#8221;目录下。</p>
<p>&nbsp;</p>
<h1>三、进行测试</h1>
<p>&nbsp;</p>
<p>环境介绍：</p>
<p>两台服务器，IP地址分别为192.168.0.1和192.168.0.2</p>
<p>在192.168.0.1上执行如下命令：</p><pre class="crayon-plain-tag"># iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------</pre><p>这条命令的意思是，在192.168.0.1的这台服务器上，开启服务模式。</p>
<p>然后在192.168.0.2这台机器上执行如下命令：</p><pre class="crayon-plain-tag"># iperf -c 192.168.0.1
------------------------------------------------------------
Client connecting to 192.168.0.1, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.2 port 16265 connected with 192.168.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   114 MBytes  94.8 Mbits/sec</pre><p>以此类推，我们也可以测试出从192.168.0.1这台服务器到192.168.0.2这台服务器的网络带宽。</p><pre class="crayon-plain-tag">[  4] local 192.168.0.1 port 5001 connected with 192.168.0.2 port 16265
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.1 sec   114 MBytes  95.2 Mbits/sec</pre><p>由此，我们可以推断出，两台服务器之间为百兆带宽。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1574.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>误删Oracle数据文件的恢复方法</title>
		<link>http://www.spookzang.net/archives/1563.html</link>
		<comments>http://www.spookzang.net/archives/1563.html#comments</comments>
		<pubDate>Mon, 14 May 2012 15:07:50 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[datafile]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[recovery]]></category>
		<category><![CDATA[rm]]></category>
		<category><![CDATA[回复]]></category>
		<category><![CDATA[恢复]]></category>
		<category><![CDATA[误删]]></category>
		<category><![CDATA[误操作]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1563</guid>
		<description><![CDATA[今天尝试了一下，在Linux下删除一个数据文件，然后进行回复。 环境：数据库在Open的状态，然后rm -rf users.dbf （删除users表空间），最后找回users.dbf文件。 在回复的时候，回复的方法跟数据库的版本关系不大（因为是物理文件），只是跟操作系统有一定的关系，如：Red hat Linux  , Solaris Linux 等等。 下面进行演示： 删除users表空间. 1、我们首先进入Sqlplus，然后执行SQL语句： [crayon-4fbcdb52abe82/] &#160;  2、此时，users表空间已经被删除了，我们已经无法在users表空间上建立表了。 尝试在users表空间上建立名字为abcd123的表，已经没法建立了。 [crayon-4fbcdb52abf01/] 3、确认dbwr进程PID 通过命令，我们可以看到当前数据库实例的dbwr的PID。因为我同一台主机上有两个实例，故有2个。 一个为prod，另一个为oms。 [crayon-4fbcdb52abf80/] 4、因为dbwr会打开所有数据文件的句柄。所以可以进入proc目录进行查找，格式为： cd /prod/PID/fd 此处，fd为文件描述符。 [crayon-4fbcdb52abfff/] &#160; 我们可以清楚的看到 /u01/app/oracle/oradata/prod/disk2/users01.dbf (deleted) 的字样，表示此文件已经被删掉了。 5、进行恢复 通过cp命令，把语句柄拷贝回原来的位置。 cp 24 /u01/app/oracle/oradata/prod/disk2/users01.dbf 此处的24为其给出的编号。 &#160; 6、进入recovery 执行以下SQL命令： [crayon-4fbcdb52ac07d/] 至此，回复完成！ &#160; 7、测试 我们重新尝试在users 表空间上建立一个table。 [crayon-4fbcdb52ac0fa/] 我们可以发现，建立成功了，说明回复成功，]]></description>
			<content:encoded><![CDATA[<p>今天尝试了一下，在Linux下删除一个数据文件，然后进行回复。</p>
<p>环境：<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>在Open的状态，然后rm -rf users.dbf （删除users表空间），最后找回users.dbf文件。</p>
<p>在回复的时候，回复的方法跟<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>的版本关系不大（因为是物理文件），只是跟操作系统有一定的关系，如：Red hat Linux  , Solaris Linux 等等。</p>
<p><span id="more-1563"></span></p>
<p>下面进行演示：</p>
<p>删除users表空间.</p>
<h3>1、我们首先进入Sqlplus，然后执行<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>语句：</h3>
<p></p><pre class="crayon-plain-tag">select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk4/system01.dbf
/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk2/undotbs01.dbf
/u01/app/<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="oracle">oracle</a></span>/oradata/prod/disk5/sysaux01.dbf
/u01/app/oracle/oradata/prod/disk5/bigtbs01.dbf
/u01/app/oracle/oradata/prod/disk5/indx01.dbf
/u01/app/oracle/oradata/prod/disk2/users01.dbf
/u01/app/oracle/oradata/prod/disk3/oltp01.dbf

7 rows selected.

<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>&amp;gt; !rm /u01/app/oracle/oradata/prod/disk2/users01.dbf</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-1.png"><img class="alignnone size-full wp-image-1564" title="recovery datafile 1" src="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-1.png" alt="" width="482" height="227" /></a></p>
<p>&nbsp;</p>
<h3> 2、此时，users表空间已经被删除了，我们已经无法在users表空间上建立表了。</h3>
<p>尝试在users表空间上建立名字为abcd123的表，已经没法建立了。</p><pre class="crayon-plain-tag">SQL&amp;gt; create table abcd123 tablespace users as select * from v$instance;
create table abcd123 tablespace users as select * from v$instance
                                                       *
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/disk2/users01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-2.png"><img class="alignnone size-full wp-image-1565" title="recovery datafile 2" src="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-2.png" alt="" width="628" height="164" /></a></p>
<h3>3、确认dbwr进程PID</h3>
<p>通过命令，我们可以看到当前<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>的dbwr的PID。因为我同一台主机上有两个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="实例">实例</a></span>，故有2个。</p>
<p>一个为prod，另一个为oms。</p><pre class="crayon-plain-tag">$ ps -ef|grep dbw0|grep -v grep
oracle   11872     1  0 21:46 ?        00:00:00 ora_dbw0_prod
oracle   11951     1  0 21:47 ?        00:00:01 ora_dbw0_oms</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-3.png"><img class="alignnone size-full wp-image-1566" title="recovery datafile 3" src="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-3.png" alt="" width="527" height="93" /></a></p>
<p>4、因为dbwr会打开所有数据文件的句柄。所以可以进入proc目录进行查找，格式为：</p>
<p>cd /prod/PID/fd</p>
<p>此处，fd为文件描述符。</p><pre class="crayon-plain-tag">[oracle@prod fd]$ cd /proc/11872/fd
[oracle@prod fd]$ ls -l
total 30
lr-x------  1 oracle dba 64 May 14 22:47 0 -&amp;gt; /dev/null
lr-x------  1 oracle dba 64 May 14 22:47 1 -&amp;gt; /dev/null
lrwx------  1 oracle dba 64 May 14 22:47 10 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/rdbms/audit/ora_11859.aud
lr-x------  1 oracle dba 64 May 14 22:47 11 -&amp;gt; /dev/zero
lr-x------  1 oracle dba 64 May 14 22:47 12 -&amp;gt; /dev/zero
lr-x------  1 oracle dba 64 May 14 22:47 13 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
lrwx------  1 oracle dba 64 May 14 22:47 14 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/dbs/hc_prod.dat
lrwx------  1 oracle dba 64 May 14 22:47 15 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/dbs/lkPROD
lrwx------  1 oracle dba 64 May 14 22:47 16 -&amp;gt; /u01/app/oracle/oradata/prod/disk1/control01.ctl
lrwx------  1 oracle dba 64 May 14 22:47 17 -&amp;gt; /u01/app/oracle/oradata/prod/disk2/control02.ctl
lrwx------  1 oracle dba 64 May 14 22:47 18 -&amp;gt; /u01/app/oracle/oradata/prod/disk3/control03.ctl
lrwx------  1 oracle dba 64 May 14 22:47 19 -&amp;gt; /u01/app/oracle/oradata/prod/disk4/system01.dbf
lr-x------  1 oracle dba 64 May 14 22:47 2 -&amp;gt; /dev/null
lrwx------  1 oracle dba 64 May 14 22:47 20 -&amp;gt; /u01/app/oracle/oradata/prod/disk2/undotbs01.dbf
lrwx------  1 oracle dba 64 May 14 22:47 21 -&amp;gt; /u01/app/oracle/oradata/prod/disk5/sysaux01.dbf
lrwx------  1 oracle dba 64 May 14 22:47 22 -&amp;gt; /u01/app/oracle/oradata/prod/disk5/bigtbs01.dbf
lrwx------  1 oracle dba 64 May 14 22:47 23 -&amp;gt; /u01/app/oracle/oradata/prod/disk5/indx01.dbf
lrwx------  1 oracle dba 64 May 14 22:47 24 -&amp;gt; /u01/app/oracle/oradata/prod/disk2/users01.dbf (deleted)
lrwx------  1 oracle dba 64 May 14 22:47 25 -&amp;gt; /u01/app/oracle/oradata/prod/disk3/oltp01.dbf
lrwx------  1 oracle dba 64 May 14 22:47 26 -&amp;gt; /u01/app/oracle/oradata/prod/disk1/temp01.dbf
lrwx------  1 oracle dba 64 May 14 22:47 27 -&amp;gt; /u01/app/oracle/oradata/prod/disk3/lmtemp201.dbf
lrwx------  1 oracle dba 64 May 14 22:47 28 -&amp;gt; /u01/app/oracle/oradata/prod/disk4/lmtemp201.dbf
lr-x------  1 oracle dba 64 May 14 22:47 29 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
lr-x------  1 oracle dba 64 May 14 22:47 3 -&amp;gt; /dev/null
lr-x------  1 oracle dba 64 May 14 22:47 4 -&amp;gt; /dev/null
l-wx------  1 oracle dba 64 May 14 22:47 5 -&amp;gt; /u01/app/oracle/admin/udump/prod_ora_11859.trc
l-wx------  1 oracle dba 64 May 14 22:47 6 -&amp;gt; /u01/app/oracle/admin/bdump/alert_prod.log
lrwx------  1 oracle dba 64 May 14 22:47 7 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/dbs/hc_prod.dat
l-wx------  1 oracle dba 64 May 14 22:47 8 -&amp;gt; /u01/app/oracle/admin/bdump/alert_prod.log
lrwx------  1 oracle dba 64 May 14 22:47 9 -&amp;gt; /u01/app/oracle/product/10.2.0/db_1/dbs/lkinstprod (deleted)
[oracle@prod fd]$</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-4.png"><img class="alignnone size-full wp-image-1567" title="recovery datafile 4" src="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-4.png" alt="" width="875" height="451" /></a></p>
<p>&nbsp;</p>
<p>我们可以清楚的看到 /u01/app/oracle/oradata/prod/disk2/users01.dbf (deleted) 的字样，表示此文件已经被删掉了。</p>
<h3>5、进行恢复</h3>
<p>通过cp命令，把语句柄拷贝回原来的位置。</p>
<p>cp 24 /u01/app/oracle/oradata/prod/disk2/users01.dbf</p>
<p>此处的24为其给出的编号。</p>
<p>&nbsp;</p>
<h3>6、进入recovery</h3>
<p>执行以下SQL命令：</p><pre class="crayon-plain-tag">SQL&amp;gt;  alter database datafile 6 offline;

Database altered.

SQL&amp;gt; recover datafile 6;
Media recovery complete.
SQL&amp;gt; alter database datafile 6 online;            

Database altered.

SQL&amp;gt;</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-5.png"><img class="alignnone size-full wp-image-1568" title="recovery datafile 5" src="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-5.png" alt="" width="388" height="156" /></a></p>
<p>至此，回复完成！</p>
<p>&nbsp;</p>
<h3>7、<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%B5%8B%E8%AF%95" title="测试">测试</a></span></h3>
<p>我们重新尝试在users 表空间上建立一个table。</p><pre class="crayon-plain-tag">SQL&amp;gt; create table abcd123 tablespace users as select * from v$instance;

Table created.

SQL&amp;gt; select * from abcd123;

INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION           STARTUP_T STATUS       PAR    THREAD# ARCHIVE LOG_SWITCH_WAIT
----------------- --------- ------------ --- ---------- ------- ---------------
LOGINS     SHU DATABASE_STATUS   INSTANCE_ROLE      ACTIVE_ST BLO
---------- --- ----------------- ------------------ --------- ---
              1 prod
prod
10.2.0.1.0        16-APR-12 OPEN         NO           1 STARTED
ALLOWED    NO  ACTIVE            PRIMARY_INSTANCE   NORMAL    NO

SQL&amp;gt;</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-6.png"><img class="alignnone size-full wp-image-1569" title="recovery datafile 6" src="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-6.png" alt="" width="690" height="277" /></a></p>
<p>我们可以发现，建立成功了，说明回复成功，</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1563.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle SYSTEM表空间简介</title>
		<link>http://www.spookzang.net/archives/1546.html</link>
		<comments>http://www.spookzang.net/archives/1546.html#comments</comments>
		<pubDate>Sun, 13 May 2012 12:37:39 +0000</pubDate>
		<dc:creator>spookzang</dc:creator>
				<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[SYSTEM]]></category>
		<category><![CDATA[tablespace]]></category>

		<guid isPermaLink="false">http://www.spookzang.net/?p=1546</guid>
		<description><![CDATA[一、什么是SYSTEM表空间 &#160; SYSTEM表空间是Oracle创建数据库时候自动创建的，每个Oracle数据库都会有SYSTEM表空间，而且SYSTEM表空间总是要保持在联机模式下，因为其包含了数据库运行所要求的基本信息，如：数据字典、联机求助机制、所有回退段、临时段和自举段、所有的用户数据库实体、其它ORACLE软件产品要求的表等等。 &#160; 二、怎样设置SYSTEM表空间才会使得数据更安全？ &#160; 在建立数据库的时候，SYSTEM表空间一般都写在磁盘最开始的位置，这就埋下了问题的隐患。如：误操作导致的格式化，ASM出现故障等等一系列的问题，他都会从磁盘最开始的地方写起，这样就会导致SYSTEM表空间没有办法进行数据恢复。 但是，如果在建立数据库的时候，把最开始的位置“让”出来，这样就会使得很多故障轻能而易举的解决，也让DBA在管理数据库、恢复数据库的时候能轻松一些。 &#160; 三、那SYSTEM表空间在磁盘的最开始都写了些什么呢？ &#160; 我们可遇通过SQL命令来查看下，在磁盘的最开始那部分，SYSTEM表空间到底都写了些什么。 [crayon-4fbcdb52b0382/]]]></description>
			<content:encoded><![CDATA[<h1>一、什么是SYSTEM表空间</h1>
<p>&nbsp;</p>
<p>SYSTEM表空间是<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span>创建<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>时候自动创建的，每个<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/oracle" title="Oracle">Oracle</a></span><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>都会有SYSTEM表空间，而且SYSTEM表空间总是要保持在联机模式下，因为其包含了<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库">数据库</a></span>运行所要求的基本信息，如：数据字典、联机求助机制、所有回退段、临时段和自举段、所有的用户数据库实体、其它ORACLE软件产品要求的表等等。</p>
<p><span id="more-1546"></span></p>
<p>&nbsp;</p>
<h1>二、怎样设置SYSTEM表空间才会使得数据更安全？</h1>
<p>&nbsp;</p>
<p>在建立数据库的时候，SYSTEM表空间一般都写在<strong>磁盘最开始的位置</strong>，这就埋下了问题的隐患。如：误操作导致的格式化，ASM出现故障等等一系列的问题，他都会从磁盘最开始的地方写起，这样就会导致SYSTEM表空间没有办法进行数据恢复。</p>
<p>但是，如果在建立数据库的时候，把最开始的位置“让”出来，这样就会使得很多故障轻能而易举的解决，也让DBA在管理数据库、恢复数据库的时候能轻松一些。</p>
<p>&nbsp;</p>
<h1>三、那SYSTEM表空间在磁盘的最开始都写了些什么呢？</h1>
<p>&nbsp;</p>
<p>我们可遇通过<span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>命令来查看下，在磁盘的最开始那部分，SYSTEM表空间到底都写了些什么。</p><pre class="crayon-plain-tag"><span class='wp_keywordlink'><a href="http://www.spookzang.net/archives/tag/sql" title="SQL">SQL</a></span>:
col owner for a10
set linesize 120
col segment_name for a30
select owner,segment_name,segment_type,block_id from
dba_extents where file_id=1 and block_id &amp;lt; 500 order by block_id;</pre><p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/SYSTEM-TABLESPACE1.png"><img class="alignnone size-full wp-image-1553" title="SYSTEM TABLESPACE1" src="http://www.spookzang.net/wp-content/uploads/2012/05/SYSTEM-TABLESPACE1.png" alt="" width="571" height="610" /></a></p>
<p><a href="http://www.spookzang.net/wp-content/uploads/2012/05/SYSTEM-TABLESPACE2.png"><img class="alignnone size-full wp-image-1554" title="SYSTEM TABLESPACE2" src="http://www.spookzang.net/wp-content/uploads/2012/05/SYSTEM-TABLESPACE2.png" alt="" width="577" height="449" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spookzang.net/archives/1546.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

