Oracle的学习心得和知识总结(十六)|Oracle数据库Real Application Testing之Database Reply的内部变化逻辑
Posted 孤傲小二~阿沐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle的学习心得和知识总结(十六)|Oracle数据库Real Application Testing之Database Reply的内部变化逻辑相关的知识,希望对你有一定的参考价值。
目录结构
注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:
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,点击前往
8、了解Database Replay Capture内部原理,点击前往
9、database replay基础学习,点击前往
1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
Oracle数据库Real Application Testing之Database Reply的内部变化逻辑
文章快速说明索引
学习目标:
目的:接下来这段时间我想做一些兼容Oracle数据库Real Application Testing (即:RAT)上的一些功能开发,本专栏这里主要是学习以及介绍Oracle数据库功能的使用场景、原理说明和注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!
学习内容:(详见目录)
1、Oracle数据库Real Application Testing之Database Reply的内部变化逻辑
学习时间:
2023年03月23日 21:48:11
学习产出:
1、Oracle数据库Real Application Testing之Database Reply的内部变化逻辑
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 0
Version 19.3.0.0.0
SQL>
#-----------------------------------------------------------------------------#
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19 |
+-----------+
1 row in set (0.06 sec)
mysql>
回放逻辑内部变化
数据库回放基本流程如下:
数据库回放的实操内容请见本人之前的文档!
数据库回放需要注意的有2点:
- 对于RAC集群存在workload capture file的目录必须位于共享文件系统上,否则start_capture时会报错
- 对于每个session会多消耗64KB的内存,这是由于本质上写出负载信息到workload capture file的同样是Server Process服务进程本身
但是这种写出并非在parse解析或execution执行阶段,Server Process将其LOGON、LOGOFF、SQL执行等信息记录存放在PGA中,主要是WCR Capture PG、WCR Capture PGA中,当PGA中的工作负载历史记录达到一定数目时,Server Process本身负责写出这些数据到WCR文件中,在写出这些WCR文件时Server Process进入'WCR: capture file IO write'
等待事件。与WCR相关的等待事件另有:
SQL> set line 400
SQL> col BANNER format a75
SQL> col BANNER_FULL format a75
SQL> col BANNER_LEGACY format a75
SQL>
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 0
Version 19.3.0.0.0
SQL>
SQL> select name from v$event_name where name like '%WCR%';
NAME
----------------------------------------------------------------
WCR: replay client notify
WCR: replay clock
WCR: replay lock order
WCR: replay paused
WCR: RAC message context busy
WCR: capture file IO write
WCR: Sync context busy
latch: WCR: sync
latch: WCR: processes HT
9 rows selected.
SQL>
SQL> select name,gets from v$latch where name like '%WCR%';
NAME GETS
---------------------------------------------------------------- ----------
WCR: kecu cas mem 0
WCR: kecr File Count 0
WCR: MMON Create dir 0
WCR: ticker cache 0
WCR: sync 0
WCR: processes HT 0
WCR: MTS VC queue 0
7 rows selected.
SQL>
SQL> col name format a24;
SQL> col value format a20;
SQL> col describ format a80;
SQL>
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.inst_id = USERENV ('Instance') AND y.inst_id = USERENV ('Instance') AND x.indx = y.indx AND x.ksppinm in ('_capture_buffer_size','_wcr_control');
NAME VALUE DESCRIB
------------------------ -------------------- --------------------------------------------------------------------------------
_wcr_control 0 Oracle internal test WCR parameter used ONLY for testing!
_capture_buffer_size 65536 To set the size of the PGA I/O recording buffers
SQL>
下面借助于之前的实操步骤,再次复现一下 观察每一步的内部变化:
负载捕获
建立捕获目录,建立测试表以及插入数据,如下:
SQL> create or replace directory db_replay_capture_dir as '/home/oracle/db_replay_capture';
Directory created.
SQL> conn c##spa123/spa123
Connected.
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 Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 2
Next log sequence to archive 4
Current log sequence 4
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
SQL> create restore point mypoint;
Restore point created.
SQL>
此时尚未开始捕获,目录如下:
[oracle@dbserver ~]$ cd db_replay_capture/
[oracle@dbserver db_replay_capture]$ ls
[oracle@dbserver db_replay_capture]$
接下来,就可以开启捕获了,如下:
-- sysdba
SQL> BEGIN
DBMS_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> select max(id) from dba_workload_captures;
MAX(ID)
----------
12
SQL> select id,name,status,start_time,end_time,connects,user_calls,dir_path from dba_workload_captures where id = 12;
ID NAME STATUS
---------- -------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
START_TIM END_TIME CONNECTS USER_CALLS
--------- --------- ---------- ----------
DIR_PATH
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
12 test_capture_1 IN PROGRESS
30-MAR-23 1 0
/home/oracle/db_replay_capture
SQL>
此时,捕获目录 如下:
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 2 files
[oracle@dbserver db_replay_capture]$
此时我们LOGON一个新的Server Process,如下:
-- 第二个进程
[oracle@dbserver ~]$ sqlplus /nolog
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Mar 30 17:12:22 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
SQL> conn c##spa123/spa123
Connected.
SQL> select * from test;
no rows selected
SQL>
此时的捕获目录,如下:
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 2 files
[oracle@dbserver db_replay_capture]$
-- 第二个进程,开始模拟负载
SQL> @/home/oracle/insert_test.sql
PL/SQL procedure successfully completed.
SQL> select count(*) from test;
COUNT(*)
----------
1000
SQL> select spid from v$process where addr = ( select paddr from v$session where sid=(select distinct sid from v$mystat));
SPID
------------------------
9873
SQL>
-- 原来第一个进程
SQL> select spid from v$process where addr = ( select paddr from v$session where sid=(select distinct sid from v$mystat));
SPID
------------------------
9664
SQL>
看一下现在这两个连接对应进程的打开文件描述符,如下:
[oracle@dbserver ~]$ ls -l /proc/9664/fd
总用量 0
lr-x------ 1 oracle oracle 64 3月 30 17:18 0 -> /dev/null
l-wx------ 1 oracle oracle 64 3月 30 17:18 1 -> /dev/null
l-wx------ 1 oracle oracle 64 3月 30 17:18 12 -> pipe:[103958]
l-wx------ 1 oracle oracle 64 3月 30 17:18 2 -> /dev/null
lrwx------ 1 oracle oracle 64 3月 30 17:18 256 -> /home/oracle/oracle19c/oradata/ORCL/control01.ctl
lrwx------ 1 oracle oracle 64 3月 30 17:18 257 -> /home/oracle/oracle19c/oradata/ORCL/control02.ctl
lrwx------ 1 oracle oracle 64 3月 30 17:18 258 -> /home/oracle/oracle19c/oradata/ORCL/undotbs01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 259 -> /home/oracle/oracle19c/oradata/ORCL/sysaux01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 260 -> /home/oracle/oracle19c/oradata/ORCL/system01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 261 -> /home/oracle/oracle19c/oradata/ORCL/pdbseed/system01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 262 -> /home/oracle/oracle19c/oradata/ORCL/pdbseed/sysaux01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 263 -> /home/oracle/oracle19c/oradata/ORCL/users01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 264 -> /home/oracle/oracle19c/oradata/ORCL/pdbseed/undotbs01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 265 -> /home/oracle/oracle19c/oradata/ORCL/orclpdb/system01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 266 -> /home/oracle/oracle19c/oradata/ORCL/orclpdb/sysaux01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 267 -> /home/oracle/oracle19c/oradata/ORCL/orclpdb/undotbs01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 268 -> /home/oracle/oracle19c/oradata/ORCL/orclpdb/users01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 269 -> /home/oracle/oracle19c/oradata/ORCL/temp01.dbf
lr-x------ 1 oracle oracle 64 3月 30 17:18 3 -> /dev/null
lr-x------ 1 oracle oracle 64 3月 30 17:18 4 -> /home/oracle/oracle19c/product/19c/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oracle 64 3月 30 17:18 5 -> /proc/9664/fd
lrwx------ 1 oracle oracle 64 3月 30 17:18 6 -> anon_inode:[eventpoll]
lrwx------ 1 oracle oracle 64 3月 30 17:18 7 -> /home/oracle/oracle19c/admin/orcl/adump/orcl_ora_9664_20230330170934416714863480.aud
lrwx------ 1 oracle oracle 64 3月 30 17:18 8 -> /home/oracle/db_replay_capture/capfiles/inst1/aa/wcr_2anhmh0000000.rec
lr-x------ 1 oracle oracle 64 3月 30 17:18 9 -> pipe:[103957]
[oracle@dbserver ~]$
[oracle@dbserver ~]$ ls -l /proc/9873/fd
总用量 0
lr-x------ 1 oracle oracle 64 3月 30 17:18 0 -> /dev/null
l-wx------ 1 oracle oracle 64 3月 30 17:18 1 -> /dev/null
l-wx------ 1 oracle oracle 64 3月 30 17:18 12 -> pipe:[109685]
l-wx------ 1 oracle oracle 64 3月 30 17:18 2 -> /dev/null
lrwx------ 1 oracle oracle 64 3月 30 17:18 256 -> /home/oracle/oracle19c/oradata/ORCL/undotbs01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 257 -> /home/oracle/oracle19c/oradata/ORCL/users01.dbf
lrwx------ 1 oracle oracle 64 3月 30 17:18 258 -> /home/oracle/oracle19c/oradata/ORCL/sysaux01.dbf
lr-x------ 1 oracle oracle 64 3月 30 17:18 3 -> /dev/null
lr-x------ 1 oracle oracle 64 3月 30 17:18 4 -> /home/oracle/oracle19c/product/19c/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oracle 64 3月 30 17:18 5 -> /proc/9873/fd
lrwx------ 1 oracle oracle 64 3月 30 17:18 6 -> anon_inode:[eventpoll]
lrwx------ 1 oracle oracle 64 3月 30 17:18 7 -> /home/oracle/db_replay_capture/capfiles/inst1/aa/wcr_2ann0h0000001.rec
lr-x------ 1 oracle oracle 64 3月 30 17:18 9 -> pipe:[109684]
[oracle@dbserver ~]$
此时再看一下,在 执行模拟负载 之后的捕获目录,如下:
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 2 files
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ │ ├── wcr_2anhmh0000000.rec
│ │ └── wcr_2ann0h0000001.rec
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 4 files
[oracle@dbserver db_replay_capture]$
注:这里说一下:本人使用的Oracle是19C 所测试的现象如下:
- 在新连接建立之后(甚至执行了少量语句),并没有立刻产生wcr文件(这点和参考的老哥 11g 所说的不太一样)
- wcr文件是在 大量负载 之后,出现在捕获目录(wcr_2ann0h0000001.rec)
- 而第一个进程所对应的wcr文件(wcr_2anhmh0000000.rec) 随后产生
[oracle@dbserver ~]$ lsof | grep wcr_2ann0h0000001.rec
oracle_98 9873 oracle 7u REG 252,0 655360 4988178 /home/oracle/db_replay_capture/capfiles/inst1/aa/wcr_2ann0h0000001.rec
[oracle@dbserver ~]$
[oracle@dbserver ~]$ lsof | grep wcr_2anhmh0000000.rec
oracle_96 9664 oracle 8u REG 252,0 2357 4988188 /home/oracle/db_replay_capture/capfiles/inst1/aa/wcr_2anhmh0000000.rec
[oracle@dbserver ~]$
此时断开第二个连接,并看一下 此刻的捕获目录,没有发生变化 如下:
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ │ ├── wcr_2anhmh0000000.rec
│ │ └── wcr_2ann0h0000001.rec
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 4 files
[oracle@dbserver db_replay_capture]$
此时再次建立连接,执行少量SQL(其中包括错误的语句) 并断开连接,如下:
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ │ ├── wcr_2anhmh0000000.rec
│ │ └── wcr_2ann0h0000001.rec
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 4 files
[oracle@dbserver db_replay_capture]$
-- 断开第三个连接,如下:
[oracle@dbserver db_replay_capture]$ tree
.
├── cap
│ └── wcr_scapture.wmd
├── capfiles
│ └── inst1
│ ├── aa
│ │ ├── wcr_2anhmh0000000.rec
│ │ ├── wcr_2ann0h0000001.rec
│ │ └── wcr_2apdgh0000002.rec
│ ├── ab
│ ├── ac
│ ├── ad
│ ├── ae
│ ├── af
│ ├── ag
│ ├── ah
│ ├── ai
│ └── aj
└── wcr_cap_000000000000c.start
13 directories, 5 files
[oracle@dbserver db_replay_capture]$
此时就看一下 这第三个的.rec文件,如下:
[oracle@dbserver db_replay_capture]$ od -c capfiles/inst1/aa/wcr_2apdgh0000002.rec
...
注:内容很多,后面我会把这个文件 原名上传,大家自行分析!
现在就剩第一个连接还在,此时看一下第一个进程信息,如下:
-- sysdba
SQL> select spid from v$process where addr = ( select paddr from v$session where sid=(select distinct sid from v$mystat));
SPID
------------------------
9664
SQL> oradebug setmypid
Statement processed.
SQL>
SQL> oradebug dump processstate 10;
Statement processed.
SQL>
SQL> oradebug tracefile_name
/home/oracle/oracle19c/diag/rdbms/orcl/orcl/trace/orcl_ora_9664.trc
SQL>
SQL>
从 processstate 文件中可以发现历史等待信息包括 WCR: capture file IO write,这是Server process在写WCR 文件,如下:
vim /home/oracle/oracle19c/diag/rdbms/orcl/orcl/trace/orcl_ora_9664.trc
...
service name: SYS$USERS
client details:
O/S info: user: oracle, term: pts/0, ospid: 9572
machine: dbserver program: sqlplus@dbserver (TNS V1-V3)
application name: sqlplus@dbserver (TNS V1-V3), hash value=3561831262
Current Wait Stack:
Not in wait; last wait ended 0.000714 sec ago
Wait State:
fixed_waits=0 flags=0x21 boundary=(nil)/-1
Session Wait History:
elapsed time of 0.000738 sec since last wait
0: waited for 'Disk file operations I/O'
...
1: waited for 'SQL*Net message from client'
...
2: waited for 'SQL*Net message to client'
...
3: waited for 'Disk file operations I/O'
...
4: waited for 'SQL*Net message from client'
...
5: waited for 'SQL*Net message to client'
...
6: waited for 'SQL*Net message from client'
...
7: waited for 'SQL*Net message to client'
...
8: waited for 'Disk file operations I/O'
...
9: waited for 'WCR: capture file IO write'
...
Sampled Session History of session 743 serial 20019
---------------------------------------------------
The sampled session history is constructed by sampling
the target session every 1 second. The sampling process
captures at each sample if the session is in a non-idle wait,
an idle wait, or not in a wait. If the session is in a
non-idle wait then one interval is shown for all the samples
the session was in the same non-idle wait. If the
session is in an idle wait or not in a wait for
consecutive samples then one interval is shown for all
the consecutive samples. Though we display these consecutive
samples in a single interval the session may NOT be continuously
idle or not in a wait (the sampling process does not know).
The history is displayed in reverse chronological order<Oracle学习 实战心得总结
最近要和另一套系统对接,对方用的是Oracle,硬着头皮上了,从Oracle的安装、部署、存取数据,技术有了很大提升,不再有神秘感和恐惧感了。
1、服务器都是64位,所以都装了64位的Oracle和PlSql。
2、如果服务器超过32核,会安装不了,卡在复制数据库2%处。公司服务器好像是16核,在BIOS里开了超线程,系统中显示32核,按理是刚刚好的,但一样用不了。试过把超线程关了,在系统里看到变16核了也不行。最后还是把超线程开起来,在msconfig的引导里设置成16核才正常了。
3、Oracle装完字符集怎么是UTF16的,可能安装时有选项但没注意。客户端字符集比较好改,服务器稍麻烦些,但网上也有教程,对着敲一遍就行。如果字符集对不上,update表时,中文进不去,会乱码。
4、Oracle的几个概念和SqlServer不一样,Oracle的表空间,类似SQL的库;Oracle的包,类似SQL的存储过程/函数;Oracle的序列,类似SQL的自增;
5、建表空间、建用户、分配权限、导表、脚本等,要在sqlplus下执行,DOS最好右键 -> 管理员运行
6、sqlplus下每行末尾要分号,换行的话好像要shift + enter,如果从其它地方复制的话,中间不能带空行。
7、PL/SQL用着还算不错,基本能像SSMS那样顺手了,本身功能比较强大了,但没有像SqlPrompt那样牛X的插件辅助(网上找了一圈没找到)。如果是UPDATE、DEL之类的话,默认是事务的,要提交事务。选择多条SELECT语句的话,SqlServer是竖着排下来,PL/SQL是一排横着排。如果要编辑,PL/SQL有个方便的就是直接在末尾FOR UPDATE,再点那个锁就可以直接在查询界面编辑了。不知SSMS为何不借鉴下这功能,有个Ctrl + 1还是2/3之类的,也有类似效果,可以在查询中直接修改,但为何不干脆做到普通查询界面。
8、SQL备份文件是bak,用SSMS导入。Oracle的是dmp,在DOS下导入。还有种pde是在PlSQL里用导入表的。本来PlSql好像也可以直接导dmp的,但试了不成功,在DOS下就可以了。
9、在SQL存储过程里操作Oracle,一般用OPENQUERY,但要带参数的话比较麻烦。直接用链接服务器也可以,但据说效率不如OPENQUERY。
10、Oracle没有自增键,要用序列。如果插入一条数据,可以临时去取SEQ_XX.NEXTVAL,如果是多条就不行了,要弄个触发器。弄好之后就和SQL一样用了,插入时不用管那列了,就当它是SQL的自增列。Oracle不知怎么要绕这一大圈,应该可以后台处理掉吧,或者弄个简单些的语法糖。
11、Oracle没有SQL的TOP N了,只有ROWNUM,不如SQL方便。
12、apache-Tomcat要先装Jre/Jdk之类的才可以,装完后要配系统参数JAVA_HOME,我加了当场还无效,要重启才行。。。那平时服务器不方便重启不是用不了?apache可以不用安装,复制文件进来,改下配置就可以
13、apache不能和IIS共用端口,80被IIS用了,apache就只能用其它端口了。
最近天天加班,睡眠质量也变差了,但也学到不少。
以上是关于Oracle的学习心得和知识总结(十六)|Oracle数据库Real Application Testing之Database Reply的内部变化逻辑的主要内容,如果未能解决你的问题,请参考以下文章