莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Oracle中的鎖定可以分為幾類:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。
          DML lock又可以分為row lock和table lock。row lock在select.. for update/insert/update/delete時隱式自動產生,而table lock除了隱式產生,也可以調用lock table in name來顯示鎖定。

          如果不希望別的session lock/insert/update/delete表中任意一行,只允許查詢,可以用lock table table_name in exclusive mode。(X)這個鎖定模式級別最高,并發度最小。

          如果允許別的session查詢或用select for update鎖定記錄,不允許insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

          如 果允許別的session查詢或select for update以及lock table table_name in share mode,只是不允許insert/update/delete,可以用lock table table_name in share mode。(share mode和share row exclusive mode的區別在于一個是非搶占式的而另一個是搶占式的。進入share row exclusive mode后其他session不能阻止你insert/update/delete,而進入share mode后其他session也同樣可以進入share mode,進而阻止你對表的修改。(S)

          還有兩種鎖定模式,row share(RS)和row exclusive(RX)。他們允許的并發操作更多,一般直接用DML語句自動獲得,而不用lock語句。

          詳細參考concepts文檔中的"Type Of Locks":http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937

          posted @ 2007-03-05 14:34 dennis 閱讀(959) | 評論 (0)編輯 收藏

          ??? 在websphere server上的jsp、servlet中調用EJB很簡單了:
          ??????????? Context?ctx?=?new?InitialContext();
          ????????????MessageSender?msgSender?
          =?null;
          ????????????MessageSenderHome?home?
          =?(MessageSenderHome)?javax.rmi.PortableRemoteObject
          ????????????????????.narrow(ctx.lookup(
          "MessageSender"),
          ????????????????????????????MessageSenderHome.
          class);

          ????????????msgSender?
          =?home.create();
          ????????????msgSender.sendMessage();
          ??? 如果要在服務器外部的普通java類的main方法中調用websphere上的EJB,需要注意幾個問題:
          1.需要將websphere安裝目錄下的lib中的jar包加入classpath
          2.拷貝websphere安裝目錄下\WebSphere\AppServer\properties\下面的implfactory.properties文件加入classpath
          3.需要將websphere部署完成后生成的jar包(包含自動生成的存根類等,不然會報不能載入存根的error)加入classpath,比如WebSphere\AppServer\installedApps\dennis\JMSTest.ear\JMSTest.jar包
          4.使用webphere自帶的ibm的JDK,也就是安裝目錄下WebSphere\AppServer\java即是,在eclipse中新建一個安裝的jre即可,替代策略是將此jdk下的jre的jar包加進classpath也行

          ??? 一個java類調用ejb的例子,調用SLSB:
          package?net.rubyeye.testjms;

          import?javax.naming.Context;
          import?javax.naming.InitialContext;

          import?net.rubyeye.testjms.interfaces.MessageSender;
          import?net.rubyeye.testjms.interfaces.MessageSenderHome;

          public?class?Test?{

          ????
          /**
          ?????*?
          @param?args
          ?????
          */
          ????
          public?static?void?main(String[]?args)?{
          ????????
          try?{
          ????????????
          //?Hashtable?h?=?new?Hashtable();
          ????????????
          //?h.put(Context.INITIAL_CONTEXT_FACTORY,
          ????????????
          //?"com.ibm.websphere.naming.WsnInitialContextFactory");
          ????????????
          //?h.put(Context.PROVIDER_URL,?"corbaloc::127.0.0.1:port");
          ????????????Context?ctx?=?new?InitialContext();
          ????????????MessageSender?msgSender?
          =?null;
          ????????????MessageSenderHome?home?
          =?(MessageSenderHome)?javax.rmi.PortableRemoteObject
          ????????????????????.narrow(ctx.lookup(
          "MessageSender"),
          ????????????????????????????MessageSenderHome.
          class);

          ????????????msgSender?
          =?home.create();
          ????????????msgSender.sendMessage();
          ????????}?
          catch?(Throwable?t)?{
          ????????????t.printStackTrace();
          ????????}
          ????}
          }
          在同一臺機器上使用上面的代碼即可調用,遠程調用去掉注釋,并替換相應的IP和port

          posted @ 2007-03-04 11:57 dennis 閱讀(1408) | 評論 (0)編輯 收藏

          ??? 我們是沒辦法使用javamail通過一般的代理服務器發送郵件的,比如下面的代碼是沒有效果的:
          ??????? Properties?props?=?System.getProperties();
          ??????? props.setProperty(
          "proxySet","true");
          ??????? props.setProperty(
          "ProxyHost","192.168.155.1");
          ??????? props.setProperty(
          "ProxyPort","1080");
          ??????? //或者這樣,也是沒用
          ??????? //Properties?props?=?System.getProperties();
          ??????? //props.setProperty("proxySet","true");
          ??????? //props.setProperty("http.proxyHost","192.168.155.1");
          ??????? //props.setProperty("http.proxyPort","808");

          ??????? props.put(
          "mail.smtp.auth",?"true");
          ? ? ? ? props.put(
          "mail.debug",?"true");
          ????????
          //?props.put("mail.store.protocol",?"pop3");
          ????????
          //?props.put("mail.transport.protocol",?"smtp");
          ????????final?String?username?= "username"
          ????????
          final?String?password?= "password"
          ????????Session?session?
          =?Session.getDefaultInstance(props,
          ????????????????
          new?Authenticator()?{
          ????????????????????
          protected?javax.mail.PasswordAuthentication?getPasswordAuthentication()?{
          ????????????????????????
          return?new?javax.mail.PasswordAuthentication(username,
          ????????????????????????????????password);
          ????????????????????}
          ????????????????});
          ????????MimeMessage?message?
          =?new?MimeMessage(session);
          ???????
          ?
          ???
          ??? 不過可以通過socks網關來訪問外網的email服務器,當然,前提是你安裝了一個socks服務器。完整的使用代理發送郵件代碼如下:

          ????
          package?net.rubyeye.testjms;

          import?java.util.Date;
          import?java.util.Properties;
          import?java.security.Security;
          import?javax.mail.Address;
          import?javax.mail.Authenticator;
          import?javax.mail.Session;
          import?javax.mail.Transport;
          import?javax.mail.internet.InternetAddress;
          import?javax.mail.internet.MimeMessage;

          public?class?MailTest?{

          ????
          /**
          ?????*?
          @param?args
          ?????
          */
          ????
          public?static?void?main(String[]?args)?throws?Exception?{
          ????????
          //?Security.addProvider(new?com.sun.net.ssl.internal.ssl.Provider());
          ????????
          //?final?String?SSL_FACTORY?=?"javax.net.ssl.SSLSocketFactory";
          ????????
          //設置代理服務器
          ????????Properties?props?=?System.getProperties();
          ????????props.setProperty(
          "proxySet",?"true");
          ????????props.setProperty(
          "socksProxyHost",?"192.168.155.1");
          ????????props.setProperty(
          "socksProxyPort",?"1081");
          ????????props.setProperty(
          "mail.smtp.host",?"smtp.126.com");
          ????????
          ????????
          //?props.setProperty("mail.smtp.socketFactory.class",?SSL_FACTORY);
          ????????
          //?props.setProperty("mail.smtp.socketFactory.fallback",?"false");
          ????????
          //?props.setProperty("mail.smtp.port",?"465");
          ????????
          //?props.setProperty("mail.smtp.socketFactory.port",?"465");
          ????????props.put("mail.smtp.auth",?"true");
          ????????props.put(
          "mail.debug",?"true");
          ????????
          //?props.put("mail.store.protocol",?"pop3");
          ????????
          //?props.put("mail.transport.protocol",?"smtp");
          ????????final?String?username?=?"username";
          ????????
          final?String?password?=?"password";
          ????????
          ????????
          //使用驗證
          ????????Session?session?=?Session.getDefaultInstance(props,
          ????????????????
          new?Authenticator()?{
          ????????????????????
          protected?javax.mail.PasswordAuthentication?getPasswordAuthentication()?{
          ????????????????????????
          return?new?javax.mail.PasswordAuthentication(username,
          ????????????????????????????????password);
          ????????????????????}
          ????????????????});
          ????????MimeMessage?message?
          =?new?MimeMessage(session);
          ????????Address?address?
          =?new?InternetAddress("killme6115@126.com");
          ????????Address?toAaddress?
          =?new?InternetAddress("killme6115@sina.com");
          ????????
          ????????message.setFrom(address);
          ????????message.setRecipient(MimeMessage.RecipientType.TO,?toAaddress);
          ????????message.setSubject(
          "測試");
          ????????message.setText(
          "test");
          ????????message.setSentDate(
          new?Date());
          ????????
          ????????Transport.send(message);
          ????????System.out.println(
          "郵件發送!");

          ????}

          }

          posted @ 2007-03-04 11:50 dennis 閱讀(5193) | 評論 (1)編輯 收藏

          ??? 模式一直是J2EE領域的熱門話題。兩年前,對剛開始自學java并且到處碰壁的我,一本在圖書館借的《java與模式》看的我云里霧里,盡管心里面覺的他講的很有道理,可對于沒有實際項目經驗的我,真正的理解和應用還很遠很遠。轉眼工作快一年多了了,也做了幾個不大不小的項目,盡管還只是個代碼工人水準的,但是對于模式的興趣越發濃厚,于是從書堆里找出來買了好久的GOF《設計模式》。這本書是圣經級別了,可我對C++的了解有限(雖然在學校里還是狠狠啃過好幾本大部頭,現在忘光了),而且這本圣經對初學者似乎不太友好,對模式也以羅列各條目為主,例子失當。于是買了《設計模式精解》,看china-pub的書評都說對初學者很有用,而且翻譯的人也是我很佩服的gigix。
          ??? 在春節期間讀完了這本書,本書詳細介紹了13種常見的設計模式,以一個實際問題引出了對面向對象新觀點和設計模式的討論,在介紹完所有的模式后,更難能可貴的是作者詳細介紹了自己對模式的使用經驗(使用共同點/變化點分析,使用分析矩陣等),整本書讀下來令人心曠神怡。
          ? ? 我們為什么要學習設計模式呢?總之是為了獲得可以復用和容易擴展的解決方案,建立通用術語以方便團隊內的溝通交流,另外,模式能讓你以更高的層次或者說視角去觀察問題,這樣的視角將你從過早處理細節的泥潭中解放出來。模式本身就是對如何創建優良面向對象設計策略的實現:
          ??? 1.針對接口編程
          ??? 2.優先使用對象組合,而不是類繼承
          ??? 3.發現并封裝變化點
          ??? 你可以在每一個模式的背后或者每一個優秀設計的背后看到這些原則的影子。比如abstract factory、adapter、strategy體現了針對接口編程,composite、bridge體現了優先使用組合而不是繼承等。
          ???
          ??? 作者解釋了面向對象的新觀點:
          ???
          ??????????????? 原來的觀點??????????????? 新的觀點

          對象?????????? 伴隨有方法的數據??????????? 擁有責任的實體,或者說擁有特定行為的實體 ?


          封裝????????? 數據隱藏 ? ? ? ? ? ? ? ? ?? 各種形式的封裝,1.數據的封裝,2.方法的封裝
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3.父類對子類的隱藏?? 4.其他對象的封裝

          繼承 ? ? ? ?? 特化和復用 ? ? ? ? ? ? ? ? ? 對象分類的一種方法

          ??? 這些觀點其實并不新,Martin Fowler提出了軟件開發過程中的三種視覺:概念、規格和實現,過去我們對面向對象的觀點來自于實現的角度(代碼的角度)去觀察,而新的觀點只是從概念的角度重新觀察面向對象設計。
          ??? 深入到具體模式的討論,記錄一些需要注意的問題:
          1.Adapter與Facade模式的區別
          它們都是包裝器,但是兩者也有細微的區別:
          .兩個模式中,我們都有已經存在的類(或者說系統)
          .Facade模式中,我們無需針對接口編程;而Adapter模式我們必須針對接口編程
          .Adapter模式通常是為了保持多態,而Facade模式對此不感興趣
          .動機不同,Facade模式是為了簡化接口,而Adapter模式是針對一個現存的接口編程
          結論:Facade模式簡化接口,而Adapter模式將接口轉換成另一個現有的接口

          2.Bridge模式的理解
          Bridge模式的意圖是將抽象部分與它的實現部分分離,使它們可以獨立的變化。這里的關鍵點是需要理解“實現部分”,如果把“實現部分”看成“對象外部、被對象使用的某種東西”,此模式就很好理解了。我們將變化轉移到一個使用或者擁有變化的對象(此對象是指抽象類的對象和用來實現抽象類的派生類的對象)。當出現繼承的類爆炸情況時,也許你該考慮此模式的應用場景了。此模式的UML圖
          Bridge1.jpg


          3.Observer模式,實現自己的觀察者模式也是很簡單,不過java已經內置了對此模式的支持。java.util.Observer和java.util.Observable是此模式的一個實現版本,實際應用中你所需要做的只是實現Observer接口,和繼承Observable類

          4.Decorator模式是為現有的功能動態添加附加功能的一種方法,UML圖如下
          ShowImg.jpg
          java的IO庫是典型的應用實現,java.io.InputStream和java.io.OutputStream就是圖中的Component接口,FilterInputStream繼承InputStream(也就是圖中的Decorator,裝飾器),其他的如ByteArrayInputStream、FileInputStream等直接繼承自InputStream的類就是被裝飾對象,而繼承FilterInputStream的就是各式各樣的裝飾者。

          5.Strategy模式是一種定義算法家族的方法,所有的算法都做相同的工作,它們只是擁有不同的實現。當你的代碼中出現了很多switch或者if else的語句,你應該考慮此模式。Strategy模式帶來的缺點是類的數量的增加,在java中可以通過將實現類作為嵌套類放在Strategy抽象類中來解決。

          6.singleton模式的實現
          單線程應用:
          第一種:靜態初始化
          public?class?Singleton?{
          ????
          private?Singleton()?{
          ????}

          ????
          private?static?Singleton?instance?=?new?Singleton();

          ????
          public?static?Singleton?getInstance()?{
          ????????
          return?instance;
          ????}
          }

          第二種:lazy loading
          public???class???Singleton???{????
          ??  
          private???static???Singleton???instance???=???null;??
          ???
          ??  
          public???static?? Singleton???getInstance()???{??

          ??  if???(instance==null)??
          ??    instance=
          new???Singleton();??
          ??  
          return???instance;???  }????
          ???
          ??}??

          多線程環境下:在C++中安全的Double-Checked Locking模式,在java中是不安全的,詳細原因與java的內存管理模型有關,請見dreamstone的文章《java中的模式——單態》
          安全的實現方法是使用同步:
          ?? public?class?Singleton?{??
          ??
          ??
          ??
          ? static?Singleton?instance;??
          ??
          ??
          ??
          ?? public?static?synchronized?Singleton?getInstance()?{??
          ??
          ???? if?(instance?==?null)??
          ??
          ?????? instance?==?new?Singleton();??
          ??
          ???? return?instance;??
          ??
          ?? }??
          ?
          ??
          ?
          }??

          《Effective Java》中提到的另一種寫法
          public?class?Singleton?{

          ??
          static?class?SingletonHolder?{
          ????
          static?Singleton?instance?=?new?Singleton();
          ??}

          ??
          public?static?Singleton?getInstance()?{
          ????
          return?SingletonHolder.instance;
          ??}

          }

          ??? 在介紹完13個模式之后,作者提出了 一種稱為分析矩陣的方法,詳細討論不是這篇短文能說的完,有興趣請找來此書的電子版看看。簡單來講,先從問題領域中分析出所有的變化點和共同點,觀察每一種必須實現的功能并作為矩陣的行,而矩陣中的列表示特定情況中的特定實現;然后觀察行,并根據場景探討使用合適的模式;最后觀察列,從整體上考慮整個問題的模式的使用。在出現的概念的場景中添加新的概念來進行設計。

          ??? 最后,作者總結了面向對象的原則:
          .“對象”是負有定義良好的責任的東西
          .對象對自己負責
          .封裝意味著
          ? ? ——數據隱藏
          ? ? ——類隱藏(藏在抽象類或者接口后面)
          ? ? ——實現隱藏(變化封裝為對象進行引用)
          .使用共同點/變化點分析抽象出行為和數據中的變化點
          .針對接口編程
          .把繼承考慮為一種封裝變化的方法,而不是為現有的對象制造特殊情況
          .將變化點封裝在一個類中,并使之與其他變化點相分離
          .力求松耦合
          .力求高內聚
          .絕對細心地應用“一次并且只有一次”規則(只在一個地方實現一條規則)
          ? ?? 書本只是提供了模式的介紹和參照,真正的應用還是要靠自己日常工作中的觀察和體驗,我將繼續在工作中理解并貫徹這些原則。 ? ??

          posted @ 2007-03-03 10:41 dennis 閱讀(4759) | 評論 (10)編輯 收藏

          剛剛走上社會的年輕人,充滿了蓄勢待發的豪情、青春的朝氣、前衛的思想,夢想著豐富的待遇和轟轟烈烈的事業??墒牵鐣吘故且凰_萬象、喧囂復雜的大學校,這里沒有寒暑假,拒絕虛假和膚淺,更拒絕空想和庸碌,難以預告何時開課何時放學。

            如何在涉世之初少走彎路,有一個好的開端,開始一番成功的事業?以下是一些先行者積累的10條有益的涉世忠告。好好地遵循、把握這些忠告和建議吧,比起所學的課堂課程來,它毫不遜色!

          1. 買個鬧鐘,以便按時叫醒你。貪睡和不守時,都將成為你工作和事業上的絆腳石,任何時候都一樣。不僅要學會準時,更要學會提前。就如你坐車去某地,沿途的風 景很美,你忍不住下車看一看,后來雖然你還是趕到了某地,卻不是準時到達。“鬧鐘”只是一種簡單的標志和提示,真正靈活、實用的時間,掌握在每個人的心 中。

          2. 如果你不喜歡現在的工作,要么辭職不干,要么就閉嘴不言。初出茅廬,往往眼高手低,心高氣傲,大事做不了,小事不愿做。不要養成挑三揀四的習慣。不要雨天煩打傘,不帶傘又怕淋雨,處處表現出不滿的情緒。記住,不做則已,要做就要做好。

          3. 每個人都有孤獨的時候。要學會忍受孤獨,這樣才會成熟起來。年輕人嘻嘻哈哈、打打鬧鬧慣了,到了一個陌生的環境,面對形形色色的人和事,一下子不知所措起 來,有時連一個可以傾心說話的地方也沒有。這時,千萬別浮躁,學會靜心,學會忍受孤獨。在孤獨中思考,在思考中成熟,在成熟中升華。不要因為寂寞而亂了方 寸,而去做無聊無益的事情,白白浪費了寶貴的時間。

          4. 走運時要做好倒霉的準備。有一天,一只狐貍走到一個葡萄園外,看見里面水靈靈的葡萄垂涎欲滴??墒峭饷嬗袞艡趽踔?,無法進去。于是它一狠心絕食三日,減肥 之后,終于鉆進葡萄園內飽餐一頓。當它心滿意足地想離開葡萄園時,發覺自己吃得太飽,怎么也鉆不出柵欄了。相信任何人都不愿做這樣的狐貍。退路同樣重要。 飽帶干糧,晴帶雨傘,點滴積累,水到渠成。有的東西今天似乎一文不值,但有朝一日也許就會身價百倍。

          5. 不要像玻璃那樣脆弱。有的人眼睛總盯著自己,所以長不高看不遠;總是喜歡怨天尤人,也使別人無比厭煩。沒有苦中苦,哪來甜中甜?不要像玻璃那樣脆弱,而應像水晶一樣透明,太陽一樣輝煌,臘梅一樣堅強。既然睜開眼睛享受風的清涼,就不要埋怨風中細小的沙粒。

          6. 管住自己的嘴巴。不要談論自己,更不要議論別人。談論自己往往會自大虛偽,在名不副實中失去自己。議論別人往往陷入雞毛蒜皮的是非口舌中糾纏不清。每天下 班后和你的那些同事朋友喝酒聊天可不是件好事,因為,這中間往往會把議論同事、朋友當做話題。背后議論人總是不好的,尤其是議論別人的短處,這些會降低你 的人格。

          7. 機會從不會“失掉”,你失掉了,自有別人會得到。不要凡事在天,守株待兔,更不要寄希望于“機會”。機會只不過是相對于充分準備而又善于創造機會的人而言 的。也許,你正為失去一個機會而懊悔、埋怨的時候,機會正被你對面那個同樣的“倒霉鬼”給抓住了。沒有機會,就要創造機會,有了機會,就要巧妙地抓住。

          8. 若電話老是不響,你該打出去。很多時候,電話會給你帶來意想不到的收獲,它不是花瓶,僅僅成為一種擺設。交了新朋友,別忘了老朋友,朋友多了路好走。交際的一大訣竅就是主動。好的人緣好的口碑,往往助你的事業更上一個臺階。

          9. 千萬不要因為自己已經到了結婚年齡而草率結婚。想結婚,就要找一個能和你心心相印、相輔相攜的伴侶。不要因為放縱和游戲而戀愛,不要因為戀愛而影響工作和事業,更不要因一樁草率而失敗的婚姻而使人生受阻。感情用事往往會因小失大。

          10. 寫出你一生要做的事情,把單子放在皮夾里,經常拿出來看。人生要有目標,要有計劃,要有提醒,要有緊迫感。一個又一個小目標串起來,就成了你一生的大目標。生活富足了,環境改善了,不要忘了皮夾里那張看似薄薄的單子。


          心浮氣躁時看看這篇文章,總能讓我平靜下來,做應該做的事情。

          摘自:

          http://www.aygfsteel.com/chenpengyi/articles/8445.html

          posted @ 2007-03-03 09:07 dennis 閱讀(273) | 評論 (0)編輯 收藏

          oracle的卸載是一個比較麻煩的事,如果沒有成功卸載或者卸載的不干凈,往往會影響下次的安裝。正確的步驟如下:

          1. 關閉所有oracle的服務和程序
          2. 選擇開始| 程序|oracle Installation Products命令,運行Universal Installer,彈出歡迎對話框
          3. 單機 卸載產品 按鈕,彈出Inventory對話框
          4. 選中Inventroy對話框中的所有節點,點擊刪除,確認即可
          5. 選 擇 開始|運行 輸入regedit并按ENTER鍵,選擇HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,刪除此象,然后選擇 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滾動此列表,刪除與oracle有關的所 有選項。
          6. 從桌面上、STARTUP和程序菜單中刪除所有ORACLE的組和圖標。
          7. 重啟系統。
          8. 刪除包括文件在內的安裝目錄。至此ORACLE的全部卸載完成。

          posted @ 2007-03-02 16:11 dennis 閱讀(546) | 評論 (0)編輯 收藏

               摘要: update:這個例子是不當的,更合適的例子請自己上javaeye上搜索個帖子。源碼俺早就丟了,請不要再發郵件給我,謝謝。       osworkflow擴展非常容易,跟我們的應用結合起來使用也很容易。假設一個請假流程:員工請假,需要經過部門經理和人力資源部經理兩人共同審批,只有當兩人都許可時才通過,任一人駁回就失效,也就是一個and split和and Joi...  閱讀全文

          posted @ 2007-03-02 16:07 dennis| 編輯 收藏

               摘要: oracle sql語句優化的常見原則  閱讀全文

          posted @ 2007-03-02 11:57 dennis 閱讀(1884) | 評論 (0)編輯 收藏

          在導入一個2G的備份文件時,數據庫報ORA-00257故障,找到這篇文章。轉自http://dev.yesky.com/438/2525938.shtml

          概述

            Oracle數據庫是目前業界最常用的大型數據庫系統,我在實際項目中遇到出現ORA-00257錯誤(空間不足錯誤),通過查找資料,絕大部分說這是由于歸檔日志太多,占用了全部的硬盤剩余空間導致的,通過簡單刪除日志或加大存儲空間就能夠解決。但是我在Oracle 10g上發現,存儲空間還有很大,卻也報這個錯誤。原來是Oracle 10g中新的特性,對Flash Recovery的管理導致的。

            1、軟硬件環境

            服務器HP Proliant DL580G4(Intel Xeon 3.16GHz/4GB/ 72.8*4/RAID4)

            操作系統Red Flag DC Server release 5.0 (Trinity) for x86-64 Linux

            數據庫Oracle 10.2.0.1.0

            2、問題現象

            數據庫系統已經試運行了半個多月,在7月24日晚上連接數據庫后做數據更新時出現ORA-00257錯誤,如下圖。


            提示歸檔錯誤,通過查找ORACLE錯誤代碼,解釋為硬盤空間不足,需要刪除歸檔日志增加空間,但是服務器可用空間200GB,目前只用了10GB左右,這是為什么呢?

            3、診斷過程

            1)查看ORACLE數據庫歸檔日志情況

          [root@hrmsdb /]# cd /oracle/flash_recovery_area/HKCHR/archivelog

          [root@hrmsdb archivelog]# ls

          2006_07_04 2006_07_13 2006_07_17 2006_07_20 2006_07_23

          2006_07_11 2006_07_14 2006_07_18 2006_07_21 2006_07_24

          2006_07_12 2006_07_15 2006_07_19 2006_07_22 2006_07_25

          [root@hrmsdb archivelog]# cd 2006_07_25

          [root@hrmsdb 2006_07_25]# ls

          [root@hrmsdb 2006_07_25]# cd ../2006_07_24

          [root@hrmsdb 2006_07_24]# ls

          o1_mf_1_92_2d933vgb_.arc o1_mf_1_96_2d954ns7_.arc o1_mf_1_98_2d969d5h_.arc

          o1_mf_1_95_2d9537cs_.arc o1_mf_1_97_2d956km0_.arc

            說明在出現問題之前數據庫歸檔處理一直是正常的。

            2)查看數據庫REDOLOG情況

          [oracle@hrmsdb ~]$ sqlplus /nolog

          SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 7月 25 10:44:18 2006

          Copyright (c) 1982, 2005, Oracle. All rights reserved.

          SQL> connect / as sysdba

          已連接。

          SQL> select * from v$log;

          GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME

          ---------- ---------- ---------- ---------- ---------- --- --------------------------------------- --------------

          1 1 101 52428800 1 NO CURRENT 3621973 24-7月 -06

          2 1 99 52428800 1 NO INACTIVE 3600145 24-7月 -06

          3 1 100 52428800 1 NO INACTIVE 3611932 24-7月 -06

            發現ARC狀態為NO,表示系統沒法自動做歸檔。

            3)手工切換日志

          SQL> alter system switch logfile;

          alter system switch logfile

          *
          第 1 行出現錯誤:

            ORA-01013: 用戶請求取消當前的操作

            在等待長時間沒反應后,中斷操作,手工切換日志沒有成功。

            4)查看Oracle數據庫后臺歸檔服務進程

          [oracle@hrmsdb ~]$ ps -ef|grep oracle

          oracle 4601 1 0 Jul11 ? 00:00:04 /oracle/product/10.2.0/db_1/bin/

          tnslsnr LISTENER -inherit

          oracle 5025 1 0 Jul11 ? 00:00:00 /usr/bin/ssh-agent -s

          oracle 20923 1 0 Jul24 ? 00:00:01 ora_pmon_hkchr

          oracle 20925 1 0 Jul24 ? 00:00:00 ora_psp0_hkchr

          oracle 20927 1 0 Jul24 ? 00:00:00 ora_mman_hkchr

          oracle 20929 1 0 Jul24 ? 00:00:01 ora_dbw0_hkchr

          oracle 20931 1 0 Jul24 ? 00:01:07 ora_lgwr_hkchr

          oracle 20933 1 0 Jul24 ? 00:00:05 ora_ckpt_hkchr

          oracle 20935 1 0 Jul24 ? 00:00:01 ora_smon_hkchr

          oracle 20937 1 0 Jul24 ? 00:00:00 ora_reco_hkchr

          oracle 20939 1 0 Jul24 ? 00:00:00 ora_cjq0_hkchr

          oracle 20941 1 0 Jul24 ? 00:00:01 ora_mmon_hkchr

          oracle 20943 1 0 Jul24 ? 00:00:05 ora_mmnl_hkchr

          oracle 20945 1 0 Jul24 ? 00:00:00 ora_d000_hkchr

          oracle 20947 1 0 Jul24 ? 00:00:00 ora_s000_hkchr

          oracle 20953 1 0 Jul24 ? 00:09:41 ora_arc0_hkchr

          oracle 20955 1 1 Jul24 ? 00:10:29 ora_arc1_hkchr

          oracle 20959 1 0 Jul24 ? 00:00:00 ora_qmnc_hkchr

          oracle 20967 1 0 Jul24 ? 00:00:00 ora_q000_hkchr

          oracle 20969 1 0 Jul24 ? 00:00:00 ora_q001_hkchr

          oracle 21715 1 0 Jul24 ? 00:00:19 oraclehkchr (LOCAL=NO)

          oracle 21765 1 0 Jul24 ? 00:00:00 ora_j000_hkchr

          oracle 21816 1 0 Jul24 ? 00:00:00 ora_j001_hkchr

          oracle 21832 1 0 Jul24 ? 00:00:00 ora_j002_hkchr

          oracle 21839 1 0 Jul24 ? 00:00:00 ora_j003_hkchr

          oracle 21859 1 0 Jul24 ? 00:00:00 ora_j004_hkchr

          oracle 21861 1 0 Jul24 ? 00:00:00 ora_j005_hkchr

          oracle 21886 1 0 Jul24 ? 00:00:00 ora_j006_hkchr

          oracle 21888 1 0 Jul24 ? 00:00:00 ora_j007_hkchr

          root 23187 23186 0 10:39 ? 00:00:00 login -- oracle

          oracle 23188 23187 0 10:39 pts/0 00:00:00 -bash

          oracle 23216 23188 0 10:39 pts/0 00:00:00 sqlplus

          oracle 23217 23216 0 10:39 ? 00:00:00 oraclehkchr (DESCRIPTION=(LOCAL=

          YES)(ADDRESS=(PROTOCOL=beq)))

          root 23224 23223 0 10:40 ? 00:00:00 login -- oracle

          oracle 23225 23224 0 10:40 pts/1 00:00:00 -bash

          oracle 23310 23225 0 10:46 pts/1 00:00:00 ps -ef

          oracle 23311 23225 0 10:46 pts/1 00:00:00 grep oracle

          [oracle@hrmsdb ~]$

          后臺進程都正常運行。

            5)查看FLASH_RECOVERY_AREA空間使用情況

          [root@hrmsdb /]# cd /oracle

          [root@hrmsdb oracle]# ls

          admin flash_recovery_area oraInventory product

          [root@hrmsdb oracle]# du -a -k flash_recovery_area

          4 flash_recovery_area/HKCHR/onlinelog

          42456 flash_recovery_area/HKCHR/archivelog/2006_07_15/o1_mf_1_74_2cj1h1jz_.arc

          ……………….

          42448 flash_recovery_area/HKCHR/archivelog/2006_07_14/o1_mf_1_68_2cfzwwvt_.arc

          512560 flash_recovery_area/HKCHR/archivelog/2006_07_14

          1469224 flash_recovery_area/HKCHR/archivelog

          6988 flash_recovery_area/HKCHR/backupset/2006_07_04/o1_mf_ncsnf_TAG20060704T1

          74229_2bng1o0b_.bkp

          876916 flash_recovery_area/HKCHR/backupset/2006_07_04/o1_mf_nnndf_TAG20060704T1

          74229_2bng0cx4_.bkp

          883908 flash_recovery_area/HKCHR/backupset/2006_07_04

          883912 flash_recovery_area/HKCHR/backupset

          2353144 flash_recovery_area/HKCHR

          2353148 flash_recovery_area

          [root@hrmsdb oracle]#


          FLASH_RECOVERY_AREA空間使用了2.35GB

            6)查看FLASH_RECOVERY_AREA空間中各部分使用情況

          SQL> select * from v$recovery_file_dest;

          NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES

          ------------------------------------------------------------------------------------------------------------------

          /oracle/flash_recovery_area 2147483648 2134212608 0 35

          SQL> select * from v$flash_recovery_area_usage;

          FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

          ------------ ------------------ ------------------------- ---------------- -------------- -------------- -------------

          CONTROLFILE 0 0 0

          ONLINELOG 0 0 0

          ARCHIVELOG 69.97 0 40

          BACKUPPIECE 30.01 0 2

          IMAGECOPY 0 0 0

          FLASHBACKLOG 0 0 0

          已選擇6行。

            發現ARCHIVELOG占近70%,BACKUPPIRCR占了30%,這樣FLASH_RECOVERY_AREA空間的空間已經被完全占據了。
          4、解決過程

            根據數據庫目前可用存儲空間為200GB、FLASH_RECOVERY_AREA空間為2GB的實際情況,把FLASH_RECOVERY_AREA的空間修改為20GB。

          SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;

          系統已更改。

          SQL> select * from v$recovery_file_dest;

          ------------------------------------------------------- ---------- -----------------------------------

          NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES

          ----------- ---------- ----------------- ------------- -------------- ---------- ---------- ------------

          /oracle/flash_recovery_area 2.1475E+10 2264587776 0 38

            這時再查看日志的狀態,發現REDO LOG處于正常的歸檔狀態。

          SQL> select * from v$log;

          GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME

          ---------- ---------- ---------- ---------- ---------- --- -------------------------------------------- --------------

          1 1 101 52428800 1 YES ACTIVE 3621973 24-7月 -06

          2 1 102 52428800 1 NO CURRENT 3650399 25-7月 -06

          3 1 100 52428800 1 YES INACTIVE 3611932 24-7月 -06

          SQL> select * from v$flash_recovery_area_usage;

          FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

          ------------ ------------------ ------------------------- ---------------

          CONTROLFILE 0 0 0

          ONLINELOG 0 0 0

          ARCHIVELOG 7.6 0 43

          BACKUPPIECE 4.21 0 2

          IMAGECOPY 0 0 0

          FLASHBACKLOG 0 0 0

          已選擇6行。

          SQL>

            5、小結

            造成本次故障的原因由兩方面同時發生所造成的:

            ·其一是Flash_Recovery_Area空間缺省安裝時比較小,只有2GB,容易用完;

            ·其二是由于采用歸檔方式通過Veritas備份,由于備份軟件沒有運行,造成歸檔日志沒有及時刪除。

            從本次故障解決處理中,我們可以得出經驗教訓:

            ·Oracle 10g數據庫物理空間管理方式與以前Oracle發生了變化,對歸檔日志所在的Flash_Recovery_Area空間進行了另外限制;
           
            ·對數據庫系統管理員要對Oracle數據庫歸檔日志、備份軟件運行狀況定期檢查,提前發現、處理可能發生的故障。

          posted @ 2007-03-02 11:09 dennis 閱讀(480) | 評論 (0)編輯 收藏

          ??? 昨天根據客戶要求,增加了一個jasperreport實現的報表打印功能,然后在測試服務器上測試通過,因為看到測試數據庫上的數據都太“舊”了,我就從正式環境下導出了OA系統的數據,導出操作一切順利,在導入過程中卻由于網絡問題中斷(因為我是遠程導入,備份文件在我的機器上)。再次連接數據庫,一直報錯,說什么只允許內部連接。遠程重啟了下oracle服務,登錄數據庫還是不行,發現數據庫根本沒打開,通過sqlplus執行
          ???
          alter?database?open;
          命令,報錯:
          ORA-16014:?日志?1?的序列號?680?未歸檔,?沒有可用的目的地
          ORA
          -00312:?聯機日志?1?線程?1:?
          alter?database?clear?unarchived?logfile?'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'

          看情況是日志文件出錯,幸好是測試服務器,把我這個對oracle管理一竅不通的家伙急壞了。馬上baidu了下錯誤代碼,找到一篇文章:

          在日志文件損壞或者dump這些損壞的日志文件的時候,通?;厥盏筋愃葡旅娴腻e誤:

          ORA-00354: corrupt redo log block header

          ORA-00353: log corruption near block 3740 change 0 time 04/11/2006 13:49:56??

          ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log'

          或者:

          sys@TSMISC02> ALTER SYSTEM DUMP LOGFILE '/oracle/oradata/TSMISC02/redo01.log';

          ALTER SYSTEM DUMP LOGFILE '/oracle/oradata/TSMISC02/redo01.log'

          *

          ERROR at line 1:

          ORA-00354: corrupt redo log block header

          ORA-00353: log corruption near block 3740 change 6918597 time 04/10/2006 23:53:24

          ORA-00334: archived log: '/oracle/oradata/TSMISC02/redo01.log'

          Elapsed: 00:00:03.36

          sys@TSMISC02>

          這里首先介紹一下oracle使用日志文件的策略。每一個數據庫至少有兩個或多個日志文件組(redo log group),每個組中至少有一個日志成員(redo log member)。日志文件的主要功能是真實完整的記錄對數據庫作的全部修改。在出現故障時,如果不能將修改數據永久地寫入數據文件,則系統將利用日志前滾來恢復數據庫數據文件。日志文件主要是保護數據庫以防止故障。

          如果LGWR 至少能夠訪問一個組內的某一個成員,那么oracle就會對這個組內的可訪問成員繼續照常進行讀寫操作,也就是說,LGWR 將忽略組內的不可用成員。如果在日志切換時LGWR 無法訪問下一個組的所有成員或者損壞的日志文件時改組中日志成員,數據庫的正常操作就無法進行了。這也就是oracle常說的,為了防止日志文件的故障或丟失,強烈建議鏡象日志(mirrored redo log),即,在不同磁盤上維護至少兩個或多個日志文件(redo log member)副本的作用——只要組內有一個可用的成員,oracle就會繼續“正?!辈僮?。

          回到這里,如果數據庫發生日志文件的上述損壞,不管是哪種原因造成的,解決方法無外乎是使用完好的文件恢復已經損壞的文件,或者初始化損壞的文件組等等(日志文件的故障處理不做這里的重點介紹,我將會在其他的文章中逐一說明和舉例)。

          我們這里主要是使用了_disable_loggingtrue這個隱含參數(實際性能故障診斷時,你可以通過alert.log找到相關信息)造成了歸檔數據庫中,所有日志不能歸檔,最終數據庫不能繼續操作的問題,因此解決方法就是:

          a)如果是使用了隱含參數,那么去掉這個隱含參數:

          ??? alter system set "_disable_logging"=false scope=both;

          b)然后,初始化損壞的redo log

          alter database clear unarchived logfile '<logilename>';?

          例如:

          sys@TSMISC02> alter system set "_disable_logging"=false scope=both;

          System altered.

          Elapsed: 00:00:00.01

          sys@TSMISC02>

          sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log';?

          Database altered.

          Elapsed: 00:00:00.18

          sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo03.log';?

          Database altered.

          Elapsed: 00:00:00.17

          sys@TSMISC02>

          OK,馬上執行命令:
          alter?database?clear?unarchived?logfile?'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'

          再打開數據庫,一切正常,重新導入,問題解決。

          我需要加強下對oracle基本故障處理方面知識的學習了。

          posted @ 2007-03-02 10:51 dennis 閱讀(4060) | 評論 (0)編輯 收藏

          僅列出標題
          共56頁: First 上一頁 46 47 48 49 50 51 52 53 54 下一頁 Last 
          主站蜘蛛池模板: 高唐县| 会宁县| 辉南县| 广宁县| 专栏| 南部县| 宜兰县| 巴塘县| 中西区| 黄骅市| 大悟县| 石阡县| 个旧市| 望城县| 洪雅县| 阳谷县| 饶河县| 隆昌县| 襄汾县| 达拉特旗| 休宁县| 深泽县| 冕宁县| 邵武市| 洛川县| 庆云县| 政和县| 元阳县| 安国市| 和平县| 西贡区| 稷山县| 白朗县| 新源县| 铜鼓县| 永丰县| 老河口市| 六枝特区| 湾仔区| 丰宁| 麦盖提县|