<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hopes

    Start Here..

     

    Oracle Database 9i, 10g閃回版本查詢

     

    Oracle Database 9i, 10g閃回版本查詢

    2008-05-25 17:25 1355人閱讀 評論(1) 收藏 舉報

    轉(zhuǎn)自:http://blog.csdn.net/xiaojianpitt/archive/2007/11/29/1907051.aspx    (很好的文章)

     Oracle Database 9i, 10g閃回版本查詢

         不需要設(shè)置,立即識別對行的所有更改 

         Oracle9i Database 中,我們看到它推出了以閃回查詢形式表示的時間機器。該特性允許 DBA 看到特定時間的列值,只要在還原段中提供該數(shù)據(jù)塊此前鏡像的拷貝即可。但是,閃回查詢只提供某時刻數(shù)據(jù)的固定快照,而不是在兩個時間點之間被更改數(shù)據(jù)的運行狀態(tài)表示。某些應(yīng)用程序,如涉及到外幣管理的應(yīng)用程序,可能需要了解一段時期內(nèi)數(shù)值數(shù)據(jù)的變化,而不僅僅是兩個時間點的數(shù)值。由于閃回版本查詢特性,Oracle Database 10g 能夠更方便高效地執(zhí)行該任務(wù)。

     

        查詢對表的更改

     

        在本示例中,我使用了一個銀行外幣管理應(yīng)用程序。其數(shù)據(jù)庫含有一個名稱為 RATES 的表,用于記錄特定時間的匯率。

     

        SQL> desc rates

        Name              Null?Type

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

        CURRENCY                   VARCHAR2(4)

        RATE                       NUMBER(15,10)

     

        該表顯示 US$ 與各種其他貨幣的匯率,在 CURRENCY 列中顯示。在金融服務(wù)行業(yè)中,匯率不但在變更時進行更新,而且被記錄在歷史中。需要這種方式的原因是銀行交易可能在過去時間生效,以便適應(yīng)由于匯款而耗費的時間。例如,對于一項在上午 10:12 發(fā)生但在上午 9:12 生效的交易,其有效匯率是上午 9:12 的匯率,而不是現(xiàn)在的匯率。

     

        直到現(xiàn)在,唯一的選擇是創(chuàng)建一個匯率歷史表來存儲匯率的變更,然后查詢該表是否提供歷史記錄。另一種選擇是在 RATES 表本身中記錄特定匯率適用性的開始和結(jié)束時間。當(dāng)發(fā)生變更時,現(xiàn)有行中的 END_TIME 列被更新為 SYSDATE,并插入一個具有新匯率的新行,其 END_TIME  NULL

     

        但是在 Oracle Database 10g 中,閃回版本查詢特性不需要維護歷史表或存儲開始和結(jié)束時間。使用該特性,您不必進行額外的設(shè)置,即可獲得某行在過去特定時間的值。

     

        例如,假定該 DBA 在正常業(yè)務(wù)過程中數(shù)次更新匯率 ,甚至刪除了某行并重新插入該行:

     

        insert into rates values ('EURO',1.1012);

        commit;

        update rates set rate = 1.1014;

        commit;

        update rates set rate = 1.1013;

        commit;

        delete rates;

        commit;

        insert into rates values ('EURO',1.1016);

        commit;

        update rates set rate = 1.1011;

        commit;

     

        在進行了這一系列操作后,DBA 將通過以下命令獲得 RATE 列的當(dāng)前提交值

     

        SQL> select * from rates;

     

        CURR       RATE

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

        EURO     1.1011

     

        此輸出顯示 RATE 的當(dāng)前值,沒有顯示從第一次創(chuàng)建該行以來發(fā)生的所有變更。這時使用閃回查詢,您可以找出給定時間點的值;但我們對構(gòu)建變更的審計線索更感興趣 ? 有些類似于通過便攜式攝像機來記錄變更,而不只是在特定點拍攝一系列快照。

     

        以下查詢顯示了對表所做的更改:

     

        select versions_starttime, versions_endtime, versions_xid,

        versions_operation, rate

        from rates versions between timestamp minvalue and maxvalue

        order by VERSIONS_STARTTIME

        /

     

        VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE

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

        01-DEC-03 03.57.12 PM 01-DEC-03 03.57.30 PM 0002002800000C61 I     1.1012

        01-DEC-03 03.57.30 PM 01-DEC-03 03.57.39 PM 000A000A00000029 U     1.1014

        01-DEC-03 03.57.39 PM 01-DEC-03 03.57.55 PM 000A000B00000029 U     1.1013

        01-DEC-03 03.57.55 PM                         000A000C00000029 D     1.1013

        01-DEC-03 03.58.07 PM 01-DEC-03 03.58.17 PM 000A000D00000029 I     1.1016

        01-DEC-03 03.58.17 PM                         000A000E00000029 U     1.1011

     

        注意,此處顯示了對該行所作的所有更改,甚至包括該行被刪除和重新插入的情況。VERSION_OPERATION 列顯示對該行執(zhí)行了什么操作 (Insert/Update/Delete)。所做的這些工作不需要歷史表或額外的列。

     

        在上述查詢中,列 versions_starttimeversions_endtime、versions_xid、versions_operation 是偽列,與 ROWNUMLEVEL 等其他熟悉的偽列相類似。其他偽列   VERSIONS_STARTSCN  VERSIONS_ENDSCN  顯示了該時刻的系統(tǒng)更改號。列 versions_xid 顯示了更改該行的事務(wù)標(biāo)識符。有關(guān)該事務(wù)的更多詳細信息可在視圖 FLASHBACK_TRANSACTION_QUERY 中找到,其中列 XID 顯示事務(wù) id。例如,使用上述的 VERSIONS_XID  000A000D00000029,UNDO_SQL 值顯示了實際的語句。

     

        SELECT UNDO_SQL

        FROM FLASHBACK_TRANSACTION_QUERY

        WHERE XID = '000A000D00000029';

     

        UNDO_SQL

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

        insert into "ANANDA"."RATES"("CURRENCY","RATE") values ('EURO','1.1013');

     

        除了實際語句之外,該視圖還顯示提交操作的時間標(biāo)記和 SCN、查詢開始時的 SCN 和時間標(biāo)記以及其他信息。

     

        找出一段時期中的變更

     

        現(xiàn)在,讓我們來看如何有效地使用這些信息。假設(shè)我們需要找出下午 3:57:54  RATE 列的值。我們可以執(zhí)行:

     

        select rate, versions_starttime, versions_endtime

        from rates versions

        between timestamp

        to_date('12/1/2003 15:57:54','mm/dd/yyyy hh24:mi:ss')

        and to_date('12/1/2003 16:57:55','mm/dd/yyyy hh24:mi:ss')

        /

     

        RATE VERSIONS_STARTTIME     VERSIONS_ENDTIME

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

            1.1011

     

        此查詢與閃回查詢類似。在以上的示例中,開始和結(jié)束時間為空,表示匯率在該時間段中沒有更改,而是包含一個時間段。還可以使用 SCN 來找出過去的版本值??梢詮膫瘟?/span> VERSIONS_STARTSCN  VERSIONS_ENDSCN 中獲得 SCN 號。以下是一個示例:

     

        select rate, versions_starttime, versions_endtime

        from rates versions

        between scn 1000 and 1001

        /

     

        使用關(guān)鍵詞 MINVALUE  MAXVALUE,可以顯示還原段中提供的所有變更。您甚至可以提供一個特定的日期或 SCN 值作為范圍的一個端點,而另一個端點是文字 MAXVALUE  MINVALUE。例如,以下查詢提供那些只從下午 3:57:52 開始的變更,而不是全部范圍的變更:

     

        select versions_starttime, versions_endtime, versions_xid,

        versions_operation, rate

        from rates versions between timestamp

        to_date('12/11/2003 15:57:52', 'mm/dd/yyyy hh24:mi:ss')

        and maxvalue

        order by VERSIONS_STARTTIME

        /

     

        VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE

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

        01-DEC-03 03.57.55 PM                         000A000C00000029 D     1.1013

        01-DEC-03 03.58.07 PM 01-DEC-03 03.58.17 PM 000A000D00000029 I     1.1016

        01-DEC-03 03.58.17 PM                         000A000E00000029 U     1.1011

     

        最終的分析

     

        閃回版本查詢隨取隨用地復(fù)制表變更的短期易變數(shù)值審計。這一優(yōu)點使得 DBA 能夠獲得過去時間段中的所有變更而不是特定值,只要還原段中提供數(shù)據(jù),就可以盡情使用。因此,最大的可用版本依賴于 UNDO_RETENTION 參數(shù)。

     

        有關(guān)閃回版本查詢的更多信息,請參見 Oracle Database Concepts 10g Release 1 (10.1) 指南的相關(guān)部分。

    1、Oracle 9i的閃回查詢功能

      在Oracle 9i之前,如果用戶錯誤操作數(shù)據(jù)后,除了不完全恢復(fù)外,沒有好的解決辦法。Oracle 9i中提供閃回查詢,由一個新的包DBMS_FLASH來實現(xiàn)。用戶使用閃回查詢可以及時取得誤操作DMLDelete、Update、Insert)前某一時間點數(shù)據(jù)庫的映像視圖,用戶可以利用系統(tǒng)時間或系統(tǒng)改變號(SCNSystem Change Number)來指定這個只讀視圖,并可以針對錯誤進行相應(yīng)的恢復(fù)措施。閃回查詢功能完全依賴于自動回滾段管理(AUM),對于Drop等誤操作不能恢復(fù)。閃回特性可應(yīng)用在以下方面:

      (1)自我維護過程中的修復(fù):當(dāng)一些重要的記錄被意外刪除,用戶可以向后移動到一個時間點,查看丟失的行并把它們重新插入現(xiàn)在的表內(nèi)恢復(fù)。

      (2)恢復(fù)Email和聲音Email:當(dāng)用戶意外刪除了Email或者聲音信息時,可以通過移回到固定時間點來恢復(fù)刪除。

     ?。?/span>3)賬號平衡狀況:可以查看以前的歷史數(shù)據(jù)。如銀行外幣管理中用于記錄特定時間的匯率。在以前,匯率變更被記錄在一個歷史表中,現(xiàn)在就可以通過閃回功能進行查詢。

     ?。?/span>4)用于趨勢分析的決策支持系統(tǒng):決策支持系統(tǒng)和聯(lián)機分析應(yīng)用必須執(zhí)行一個長時間的事務(wù)。使用閃回查詢,這些應(yīng)用可以對歷史數(shù)據(jù)執(zhí)行分析和建模。例如,特定產(chǎn)品如礦泉水隨季節(jié)變化需求情況的變化。 

      2、回滾段概述

      回滾段用于存放數(shù)據(jù)修改之前的位置和值,回滾段的頭部包含正在使用的該回滾段事務(wù)的信息。回滾段的作用如下:

     ?。?/span>1)事務(wù)回滾:當(dāng)事務(wù)修改表中數(shù)據(jù)的時候,該數(shù)據(jù)修改前的值(即前影像)會存放在回滾段中,當(dāng)用戶回滾事務(wù)時,Oracle將會利用回滾段中的數(shù)據(jù)前影像來將修改的數(shù)據(jù)恢復(fù)到原來的值。 

     ?。?/span>2)事務(wù)恢復(fù):當(dāng)事務(wù)正在處理的時候,例程失敗,回滾段的信息保存在重做日志文件中,Oracle將在下次打開數(shù)據(jù)庫時利用回滾來恢復(fù)未提交的數(shù)據(jù)。

     ?。?/span>3)讀一致性:當(dāng)一個會話正在修改數(shù)據(jù)時,其它的會話將看不到該會話未提交的修改。而且,當(dāng)一個語句正在執(zhí)行時,該語句將看不到從該語句開始執(zhí)行后的未提交的修改(語句級讀一致性)。

      3、OracleDeleteCommit操作的流程分析 

     ?。?/span>1)刪除(Delete)流程

      ·OracleBlock(數(shù)據(jù)塊)Buffer Cache(緩沖區(qū))(如果該BlockBuffer中不存在);

      ·Redo Log Buffer(重做日志緩沖區(qū))中記錄Delete操作的細節(jié);

      ·在相應(yīng)回滾段段頭的事物表中創(chuàng)建一個Undo(回滾)條目;

      ·把將要刪除的記錄創(chuàng)建前鏡像,存放到Undo Block(回滾塊)中;

      ·Buffer Cache中的相應(yīng)數(shù)據(jù)塊上刪除記錄,并且標(biāo)記相應(yīng)的數(shù)據(jù)塊為Dirty(臟)。

     ?。?/span>2)提交(Commit)流程

      ·Oracle產(chǎn)生一個SCN;

      ·在回滾段事物表中標(biāo)記該事物狀態(tài)為Commited

      ·LGWR(日志讀寫進程) Flush Log Buffer到日志文件; 

      ·如果此時數(shù)據(jù)塊仍然在Buffer Cache中,那么SCN將被記錄到Block Header上,這被稱為快速提交;

      ·如果Dirty Block已經(jīng)被寫回到磁盤,那么下一個訪問這個Block的進程將會自回滾段中獲取該事物的狀態(tài),確認該事物被提交。然后這個進程獲得提交SCN并寫回到Block Header上,這被稱為延遲塊清除。

      4、Oracle 9i中閃回查詢操作實例

      進行閃回查詢必須設(shè)置自動回滾段管理,在init.ora設(shè)置參數(shù)UNDO_MANAGEMENT=AUTO,參數(shù)UNDO_RETENTION=n,決定了能往前閃回的最大時間,值越大就需要越多Undo空間。

      例:Oracle 9iFlashback Query操作。

     ?。?/span>1)創(chuàng)建閃回查詢用戶

    SQL> create user flashtest identified by flashtest; 
    SQL> grant connect, resource to flashtest; 
    SQL> grant execute on dbms_flashback to flashtest; 
    SQL> connect flashtest/flashtest;


      (2)創(chuàng)建測試表,插入測試記錄

    SQL> create table test(id number(3)); 
    SQL> insert into test values (1); 
    SQL> insert into test values(2); 
    SQL> commit; 
    SQL> create table rec_date(date_scn);


      注意:在執(zhí)行步驟3或者步驟4之前,等待5分鐘。

     ?。?/span>3)刪除記錄

    SQL> execute dbms_flashback.disable; 
    SQL> insert into rec_date select sysdate from dual; 
    SQL> commit; 
    SQL> delete from test where id=1; 
    SQL> commit;


      通過以上的操作,我們插入了兩條記錄,并刪除了其中一條記錄。在以下的操作中,我們將通過flashback query找到刪除的記錄

     ?。?/span>4)閃回查詢

    SQL> DECLARE 
    Restore_scn date; 
    BEGIN 
    Select date_scn into restore_scn from rec_date; 
    Dbms_flashback.enable_at_time (restore_scn); 
    END; 
    SQL> select * from test; 
    ID
    1
    2


      可以看出,雖然刪除記錄并提交,但是通過閃回操作,仍能查詢到刪除前的兩條記錄。需要注意Oracle5分鐘記錄一次SCN,并將SCN和對應(yīng)時間的映射進行紀(jì)錄。如果原來插入的記錄到做閃回操作的時間在5分鐘之內(nèi),用基于時間的閃回查詢可能得不到記錄,因為基于時間點的查詢實際上是轉(zhuǎn)化為最近的一次SCN,然后從這個SCN開始進行恢復(fù)。因此,如果需要精確的查詢可以采用基于SCN的閃回查詢,可精確閃回到需要恢復(fù)的時間。可以通過DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER語句獲取SCN

      Oracle 10g的閃回查詢概述

      與Oracle 9i相比Oracle 10g Flashback有了非常大的改進,從普通的Flashback Query發(fā)展到了多種形式,主要表現(xiàn)在如下幾方面新特性:

      1、Flashback Database

      Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓 數(shù)據(jù)庫前滾到當(dāng)前的前一個時間點或者SCN,而不需要做時間點的恢復(fù)。閃回數(shù)據(jù)庫可以迅速將數(shù)據(jù)庫回到誤操作或人為錯誤的前一個時間點,如Word中的"撤消"操作,可以不利用備份就快速的實現(xiàn)基于時間點的恢復(fù)。Oracle通過創(chuàng)建新的Flashback Logs(閃回日志),記錄數(shù)據(jù)庫的閃回操作。如果希望能閃回數(shù)據(jù)庫,需要設(shè)置如下參數(shù):DB_RECOVER_FILE_DEST日志的存放位置, DB_RECOVER_FILE_DEST_SIZE恢復(fù)區(qū)的大小。在創(chuàng)建數(shù)據(jù)庫的時候,Oracle將自動創(chuàng)建恢復(fù)區(qū),但默認是關(guān)閉的,需要執(zhí)行 alter database flashback on命令。

      例:執(zhí)行Flashback Database命令格式。

    SQL>flashback database to time to_timestamp(xxx);
    SQL>flashback database to scn xxx


      2、Flashback Table

      Oracle Flashback Table特性允許利用Flashback Table語句,確保閃回到表的前一個時間點。與Oracle 9i中的Flashback Query相似,利用回滾段信息來恢復(fù)一個或一些表到以前的一個時間點(一個快照)。要注意的是,Flashback Table不等于Flashback Query,Flashback Query僅僅是查詢以前的一個快照點而已,并不改變當(dāng)前表的狀態(tài),而Flashback Table將改變當(dāng)前表及附屬對象一起回到以前的時間點。

      語法:

    flashback table tablename to timestamp xxx
    flashback table tablename to scn xxx


      注意:如果需要閃回一個表,需要以下條件:
      ·需要有flashback any table的系統(tǒng)權(quán)限或者是該表的flashback對象權(quán)限;
      ·需要有該表的select,insert,delete,alter權(quán)限;
      ·必須保證該表row movement,可以使用命令alter table tablename enable row movement;

    注意:該flashback table tablename to命令不能在sys用戶下使用,即不支持sys用戶。

      例:執(zhí)行將test表閃回到200557下午3。

    SQL>flashback table test to timestamp to_timestamp(’2005-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’);


      3、Flashback Drop

      Oracle Flashback Drop特性提供一個類似回收站的功能,用來恢復(fù)不小心被刪除的表。當(dāng)刪除表時,Oracle 10g并不立刻釋放被刪除的表所占用的空間,而是將這個被刪除的表進行自動重命名(為了避免同類對象名稱的重復(fù))并放進回收站中。所謂的回收站類似于 Windows系統(tǒng)中的回收站,是一個虛擬的容器,用于存放所有被刪除的對象,在回收站中被刪除的對象將占用創(chuàng)建時的同樣的空間。如果這個被刪除的表需要進行恢復(fù),就可利用Flashback Drop功能。

      例:進行一個刪除表后恢復(fù)的簡單測試。

      (1)顯示回收站信息

    SQL>show recyclebin;


      可以看到,回收站中是沒有任何結(jié)果的,表示沒有任何表在回收站中。

      (2)創(chuàng)建一個表,并刪除,再次顯示回收站信息

    SQL>create table test_drop(name varchar2(10));
    SQL>drop table test_drop;
    SQL>show recyclebin;
    ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
    TEST_DROP BIN$b+XkkO1RS5K10uKo9BfmuA==$0 TABLE 2005-05-07:14:30:47


     ?。?/span>3)對被刪除的表進行恢復(fù)

    SQL>flashback table test_drop to before drop;
    SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;


      (4)管理回收站

      清除回收站中的單個表:purge table test_drop

      清除整個回收站:purge recyclebin

      清除不同的對象回收站:purge user_recyclebinpurge dba_recyclebin

     ?。?/span>5)確認刪除一個表

    SQL>drop table test_drop purge;


      如果刪除一個表且不放到回收站中不能進行恢復(fù),在drop語句中可以利用purge選項。

      4Flash Version Query

      Oracle Flashback Version Query特性,利用保存的回滾信息,可以看到特定的表在時間段內(nèi)的任何修改,如電影的回放一樣,可以了解表在該期間的任何變化。Flashback version query一樣依賴于AUM,提供了一個查看行改變的功能,能找到所有已經(jīng)提交了的行的記錄,分析出過去時間都執(zhí)行了什么操作。Flashback version query采用VERSIONS BETWEEN語句來進行查詢,常用的方法:

      ·VERSIONS_SCN - 系統(tǒng)改變號

      ·VERSIONS_TIMESTAMP - 時間

      例如:在test表中,時間1插入一條記錄,時間2刪除了這條記錄,對于時間3執(zhí)行select * from test當(dāng)然查詢不到這條記錄,只能看到該表最后的提交記錄。這時如果利用Flash Table或者是Flash Query,只能看到過去的某一時間點的一個快照,而利用Flashback Version Query,能夠把時間1、時間2的操作給記錄下來,并詳細的查詢出對表進行的任何操作。

    SQL>select versions_starttime,versions_endtime, versions_xid,versions_operation,id 
    from test versions 
    between timestamp minvalue and maxvalue 
    order by versions_starttime;


      在上述查詢中,列 versions_starttimeversions_endtimeversions_xidversions_operation是偽列,還有一些偽列,如versions_startscnversions_endscn顯示了該時刻的系統(tǒng)更改號。列versions_xid顯示了更改該行的事務(wù)標(biāo)識符。

      當(dāng)然,除了分析以上所有的變更之外,可以根據(jù)需要指定時間段,如顯示在2005-05-07時間在15:3016:30之間test表的所有變更。

    SQL>select id from test 
    versions between timestamp to_date(’2005-05-07 15:30:00’,’yyyy-mm-dd hh24:mi:ss’) and to_date(’2005-05-07 16:30:00’,’yyyy-mm-dd hh24:mi:ss’)


      5Flashback Transaction Query

      Oracle Flashback Transaction Query特性確保檢查數(shù)據(jù)庫的任何改變在一個事務(wù)級別,可以利用此功能進行診斷問題、性能分析和審計事務(wù)。它其實是Flashback Version Query查詢的一個擴充,Flashback Version Query說明了可以審計一段時間內(nèi)表的所有改變,但是也僅僅是能發(fā)現(xiàn)問題,對于錯誤的事務(wù),沒有好的處理辦法。而Flashback Transaction Query提供了從FLASHBACK_TRANSACTION_QUERY視圖中獲得事務(wù)的歷史以及Undo_sql(回滾事務(wù)對應(yīng)的sql語句),也就是說審計一個事務(wù)到底做了什么,甚至可以回滾一個已經(jīng)提交的事務(wù)。

      例:Flashback Transaction Query的操作實例。

     ?。?/span>1)在test表中刪除記錄,獲得事務(wù)的標(biāo)識XID,然后提交。

    SQL>delete from test where id=2;
    SQL>select xid from v$transaction;
    XID
    ----------------
    04001200AE010000
    SQL>commit;


      在測試中方便起見,在事務(wù)沒有提交的時候,獲得事務(wù)的XID04001F0035000000。實際情況下,不可能去跟蹤每個事務(wù),想要獲得已提交事務(wù)的XID,就必須通過上面的Flashback Version Query。

      (2)進行Flashback Transaction Query

    SQL>select * from FLASHBACK_TRANSACTION_QUERY
    where xid=’04001F0035000000’;
    UNDO_SQL
    insert into "FLASHTEST"."TEST"("ID") values (’2’);


      注意:這個刪除語句對應(yīng)的是1Insert語句,如果想回滾這個事務(wù),執(zhí)行這個Insert語句即可。

      可以看到,Flashback Transaction Query主要用于審計一個事務(wù),并可以回滾一個已經(jīng)提交的事務(wù)。如果確定出錯的事務(wù)是最后一個事務(wù),我們利用Flashback Table或者Flashback Query就可以解決問題。但是,如果執(zhí)行了一個錯誤的事務(wù)之后,又執(zhí)行了一系列正確的事務(wù),那么上面的方法就無能為力,利用Flashback Transaction Query可以查看或回滾這個錯誤的事務(wù)。
      結(jié)束語
      通過上面的描述,可以看出閃回功能使用戶恢復(fù)偶然的錯誤刪除更加容易,增強了系統(tǒng)的可用性與讀一致性。

    posted on 2012-05-25 09:52 ** 閱讀(215) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    收藏夾

    C#學(xué)習(xí)

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲欧洲精品| 久久亚洲精品无码观看不卡| 免费的涩涩视频在线播放| 在线视频免费国产成人| 亚洲高清国产拍精品青青草原 | 欧美在线看片A免费观看| 免费高清资源黄网站在线观看| 免费在线观看a级毛片| 久久91亚洲人成电影网站| 亚洲成人网在线观看| 午夜亚洲乱码伦小说区69堂| 中国精品一级毛片免费播放| 午夜免费1000部| 免费成人在线观看| 久久精品国产亚洲77777| 亚洲AV成人精品日韩一区| a色毛片免费视频| 欧美三级在线电影免费| 亚洲伊人成无码综合网| 亚洲一区无码中文字幕乱码| 曰批免费视频播放免费| 最近中文字幕大全免费视频| 日本19禁啪啪无遮挡免费动图| 久久久青草青青亚洲国产免观 | 国产成人亚洲精品电影| 人人玩人人添人人澡免费| 成人免费777777| 亚洲乱码精品久久久久..| 亚洲性无码AV中文字幕| 热99RE久久精品这里都是精品免费| 国产乱码免费卡1卡二卡3卡| 亚洲中文字幕成人在线| 亚洲一卡二卡三卡四卡无卡麻豆| 四虎精品成人免费视频| 国产免费毛不卡片| 亚洲国产精品无码久久一线| 亚洲s码欧洲m码吹潮| 99re在线视频免费观看| 国产亚洲精品高清在线| 亚洲色欲色欱wwW在线| 好久久免费视频高清|