二.Database Replay 示例 2.1 捕获(Capture) --生产库 DBMS_WORKLOAD_CAPTURE包提供了一些列的过程和函数来控制capture 进程。 2.1.1 创建目录存放capture 日志 在生产库上创建如下目录: [root@dave ~]# su - oracle [oracle@dave ~]$ mkdir /oracle/app/oracle/db_replay_capture 连接实例,创建directory: [oracle@dave ~]$ ora si SQL*Plus: Release 11.2.0.3.0 Production onWed Oct 10 18:57:05 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Miningand Real Application Testing options SQL> CREATE OR REPLACE DIRECTORY db_replay_capture_dir AS ‘/oracle/app/oracle/db_replay_capture/‘; Directory created. SQL> SHUTDOWN IMMEDIATE Database closed. Database dismounted. ORACLE instance shut down. SQL> STARTUP ORACLE instance started. Total System Global Area 730714112 bytes Fixed Size 2231952 bytes Variable Size 285213040 bytes Database Buffers 419430400 bytes Redo Buffers 23838720 bytes Database mounted. Database opened. SQL> 注意: 这里的shutdown 和startup 操作不是必须的操作。 但是Oracle 建议我们执行这个操作。 这样可以确保我们在开始captureprocess 之前,其他的outstanding processes已经执行完毕。 2.1.2 创建Filter 结合ADD_FILTER 过程和START_CAPTURE 过程的DEFAULT_ACTION 参数,通过对如下属性的including或者excluding的设置,来定制我们自己的workload。 (1) INSTANCE_NUMBER (2) USER (3) MODULE (4) ACTION (5) PROGRAM (6) SERVICE Add_filer的使用示例: SQL> exec dbms_workload_capture.ADD_FILTER( fname IN VARCHAR2, fattribute IN VARCHAR2,fvalue IN VARCHAR2); fname=Name of the filter. fattribute=Attribute on which the filter will be applied i.e USER, PROGRAM,INSTANCE_NUMBER etc. --就是我们上面列的6个属性。 fvalue= value for the corresponding attribute. 如: SQL > exec dbms_workload_capture.ADD_FILTER(fname =>‘FILTER_DAYU‘,fattribute => ‘USER‘,fvalue => ‘DAYU‘); 这里为了简单,假设我们capture 所有的信息,就跳过add_filter 的设置。 2.1.3 运行Capture 运行START_CAPTURE 过程时,需要指定capture 名称,directory 和capture 进程运行的时间。 如果duration设置为NULL,则captureprocess 必须等我们手工调用FINISH_CAPTURE 过程来结束。 具体操作如下: BEGIN DBMS_WORKLOAD_CAPTURE.start_capture (name => ‘test_capture_1‘, dir =>‘DB_REPLAY_CAPTURE_DIR‘, duration => NULL); END; / PL/SQL procedure successfully completed. --运行这个过程,必须要具有SYSDBA和SYSOPER的用户来执行。 2.1.4 做一些变更操作 --创建用户: SQL> CREATE USER anqing IDENTIFIED BY anqing QUOTA UNLIMITED ON users; User created. SQL> GRANT CONNECT, CREATE TABLE TO anqing; Grant succeeded. --插入数据: SQL> conn anqing/anqing; Connected. CREATE TABLE db_replay_test_tab (id NUMBER, description VARCHAR2(50), CONSTRAINT db_replay_test_tab_pk PRIMARY KEY (id) ); Table created. BEGIN FOR i IN 1 .. 500000 LOOP INSERT INTO db_replay_test_tab (id, description) VALUES (i, ‘Description for‘ || i); END LOOP; COMMIT; END; / PL/SQL procedure successfully completed. 2.1.5 停止 capture SQL> conn / as sysdba Connected. BEGIN DBMS_WORKLOAD_CAPTURE.finish_capture; END; / PL/SQL procedure successfully completed. 2.1.6 检查capture 目录 [oracle@dave ~]$ cd /oracle/app/oracle/db_replay_capture [oracle@dave db_replay_capture]$ ls cap capfiles [oracle@dave db_replay_capture]$ cd cap [oracle@dave cap]$ ls wcr_cr.html wcr_cr.text wcr_fcapture.wmd wcr_scapture.wmd [oracle@dave cap]$ cd .. [oracle@dave db_replay_capture]$ tree . |-- cap | |-- wcr_cr.html | |-- wcr_cr.text | |-- wcr_fcapture.wmd | `-- wcr_scapture.wmd `-- capfiles `-- inst1 |-- aa | |-- wcr_7aq7rh000000c.rec | |-- wcr_7aq8qh000000d.rec | `-- wcr_7aqfhh000000r.rec |-- ab |-- ac |-- ad |-- ae |-- af |-- ag |-- ah |-- ai `-- aj 13 directories, 7 files [oracle@dave db_replay_capture]$ 当capture process 进程正在运行时会生成2个文件: wcr_scapture.wmd 和 wcr_cap_000xx.start。 当finish capture后,还会得到得到另外2个文件: wcr_cr.html 和 wcr_cr.text,wcr_cr.html 文件和 AWR report 类似。 2.1.7 获取capture ID 有两种方法: (1)使用GET_CAPTURE_INFO 函数 SQL> SELECT DBMS_WORKLOAD_CAPTURE.get_capture_info(‘DB_REPLAY_CAPTURE_DIR‘) FROM dual; DBMS_WORKLOAD_CAPTURE.GET_CAPTURE_INFO(‘DB_REPLAY_CAPTURE_DIR‘) --------------------------- 1 (2)使用DBA_WORKLOAD_CAPTURES视图 SQL> COLUMN name FORMAT A30 SQL> SELECT id, name FROMdba_workload_captures; ID NAME ---------- ------------------------------ 1 test_capture_1 SQL> desc dba_workload_captures Name Null? Type ------------------------------------------------- ---------------------------- ID NOTNULL NUMBER NAME NOT NULLVARCHAR2(100) DBID NOT NULLNUMBER DBNAME NOT NULLVARCHAR2(10) DBVERSION NOT NULL VARCHAR2(30) PARALLEL VARCHAR2(3) DIRECTORY NOT NULLVARCHAR2(30) STATUS NOT NULLVARCHAR2(40) START_TIME NOT NULL DATE END_TIME DATE DURATION_SECS NUMBER START_SCN NOT NULLNUMBER END_SCN NUMBER DEFAULT_ACTION NOT NULLVARCHAR2(30) FILTERS_USED NUMBER CAPTURE_SIZE NUMBER DBTIME NUMBER DBTIME_TOTAL NUMBER USER_CALLS NUMBER USER_CALLS_TOTAL NUMBER USER_CALLS_UNREPLAYABLE NUMBER TRANSACTIONS NUMBER TRANSACTIONS_TOTAL NUMBER CONNECTS NUMBER CONNECTS_TOTAL NUMBER ERRORS NUMBER AWR_DBID NUMBER AWR_BEGIN_SNAP NUMBER AWR_END_SNAP NUMBER AWR_EXPORTED VARCHAR2(12) ERROR_CODE NUMBER ERROR_MESSAGE VARCHAR2(300) DIR_PATH NOT NULLVARCHAR2(4000) DIR_PATH_SHARED NOT NULLVARCHAR2(10) LAST_PROCESSED_VERSION VARCHAR2(30) SQLSET_OWNER VARCHAR2(30) SQLSET_NAME VARCHAR2(30) DBA_WORKLOAD_CAPTURES 视图包含了capture 进程的一些信息,我们可以通过查询该视图来获取capture 的信息。或者,我们也可以使用report 函数生成一个text 或者html 格式的报告来查看。 如下: DECLARE l_report CLOB; BEGIN l_report := DBMS_WORKLOAD_CAPTURE.report(capture_id => 1, format =>DBMS_WORKLOAD_CAPTURE.TYPE_HTML); END; / 并且使用这个capture ID,也可以导出该Capture ID 对应的AWR 快照。如: BEGIN DBMS_WORKLOAD_CAPTURE.export_awr (capture_id => 1); END; / 该过程执行时,会生成2个文件:wcr_ca.dmp 和 wcr_ca.log。 查看capture 目录,会显示多一个dump和相关的log 文件: [oracle@dave db_replay_capture]$ tree . |-- cap | |-- wcr_ca.dmp | |-- wcr_ca.log | |--wcr_cr.html | |-- wcr_cr.text | |-- wcr_fcapture.wmd | `-- wcr_scapture.wmd `-- capfiles `-- inst1 |-- aa | |-- wcr_7aq7rh000000c.rec | |-- wcr_7aq8qh000000d.rec | `-- wcr_7aqfhh000000r.rec |-- ab |-- ac |-- ad |-- ae |-- af |-- ag |-- ah |-- ai `-- aj 13 directories, 9 files 2.2 处理工作量(WorkloadPreprocessing)--测试库 2.2.1 创建目录并copy capture 文件 在测试库上创建目录,并将生产库上产生的capture 文件copy 过来。 [oracle@dave ~]$ mkdir /oracle/app/oracle/db_replay_capture [oracle@dave ~]$ scp -r 192.168.8.100:/oracle/app/oracle/db_replay_capture/* /oracle/app/oracle/db_replay_capture oracle@192.168.1.10‘s password: wcr_scapture.wmd 100% 98 0.1KB/s 00:00 wcr_cap_uc_graph.extb 100% 12KB 12.0KB/s 00:00 wcr_fcapture.wmd 100% 188 0.2KB/s 00:00 wcr_cr.html 100% 30KB 29.6KB/s 00:00 wcr_ca.dmp 100% 7288KB 7.1MB/s 00:01 wcr_ca.log 100% 15KB 15.2KB/s 00:00 wcr_cr.text 100% 11KB 10.6KB/s 00:00 wcr_7aq8qh000000d.rec 100% 4020 3.9KB/s 00:00 wcr_7aq7rh000000c.rec 100%1984 1.9KB/s 00:00 wcr_7aqfhh000000r.rec 100% 1614 1.6KB/s 00:00 [oracle@dave ~]$ cd/oracle/app/oracle/db_replay_capture/ [oracle@dave db_replay_capture]$ tree . |-- cap | |-- wcr_ca.dmp | |-- wcr_ca.log | |-- wcr_cr.html | |-- wcr_cr.text | |-- wcr_fcapture.wmd | `-- wcr_scapture.wmd `-- capfiles `-- inst1 |-- aa | |-- wcr_7aq7rh000000c.rec | |-- wcr_7aq8qh000000d.rec | `-- wcr_7aqfhh000000r.rec |-- ab |-- ac |-- ad |-- ae |-- af |-- ag |-- ah |-- ai `-- aj 13 directories, 9 files 2.2.2 实例中创建directory [oracle@dave ~]$ ora si SQL*Plus: Release 11.2.0.3.0 Production onWed Oct 10 19:54:27 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Miningand Real Application Testing options SQL> CREATE OR REPLACE DIRECTORY db_replay_capture_dir AS ‘/oracle/app/oracle/db_replay_capture/‘; Directory created. 2.2.3 处理工作量 使用PROCESS_CAPTURE过程来准备capture logs。 BEGIN DBMS_WORKLOAD_REPLAY.process_capture(‘DB_REPLAY_CAPTURE_DIR‘); END; / 执行完毕后,会生成wcr_process.wmd,wcr_login.pp, wcr_seq_data.extb, wcr_scn_order.extb , wcr_conn_data.extb等文件。 [oracle@dave db_replay_capture]$ tree . |-- cap | |-- wcr_ca.dmp | |-- wcr_ca.log | |-- wcr_cr.html | |-- wcr_cr.text | |-- wcr_fcapture.wmd | `-- wcr_scapture.wmd |-- capfiles | `-- inst1 | |-- aa | | |-- wcr_7aq7rh000000c.rec | | |-- wcr_7aq8qh000000d.rec | | `-- wcr_7aqfhh000000r.rec | |-- ab | |-- ac | |-- ad | |-- ae | |-- af | |-- ag | |-- ah | |-- ai | `-- aj |-- pp11.2.0.3.0 | |-- wcr_calibrate.xml | |-- wcr_commits.extb | |-- wcr_conn_data.extb | |-- wcr_data.extb | |-- wcr_dep_graph.extb | |-- wcr_login.pp | |-- wcr_process.wmd | |-- wcr_references.extb | |-- wcr_scn_order.extb | `-- wcr_seq_data.extb `-- rep35546834 15 directories, 19 files 2.3 重演(Replay)--测试库 2.3.1 使用wrc 工具效验 效验结果会显示完成replay需要replayclents和hosts的数量。 [oracle@dave /]$ wrc mode=calibratereplay dir=/oracle/app/oracle/db_replay_capture Workload Replay Client: Release 11.2.0.3.0- Production on Wed Oct 10 20:12:32 2012 Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved. Report for Workload in:/oracle/app/oracle/db_replay_capture ----------------------- Recommendation: Consider using at least 1clients divided among 1 CPU(s) You will need at least 3 MB of memory perclient process. If your machine(s) cannot match thatnumber, consider using more clients. Workload Characteristics: - max concurrency: 1 sessions - total number of sessions: 3 Assumptions: - 1 client process per 50 concurrentsessions - 4 client process per CPU - 256 KB of memory cache per concurrentsession - think time scale = 100 - connect time scale = 100 - synchronization = TRUE 2.3.2 开始replay 在上面的效验结果,显示一个CPU 上建议一个clint,所以我们这里开始一个replay clint。 --使用Initializing replay 装载metadata到tables里: EXEC DBMS_WORKLOAD_REPLAY.initialize_replay (replay_name => ‘test_capture_1‘, replay_dir => ‘DB_REPLAY_CAPTURE_DIR‘); --将数据改成PREPARE REPLAY 模式: exec DBMS_WORKLOAD_REPLAY.prepare_replay (synchronization => TRUE); --检查replay的状态: SQL> set lin 160 SQL> col name for a20 SQL> col status for a20 SQL> select name,status from dba_workload_replays; NAME STATUS -------------------- -------------------- test_capture_1 PREPARE [oracle@dave /]$ wrc system/oracle mode=replay replaydir=/oracle/app/oracle/db_replay_capture Workload Replay Client: Release 11.2.0.3.0- Production on Wed Oct 10 20:31:39 2012 Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved. Wait for the replay to start (20:38:31) --执行之后,replay client 被暂停,并等待start replay 。 另开一个sqlplus 窗口执行如下命令: SQL> exec DBMS_WORKLOAD_REPLAY.START_REPLAY (); SQL> select name,status from dba_workload_replays; NAME STATUS -------------------- -------------------- test_capture_1 IN PROGRESS --如果希望在完成replay 前stop replay过程,调用CANCEL_REPLAY 过程即可。 SQL> exec DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY (); --取消后在replay client 窗口会显示: Errors in file : ORA-15509: workload replay has beencancelled --返回replay clint窗口,等dba_workload_replays中的状态变成compelte就完成replay。此时replayclient会显示操作开始和结束的时间: [oracle@dave /]$ wrc system/oracle mode=replay replaydir=/oracle/app/oracle/db_replay_capture Workload Replay Client: Release 11.2.0.3.0- Production on Wed Oct 10 20:38:31 2012 Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved. Wait for the replay to start (20:38:31) Replay started (20:38:46) Replay finished(20:45:12) --插曲: 我这里在第一次进行replay的时候,失败,replay client 显示: Errors in file : ORA-15568: login of user ANQING duringworkload replay failed with ORA-1435 [oracle@dave db_replay_capture]$ oerr ora1435 01435, 00000, "user does notexist" // *Cause: // *Action: 这里提示anqing的用户不存在,根据签名的说明,database replay 是支持DDL操作的。 后来我手工在测试库上创建了用户,然后重新进行了一次replay,才成功。 2.3.3 验证replay SQL> conn anqing/anqing; Connected. SQL> select count(1) from db_replay_test_tab; COUNT(1) ---------- 500000 这里数据是ok的。 2.3.4 查看replay 信息 可以使用DBA_WORKLOAD_REPLAYS视图来查看replay 进程的相关信息,并根据capture ID 生成报告。 SQL> conn /as sysdba Connected. SQL> COLUMNname FORMAT A30 SQL> SELECTid, name FROM dba_workload_replays; ID NAME ---------------------------------------- 1 test_capture_1 12 test_capture_1 21 test_capture_1 33 test_capture_1 --生成报告: DECLARE l_report CLOB; BEGIN l_report := DBMS_WORKLOAD_REPLAY.report(replay_id => 33, format =>DBMS_WORKLOAD_REPLAY.TYPE_HTML); END; / --capture 目录: [oracle@dave db_replay_capture]$ tree . |-- cap | |-- wcr_ca.dmp | |-- wcr_ca.log | |-- wcr_cr.html | |-- wcr_cr.text | |-- wcr_fcapture.wmd | `-- wcr_scapture.wmd |-- capfiles | `-- inst1 | |-- aa | | |-- wcr_7aq7rh000000c.rec | | |-- wcr_7aq8qh000000d.rec | | `-- wcr_7aqfhh000000r.rec | |-- ab | |-- ac | |-- ad | |-- ae | |-- af | |-- ag | |-- ah | |-- ai | `-- aj |-- pp11.2.0.3.0 | |-- wcr_calibrate.xml | |-- wcr_commits.extb | |-- wcr_conn_data.extb | |-- wcr_data.extb | |-- wcr_dep_graph.extb | |-- wcr_login.pp | |-- wcr_process.wmd | |-- wcr_references.extb | |-- wcr_scn_order.extb | `-- wcr_seq_data.extb |-- rep35546834 | |-- wcr_ra_35546834.dmp | |-- wcr_ra_35546834.log | |-- wcr_replay.wmd | |-- wcr_rep_uc_graph_35546834.extb | `-- wcr_rr_35546834.xml |-- rep650437870 | |-- wcr_ra_650437870.dmp | |-- wcr_ra_650437870.log | |-- wcr_replay.wmd | |-- wcr_rep_uc_graph_650437870.extb | `-- wcr_rr_650437870.xml `-- rep968319046 |-- wcr_ra_968319046.dmp |-- wcr_ra_968319046.log |-- wcr_replay.wmd |-- wcr_rep_uc_graph_968319046.extb `-- wcr_rr_968319046.xml 17 directories, 34 files
参考文章:https://blog.csdn.net/zhang123456456/article/details/70217000
参考文章:http://blog.itpub.net/53956/viewspace-1314843/
原文:https://www.cnblogs.com/dayu-liu/p/11422878.html