database replay基礎學習
在11g中,database replay是一個很重要的新特性,按照這個特性的說法,可以完整地捕獲資料庫的負載資訊,便於在需要的時候隨時重放。
使用這種方法,可以以二進位制檔案格式捕獲 SQL 級以下的所有資料庫活動,然後在同一資料庫或不同資料庫內進行重放。
基本的流程圖如下:
自己看到這個特性也是很感興趣,然後在測試環境進行了多次測試,可能我學習的方式比較較真,對於很多知識點,都是希望先能簡單模擬,弄出個結果,然後自己才喜歡搗鼓一些細節的內容。
越是這樣做,似乎對於這個特性還是有很多的細節需要注意,總是碰到各種各樣的問題,最後都是不了了之。在很多網站,帖子中也搜了不少的相關文件,但是描述的比較全的帖子還是比較少。特意整理了一下,自己也反覆做了測試,基本能夠保證按照步驟順利完成。
首先我們需要建立一個目錄,然後賦予許可權。
create table n1.test(id number);
SQL> create directory dbplay as 'c:\test\dbreplay' ;
Directory created.
SQL> grant read,write on directory dbplay to n1;
Grant succeeded.
然後使用dbms_workload_capture來準備開始捕獲資料庫層面的負載情況,在這個例子中我們指定時長為600秒,也可以中途終止。也可以指定對於某個schema進行細粒度的捕獲。
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name => 'dbreplay_test',
dir => 'dbplay',
duration => 600);
END;
/
這個時候我們會碰到錯誤。
ERROR at line 1:
ORA-20222: Invalid DB State or Input. Input "dbplay" is not a valid DIRECTORY
object!
這個問題算比較清晰的,就是目錄名的問題,只需要改為大寫即可。
如果碰到如下的錯誤。
ERROR at line 1:
ORA-15505: cannot start workload capture because instance 1 encountered errors
while accessing directory "c:\test\dbreplay"
說明在指定的捕獲目錄下,很可能有之前捕獲的檔案,會有一定的衝突。可以清空或者換一個目錄。
開始捕獲
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name => 'dbreplay_test',
dir => 'DBPLAY',
duration => 600);
END;
/
這個時候檢視目錄中的檔案,就會發現生成了幾個資料夾,和一個.start的檔案(檔案為空),這也就標誌著捕獲開始了。
03/29/2015 09:48 PM ..
03/29/2015 09:48 PM cap
03/29/2015 09:47 PM capfiles
03/29/2015 09:47 PM wcr_cap_0000f.start
在捕獲期間,我們嘗試執行下面的一個指令碼,來進行大量的資料插入,這個語句會進行大量的硬解析,存在一定的效能隱患。
begin
for x in 1..200000 loop
insert into n1.test values(x);
commit;
end loop;
end;
/
如果時間在600秒內,完成後就會自動結束,我們也可以在中途進行手動結束捕獲。
BEGIN
DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE();
END;
/
技術捕獲後,就會發現.start檔案就會自動清除。
我們可以使用如下的指令碼來進行捕獲情況的監控。
select id,name,status,capture_size from DBA_WORKLOAD_CAPTURES;
最後我們使用如下的方法來進行檔案的預處理,處理之後就會生成一個pp開頭的目錄,我的資料庫版本是11.2的,檔案就為: pp11.2.0.1.0
BEGIN
DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (
capture_dir => 'DBPLAY');
END;
/
這個時候,捕獲工作就完成了。
如果在工作中,我們可以在測試環境中進行這些資訊的重放。這個時候就需要把捕獲目錄中的檔案都拷貝到測試機器上。
當然為了演示方便,也可以在當前的環境進行重放。
在測試機器上,我們需要建立對應的目錄,把捕獲檔案都拷貝過來。
SQL> create or replace directory target_replay as 'c:\test\target_replay';
Directory created.
SQL> grant read,write on directory target_replay to n1;
Grant succeeded.
這個時候我們需要清空表中的資料,這樣就能夠很 清楚的看到重放的過程中資料的變化。
truncate table n1.test;
開始進行初始化
BEGIN
DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (
replay_name => 'target_replay_test',
replay_dir => 'TARGET_REPLAY');
END;
/
BEGIN
DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY (synchronization => TRUE);
END;
/
這個時候檢視目錄結構,會發現又多了一個目錄rep開頭的,這個是replay初始化的時候生成的。
Directory of C:\test\target_replay
03/29/2015 09:14 PM cap
03/29/2015 09:14 PM capfiles
03/29/2015 09:14 PM pp11.2.0.1.0
03/29/2015 09:16 PM rep438010913
這個時候我們可以通過wrc來開啟重放客戶端,在另外一個視窗中執行即可。
C:\test\target_replay>wrc system/oracle mode=replay replaydir=c:\test\target_replay
Workload Replay Client: Release 11.2.0.1.0 - Production on Sun Mar 29 21:18:20 2
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Wait for the replay to start (21:18:20)
可以看到客戶端中已經開始等待重放了。
不用著急,我們在另外一個視窗中開始重放。
BEGIN
DBMS_WORKLOAD_REPLAY.START_REPLAY ();
END;
/
這個時候不間斷的檢視test表中的資料,就會發現資料在一點一點的插入。如果存在效能問題,也可以有針對性的分析。
SQL> select count(*)from n1.test;
COUNT(*)
----------
91458
SQL> /
COUNT(*)
----------
159206
SQL> /
COUNT(*)
----------
175586
SQL> /
COUNT(*)
----------
200000
我們可以最後指定重放完畢。客戶端中就會觸發退出。
BEGIN
DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY ();
END;
/
Wait for the replay to start (21:18:20)
Replay started (21:19:16)
Replay finished (21:21:11)
我們可以通過如下的語句來監控重放的情況
select id,name,status,user_calls from DBA_WORKLOAD_REPLAYS;
如果我們想得到捕獲過程中的報告,可以使用如下的方式完成。
set long 100000;
set pagesize 40000;
select dbms_workload_replay.report(2,'TEXT') from dual;
最後就是這些資訊的清理,如果已經完成了重放,分析完成了,就可以刪除這些捕獲或者重放的配置資訊。傳入的引數就是對應的id,在DBA_WORKLOAD_CAPTURES,DBA_WORKLOAD_REPLAYS中可以得到對應的id
exec dbms_workload_replay.DELETE_REPLAY_INFO(1);
exec dbms_workload_capture.DELETE_CAPTURE_INFO(1);
使用這種方法,可以以二進位制檔案格式捕獲 SQL 級以下的所有資料庫活動,然後在同一資料庫或不同資料庫內進行重放。
基本的流程圖如下:
自己看到這個特性也是很感興趣,然後在測試環境進行了多次測試,可能我學習的方式比較較真,對於很多知識點,都是希望先能簡單模擬,弄出個結果,然後自己才喜歡搗鼓一些細節的內容。
越是這樣做,似乎對於這個特性還是有很多的細節需要注意,總是碰到各種各樣的問題,最後都是不了了之。在很多網站,帖子中也搜了不少的相關文件,但是描述的比較全的帖子還是比較少。特意整理了一下,自己也反覆做了測試,基本能夠保證按照步驟順利完成。
首先我們需要建立一個目錄,然後賦予許可權。
create table n1.test(id number);
SQL> create directory dbplay as 'c:\test\dbreplay' ;
Directory created.
SQL> grant read,write on directory dbplay to n1;
Grant succeeded.
然後使用dbms_workload_capture來準備開始捕獲資料庫層面的負載情況,在這個例子中我們指定時長為600秒,也可以中途終止。也可以指定對於某個schema進行細粒度的捕獲。
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name => 'dbreplay_test',
dir => 'dbplay',
duration => 600);
END;
/
這個時候我們會碰到錯誤。
ERROR at line 1:
ORA-20222: Invalid DB State or Input. Input "dbplay" is not a valid DIRECTORY
object!
這個問題算比較清晰的,就是目錄名的問題,只需要改為大寫即可。
如果碰到如下的錯誤。
ERROR at line 1:
ORA-15505: cannot start workload capture because instance 1 encountered errors
while accessing directory "c:\test\dbreplay"
說明在指定的捕獲目錄下,很可能有之前捕獲的檔案,會有一定的衝突。可以清空或者換一個目錄。
開始捕獲
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name => 'dbreplay_test',
dir => 'DBPLAY',
duration => 600);
END;
/
這個時候檢視目錄中的檔案,就會發現生成了幾個資料夾,和一個.start的檔案(檔案為空),這也就標誌著捕獲開始了。
03/29/2015 09:48 PM
03/29/2015 09:48 PM
03/29/2015 09:47 PM
03/29/2015 09:47 PM
在捕獲期間,我們嘗試執行下面的一個指令碼,來進行大量的資料插入,這個語句會進行大量的硬解析,存在一定的效能隱患。
begin
for x in 1..200000 loop
insert into n1.test values(x);
commit;
end loop;
end;
/
如果時間在600秒內,完成後就會自動結束,我們也可以在中途進行手動結束捕獲。
BEGIN
DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE();
END;
/
技術捕獲後,就會發現.start檔案就會自動清除。
我們可以使用如下的指令碼來進行捕獲情況的監控。
select id,name,status,capture_size from DBA_WORKLOAD_CAPTURES;
最後我們使用如下的方法來進行檔案的預處理,處理之後就會生成一個pp開頭的目錄,我的資料庫版本是11.2的,檔案就為: pp11.2.0.1.0
BEGIN
DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (
capture_dir => 'DBPLAY');
END;
/
這個時候,捕獲工作就完成了。
如果在工作中,我們可以在測試環境中進行這些資訊的重放。這個時候就需要把捕獲目錄中的檔案都拷貝到測試機器上。
當然為了演示方便,也可以在當前的環境進行重放。
在測試機器上,我們需要建立對應的目錄,把捕獲檔案都拷貝過來。
SQL> create or replace directory target_replay as 'c:\test\target_replay';
Directory created.
SQL> grant read,write on directory target_replay to n1;
Grant succeeded.
這個時候我們需要清空表中的資料,這樣就能夠很 清楚的看到重放的過程中資料的變化。
truncate table n1.test;
開始進行初始化
BEGIN
DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (
replay_name => 'target_replay_test',
replay_dir => 'TARGET_REPLAY');
END;
/
BEGIN
DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY (synchronization => TRUE);
END;
/
這個時候檢視目錄結構,會發現又多了一個目錄rep開頭的,這個是replay初始化的時候生成的。
Directory of C:\test\target_replay
03/29/2015 09:14 PM
03/29/2015 09:14 PM
03/29/2015 09:14 PM
03/29/2015 09:16 PM
這個時候我們可以通過wrc來開啟重放客戶端,在另外一個視窗中執行即可。
C:\test\target_replay>wrc system/oracle mode=replay replaydir=c:\test\target_replay
Workload Replay Client: Release 11.2.0.1.0 - Production on Sun Mar 29 21:18:20 2
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Wait for the replay to start (21:18:20)
可以看到客戶端中已經開始等待重放了。
不用著急,我們在另外一個視窗中開始重放。
BEGIN
DBMS_WORKLOAD_REPLAY.START_REPLAY ();
END;
/
這個時候不間斷的檢視test表中的資料,就會發現資料在一點一點的插入。如果存在效能問題,也可以有針對性的分析。
SQL> select count(*)from n1.test;
COUNT(*)
----------
91458
SQL> /
COUNT(*)
----------
159206
SQL> /
COUNT(*)
----------
175586
SQL> /
COUNT(*)
----------
200000
我們可以最後指定重放完畢。客戶端中就會觸發退出。
BEGIN
DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY ();
END;
/
Wait for the replay to start (21:18:20)
Replay started (21:19:16)
Replay finished (21:21:11)
我們可以通過如下的語句來監控重放的情況
select id,name,status,user_calls from DBA_WORKLOAD_REPLAYS;
如果我們想得到捕獲過程中的報告,可以使用如下的方式完成。
set long 100000;
set pagesize 40000;
select dbms_workload_replay.report(2,'TEXT') from dual;
最後就是這些資訊的清理,如果已經完成了重放,分析完成了,就可以刪除這些捕獲或者重放的配置資訊。傳入的引數就是對應的id,在DBA_WORKLOAD_CAPTURES,DBA_WORKLOAD_REPLAYS中可以得到對應的id
exec dbms_workload_replay.DELETE_REPLAY_INFO(1);
exec dbms_workload_capture.DELETE_CAPTURE_INFO(1);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1478096/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel核心程式碼學習 -- Database 基礎介紹LaravelDatabase
- 強化學習(十一) Prioritized Replay DQN強化學習Zed
- 免殺學習-基礎學習
- Linux基礎學習——檔案基礎Linux
- python基礎學習Python
- Redis 基礎學習Redis
- Linux基礎學習Linux
- Docker 基礎學習Docker
- Flume基礎學習
- 【Vue學習】基礎Vue
- jQuery基礎學習jQuery
- Scala基礎學習
- kafka基礎學習Kafka
- Zookeeper 基礎學習
- 深度學習基礎深度學習
- 學習linux基礎Linux
- Pandas基礎學習
- 【機器學習基礎】神經網路/深度學習基礎機器學習神經網路深度學習
- Python基礎學習篇Python
- Zookeeper學習——基礎框架框架
- python基礎學習1Python
- linux基礎命令學習Linux
- python基礎學習2Python
- 深度學習--RNN基礎深度學習RNN
- redis學習——基礎指令Redis
- YII-基礎學習
- python基礎學習五Python
- opencv學習之基礎OpenCV
- Spring Boot 學習-基礎Spring Boot
- [pwn基礎]Pwntools學習
- 遙感基礎學習
- SQL學習___01:基礎SQL
- Linux基礎學習-Docker學習筆記LinuxDocker筆記
- 機器學習基礎——整合學習1機器學習
- ARCore學習之旅:基礎概念
- CSS 基礎學習筆記CSS筆記
- Spark學習(二)——RDD基礎Spark
- DL-深度學習基礎深度學習
- java基礎學習(目錄)Java