Oracle的学习心得和知识总结(十三)|Oracle数据库Real Application Testing之Database Replay实操(一)

本文主要是介绍Oracle的学习心得和知识总结(十三)|Oracle数据库Real Application Testing之Database Replay实操(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、参考书籍:《Oracle Database SQL Language Reference》
2、参考书籍:《PostgreSQL中文手册》
3、EDB Postgres Advanced Server User Guides,点击前往
4、PostgreSQL数据库仓库链接,点击前往
5、PostgreSQL中文社区,点击前往
6、Oracle Real Application Testing 官网首页,点击前往
7、Oracle 21C RAT Testing Guide,点击前往


1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)


Oracle数据库Real Application Testing之Database Replay实操

  • 文章快速说明索引
  • 数据库回放的演示
    • 负载捕获
    • 负载处理
    • 负载重放
    • 分析报告



文章快速说明索引

学习目标:

目的:接下来这段时间我想做一些兼容Oracle数据库Real Application Testing (即:RAT)上的一些功能开发,本专栏这里主要是学习以及介绍Oracle数据库功能的使用场景、原理说明和注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!


学习内容:(详见目录)

1、Oracle数据库Real Application Testing之Database Replay实操(一)


学习时间:

2023年03月23日 21:48:11


学习产出:

1、Oracle数据库Real Application Testing之Database Replay实操(一)
2、CSDN 技术博客 1篇


注:下面我们所有的学习环境是Centos7+PostgreSQL15.0+Oracle19c+MySQL5.7

postgres=# select version();version                                   
-----------------------------------------------------------------------------PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
(1 row)postgres=##-----------------------------------------------------------------------------#SQL> select * from v$version; BANNER									    BANNER_FULL 								BANNER_LEGACY									CON_ID
--------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production	    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production	Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production		     0Version 19.3.0.0.0SQL>
#-----------------------------------------------------------------------------#mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.06 sec)mysql>

数据库回放的演示

在这里插入图片描述

数据库重放由四个主要步骤组成,如上图所示,如下所述:

  1. 工作负载捕获

    启用工作负载捕获后,所有指向 Oracle 数据库的外部客户端请求都将被跟踪并存储在数据库服务器主机文件系统上的二进制文件(称为捕获文件)中。Oracle 建议在捕获负载之前对整个数据库进行备份。用户指定捕获文件的位置以及工作负载捕获的开始和结束时间。在此过程中,与外部数据库调用有关的所有信息都将写入捕获文件

  2. 工作负载处理

    捕获工作负载后,必须处理捕获文件中的信息。此处理将捕获的数据转换为重放文件,并创建重放工作负载所需的所有必要元数据。捕获文件通常会被复制到另一个系统进行处理。在重放之前,必须为每个捕获的工作负载执行一次此操作。捕获的工作负载处理后,可以在重放系统上重复重放。由于工作负载处理可能非常耗时且资源密集,因此通常建议在将重放工作负载的测试系统上执行此步骤

  3. 工作负载回放

    处理完捕获的工作负载后,就可以重放了。然后,名为 Replay Client 的客户端程序处理重播文件,并以与捕获系统完全相同的时间和并发性将调用提交给数据库。根据捕获的工作负载,您可能需要一个或多个重放客户端才能正确重放工作负载。提供了一个校准工具来帮助确定工作负载所需的重播客户端数量。应该注意的是,由于重放了整个工作负载,包括 DML 和 SQL 查询,因此重放系统中的数据必须与捕获其工作负载的生产系统中的数据相同,以便能够为报告目的进行可靠的分析

  4. 分析和报告

    提供了广泛的报告,以便对捕获和重放进行详细分析。报告重放期间遇到的任何错误。显示 DML 或查询返回的行中的任何差异。提供了捕获和回放之间的基本性能比较。对于高级分析,回放比较周期和其他 AWR 报告可用于详细比较捕获和回放之间的各种统计数据


负载捕获

首先建立捕获目录,如下:

[oracle@dbserver ~]$ pwd
/home/oracle
[oracle@dbserver ~]$ mkdir db_replay_capture
[oracle@dbserver ~]$ cd db_replay_capture/
[oracle@dbserver db_replay_capture]$ 
[oracle@dbserver db_replay_capture]$ pwd
/home/oracle/db_replay_capture
[oracle@dbserver db_replay_capture]$
[oracle@dbserver ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Mar 23 21:59:36 2023
Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle.  All rights reserved.Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0SQL> create or replace directory db_replay_capture_dir as '/home/oracle/db_replay_capture';Directory created.SQL> 

建立测试表以及插入数据,如下:

SQL> conn c##spa123/spa123
Connected.
SQL> 
SQL> create table test (id number, cust_name varchar2(20), dt date, amt number(8,2), store_id number(2));Table created.SQL> create sequence test_id_seq start with 1 maxvalue 99999999999999 minvalue 1 nocycle cache 20;Sequence created.SQL> 

注:我们这里测试环境只用一台机器来模拟数据库重放,所以需要先建立一个还原点。

需要先确认是开启了归档模式,如下:

SQL> conn /as sysdba
Connected.-- 如下没有开启归档
SQL> archive log list;
Database log mode	       No Archive Mode
Automatic archival	       Disabled
Archive destination	       /home/oracle/oracle19c/product/19c/dbhome_1/dbs/arch
Oldest online log sequence     77
Current log sequence	       79
SQL> 
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.Total System Global Area 1157624440 bytes
Fixed Size		    9134712 bytes
Variable Size		  620756992 bytes
Database Buffers	  520093696 bytes
Redo Buffers		    7639040 bytes
Database mounted.
SQL> archive log list;
Database log mode	       No Archive Mode
Automatic archival	       Disabled
Archive destination	       /home/oracle/oracle19c/product/19c/dbhome_1/dbs/arch
Oldest online log sequence     77
Current log sequence	       79
SQL> alter database archivelog;Database altered.SQL> select flashback_on from v$database;FLASHBACK_ON
------------------
NOSQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
Archive destination	       /home/oracle/oracle19c/product/19c/dbhome_1/dbs/arch
Oldest online log sequence     77
Next log sequence to archive   79
Current log sequence	       79
SQL>
SQL> alter system set db_recovery_file_dest_size=5G;System altered.SQL> alter system set db_recovery_file_dest='/home/oracle/flash_recovery_area' scope=both;System altered.SQL> alter system set db_recovery_file_dest_size=60G scope=both;System altered.SQL> alter system set db_flashback_retention_target=4320 scope=both;System altered.SQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
Archive destination	       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     77
Next log sequence to archive   79
Current log sequence	       79
SQL> alter database flashback on;Database altered.SQL> select flashback_on from v$database;FLASHBACK_ON
------------------
YESSQL>

接下来,建立还原点,如下:

SQL> create restore point mypoint;Restore point created.SQL>

注:因为我们这里想要 capture 所有的信息,就跳过 add_filter 的设置。关于设置过滤器,可以参见本人后面博客的详细介绍!


接下来,就可以开启捕获了,如下:

-- sysdbaSQL> BEGINDBMS_WORKLOAD_CAPTURE.start_capture (name=>'test_capture_1', dir=>'DB_REPLAY_CAPTURE_DIR', duration=> NULL);
END;
/  2    3    4  PL/SQL procedure successfully completed.SQL>

开始负载模拟,如下:

[oracle@dbserver ~]$ pwd
/home/oracle
[oracle@dbserver ~]$ cat insert_test.sql 
declarel_stmt varchar2(2000);
beginfor ctr in 1..1000 loopl_stmt := 'insert into test values ('||test_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;
/[oracle@dbserver ~]$
SQL> conn c##spa123/spa123
Connected.
SQL> select * from test;no rows selectedSQL> @/home/oracle/insert_test.sqlPL/SQL procedure successfully completed.SQL> select count(*) from test;COUNT(*)
----------1000SQL>

停止捕获,如下:

SQL> conn / as sysdba
Connected.
SQL> BEGINDBMS_WORKLOAD_CAPTURE.finish_capture;
END;
/  2    3    4  PL/SQL procedure successfully completed.SQL>

查看捕获的目录,如下:

[oracle@dbserver db_replay_capture]$ ls
cap  capfiles
[oracle@dbserver db_replay_capture]$ ls cap
wcr_cr.html  wcr_cr.text  wcr_cr.xml  wcr_fcapture.wmd  wcr_scapture.wmd
[oracle@dbserver db_replay_capture]$ 
[oracle@dbserver db_replay_capture]$ ls capfiles/
inst1
[oracle@dbserver db_replay_capture]$ ls capfiles/inst1/
aa  ab  ac  ad  ae  af  ag  ah  ai  aj
[oracle@dbserver db_replay_capture]$
[oracle@dbserver db_replay_capture]$ tree .
.
├── cap
│   ├── wcr_cr.html
│   ├── wcr_cr.text
│   ├── wcr_cr.xml
│   ├── wcr_fcapture.wmd
│   └── wcr_scapture.wmd
└── capfiles└── inst1├── aa│   ├── wcr_1st9dh0000000.rec│   ├── wcr_1st9dh0000001.rec│   └── wcr_1stf7h0000002.rec├── ab├── ac├── ad├── ae├── af├── ag├── ah├── ai└── aj13 directories, 8 files
[oracle@dbserver db_replay_capture]$

此时获取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')
---------------------------------------------------------------1SQL>-- 读取dba_workload_captures视图读取:
SQL> SELECT id, name FROM dba_workload_captures;ID NAME
---------- --------------------------------------------------------------------------------------------------------------------------------1 test_capture_1SQL>

负载处理

注:由于是测试环境、捕获和重放是同一台机器(正式环境下需要将捕获的文件复制到目标机器上),现在将数据库恢复到开始捕获前的状态,如下:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.Total System Global Area 1157624440 bytes
Fixed Size		    9134712 bytes
Variable Size		  620756992 bytes
Database Buffers	  520093696 bytes
Redo Buffers		    7639040 bytes
Database mounted.
SQL> flashback database to restore point mypoint;Flashback complete.SQL> alter database open resetlogs;Database altered.SQL>
-- 数据库已闪回SQL> conn c##spa123/spa123
Connected.
SQL> select * from test;no rows selectedSQL>

之后就开始预处理,由于是同一台机器测试的,数据库的目录也不需要重新建立,否则还需要建立目录:

CREATE OR REPLACE DIRECTORY db_replay_capture_dir AS '/home/oracle/db_replay_capture/';
SQL> conn / as sysdba
Connected.
SQL> 
SQL> BEGIN
DBMS_WORKLOAD_REPLAY.process_capture('DB_REPLAY_CAPTURE_DIR');
END;
/  2    3    4  PL/SQL procedure successfully completed.SQL>

这个时候再去看一下目录,上下两次对比 如下:

在这里插入图片描述

如上,预处理之后,目录方的中生成了重演的数据,pp19.3.0.0.0的目录


负载重放

这里使用wrc工具进行校验,效验结果会显示完成replay需要replay clients和hosts的数量,如下:

[oracle@dbserver ~]$ wrc mode=calibrate replaydir=/home/oracle/db_replay_captureWorkload Replay Client: Release 19.3.0.0.0 - Production on Thu Mar 23 23:02:49 2023Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.Report for Workload in: /home/oracle/db_replay_capture
-----------------------Recommendation:
Consider using at least 1 clients divided among 1 CPU(s)
You will need at least 3 MB of memory per client process.
If your machine(s) cannot match that number, consider using more clients.Workload Characteristics:
- max concurrency: 1 sessions
- total number of sessions: 2Assumptions:
- 1 client process per 100 concurrent sessions
- 4 client processes per CPU
- 256 KB of memory cache per concurrent session
- think time scale = 100
- connect time scale = 100
- synchronization = TRUE[oracle@dbserver ~]$

接下来,开始replay。在上面的效验结果,显示一个CPU上建议一个client,所以我们这里开始一个replay client。

-- 使用 initialize_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.SQL>
-- 将数据改成PREPARE REPLAY 模式:SQL> exec DBMS_WORKLOAD_REPLAY.prepare_replay(synchronization=>TRUE);PL/SQL procedure successfully completed.SQL> 
-- 检查replay的状态:SQL> select name, status from dba_workload_replays;NAME																 STATUS
-------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
test_capture_1															 PREPARESQL>
[oracle@dbserver ~]$ wrc system/123456 mode=replay replaydir=/home/oracle/db_replay_capture-- 执行之后,replay client 被暂停,并等待start replay 。 另开一个sqlplus 窗口执行如下命令:
[oracle@dbserver ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Mar 23 23:16:36 2023
Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle.  All rights reserved.Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0SQL> 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 PROGRESSSQL>

在这里插入图片描述

等dba_workload_replays中的状态变成compelte就完成replay。此时replayclient会显示操作开始和结束的时间,如下:

SQL> select name,status from  dba_workload_replays;NAME																 STATUS
-------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
test_capture_1															 COMPLETEDSQL> 

在这里插入图片描述


这时就可以验证replay结果,如下:

SQL> conn c##spa123/spa123
Connected.
SQL> select count(*) from test;COUNT(*)
----------1000SQL>

分析报告

生成报告,如下:

SQL> DECLAREl_report  CLOB;
BEGINl_report := DBMS_WORKLOAD_REPLAY.report(replay_id=>1, format=>DBMS_WORKLOAD_REPLAY.TYPE_HTML);
END;
/  2    3    4    5    6  PL/SQL procedure successfully completed.SQL>
[oracle@dbserver db_replay_capture]$ ls
cap  capfiles  pp19.3.0.0.0  rep78492439
[oracle@dbserver db_replay_capture]$ ls rep78492439/
wcr_ra_78492439.dmp  wcr_ra_78492439.log  wcr_replay_div_summary.extb  wcr_replay_thread.extb  wcr_replay.wmd  wcr_rep_uc_graph_78492439.extb  wcr_rr_78492439.cc.xml  wcr_rr_78492439.html  wcr_rr_78492439.txt  wcr_rr_78492439.xml  wcr_tracked_commits.extb
[oracle@dbserver db_replay_capture]$ 

如上,目录下面多了rep开头的子目录,html文件就是生成的报告。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这篇关于Oracle的学习心得和知识总结(十三)|Oracle数据库Real Application Testing之Database Replay实操(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429336

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始