資料庫負荷重放(Database replay)

llnnmc發表於2018-01-23

Oracle 11g開始支援資料庫負荷重放(Database Replay)功能,透過捕獲生產伺服器上的工作負荷,然後在測試系統上重放工作負荷,以此來幫助評估測試系統上效能的變化,輔助解決效能問題。


使用Database Replay,需要執行四個主要步驟:

1)捕獲工作負荷

2)預處理工作負荷

3)重放工作負荷

4)分析和報告


記錄過程自身在生產系統上帶來的開銷極低。但是根據捕獲時間的長短,需要保證擁有足夠的磁碟空間來儲存捕獲的工作負荷。如果磁碟空間用盡,則捕獲過程將停止。如果可能,務必在無活動會話時開始捕獲過程。雖然可以捕獲正在進行中的事務,但可能無法正常重放,因為這樣只會在目標系統重放每個正在進行的事務的一部分。捕獲操作不包含諸如SQL*Loader操作、Oracle流、閃回查詢、OCI物件導航、非基於SQL的物件訪問、遠端describecommit命令。


以下示範Database replay功能的使用:


一、生產庫上的操作


1、用syssystem使用者身份登入,建立使用者、表和目錄並授權:

sqlplus / as sysdba

grant dba to player identified by player;

create table player.t1 as select * from all_objects;

create directory play_d as 'd:\play_d';

grant all on directory play_d to public;


2、開始捕獲,兩個引數是自定義的捕獲名稱和儲存捕獲的Oracle目錄:

exec dbms_workload_capture.start_capture('cap1', 'PLAY_D');


3、以新的使用者身份連線,執行生成資料庫工作負荷的PL/SQL塊:

conn player/player


declare

    m number;

begin

    for i in 1 .. 1000 loop

        select count(1) into m from t1 where object_id = 1;

    end loop;

end;

/


4、以syssystem使用者身份連線,終止捕獲並預處理捕獲資訊為可以在目標系統上重放的重放檔案:

conn / as sysdba

exec dbms_workload_capture.finish_capture;

exec dbms_workload_replay.process_capture('PLAY_D');


二、測試庫上的操作


1、用syssystem使用者身份登入,建立使用者、表和目錄並授權,與生產庫對應:

sqlplus / as sysdba

grant dba to player identified by player;

create table player.t1 as select * from all_objects;

create directory play_d as 'd:\play_d';

grant all on directory play_d to public;


2、將生產庫play_d目錄中的內容複製到測試庫的play_d中。


3、重放的資料庫狀態準備:

exec dbms_workload_replay.initialize_replay('cap1', 'PLAY_D');

exec dbms_workload_replay.prepare_replay;


4、在作業系統命令提示符下啟動重放客戶端,重新建立所有客戶端請求。一個重放客戶端可以重放來自許多會話的語句:

C:\Users\Administrator>wrc player/player replaydir=d:\play_d


Workload Replay Client: Release 11.2.0.1.0 - Production on 星期五 1月 19 11:07:35 2018


Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


Wait for the replay to start (11:07:35)


5、回到SQL*Plus中啟動重放,這將允許建立的客戶端開始執行捕獲的工作負荷中的語句:

exec dbms_workload_replay.start_replay;


6、檢索重放報告:


首先獲取ID

select id, capture_id, directory, start_time, end_time from dba_workload_replays;


        ID CAPTURE_ID DIRECTORY                      START_TIME          END_TIME

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

         1          1 PLAY_D                         2018-01-19 03:08:54


執行檢索,可以生成HTML格式的檔案或者生成TEXT格式的檔案:

spool d:\play_d\report.html

select dbms_workload_replay.report(1, 'HTML') from dual;

spool off


根據需要,也可以用以下PL/SQL程式檢索和生成報告:

declare

    capt_dir_id number;

    curr_replay_id number;

    replay_report  clob;

begin

    capt_dir_id := dbms_workload_replay.get_replay_info(dir => 'PLAY_D');

    select max(id)

      into curr_replay_id

      from dba_workload_replays

     where capture_id = capt_dir_id;

    replay_report := dbms_workload_replay.report(replay_id => curr_replay_id,

                                                 format    => dbms_workload_replay.type_text);

end;

/


研究生成的報告,注意ReplayCaptureDB Time值:



7、以player使用者身份連線,向表中新增一個主鍵約束:

conn player/player

alter table t1 add constraint t1_pk primary key(object_id);


8、重複3456步驟,觀察重放報告中DB Time值的變化,說明定義約束後效能的提高。


9、使用delete_replay_info過程刪除重放目錄中的報告,引數中指定需要刪除的報告ID

exec dbms_workload_replay.delete_replay_info(1);


10、清理測試使用者和目錄:

drop user player cascade;

drop directory play_d;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28974745/viewspace-2150466/,如需轉載,請註明出處,否則將追究法律責任。

相關文章