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
declare
  l_stmt varchar2(2000);
begin
  for ctr in 1..1000 loop
     l_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           81

SQL> select flashback_on from v$database; --确定开启flashbak数据库

FLASHBACK_ON
------------------
YES

SQL> 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> BEGIN
  2  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> BEGIN
  2  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
        `-- aj

13 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> BEGIN
  2  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_capture

Workload Replay Client: Release 11.2.0.3.0 - Production on Wed Jul 18 08:59:42 2018

Copyright (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: 12

Assumptions:
- 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_capture

Workload Replay Client: Release 11.2.0.3.0 - Production on Wed Jul 18 09:34:22 2018

Copyright (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_capture

Workload Replay Client: Release 11.2.0.3.0 - Production on Wed Jul 18 09:34:22 2018

Copyright (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_1

SQL> DECLARE
  2  l_report  CLOB;
  3  BEGIN
  4  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.xml

15 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

猜你喜欢

转载自blog.csdn.net/jolly10/article/details/81079904