Oracle数据库基础之2_体系结构

Oracle 服务器=实例+数据库

数据库实例(Instance) = 内存结构(SGA) + 后台进程(Background Process)。

数据库服务器内存:SGA + PGA + 服务器进程在OS级的消耗

SGA

DB Buffer Cache

Shared Pool

Redo Log Buffer

Large Pool

Java Pool

Streams Pool

DB Buffer Cache是采用何种方式来管理的呢?

Oracle 用 LRU(Least Recently Used)算法来管理数据高速缓冲区。该算法将最近使用的数据块按照使用时间的早晚排成队列,当缓冲区占满后,调入新的数据块时,必须清除已有的数据块,来获得空闲数据块空间,那么,最合理的选择就是清除最早没有使用数据块,因为使用该块的概率相对比较小。通过规划SGA时合理地设置数据高速缓存的尺寸,尽量的避免缓冲区占满的情况发生,否则就会降低系统的效率。

Oracle 将队列分成两端,分别为热端A-E和冷端F-J。

假设新数据块K将要被读入,又没有空闲位置,则Oracle会对冷端头J块进行判断:假设J被访问次数为1,Oracle将会认为J不是一个经常被访问的块(冷),则会将J块踢出队列,将K插入至F的位置,F和其他块右移,则热端为A-E,冷端为K-I

假设新数据块L将要被读入,又没有空闲位置,则Oracle会对冷端头I块进行判断:假设I被访问次数为5,Oracle将会认为I是一个经常被访问的块(热),则会将I块放入热端头,A和其他快右移,则热端为I-D,冷端为E-H

这时,将对下一个冷端头块H进行判断:假设H被访问次数为1,Oracle将会认为H不是一个经常被访问的块(冷),则会将H块踢出队列,将L插入至E的位置,E和其他块右移,则热端为I-D,冷端为L-G

但是这时,我们会发现。I块被放入热端头,经过漫长的时间,I块最终会被放到冷端头进行判断;如果这段时间中,即使I没有再被访问过,I的访问次数也仍然是5,这样I将再次回到热端头,这样就造成了死循环,I永远无法被踢出列表。因此,当I被放到热端头的时候,访问次数将会被清零。如果这段时间I被访问多次,则有机会回到热端头,否则,可能被踢出列表。

PGA

Private SQL Area:Session Memory,Persistent Area,Runtime Aren

SQL Work Areas:Sort Area,Hash Area,Bitmap Merge Area

不要将PGA中的私有SQL区域与SGA中存储执行计划的共享SQL区域混淆。同一或不同会话中的多个私有SQL区域可以指向SGA中的单个执行计划。例如,在一个会话中执行20次SELECT * FROM和在不同会话中执行10次相同的查询可以共享相同的计划。每次执行的私有SQL区域不共享,可能包含不同的值和数据。PGA是一个非共享内存区域,其中包含仅供Oracle进程使用的数据和控制信息。启动Oracle进程时,Oracle数据库会创建PGA。每个服务器进程和后台进程都有一个PGA。单个PGA的集合是总实例PGA或实例PGA。数据库初始化参数设置实例PGA的大小,而不是单个PGA的大小。

ORACLE推荐,只安装数据库的服务器,80%的物理内存给数据库使用,OLTP系统,SGA=(total_mem *80%)*80%,PGA=(total_mem *80%)*20%

SGA内存的参数是sga_target和sga_max_size

ASMM,Automatic Shared Memory Management

我们不再需要手工设置sharedpool、buffer pool 等若干内存池的大小,而是为SGA设置(sga_target)一个总的大小尺寸即可。Oracle数据库会根据系统负载变化,自动调整各组件的大小,从而使得内存始终能够流向最需要它的地方。sga_target 的值不能超过sga_max_size 的值,修改sga_max_size 时,必须重启实例才能生效,而sga_target则可以在线修改,立即生效,无须重启实例。

PGA内存的参数是PGA_AGGREGATE_TARGET

AMM,Automatic Memory Management

SGA和PGA的新的管理方式的参数MEMORY_TARGET和MEMORY_MAX_TARGET

Oracle11g开始引入了MEMORY_TARGET来管理SGA和PGA,不再需要设定参数SGA_TARGET和PGA_AGGREGATE_TARGET,,因为这两个参数都已经被修改成自动调优的,除非想指定PGA和SGA的最小值才需要设定这两个参数。如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态调节MEMORY_TARGET的大小,但是不允许超过MEMORY_MAX_TARGET的值。

Background Processes

System Monitor Process (SMON)主要任务是实例启动时执行恢复性工作,对有故障数据库实例进行恢复。

Process Monitor Process (PMON)主要任务用于恢复失败的用户进程和注册监听。

Database Writer Process (DBWn)将修改后的数据块内容写回数据文件。散列写即随机IO,DBWn进程可以有多个,比如dbw0、dbw1、dbw2。。

Log Writer Process (LGWR)将内存中的日志内容写入日志文件。顺序写即顺序IO,12C之前LGWR进程只能有一个,12.1开始实现了SCALABLE LGWR多进程,采用多个LGWR协同对redo log日志进行并行写入,这是Oracle数据库内部最重要的改进,解决了最后的并发瓶颈点

Checkpoint Process (CKPT)启动检查点,用于减少数据库实例恢复所需要的时间。

Manageability Monitor Processes (MMON and MMNL)

Recoverer Process (RECO)用于分布式数据库中的失败处理。

Archiver Processes (ARCn)当数据库服务器以归档方式运行时调用该进程完成日志归档。

DBWn哪些场景会触发

系统发出ckpt检查点指令。

脏缓冲区个数达到指定阀值。

服务进程搜索一定数目的数据块后,不能找到自由缓冲区。

数据写入计时时间到。

表空间脱机或进入只读状态。

执行删除或截断表操作。

执行ALTERTABLESPACE...BEGINBACKUP命令

LGWR哪些场景会触发

在DWBR进程将脏缓冲区写入数据文件之前。

在重做日志记录达到缓冲区的三分之一。

日志缓冲区记录的日志多于1M。

每隔3秒钟。

提交事务(执行Commit)

CKPT哪些场景会触发

发生日志切换。

关闭实例(SHUTDOWNABORT除外)。

手工执行检查点操作。

由初始化参数LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT强制发出

查询后台进程的方法

ps -ef|grep ora_

查询后台进程信息的SQL

SQL> select distinct name,description from V$BGPROCESS order by 1;

Server Processes

查询服务器进程的方法

ps -ef|grep LOCAL

LOCAL=YES表示用户进程比如sqlplus运行在数据库服务器上

LOCAL=NO表示用户进程比如sqlplus运行在客户端机器上

sql 复制代码
[root@DB1]# ifconfig |grep "inet addr"
          inet addr:192.168.10.101  Bcast:192.168.10.255  Mask:255.255.255.0
          inet addr:127.0.0.1  Mask:255.0.0.0
[root@DB1]# ps -ef|grep LOCAL
oracle    4629  4628  0 19:30 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    4649     1  0 19:31 ?        00:00:00 oracleorcl (LOCAL=NO)
root      4665  3661  0 19:32 pts/2    00:00:00 grep LOCAL
[root@DB1]# netstat -apn |grep 4629
udp        0      0 :::46703                    :::*                                    4629/oracleorcl
[root@DB1]# netstat -apn |grep 4649
tcp        0      0 ::ffff:192.168.10.101:1521  ::ffff:192.168.10.1:50053   ESTABLISHED 4649/oracleorcl

数据库

数据库在物理上由多个操作系统文件组成, 其中主要包括数据文件、控制文件和重做日志文件,还有其他的一些文件比如参数文件,密码文件,归档日志,警告文件,跟踪文件。

startup启动选项

NOMOUNT:加载参数文件(参数文件内容包含控制文件路径名称,包含db_name。。。),启动实例即出现后台进程

MOUNT:加载控制文件(控制文件包含日志文件路径名称大小,数据文件路径名称),可以查询v$打头的动态性能视图,不能查询dba_打头的静态数据字典视图

OPEN:加载数据文件,可以查询所有表和视图

shutdown关闭选项

SHUTDOWN NORMAL:不允许新的连接再次连数据库,等待当前所有会话连接退出数据库后再关闭数据库

SHUTDOWN IMMEDIATE:不允许新的连接再次连数据库,不允许现有连接再启动新的事务,任何没有提交的事务都立刻回滚,现有的连接立刻断开,再关闭数据库--常用的关闭数据库的方式

SHUTDOWN TRANSACTIONAL:不允许新的连接再次连数据库,不允许现有连接再启动新的事务,等待现有会话的事务完成后,再断开现有连接,再关闭数据库

SHUTDOWN ABORT:不允许新的连接再次连数据库,不允许现有连接再启动新的事务,现有的连接立刻断开,没有提交的事务没有回滚

参数文件

初始化参数文件分为静态初始化参数文件plain-text parameter file (pfile)和动态初始化参数文件server parameter file (spfile)。

静态初始化参数文件为文本格式,可以用vi 编辑器编辑,默认名为initsid.ora;

动态初始化参数文件为二进制格式,不可以用vi 编辑器编辑,默认名为spfilesid.ora。

alter system set parametername=xx

scope=spfile;--重启才能生效

scope=memory;--在当前内存中立即生效

scope=both;--以上两者都生效,使用spfile启动的数据库,不加scope时默认是both

参数文件加载顺序实验例子,优先顺序依次是spfilesid.ora,spfile.ora,initsid.ora

sql 复制代码
SQL> ! ls /u01/app/oracle/product/11.2.0/db_1/dbs |grep .ora
init.ora
spfileocp.ora

SQL> create pfile from spfile;
SQL> ! cp /u01/app/oracle/product/11.2.0/db_1/dbs/spfileocp.ora /u01/app/oracle/product/11.2.0/db_1/dbs/spfile.ora
SQL> ! ls /u01/app/oracle/product/11.2.0/db_1/dbs |grep .ora
init.ora
initocp.ora
spfile.ora
spfileocp.ora
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size                  1344680 bytes
Variable Size             771754840 bytes
Database Buffers          486539264 bytes
Redo Buffers               12574720 bytes
SQL> show parameter spfile;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/11.2.0
                                                 /db_1/dbs/spfileocp.ora
SQL> shutdown abort;
ORACLE instance shut down.
SQL> ! mv /u01/app/oracle/product/11.2.0/db_1/dbs/spfileocp.ora /u01/app/oracle/product/11.2.0/db_1/dbs/spfileocpXX.ora
SQL>  ! ls /u01/app/oracle/product/11.2.0/db_1/dbs |grep .ora
init.ora
initocp.ora
spfile.ora
spfileocpXX.ora
SQL>  startup nomount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size                  1344680 bytes
Variable Size             771754840 bytes
Database Buffers          486539264 bytes
Redo Buffers               12574720 bytes
SQL> show parameter spfile;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/11.2.0
                                                 /db_1/dbs/spfile.ora
SQL> shutdown abort;
ORACLE instance shut down.
SQL> ! mv /u01/app/oracle/product/11.2.0/db_1/dbs/spfile.ora /u01/app/oracle/product/11.2.0/db_1/dbs/spfileXX.ora
SQL> ! ls /u01/app/oracle/product/11.2.0/db_1/dbs |grep .ora
init.ora
initocp.ora
spfileocpXX.ora
spfileXX.ora
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size                  1344680 bytes
Variable Size             771754840 bytes
Database Buffers          486539264 bytes
Redo Buffers               12574720 bytes
SQL> show parameter spfile;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string
SQL> shutdown abort;
ORACLE instance shut down.
SQL> ! mv /u01/app/oracle/product/11.2.0/db_1/dbs/initocp.ora /u01/app/oracle/product/11.2.0/db_1/dbs/initocpXX.ora
SQL> ! ls /u01/app/oracle/product/11.2.0/db_1/dbs |grep .ora
init.ora
initocpXX.ora
spfileocpXX.ora
spfileXX.ora
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0/db_1/dbs/initocp.ora'
SQL>

控制文件

新增一个控制文件的操作

sql 复制代码
SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/ocp/c
                                                 ontrol01.ctl, /u01/app/oracle/
                                                 oradata/ocp/control02.ctl
SQL> ! ls /u01/app/oracle/oradata/ocp |grep control
control01.ctl
control02.ctl
SQL> alter system set control_files='/u01/app/oracle/oradata/ocp/control01.ctl','/u01/app/oracle/oradata/ocp/control02.ctl','/u01/app/oracle/oradata/ocp/control03.ctl' scope=spfile;
SQL> shutdown immediate;
SQL> ! cp /u01/app/oracle/oradata/ocp/control01.ctl /u01/app/oracle/oradata/ocp/control03.ctl
SQL> ! ls /u01/app/oracle/oradata/ocp |grep control
control01.ctl
control02.ctl
control03.ctl
SQL> startup
SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/ocp/c
                                                 ontrol01.ctl, /u01/app/oracle/
                                                 oradata/ocp/control02.ctl, /u
                                                 01/app/oracle/oradata/ocp/con
                                                 trol03.ctl

丢失一个控制文件的恢复操作

SQL> ! rm -f /u01/app/oracle/oradata/ocp/control02.ctl

SQL> shutdown immediate;

都会报错

sql 复制代码
SQL> shutdown abort;
ORACLE instance shut down.
SQL> ! cp /u01/app/oracle/oradata/ocp/control01.ctl /u01/app/oracle/oradata/ocp/control02.ctl
SQL> startup

所有控制文件丢失,没有任何备份的情况下,重建控制文件(前提是要知道redo log和datafile路径)

sql 复制代码
SQL> shutdown immediate;
SQL> ! rm -f /u01/app/oracle/oradata/ocp/control0*.ctl
SQL> ! ls /u01/app/oracle/oradata/ocp/ |grep control
SQL>startup
CREATE CONTROLFILE REUSE DATABASE "ocp" NORESETLOGS NOARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 32
    MAXINSTANCES 1
    MAXLOGHISTORY 449
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/ocp/redo01.log',
  GROUP 2 '/u01/app/oracle/oradata/ocp/redo02.log',
  GROUP 3 '/u01/app/oracle/oradata/ocp/redo03.log'
DATAFILE
  '/u01/app/oracle/oradata/ocp/users01.dbf',
  '/u01/app/oracle/oradata/ocp/undotbs01.dbf',
  '/u01/app/oracle/oradata/ocp/sysaux01.dbf',
  '/u01/app/oracle/oradata/ocp/system01.dbf',
  '/u01/app/oracle/oradata/ocp/example01.dbf'
CHARACTER SET AL32UTF8;
SQL> ! ls /u01/app/oracle/oradata/ocp/ |grep control
control01.ctl
control02.ctl
control03.ctl
SQL> alter database open;
SQL> alter tablespace TEMP add tempfile '/u01/app/oracle/oradata/ocp/temp01.dbf' size 100M reuse;

数据文件

调整表空间大小:表空间物理上表现为一个或多个数据文件,表空间的尺寸即表空间所有数据文件尺寸的总和。因此表空间的大小由数据文件的个数和数据文件的大小来决定,可通过以下方法进行调整:

1、重置数据文件的大小:ALTER DATABASE DATAFILE'...' |FileNo RESIZE XX

ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/mytbs7.ora' RESIZE 10GB;

2、更改数据文件的大小:可以使用数据文件AUTOEXTEND(自动扩展)属性自动调整数据文件的大小,也可以使用ALTER TABLESPACE手动调整。

ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/mytbs7.ora' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

3、使用ALTER TABLESPACE 命令给表空间添加新的数据文件

ALTER TABLESPACE mytbs3 ADD DATAFILE '/u01/app/oracle/oradata/mytbs3c.dbf' SIZE 10GB;

移动数据文件:

12C之前的版本移动有两种方法,前提就是数据文件都不能是online状态

方法1:使用ALTER DATABASE 命令,数据库必须处于mount状态

alter database rename file '/XX/YY.dbf' to '/ZZ/WW.dbf';

方法2:使用ALTER TABLESPACE 命令,数据库必须处于open状态,但是数据文件对应的表空间必须是offline状态

alter tablespace tablespace_name rename datafile '/XX/YY.dbf' to '/ZZ/WW.dbf';

12C开始,数据文件可以在线移动

alter database move datafile '/XX/YY.dbf' to '/ZZ/WW.dbf';

undo data

数据修改之前的保存的一份前镜像,undo属于data file

回滚段中的数据主要分为以下三种类型:

1.Uncommitted undo information; 未提交的回滚数据,该数据所关联的事务并未提交,用于实现读一致性,所以该数据不能被其它事务的数据所覆盖(假如回滚段不够的情况下,开始执行一个事务,执行到一半就会提示ORA-30036:unable to extend segment by %s in undo tablespace '%s'。就如undo只有10M的情况下,delete一张100M的表,delete执行不到一半就会开始报错了。

2.Committed undo information; 已经提交但未过期的回滚数据,该数据关联的事务已经提交,但是仍在undo retention参数保持的时间内

3.Expired undo information; 事务已经提交,而且数据保存时间已经超过undo retention参数指定的时间,属于已经过期的数据

当回滚段不足时,会优先覆盖Expired undo information,当过期数据空间覆盖后,会再覆盖Committed undo information的区域,这时undo retention参数所规定的保持时间是不起作用的,Uncommitted undo information的数据是不允许覆盖的,如果要求提交的数据在undo retention参数规定的时间内不会被覆盖,必须在undo表空间上指定RETENTION GUARANTEE

了解Oracle在什么情况下会产生ORA-01555:snapshot too old

假设有一张1000万行数据的test表,预计test全表扫描1次需要1个小时,参考过程如下:

1、在1:00,用户A发出了select * from test;此时不管将来test怎么变化,1小时执行完后显示的正确结果应该是用户A看到在1:00这个时刻的内容。

2、在1:20,用户B执行了update命令,更新了test表中的第900万行的这条记录,这时,用户A的全表扫描还没有到达第900万条。毫无疑问,这个时候,第900万行的这条记录是被写入了回滚段,假设是回滚段UNDOTS1,如果用户A的全表扫描到达了第900万行,是应该会正确的从回滚段UNDOTS1中读取出1:00这个时刻的内容的。

3、到了1:30这时,用户B将他刚才做的update操作提交了,但是这时,系统仍然可以给用户A提供正确的数据,因为那第900万行记录的内容仍然还在回滚段UNDOTS1里。但要注意到,就是第900万行在回滚段UNDOTS1里的数据有可能随时被覆盖掉,因为这条记录已经被提交了!

4、到了1:40这时,由于用户A的查询时间漫长,而业务在一直不断的进行,UNDOTS1回滚段在被多个不同的事务使用着,回滚段开始出现了不足的情况,由于test表第900万行的这条记录已经被标记提交了,所以在1:40它在回滚段中的空间被其他事务覆盖掉的!

5、到了1:50,用户A的查询终于到了第900万行,这时需要到回滚段UNDOTS1去找数据,而这时已经出现了第4条说的情况,该回滚段已经被覆盖掉了,这时就出现了ORA-01555错误。

redo log日志文件

物理层面:数据修改前,先写入到redo,再写入到数据文件

内存层面:数据修改前,先写入到log buffer,再写入到db buffer

sql 复制代码
SQL> select GROUP#,THREAD#,SEQUENCE#,BYTES,MEMBERS,ARCHIVED,STATUS from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
         1          1         16   52428800          1 NO  CURRENT
         2          1         14   52428800          1 NO  INACTIVE
         3          1         15   52428800          1 NO  INACTIVE

SQL> col MEMBER format a50
SQL> select GROUP#,MEMBER from v$logfile;

    GROUP# MEMBER
---------- ----------------------------------------
         3 /u01/app/oracle/oradata/ocp/redo03.log
         2 /u01/app/oracle/oradata/ocp/redo02.log
         1 /u01/app/oracle/oradata/ocp/redo01.log

新增redo log组

sql 复制代码
SQL> alter database add logfile group 4 ('/u01/app/oracle/oradata/ocp/redo0401.log','/u01/app/oracle/oradata/ocp/redo0402.log') size 50M;

新增redo log组的成员

sql 复制代码
SQL> alter database add logfile member '/u01/app/oracle/oradata/ocp/redo03_02.log' to group 3;

删除redo log组

sql 复制代码
SQL> alter system switch logfile;
SQL> /
SQL> /
SQL> select GROUP#,THREAD#,SEQUENCE#,BYTES,MEMBERS,ARCHIVED,STATUS from v$log;

SQL> ALTER DATABASE DROP LOGFILE GROUP 4; 
--不能删除状态是current的logfile group,否则会报错
ORA-01623: log N is current log for instance orcl (thread 1) - cannot drop
--不能删除状态是active的logfile group,否则会报错
ORA-01624: log N needed for crash recovery of instance orcl (thread 1)

删除redo log成员

sql 复制代码
SQL> ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/ocp/redo03_02.log';
--不能删除状态是current的logfile member
ORA-01609: log 3 is the current log for thread 1 - cannot drop members

口令文件

orapwd命令

orapwd file=$ORACLE_HOME/dbs/orapwSID password=xx

file名的格式必须是orapwSID,否则不会正常

口令文件用于存放特权用户信息及其口令的文件,"特权用户"是指具有启动、关闭Oracle 服务器并建立数据库等特殊权利的用户。如具有SYSDBA、SYSOPER、SYSASM权限的用户。

非特权用户信息及口令存放在数据库的系统数据字典中,例如dba_users。

SQL> select * from v$pwfile_users;

没有密码文件时,结果为空

C:\Users\101004871>sqlplus sys/oracle@192.168.10.101:1521/ocp as sysdba

没有密码文件时,异机使用sysdba登录会提示权限不够

本机不会报错,是因为本机可以开启OS验证,异机的话必须使用密码文件验证

归档

查看是否归档模式,看下面的Database log mode

sql 复制代码
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     12
Current log sequence           14

归档的开启

1、设置归档路径

SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/archivelog';

LOCATION=path_name,表示本地磁盘

SERVICE=net_service_name,表示网络上其他数据库服务器的磁盘

2、设置归档模式

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

SQL> alter system archive log current;

SQL> ! ls /u01/app/oracle/archivelog

trace file和alert log file

sql 复制代码
SQL>  show parameter dump
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_core_dump                 string      partial
background_dump_dest                 string      /u01/app/oracle/diag/rdbms/ocp
                                                 /ocp/trace
core_dump_dest                       string      /u01/app/oracle/diag/rdbms/ocp
                                                 /ocp/cdump
max_dump_file_size                   string      unlimited
shadow_core_dump                     string      partial
user_dump_dest                       string      /u01/app/oracle/diag/rdbms/ocp
                                                 /ocp/trace

trace file就是/u01/app/oracle/diag/rdbms/ocp/ocp/trace下的trc结尾文件

alert log file就是/u01/app/oracle/diag/rdbms/ocp/ocp/trace下的alert_SID.log

数据库后台进程跟踪文件名称包含Oracle SID、后台进程名称和操作系统进程编号,而服务器进程跟踪文件名包含Oracle SID、字符串"ora"和操作系统进程号

orcl_ora_5821.trc是服务器进程跟踪文件即客户端会话连上来产生的跟踪文件

orcl_mmon_4139.trc是后台进程跟踪文件

alert_SID.log文件记录报错信息都是ORA-开头,例如ORA-00313,我们可以通过oerr ora 00313命令查看该报错的详细信息

SCN:System Change Number. SCN的值是数据库更改的逻辑时间点

查询当前SCN

SQL>select dbms_flashback.get_system_change_number() from dual;--不会影响原有的最新值

SQL>select current_scn from v$database;--SQL只要执行一次SCN就会在原有的最新值的基础上加1,和序列号的nextval相似

oracle实例恢复(instance recovery)时先前滚(roll forward)再回滚(roll backward)

redo、undo用到的原因是:因redo log先于datafile写入持久层,所以实例启动时需要先前滚redo log中修改的数据,如果这些数据没有commit再使用undo中数据回滚回去。

假如,一个会话A,修改某行的某列数值5为3,但是没有来得及commit,就执行了shutdown abort。

因为没有ckpt,所以data file和control file没有记录最新的SCN,但是redo起码有shutdown abort前三秒的SCN

SMON进程发现redo log、data file、control file三者的SCN不一致,则利用redo log进行前滚,同步数据文件、控制文件使这二者和重做日志文件的最新SCN一致,当前滚完成后,发现会话A的数据块的ITL状态是uncommitted,则再使用undo中会话A的前镜像回滚,再一次同步数据文件、控制文件、重做日志文件确保三者都是一致的SCN

配置DB随服务器开机而自动启动

bash 复制代码
1、# vim /etc/oratab
DB1:/u01/app/oracle/product/19.3.0/db_1:Y

2、# vim /lib/systemd/system/rc-local.service
[Install]
WantedBy=multi-user.target

3、# systemctl enable  rc-local.service

4、# chmod +x /etc/rc.d/rc.local

5、# vim /etc/rc.local
su - oracle -c "/u01/app/oracle/product/19.3.0/db_1/bin/lsnrctl start"
su - oracle -c "/u01/app/oracle/product/19.3.0/db_1/bin/dbstart start"

访问数据库的形象一个例子

客户:客户端程序

工厂:实例+数据库

保安:监听

业务代表和小办公室:私有会话Server Process+PGA

厂区公共展示台:SGA

客户去访问一个工厂,先要到保安(监听)那里登记,登记通过则进入工厂,进入工厂后,工厂会安排一个业务代表和客户接触,业务代表安排客户在小办公室(PGA,有很多不同客户在不同的小办公室)里洽谈,客户想看产品,就进入到厂区的公共展示台看(SGA),如果公共展示台没有,就需要从仓库(database)拿出来放到公共展示台,如果客户想让工厂代加工自己的产品,就必须客户先下订单,工厂拿到生产订单(redo),工厂才能开始生产产品(data)。

相关推荐
可乐ea1 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
东方护航数据恢复(深圳)2 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘
lusklusklusk3 小时前
Oracle数据库基础之11_Duplicate和Dataguard和RAC
数据库·oracle
PHP实战开发录4 小时前
MySQL字段加索引为什么没变快
数据库·mysql·php·开发
红红谈说5 小时前
标签化推送与已读统计怎么做?一次通知链路的工程复盘
数据库·消息推送·数字乡村·集合运算·已读回执·标签体系·写入放大
Shadow(⊙o⊙)5 小时前
MySQL索引
数据库·mysql
fb_123456 小时前
MySQL运维实战:备份恢复+主从复制+读写分离+MHA高可用(超详细手把手教程)
运维·mysql·oracle
倔强的石头_7 小时前
多环境配置治理:开发、测试、生产连接信息如何隔离
数据库
杨云龙UP7 小时前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql