oracle体系架构之物理存储结构

物理存储结构

逻辑存储结构是为管理oracle数据而定义的具有逻辑层次关系的抽象概念。

而物理存储结构用来描述数据在磁盘上的物理组成情况。

宏观来看,oracle的数据逻辑存储在表空间中,而物理上存储在表空间包含的数据文件中。

oracle数据库的物理结构多种物理文件构成,主要有数据文件、控制文件、重做日志文件、归档日志文件、参数文件和告警日志文件、跟踪文件等等。

1. 数据文件

数据文件是用与保存应用程序数据和系统内部数据的文件,在操作系统中是普通文件。oracle逻辑上由表空间组成,每个表空间可以包含一个或多个数据文件,一个数据文件只能属于一个表空间。

用户只能选择存储在那个表空间,无法指定使用哪个数据文件来存储,只能系统分配。一个数据对象的数据可以全部存储在一个数据文件中,也可以分布存储在同一个表空间的多个数据文件中。

读取数据时。oracle系统首先从数据文件中读取数据,并将数据存储在内存的高速缓冲区中。如果用户需要读取数据库的某些数据,在内存的高速数据缓冲区中就直接用,没有就从数据文件中读取到缓冲区。也就是常说的内存有就用,没有就回盘load。

当修改数据时,也不会立即写入数据文件,而是先保存在内存的数据缓冲区,由检查点机制去触发后台进程DBWR去写入到相应数据文件。也就是脏数据落盘,是checkpoint激活时会触发数据库写进程(DBWR),将数据缓冲区里的脏数据块写到数据文件中。通过这样的方式,减少磁盘IO,提供系统性能。

--查看数据文件信息,或者在操作系统目录查看
--可以通过dba_data_files或v$datafile数据字典
SQL> col file_name for a50
SQL> set linesize 100;
SQL> select file_name,tablespace_name from dba_data_files;

四种类型数据文件:

​ 系统数据文件(system01.dbf、sysaux01.dbf)

​ 回滚数据文件(undotbs01.dbf)

​ 用户数据文件(users01.dbf)

​ 临时数据文件(temp01.dbf)

系统数据用来管理用户数据和Oralce本身的数据,如用户建立表的名字、列的名字、字段类型等,这些数据被自动存放在系统表空间对应的system01.dbf数据文件中。oracle系统内部的数据字典、系统表等所存储的数据属于oracle系统内部数据,也存储在系统表空间对应的数据文件中。

回滚数据文件(撤销数据文件)用于临时存储修改前的旧数据

用户数据文件用于存储用户应用系统的数据,包括与应用系统相关的所有相关信息

临时数据文件用于存放和排序相关的数据,临时表数据文件和一般数据文件被Oracle做了区分,不能再dba_data_files中查询到。

--临时文件查看
--可以通过dba_temp_files或者v$tempfile数据字典查询
SQL> col file_name format a50
SQL> col tablespace_name format a20
SQL> select file_name,tablespace_name from dba_temp_files;

2. 控制文件

控制文件是数据库中最重要的文件,它是一个二进制文件,它记录了数据库名、实例信息、数据文件和日志文件的名字位置、建库日期等。一般由系统安装时自动创建。控制文件存放的路径由参数文件SPFILEsid.ora和crontrol参数值来确定。

实例启动时,先加载参数文件,然后分配sga内存,这时实例处于安装状态,然后访问控制文件,读出数据文件和日志文件信息,再打开数据文件和日志文件供用户访问。

系统默认生成两组控制文件来进行多路复用,如果某个损坏,则会自动启用另一个,都损坏则无法正常工作。

每个数据库至少有一个控制文件,一个数据库可以有多个控制文件,但一个控制文件只能属于一个数据库,因为控制文件记录着数据库的许多关键信息。控制文件内部出了存储库名、创建日期、数据文件、日志文件等相关信息,在系统运行中还过程中还存储了scn、检查点信息和归档的当前状态。rman的备份信息也可能存储在控制文件中,如果不使用catalog.

当数据库的物理结构更改时,会更新到控制文件。所以控制文件也被用于数据恢复。

--查看控制文件信息可以在v$controlfile数据字典
col name for mat a60;
select name from v$controlfile;

3. 日志文件

日志文件主要功能是记录对数据所做的修改,出现问题时可以通过日志文件得到原始数据,从而不丢失操作成果。

日志文件主要分为两种:

​ 重做日志文件(redo log file)

​ 归档日志文件(archive log file)

对应着非归档模式和归档模式:

非归档模式:系统运行期间,所产生的日志信息不断记录到日志文件组中,所有重做日志组被写满后,又从第一个日志组开始覆写;

归档模式:各个日志文件都被写满而即将覆盖前,先由归档进程(ARCH)将即将覆盖的日志文件中的日志信息读出,然后写入归档日志文件中,这个过程被称为归档操作。

3.1 重做日志文件

重做日志文件,也叫联机重做日志文件(online redo log file),用来记录数据库发生过的更改信息(修改、添加、删除)以及oracle内部行为(创建表、索引等)而引起的数据库变化信息。

在数据库恢复时,可以从该日志读取原始记录。每次用户commit时,数据库都先将原始记录通过数据库自己的方法记录在日志文件中,只有写入日志文件成功时,才会将新纪录传回给用户。所以可以通过日志文件读取原始记录或恢复数据。

当对表或表空间设置nologging属性时,对其的dml、ddl操作,不生成日志。

--v$logfile视图查看日志文件信息
SQL> col member for a50;
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/app/oracle/oradata/ORCL/redo03.log
         2 /u01/app/oracle/oradata/ORCL/redo02.log
         1 /u01/app/oracle/oradata/ORCL/redo01.log

oracle示例运行中产生的日志信息,首先被临时的存放在sga的重做日志缓冲区中(redo log buffer,sga中循环使用的一段内存区域),当发出commit命令(或日志缓冲区满)或是达到一些出触发条件时,例如:

  1. 用户提交

  2. 重做日志缓冲区满1/3时

  3. 有大于1M的重做日志缓冲区未被写入磁盘(不同版本可能不同,隐含参数_LOG_IO_SIZE控制)

  4. 每隔3 秒钟

  5. DBWR 需要写入的数据的SCN大于LGWR记录的SCN,DBWR 触发LGWR写入。

LGWR进程将日志信息从重做日志缓冲区中读出,写入日志组中序列较小的文件里,在一个日志组写满后接着写入另一个日志组。在LGWR将所有能用的日志文件都使用过后,将会覆写第一个日志组。

3.2 归档日志文件

由于所有的日志文件被写入一遍后,LGWR将覆写第一个日志组,从而导致一部分较早的日志信息被覆盖。所以数据库开启归档后,这些将被覆盖的日志将被保存在归档日志中。

在归档操作过程中,LGWR进程需要等待ARCH进程结束才能开始覆写日志文件,这也就延迟了系统响应时间,同时归档也占用了大量磁盘空间

--查看是否开启归档
SQL> col name format a30;
SQL> select dbid,name,log_mode from v$database;
--或着
SQL> archive log list;

--查看归档路径
SQL> archive log list;
--或者
SQL> set pagesize 30;
SQL> show parameter log_archive_dest;

3.3 参数文件

作用:记录oracle参数信息,类似mysql的my.cnf

在启动阶段读取初始化参数文件(init parameter files)。该文件管理实例相关启动参数。

参数类型大致以下几种:

基本初始化参数 大约 10-20 个左右(见联机文档)
初始化参数 300 个左右
隐含参数 Oracle 不推荐使用

总的来说也就是普通参数和隐含参数

查看普通参数:

select * from v$parameter;
......
445 rows selected

查看隐含参数:

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 LIKE '%&par%'

动态参数和静态参数,及文件

动态参数:可以直接在内存中修改,并对当前 instance 立即生效

静态参数:必须修改参数文件,下次启动后生效

区分是静态参数还是动态参数:

根据 ISSYS_MODIFIABLE 的值判断

SQL>  select distinct issys_modifiable from v$parameter;

ISSYS_MOD
---------
IMMEDIATE		#动态参数
DEFERRED		#静态参数
FALSE			#延迟参数,下次session连接有效

#例子
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter where name ='undo_retention';

NAME            VALUE            ISSYS_MODIFIABLE
--------------- -----------------------------------
undo_retention   900             IMMEDIATE

文件:

参数文件:参数文件可以分为文本参数文件(pfile)和 二进制参数文件(spfile)

静态参数文件:记录Oracle参数文本文件(默认已经不使用),默认的名称为“init+实例名.ora”,这是一个文本文件,可以用任何文本编辑工具打开。文件存放在$ORACLE_HOME/dbs目录下

动态参数文件:记录Oracle参数二进制文件(默认使用的参数文件)

spfile 默认的名称为“spfile+例程名.ora”这是一个二进制文本形式存在,不能用vi编辑器对其中参数进行修改。show parameter spfile --查看当前数据库使用的参数文件

两种参数文件:pfile和spfile

pfile(parameter file)

特点:

①必须通过文本编辑器修改参数,便于一次修改多个参数。

②缺省的路径及命名方式:$ORACLE_HOME/dbs/initSID.ora

spfile(system parameter file)

特点:

①二进制文件,不可以通过编辑器修改。通过 Linux 命令 strings 可以查看内容。

②路径及命名方式: $ORACLE_HOME/dbs/spfileSID.ora

参数的修改

修改spfile的方法:

alter system set 参数=值 [scope=memory|spfile|both]

①scope=memory 参数修改立刻生效,但不修改 spfile 文件。

②scope=spfile 修改了 spfile 文件,重启后生效。

③scope=both 前两种都要满足。要求 spfile 参数文件存在

④不写 scope 限定词,缺省③。但不如③严格,即 spfile 如果不存在,仅仅修改内存中参数。

如果不修改 spfile,将无法更改静态参数。

SQL> select name,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where name='sql_trace';

NAME         ISSES_MODIFIABLE ISSYS_MODIFIABLE
------------ ---------------- ----------------
sql_trace    TRUE             IMMEDIATE

#这个结果表示 sql_trace 参数在 session 级别可以改,在 system 级也可以 both 修改(动态参数)。

alter system set sga_target=400M ; ---动态参数
alter system set memory_max_target=600M scope=spfile; --静态参数
alter system set sga_target=400M  scope=memory;    
ALTER SYSTEM SET parameter_name=parameter_value scope=[memory|spfile|both] 

参数文件的生成和相互转换

读取顺序:优先 spfile,其次 pfile

pfile 和 spfile 可以相互生成:

SQL>create pfile from spfile
SQL>create spfile from pfile
SQL>create pfile from memory;
SQL>create spfile from memory;

例子:

#动态参数文件生成静态参数文件:
create pfile='/u01/app/oracle/product/12.2.0/dbhome_1/dbs/initweisi.ora' from spfile;
#静态参数文件生动态态参数文件:
create spfile from pfile ='/u01/app/oracle/product/12.2.0/dbhome_1/dbs/pfile.ora’;

注意:使用 spfile 启动后不能重写 spfile

尽可能使用 spfile,pfile 一般留做备用,特殊情况也可以使用 pfile 启动:

SQL> startup pfile=$ORACLE_HOME/dbs/initprod.ora
---如果 pfile 不是缺省命名或放在其他路径,则指定命令路径和文件名即可。
SQL> startup pfile=/home/oracle/mypfile

---怎样知道实例是 spfile 启动还是 pfile 启动的
SQL> show parameter spfile
NAME     TYPE     VALUE
------------------------------------ ----------- ------------------------------
spfile   string   /u01/oracle/dbs/spfile.ora
---如果 value 有值,说明数据库启动时读的是 spfile

---另一个办法是看 v$spparameter(spfile 参数视图)中的参数 memory_target 的 isspecified 字段值,如果是 TRUE 说明是 spfile 启动的
SQL> select name,value,isspecified from v$spparameter where name like 'memory_target';

NAME             VALUE         ISSPECIFIED
--------------- -----------------------------
memory_target    1528823808    TRUE

4. 密码文件、告警文件、跟踪文件

4.1 密码文件

密码文件有时也被称为口令文件,是oracle系统用于验证具有sysdba系统权限的用户远程登陆的认证,它是一个二进制文件。

以19c为例,默认存储在dbs目录下,密码格式为orapw

创建密码文件语法

orapwd file=<filename> password=<password>

#由于版本不同,越老的版本语法会有差异,查看帮助即可
orapwd --help
#可能需要的参数
format=12	#默认12.2,使用12可以忽略新特性高要求的密码复杂度
force=y		#覆盖

例子:

#删除后无法远程登陆
rm -f orapworcl

#重建
orapwd file=/u01/app/oracle/product/19.3/dbhome_1/dbs/orapworcl password=Oracle123 format=12

它受参数remote_login_passwordfile影响

SQL> show parameter remote_login_passwordfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile  

它的值对应的效果:

EXCLUSIVE:(默认值)独占模式使用密码文件,官档中提到了“only one instance of one database”使用exclusive方式,在数据库中是可以执行对于sysdba用户的增加,修改,删除动作的,同样也可以修改sysdba用户的密码,这些更改会记录到密码文件中去。

1.查看被授予sysdba权限的用户

SELECT USERNAME FROM V$PWFILE_USERS WHERE SYSDBA='TRUE';

2.口令文件中添加/删除sysdba权限用户

REVOKE SYSDBA FROM non-SYS-user;
GRANT SYSDBA TO non-SYS-user;

NONE:禁用口令文件验证

设置成none将直接禁用口令文件验证,sysdba用户只能通过操作系统认证登录数据库。此时的登录将会收到报错:

ORA-01017: invalid username/``password``; logon denied

操作系统认证方式涉及sqlnet.ora 文件中的SQLNET.AUTHENTICATION_SERVICES参数值:

  1)NONE :关闭操作系统认证,只能通过口令文件认证

  2)ALL:linux/unix平台下,采用操作系统认证,但远程sysdba登录还需使用口令文件认证。

  3)NTS:windows平台下操作系统认证

SHARED:在多个数据库间共享口令文件。

1.配置shared值的口令文件可以被一台服务器上的多个数据库或者RAC集群数据库共享;(现在知道exclusive模式时说的“only one instance of one database“的含义了吧,就是为了区分RAC环境)

2.shared下的密码文件不可被修改,这就意味着无法再授权sysdba权限给非sys用户了,修改sysdba权限用户的密码也不被允许,包括sys用户的密码。

3.oracle建议首先将需要sysdba权限的用户在exclusive模式下设置好在将REMOTE_LOGIN_PASSWORDFILE 修改为shared共享口令文件。

4.Oracle寻找口令文件的顺序:orapw$ORACLE_SID --> orapw --> Failure

4.2 告警文件

告警文件(告警日志文件)是一个存储在oracle系统目录下的文本文件,名字为alert_.log,它用来记录Oracle运行信息和错误信息。运行信息包括实例的启动和关闭,建立表空间、增加数据文件等以及有关数据库物理结构变化的信息;错误信息包括实例启动失败,扩展空间失败和一些内部错误信息等。

告警文件位置:

background_dump_destuser_dump_dest是带错误的确定告警文件和跟踪文件的归档

在 oracle 11g 中,故障诊断及跟踪的文件路径改变较大,告警文件分别 xml 的文件格式和普通文本格式两种形式存在。这两份文件的位置分别是 V$DIAG_INFO 中的 Diag Alert 和 Diag Trace 对应的目录中取来的。

而跟踪文件和文本格式的告警文件放在同一文件夹

SQL> select * from V$DIAG_INFO;

   INST_ID NAME                                                             VALUE                                                                                CON_ID
---------- ---------------------------------------------------------------- -------------------------------------------------------------------------------- ----------
         1 Diag Enabled                                                     TRUE                                                                                      0
         1 ADR Base                                                         /u01/app/oracle                                                                           0
         1 ADR Home                                                         /u01/app/oracle/diag/rdbms/orcl/orcl                                                      0
         1 Diag Trace                                                       /u01/app/oracle/diag/rdbms/orcl/orcl/trace                                                0
         1 Diag Alert                                                       /u01/app/oracle/diag/rdbms/orcl/orcl/alert                                                0
         1 Diag Incident                                                    /u01/app/oracle/diag/rdbms/orcl/orcl/incident                                             0
         1 Diag Cdump                                                       /u01/app/oracle/diag/rdbms/orcl/orcl/cdump                                                0
         1 Health Monitor                                                   /u01/app/oracle/diag/rdbms/orcl/orcl/hm                                                   0
         1 Default Trace File                                               /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_16892.trc                             0
         1 Active Problem Count                                             0                                                                                         0
         1 Active Incident Count                                            0                                                                                         0
         1 ORACLE_HOME                                                      /u01/app/oracle/product/19.3/dbhome_1                                                     0

12 rows selected

XML格式的就存放在Diag Alert中,文本格式的告警文件就在Diag Trace中

随着时间,告警文件会越来越大,应当定期清理

4.3 跟踪文件

跟踪文件包括下面一些文件

​ 1)用户进程跟踪文件(Udump)

​ 用于记载与用户进程相关的信息,主要跟踪sql语句

_ora_14778.trm,例如:orcl_ora_14778.trc

​ 2)后台进程的跟踪文件(Bdump)

​ 用于后台进程的警告和错误信息

_processname_PID.trc 如:_orcl_lgwr_15941.trc

每个后台进程都有对应的后台进程跟踪文件

而系统会将着错误的用户和后台进程的trc文件,分别复制一份到user_dump_destbackground_dump_dest

所以并不是网上说的background_dump_dest和user_dump_dest来决定,这可能和版本有关系。

另外增加.trm(trace map)文件,记录 trc 文件的结构信息

每个后台进程都有对应的后台进程跟踪文件

跟踪文件路径:

SQL> select name,value from v$diag_info where name='Diag Trace';

NAME                                                             VALUE
---------------------------------------------------------------- --------------------------------------------------------------------------------
Diag Trace                                                       /u01/app/oracle/diag/rdbms/orcl/orcl/trace
posted @ 2022-05-04 22:27  EverEternity  阅读(485)  评论(0编辑  收藏  举报