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的内部变化逻辑的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript学习(八十六)—运算符知识点总结

web基础学习心得

MySQL 总结篇 [在Oracle基础上学习的MySQL]

网页学习的心得和总结

学习过程中总结心得

实验九——基本数据类型存储及应用总结