Database Replay和Consolidated Database replay

来源:http://www.cnblogs.com/raobing/archive/2017/01/06/6255844.html
-Advertisement-
Play Games

在資料庫的遷移和升級場景中,我們經常會遇到一個問題:在做壓力測試時,如何模擬真實的業務壓力,解決這個問題的方法有很多,比如:應用方開發模擬程式或者使用壓力測試工具模擬,如load runner,但是,如果要說哪種方法能最大限度地模擬真實業務壓力,我認為還是Oracle的Database Replay ...


簡介

在資料庫的遷移和升級場景中,我們經常會遇到一個問題:在做壓力測試時,如何模擬真實的業務壓力,解決這個問題的方法有很多,比如:應用方開發模擬程式或者使用壓力測試工具模擬,如load runner,但是,如果要說哪種方法能最大限度地模擬真實業務壓力,我認為還是Oracle的Database Replay(資料庫重放)功能,Database Replay功能是Real Application Testing的一部分,它的基本原理圖如下:

簡單說,Database Replay可以在生產資料庫上“捕獲”負載(workload capture),保存成一定格式的二進位文件。將保存的負載文件複製到測試環境,經過一定的處理後,就可以在測試環境“重放”負載(workload replay),從而達到模擬真實壓力,進行壓力測試的目的。

Database Replay是11g才有的特性,但是,負載的捕獲,支持10.2.0.4之後的資料庫,這一點也正好符合國內很多客戶的需求,因為國內還有相當一部分客戶,因為穩妥起見,系統還都一直運行在10gR2版本的Oracle資料庫上,都有升級的需求。

Consolidated Database Replay 是11.2.0.2之後才出現的功能,字面意思是整合的資料庫重放,它可以將不同系統“捕獲”的負載,整合到一起重放,適用於資料庫整合測試和Scale-Up測試。

後面我們用實驗來詳細介紹一下Database Replay的相關功能,實驗採用10.2.0.5作為負載的捕獲端,用12.1.0.2作為負載的重放端。

準備工作(安裝Database Replay相關補丁)

首先要根據文檔 Mandatory Patches for Database Testing Functionality for Current and Earlier Releases (Doc ID 560977.1),檢查該打的補丁是否打過了。捕獲端和重放端都要打。

負載的捕獲

捕獲端是一個安裝在OL5.9上的10.2.0.5,資料庫SID是test1.

創建目錄

在OS創建目錄並創建相應的資料庫目錄對象,用於保存負載數據:

$ cd /u01/app/oracle

$ mkdir wrc_dir1

SQL>CREATE OR REPLACE DIRECTORY wrc_dir1 AS '/u01/app/oracle/wrc_dir1/';

打開10gR2的Workload Capture 支持

雖然Database Replay支持10.2.0.4以上的版本進行負載“捕獲”,但是10gR2的資料庫要想正常使用這個功能,需要對資料庫設置一個初始化參數,聯機文檔上講需要運行腳本$ORACLE_HOME/rdbms/admin/wrrenbl.sql,其實這個腳本只做一件事,就是設置初始化參數PRE_11G_ENABLE_CAPTURE=true。

[oracle@test10g ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.5.0 - Production on Fri Dec 23 10:57:26 2016

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> @?/rdbms/admin/wrrenbl.sql

SQL> SET FEEDBACK 1

SQL> SET NUMWIDTH 10

SQL> SET LINESIZE 80

SQL> SET TRIMSPOOL ON

SQL> SET TAB OFF

SQL> SET PAGESIZE 100

SQL> alter system set PRE_11G_ENABLE_CAPTURE=true sid='*';

System altered.

修改後需要重啟資料庫,不僅僅為了讓參數生效,也是為了讓所有會話都重新連接。

創建實驗用戶和對象

創建資料庫用戶app1,併在app1 schema中創建表test_table1:

SQL>create table test_table1 (col1 number, col2 varchar2(20));

開始捕獲負載

使用sys用戶執行:

BEGIN

DBMS_WORKLOAD_CAPTURE.start_capture (name => 'test1_cap',

dir => 'WRC_DIR1',

duration => NULL);

END;

/

模擬負載

使用app1 用戶登錄資料庫,執行:

begin

for i in 1..10000 loop

insert into test_table1 values(i,'test1:'||i);

end loop;

commit;

end;

/

在test_table1表中插入10000條記錄。

然後斷開會話。

停止捕獲負載

SQL>exec dbms_workload_capture.finish_capture;

負載的重放

重放端是一個安裝在OL7.1上的12.1.0.2資料庫,資料庫SID是test3。

準備工作

創建目錄及資料庫對象:

$ mkdir –p /u01/app/oracle/con_dir/wrc_dir1

SQL>CREATE OR REPLACE DIRECTORY wrc_dir1 AS '/u01/app/oracle/con_dir/wrc_dir1/';

複製捕獲的負載文件到/u01/app/oracle/con_dir/wrc_dir1下。

在重放端創建app1用戶,並創建和捕獲端相同結構的表test_table1。

處理負載文件

用SYS用戶執行:

BEGIN

DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (capture_dir => 'WRC_DIR1', parallel_level=>1);

END;

/

BEGIN

DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (replay_name => 'replay1',

replay_dir => 'WRC_DIR1');

END;

/

exec dbms_workload_replay.prepare_replay ;

啟動WRC客戶端

WRC客戶端是負責讀取負載文件,重放負載的程式主體。重放除了在SQL環境中發出指令,還需要WRC客戶端的配合。啟動WRC客戶端的命令:

$ wrc system/welcome1 mode=replay replaydir=./wrc_dir1

啟動重放

SQL> exec dbms_workload_replay.start_replay;

WRC客戶端退出才標誌重放完成,下麵是實際執行的輸出:

[oracle@ol71vm1 con_dir]$ wrc system/welcome1 mode=replay replaydir=./wrc_dir1

Workload Replay Client: Release 12.1.0.2.0 - Production on Sun Jan 1 20:46:15 2017

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

Wait for the replay to start (20:46:15)

Replay client 1 started (20:46:45)

Replay client 1 finished (20:50:27)

這時我們能夠看到重放端app1用戶test_table1表中被插入了10000條記錄,說明負載被正確地重放了。

另外,完成後可以查看重放報告,取得報告的命令:

SQL>set pagesize 0 long 30000000 longchunksize 2000 linesize 155

SQL>select DBMS_WORKLOAD_REPLAY.REPORT(replay_id => 71, format => 'HTML') from dual;

當然,要想做更詳細的分析,還是看相應時間段的AWR報告比較好。

Consolidated Database Replay
整合場景

比如有兩個APP,分別運行在不同的資料庫上,客戶希望將兩個應用整合到一個資料庫上,但是不知道新資料庫是否能承受住壓力。那麼就可以用Consolidated Database Replay來模擬測試一下。

捕獲端準備工作

前面的例子我們做的捕獲是從資料庫test1上做的,我們再創建另一個10.2.0.5的資料庫叫test2,在test2上也捕獲一份負載。

$ cd /u01/app/oracle

$ mkdir wrc_dir2

在test2資料庫中執行:

SQL>CREATE OR REPLACE DIRECTORY wrc_dir2 AS '/u01/app/oracle/wrc_dir2/';

創建資料庫用戶app2,併在app2 schema中創建表test_table2:

SQL>create table test_table2 (col1 number, col2 varchar2(20));

修改初始化參數,重啟test2資料庫。

開始捕獲

用戶SYS用戶執行:

BEGIN

DBMS_WORKLOAD_CAPTURE.start_capture (name => 'test2_cap',

dir => 'WRC_DIR2',

duration => NULL);

END;

/

模擬壓力

用app2用戶登錄資料庫test2,執行下麵的腳本模擬壓力:

begin

for i in 1..10000 loop

insert into test_table2 values(i,'test2:'||i);

end loop;

commit;

end;

/

然後斷開連接。

停止捕獲

SQL>exec dbms_workload_capture.finish_capture;

重放端準備工作

我們還是使用前面實驗用過的OL7.1上的12.1.0.2的這個環境,使用test3這個資料庫。

創建Consolidated database replay目錄:

SQL>CREATE OR REPLACE DIRECTORY con_dir AS '/u01/app/oracle/con_dir/';

創建存放test2負載的目錄wrc_dir2。(wrc_dir1在前面的實驗里已經創建過了。)

$ cd /u01/app/oracle/con_dir

$ mkdir wrc_dir2

SQL>CREATE OR REPLACE DIRECTORY wrc_dir2 AS '/u01/app/oracle/con_dir/wrc_dir2/';

WRC_DIR1和WRC_DIR2都是CON_DIR的子目錄。

在資料庫test3上創建app2用戶,並創建和捕獲端相同結構的表test_table2。

(app1用戶和test_table1已經在上個實驗中創建在資料庫test3上了)

處理負載並設置重放時間表

使用SYS用戶執行:

SQL>exec dbms_workload_replay.set_replay_directory('CON_DIR');

SQL>exec dbms_workload_replay.begin_replay_schedule('S1'); -- S1是給時間表起的名字

SQL>select dbms_workload_replay.add_capture('WRC_DIR1') from dual;

SQL>select dbms_workload_replay.add_capture('WRC_DIR2') from dual;

SQL>exec dbms_workload_replay.end_replay_schedule; -- 保存重放時間表

SQL>exec dbms_workload_replay.initialize_consolidated_replay('CR1','S1');

SQL>exec dbms_workload_replay.prepare_consolidated_replay (synchronization => 'OBJECT_ID');

-- 參數synchronization決定replay重放負載的方式,OBJECT_ID代表replay重放負載時,對象上的操作順序,在對象及被引用的對象範圍內,保證和捕獲時的順序一致。

啟動WRC客戶端

因為是2個不同的負載,所以需要啟動至少2個WRC客戶端

$ wrc system/welcome1 mode=replay replaydir=/u01/app/oracle/con_dir &

$ wrc system/welcome1 mode=replay replaydir=/u01/app/oracle/con_dir &

啟動重放

用SYS用戶執行:

SQL>exec dbms_workload_replay.start_consolidated_replay;

完成重放後,我們可以看到,在資料庫test3中app1和app2兩個用戶下的test_table1和test_table2表中都被插入了10000條記錄,證明負載被正確地重放了。

Scale-Up場景

有的時候,我們想知道未來業務量增長了,資料庫是否能承受的了,比如模擬測試未來業務增加一倍的情況,也可以使用Consolidated Database Replay。這樣使用的最簡單方式就是一份捕獲,複製多份,同時replay。

比如上面的實驗,從test1庫上捕獲的負載,我們可以複製2份,分別放在WRC_DIR1和WRC_DIR2中,其他步驟完全一樣,當我們重放時,就是執行了雙份的test1上捕獲的負載。

實際效果就是,app1用戶下的test_table1表中被插入了20000條記錄。

當然,Scale-Up並不只是這麼簡單,相應的還有Time Shifting,就是通過調整時間,讓多個負載的高峰重合到一起,還有Workload Folding,就是將一個負載,分成不同的時間段,然後將不同時間段的負載並行執行。篇幅有限,留待大家自己研究了。

常見問題:

如果出現沒有任何報錯,但是重放端不重放負載的情況,可能是WRC客戶端有問題,可以嘗試在重放端,重新編譯WRC客戶端:

$ cd $ORACLE_HOME/rdbms/lib

$ make -f ins_rdbms.mk iwrc


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 彙總篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件組的概念:http://www.cnblogs.com/dunitian/p/5276431.html 上次說了其他的解決方案(http://www.cnblogs.com/ ...
  • SQL Server 2008 R2安裝時選擇的是windows身份驗證,未選擇混合身份驗證的解決辦法。 ...
  • 1. 本月的第一天SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2. 本月的最後一天SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 3.上個月的第一天select dat ...
  • --但是索引本質到底是什麼? --百度百科: --索引是為了加速對錶中數據行的檢索而創建的一種分散的存儲結構。索引是針對錶而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。 --在資料庫關係圖中,可以在選定表的“索引/鍵”屬性頁中創建、編輯或刪除 ...
  • 1.前言 上篇 寫出易調試的SQL , 帶來了一些討論, 暴露了不能重用執行計劃和sql註入問題, 十分感謝園友們的建議 . 經過調整後 ,將原來的SQLHelper 抓SQL 用做調試環境用, 發佈環境還是走Dapper的參數化查詢, 保持原有優勢. 見如下代碼. 2. 在開發調試階段 抓最終SQ ...
  • 該視頻意在讓所有學員一次通過考試,避免重覆考試而承擔的巨額考試費用! 目前MongDB發展迅猛,有趕超mysql,和oracle看齊的苗頭。在這個時候MongoDB也適時的推出了官方的認證考試“MongoDB Certified DBA Associate Level”。該證書和OCP一樣,值得擁有 ...
  • 在逝去的2016後半年,由於項目需要支持數據的快速更新和多用戶的高併發負載,我試水SQL Server 2016的In-Memory OLTP,創建記憶體資料庫實現項目的負載需求,現在項目接近尾聲,系統運行穩定,寫一篇博客,記錄一下使用記憶體資料庫的經驗。 SQL Server 2016的In-Memo ...
  • 大數據離線部分 1、HDFS 1:HDFS的架構部分及工作原理 NameNode:負責管理元素據,將信息保存在記憶體中 DataNode:保存數據,以塊的形式保存。啟動後需要定時的向NameNode發送心跳,報告自身存儲的塊信息 2:HDFS的上傳過程 3:HDFS的下載 4:NameNode的元數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...