本文主要是介绍oracle 11G新特性之数据库重放replay 命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
为什么使用数据库重演
大型业务关键应用程序不但复杂,而且负载模式和使用模式也相当多。与此同时,这些业务系统要在响应时间、吞吐量、运行时间和可用性方面提供特定服务级别的保证。对系统的任何更改(如升级数据库或修改配置)通常都需要进行全面的测试和验证,然后才能在生产系统中实施这些更改。在移到生产系统之前为了保证安全,数据库管理员(DBA) 需要让测试系统承受与生产环境中的工作量很近似的工作量。DBA 使用一种有效的方式分析系统级更改对整体SQL 性能的影响也很有益处,因为这样便可以在生产之前对更改执行任何必要的优化。
为什么使用数据库重放:
(1) 系统更改(如硬件和软件升级)是不可避免的。
(2) 客户需要在实施更改前确定更改的全面影响。
(3) 大量的测试和验证可能会花费很多的时间和资金。
(4) 测试除了成本昂贵之外,成功率还很低:
a) 许多问题未被检测到。
b) 更改可能会对系统的可用性和性能产生负面影响。
(5) 成功率低的原因:
a) 无法使用实际的生产工作量进行正确的测试,有许多问题未被检测到。
(6) 数据库重放功能使您可以执行与实际情况相符合的测试。
理论上,数据库重放的工作顺序如下图所示。
启动一个记录数据库活动的捕获流程。
- 该流程将活动写入名为“capture files”的特殊文件,该文件位于 /capture directory/ 目录中。
- 稍后,停止捕获流程,将这些捕获文件移至 /replay directory/ 目录中的测试系统。
- 启动一个重放流程和若干重放客户端,以重放这些捕获文件。
- 这些捕获文件将在测试数据库上应用。
下面实际 操作一下:
1.捕获操作
1.1建立捕获目录:
[root@qht131 ~]# su - oracle
[oracle@qht131 ~]$ mkdir -p /u01/app/oracle/db_replay_capture/SQL> create or replace directory db_replay_capture_dir as '/u01/app/oracle/db_replay_capture';
1.2建立测试表以及Insert语句的代码:
SQL> create user l5m identified by l5m quota unlimited on users;User created.SQL> grant connect,create table,create sequnce to l5m;Grant succeeded.SQL> conn l5m
Enter password:
Connected.
SQL> create table trans (trans_id number,cust_name varchar2(20),trans_dt date,trans_amt number(8,2),store_id number(2)
)
/Table created.SQL> create sequence trans_id_seq start with 1 maxvalue 99999999999999 minvalue 1 nocycle cache 20;Sequence created.
insert的代码存放在一个sql里面,待开启捕获后运行些代码
[oracle@qht131 ~]$ cat add_trans.sql
declarel_stmt varchar2(2000);
beginfor ctr in 1..1000 loopl_stmt := 'insert into l5m.trans values ('||trans_id_seq.nextval||','||''''||dbms_random.string('U',20)||''','||'sysdate - '||round(dbms_random.value(1,365))||','||round(dbms_random.value(1,999999),2)||','||round(dbms_random.value(1,99))||')';dbms_output.put_line(l_stmt);execute immediate l_stmt;commit;end loop;
end;
1.3 测试环境只用一台机器来模拟重放,所以需要先建立一个还原点:
建立还原点之前需要先确认是开启了归档模式:
SQL> archive log list; --确认已开启归档
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 79
Next log sequence to archive 81
Current log sequence 81SQL> select flashback_on from v$database; --确定开启flashbak数据库FLASHBACK_ON
------------------
YESSQL> create restore point gold;Restore point created.
1.4创建filter
示例如下:
SQL> execdbms_workload_capture.ADD_FILTER( fname IN VARCHAR2, fattribute IN VARCHAR2,fvalueIN VARCHAR2);
name=Name of the filter.
fattribute=Attribute on which the filter will be applied i.e USER, PROGRAM,INSTANCE_NUMBER etc.
fvalue= value for the corresponding attribute.
如:
SQL > exec dbms_workload_capture.ADD_FILTER(fname =>'FILTER_SCOTT',fattribute => 'USER',fvalue => 'SCOTT');
这里为了简单,假设我们capture 所有的信息,就跳过add_filter 的设置。
2.开始捕获
2.1 开启捕获
运行START_CAPTURE 过程时,需要指定capture 名称,directory 和capture 进程运行的时间。 如果duration设置为NULL,则capture process 必须等我们手工调用FINISH_CAPTURE 过程来结束。
SQL> BEGIN2 DBMS_WORKLOAD_CAPTURE.start_capture (name => 'test_capture_1',3 dir =>'DB_REPLAY_CAPTURE_DIR',4 duration => NULL);5 END;6 /PL/SQL procedure successfully completed.
--运行这个过程,必须要具有SYSDBA和SYSOPER的用户来执行。
2.2 对数据库做一些操作
SQL> conn l5m/l5m
Connected.SQL> @/home/oracle/add_trans.sql;PL/SQL procedure successfully completed.SQL> select count(*) from l5m.trans;COUNT(*)
----------1000
3.结束捕获
SQL> conn / as sysdba
Connected.
SQL> BEGIN2 DBMS_WORKLOAD_CAPTURE.finish_capture;3 END;4 /PL/SQL procedure successfully completed.
4.查看捕获的目录:
[oracle@qht131 ~]$ cd /u01/app/oracle/db_replay_capture/
[oracle@qht131 db_replay_capture]$ ls
cap capfiles
[oracle@qht131 db_replay_capture]$ cd cap
[oracle@qht131 cap]$ ls
wcr_cr.html wcr_cr.text wcr_fcapture.wmd wcr_scapture.wmd
[oracle@qht131 cap]$ cd ..
[oracle@qht131 db_replay_capture]$ tree
.
|-- cap
| |-- wcr_cr.html
| |-- wcr_cr.text
| |-- wcr_fcapture.wmd
| `-- wcr_scapture.wmd
`-- capfiles`-- inst1|-- aa| |-- wcr_4v1ufh0000001.rec| |-- wcr_4v1ugh0000002.rec| |-- wcr_4v1ujh0000003.rec| |-- wcr_4v1ujh0000004.rec| |-- wcr_4v1ukh0000005.rec| |-- wcr_4v1uph0000007.rec| |-- wcr_4v1v0h0000008.rec| |-- wcr_4v1v2h0000009.rec| |-- wcr_4v1vgh000000c.rec| |-- wcr_4v1xuh000000g.rec| |-- wcr_4v1xuh000000h.rec| |-- wcr_4v20ah000000m.rec| |-- wcr_4v219h000000q.rec| |-- wcr_4v21ah000000r.rec| `-- wcr_4v21uh000000s.rec|-- ab|-- ac|-- ad|-- ae|-- af|-- ag|-- ah|-- ai`-- aj13 directories, 19 files
当capture process 进程正在运行时会生成2个文件: wcr_scapture.wmd 和 wcr_cap_000xx.start。
当finish capture后,还会得到得到另外2个文件: wcr_cr.html 和 wcr_cr.text,wcr_cr.html 文件和 AWR report 类似。
获取caputre_id,有两种方法获取:
--通过内部函数读取:
SQL> select DBMS_WORKLOAD_CAPTURE.get_capture_info('DB_REPLAY_CAPTURE_DIR') FROM dual;DBMS_WORKLOAD_CAPTURE.GET_CAPTURE_INFO('DB_REPLAY_CAPTURE_DIR')
---------------------------------------------------------------11
--读取dba_workload_captures视图读取:
SQL> SELECT id, name FROM dba_workload_captures;ID NAME
---------- ------------------------------11 test_capture_1
5.预处理workload
5.1 由于是测试环境,捕获和重放是同一台机器(正式环境下需要将捕获的文件复制到目标机器上),现在将数据库恢复到开始捕获前的状态。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.Total System Global Area 313159680 bytes
Fixed Size 2227944 bytes
Variable Size 201326872 bytes
Database Buffers 104857600 bytes
Redo Buffers 4747264 bytes
Database mounted.SQL> flashback database to restore point gold;Flashback complete.SQL> alter database open resetlogs;Database altered.
5.2 开始预处理,由于是同一台机器 测试的,数据库的目录也不需要重新建立,否则还需要建立目录(CREATE OR REPLACE DIRECTORY db_replay_capture_dir AS '/u01/app/oracle/db_replay_capture/';)
SQL> BEGIN2 DBMS_WORKLOAD_REPLAY.process_capture('DB_REPLAY_CAPTURE_DIR');3 END;4 /PL/SQL procedure successfully completed.
[oracle@qht131 db_replay_capture]$ tree
.
|-- cap
| |-- wcr_cr.html
| |-- wcr_cr.text
| |-- wcr_fcapture.wmd
| `-- wcr_scapture.wmd
|-- capfiles
| `-- inst1
| |-- aa
| | |-- wcr_4v1ufh0000001.rec
| | |-- wcr_4v1ugh0000002.rec
| | |-- wcr_4v1ujh0000003.rec
| | |-- wcr_4v1ujh0000004.rec
| | |-- wcr_4v1ukh0000005.rec
| | |-- wcr_4v1uph0000007.rec
| | |-- wcr_4v1v0h0000008.rec
| | |-- wcr_4v1v2h0000009.rec
| | |-- wcr_4v1vgh000000c.rec
| | |-- wcr_4v1xuh000000g.rec
| | |-- wcr_4v1xuh000000h.rec
| | |-- wcr_4v20ah000000m.rec
| | |-- wcr_4v219h000000q.rec
| | |-- wcr_4v21ah000000r.rec
| | `-- wcr_4v21uh000000s.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
预处理之后,目录方的中生成了重演的数据,pp11.2.0.3.0的目录。
6.重放数据库
6.1.用wrc工具进行校验,效验结果会显示完成replay需要replay clients和hosts的数量。
[oracle@qht131 db_replay_capture]$ wrc mode=calibrate replaydir=/u01/app/oracle/db_replay_captureWorkload Replay Client: Release 11.2.0.3.0 - Production on Wed Jul 18 08:59:42 2018Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Report for Workload in: /u01/app/oracle/db_replay_capture
-----------------------Recommendation:
Consider using at least 1 clients divided among 1 CPU(s)
You will need at least 26 MB of memory per client process.
If your machine(s) cannot match that number, consider using more clients.Workload Characteristics:
- max concurrency: 7 sessions
- total number of sessions: 12Assumptions:
- 1 client process per 50 concurrent sessions
- 4 client process per CPU
- 256 KB of memory cache per concurrent session
- think time scale = 100
- connect time scale = 100
- synchronization = TRUE
6.2 开始replay
在上面的效验结果,显示一个CPU 上建议一个client,所以我们这里开始一个replay client。
--使用Initializing replay 装载metadata到tables里:
SQL> EXEC DBMS_WORKLOAD_REPLAY.initialize_replay (replay_name => 'test_capture_1', replay_dir => 'DB_REPLAY_CAPTURE_DIR');PL/SQL procedure successfully completed.
--将数据改成PREPARE REPLAY 模式:
SQL> exec DBMS_WORKLOAD_REPLAY.prepare_replay (synchronization => TRUE);PL/SQL procedure successfully completed.
--检查replay的状态:
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@qht131 db_replay_capture]$ wrc system/sys mode=replay replaydir=/u01/app/oracle/db_replay_captureWorkload Replay Client: Release 11.2.0.3.0 - Production on Wed Jul 18 09:34:22 2018Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Wait for the replay to start (09:34:22)
Replay started (09:35:01)
-执行之后,replay client 被暂停,并等待start replay 。 另开一个sqlplus 窗口执行如下命令:
SQL> exec DBMS_WORKLOAD_REPLAY.START_REPLAY ();PL/SQL procedure successfully completed.SQL> select name,status from dba_workload_replays;NAME
--------------------------------------------------------------------------------
STATUS
----------------------------------------
test_capture_1
IN PROGRESS
--返回replay client窗口,等dba_workload_replays中的状态变成compelte就完成replay。此时replayclient会显示操作开始和结束的时间:
SQL> select name,status from dba_workload_replays;NAME
--------------------------------------------------------------------------------
STATUS
----------------------------------------
test_capture_1
COMPLETED
[oracle@qht131 db_replay_capture]$ wrc system/sys mode=replay replaydir=/u01/app/oracle/db_replay_captureWorkload Replay Client: Release 11.2.0.3.0 - Production on Wed Jul 18 09:34:22 2018Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Wait for the replay to start (09:34:22)
Replay started (09:35:01)
Replay finished (09:40:32)
7.验证replay结果以及查看报告
7.1查看数据
SQL> conn l5m/l5m
Connected.
SQL> select count(*) from trans;COUNT(*)
----------1000
数据没有问题,都重做了一遍。
7.2生成报告
SQL> conn /as sysdba
Connected.
SQL> COLUMN name FORMAT A30
SQL> SELECT id, name FROM dba_workload_replays;ID NAME
---------- ------------------------------1 test_capture_1SQL> DECLARE2 l_report CLOB;3 BEGIN4 l_report := DBMS_WORKLOAD_REPLAY.report(replay_id =>1,5 format =>DBMS_WORKLOAD_REPLAY.TYPE_HTML);6 END;7 /PL/SQL procedure successfully completed.
7.3查看报告
[oracle@qht131 db_replay_capture]$ tree
.
|-- cap
| |-- wcr_cr.html
| |-- wcr_cr.text
| |-- wcr_fcapture.wmd
| `-- wcr_scapture.wmd
|-- capfiles
| `-- inst1
| |-- aa
| | |-- wcr_4v1ufh0000001.rec
| | |-- wcr_4v1ugh0000002.rec
| | |-- wcr_4v1ujh0000003.rec
| | |-- wcr_4v1ujh0000004.rec
| | |-- wcr_4v1ukh0000005.rec
| | |-- wcr_4v1uph0000007.rec
| | |-- wcr_4v1v0h0000008.rec
| | |-- wcr_4v1v2h0000009.rec
| | |-- wcr_4v1vgh000000c.rec
| | |-- wcr_4v1xuh000000g.rec
| | |-- wcr_4v1xuh000000h.rec
| | |-- wcr_4v20ah000000m.rec
| | |-- wcr_4v219h000000q.rec
| | |-- wcr_4v21ah000000r.rec
| | `-- wcr_4v21uh000000s.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
`-- rep12207780|-- wcr_ra_12207780.dmp|-- wcr_ra_12207780.log|-- wcr_replay.wmd|-- wcr_rep_uc_graph_12207780.extb`-- wcr_rr_12207780.xml15 directories, 34 files
目录下面多了rep开头的子目录,xml文件就是生成的报告。
参考:
https://blog.csdn.net/tianlesoftware/article/details/8218666
http://www.oracle.com/technetwork/cn/articles/sql/11g-replay-089222-zhs.html
这篇关于oracle 11G新特性之数据库重放replay 命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!