ORACLE体系结构-真正的数据库-文件系统
前面文章,对于ORACLE部分前面主要阐述的是INSTANCE实例内部的一些东西,主要从共享池、数据缓冲区两大块去讲解,其实对于细节的说明还有一些知识点,如RMAN中的大池应用或PGA中的后台线程会在后面逐步说明,本文以ORACLE物理结构来讲解点点物理层的东西,其实这也是真正的数据库了,其余的都是实例,为此先明白一个在ORACLE数据库上容易误会的名词:INSTANCE(实例)和DATABASE(数据库),数据库是一组文件结构,而INSTANCE是一段内存结构,包含了对文件结构的操作过程和中间件,保证高效、稳定、安全等目的,而实体存放数据库的还是文件结构,一般一个实例对应一个数据库,在ORACLE集群中,可以完成多个实例对应一个数据库,实现内存共享,负载均衡、节点失败切换、分布式计算的高可用性,再配合相关容灾技术,如:Data Guard(这部分属于高可用部分知识,在后面逐步会牵涉)。
本文主要说明一下部分内容:
1、ORACLE逻辑结构说明
2、ORACLE文件分类和组织关系
3、ORACLE启动关闭详细
4、控制文件
5、日志文件
6、数据文件
1、ORACLE逻辑结构说明:
对于ORACLE的逻辑结构,普遍的教材和大学的老师会给出类似于下面的图形,我们也先来看下一下图形,用于帮助进一步说明(下面图形对于体系结构阐述了大部分的情况):
简单描述就是:
1、表空间、段、区、块、OS块一次按照一对多下去。
2、一个表空间可以包含多个数据文件,但是一个数据文件只能在一个表空间。
3、一个数据文件可以包含多个区、但是一个区只能在一个数据文件中。
补充一点:一个数据库包含多个表空间,一个表空间只能属于一个数据库,这个没有在图中说明。
那么提出一下几个问题:
a、为什么段和数据文件没有直接关系(有部分书籍将它归为多对多的关系)?
b、平时创建的表放在那里,和这个结构之间是何种关系?
c、同上一个问题,索引存放在那里,与他们何种关系?
针对这三个问题,进一步说明:
问题a:为什么段和数据文件没有直接关系(有部分书籍将它归为多对多的关系)?
一般来说,一个段是表空间分配对象的基本单位,我们先不讨论分区表和分区索引的问题,一个表或者一个索引在创建较大的时候,若一个表空间创建多个数据文件,默认的数据文件由于某种情况限制增长大小(如:数据文件不是自动增长的,该阵列或分区已满),ORACLE会自动将新增的数据写入到其他的数据文件(如果存在其他文件的情况下),那么即使是一个普通表也可能跨数据文件,也就对应一个段可以跨数据文件了,系统如何识别到是一个段呢,其实是通过OBJECT_ID,即使是做分区表,每一个分区会有不同的OBJECT_ID,上次关于数据缓冲区的文章中,提及到ROWID的生成,如何实现全数据库唯一的方式,其中ROWID第二部分就是对象编号;很多时候对象在默认情况下尽量不要去做跨文件查找,会影响一些性能,较大的表,可以适当使用分区表的方式来降低每个段的数量,每次查询基本从一个分区内提取数据。
问题b和c:
同上,一个段是表空间分配对象的基本单位,分为数据段和索引段,对于普通的表和索引,创建对象就等价于创建一个段,创建一个索引也是一个段,可以通过视图:
SELECT * FROM USER_SEGMENTS
可以查看到到段信息基本和表结构一一对应;但是表存在分区表、索引同样存在分区索引(在博客简单分区表中已经详述分区表的创建过程),分区表以及分区索引的每个分区都可以指定不同的表空间,也就是对于一个段是在同一个表空间,但是对于一个表来说,如果是分区表是可以跨表空间的,在创建分区和分区索引的时候,只需要指定每一个分区tablespace <tablespace_name>即可完成这个功能,不过这个功能在很少的情况下才会使用。
2、ORACLE文件分类和组织关系
这部分说起来有点像废话,不过既然说到这里,还是简单说明一下吧。
ORACLE文件主要分为以下几大类:
1、初始化参数文件
2、控制文件
3、日志文件(在线日志、归档日志)
4、数据文件
初始化参数文件:每个版本的数据库初始化参数文件会有所变化,对于ORACLE 10G,始化参数文件主要保存的内容包含:控制文件位置、开启有标最大值、SGA最大值、PGA最大值、SQL优化器模式、系统多块读最大数量、数据缓冲区大小、tranc文件位置、保留区位置、JOB队列大小、最大连接数、回滚段表空间默认名称、回滚段表空间管理方式。
控制文件:相互备份,由初始化参数文件找到其位置,每个控制文件一摸一样,为二进制文件,相互备份,内部也有整列类似的技术相互拷贝,初始化参数文件可以创建1~8个控制文件,通过控制文件可以找到数据文件和日志文件的位置,以及同一个数据库内部可以创建数据文件和日志文件的上限信息以及大小信息。
日志文件:
日志文件是记录数据库做过什么的记录,它也记录一个数据库的时间戳和对应的递增的SCN号,数据库在提交的时候只需要记录先通过PGA中后台进程写入相应日志;日志文件按照组进行管理,一般默认为三组,每组一个文件,可以每组多个文件,可以在一定程度上提高日志编写的性能,并减少switch log的从在线日志向归档日志转换的过程,尤其在RAC集群中,日志组可以明显提高集群下的日志写导致的阻塞从而导致性能瓶颈;系统的事务回滚点以及备份恢复等也是通过系统日志文件的记录的时间戳以及SCN号码对应起来的。
数据文件:
所谓数据文件,就是存储数据的文件,它存储什么?一般用户级别的数据文件都是记录表的壳以及表的内容以及索引的壳以及索引的内容(分别以数据段和索引段存放,不过都是存储在数据文件中,数据文件和表空间的关系,上面已经有所说明),表的壳和索引的壳是指表的位图信息以及索引的管理信息。一个数据文件的理论最大值为32G,所以很多时候在做阵列的时候以30G左右为一个分组,这样保证数据文件不会越界。一个表空间可以最多存放1024个数据文件,也就是:1024*32G=32768G。相当于32T为一个表空间的上线,那么会不会有比这个还要大的数据,有,看看上面的说明,一个表可以跨表空间存放;系统表空间需要除系统表内容外,还需要存放一些管理性的视图(这里的视图不是虚表,是说管理其所有用户的创建对象的信息),如USER_TABLES、DBA_OBJECTS、USER_SOURCE等等这些都存储在系统表空间内,所以大家在创建数据库后,一定要将系统表空间稍微设置大一点,不然有些时候数据库创建东西或者某些时候很慢不知道为什么。
为了进一步说明三大文件的规则,进一步从启动文件过程,以及关闭数据库说明系统的对三大文件以及一些相关内容的关系。
3、ORACLE启动关闭详细:
首先明确,一个数据库的创建一般需要创建哪些内容:
a、创建数据库的名称以及其SID,SID一般和数据库的名称一致,但是也不一定,外部系统要连接数据库需要按照SID去连接,SID为实例名称。
b、根据参数编写初始化参数文件,这些参数文件如果你在不输入指定的参数值的时候有一些默认值。
c、创建dump目录。
d、创建密码文件。
e、创建基于操作系统的服务信息,通过ORADIM命令可以管理这些服务信息。
f、启动到MOUNT状态,建立字典信息。
g、处理二进制信息以及扩展包的拷贝(在:$ORALCE_HOME/RDBMS/ADMIN/目录下)
付:很多时候大家认为ORACLE卸载的时候卸载不干净,为什么,最重要的一点就是ORACLE的软件产品和数据库是完全独立的,往往在WINDOWS下用习惯的人都都是在控制面板上去卸载软件,但是没有卸载掉数据库,而数据库在没有软件的情况下也启动不起来,这样就只能到注册表中去将HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,然后重启才能生效。
但是真正卸载的好办法(最少ORACLE 10G后)可以使用的就是,使用DBCA先删除数据库(在DOS下输入DBCA,会弹出向导,根据向导将数据库删掉),再卸载数据库软件,可以卸载得干干净净,或者使用ORADIM删除掉关于数据库的服务信息后,再卸载软件,就可以干干净净的重做了。
回到话题,数据库启动部分:
数据库启动分三个阶段,先启动到UNMOUNT状态,然后再启动到MOUNT状态,在后再启动到OPEN状态,下面逐步解释每一个状态一般可以做什么,数据库启动了什么,做了什么事情。
3.1、启动到UNMOUNT状态:
STARTUP UNMOUNT;
可以执行的动作为:
查看数据库状态:
SELECT STATUS FROM V$INSTANCE;
查看后台进程:
SELECT * FROM V$BGPROCESS WHERE paddr<>'00';
启动了什么:
a、确定SID信息
b、找到参数文件(查找顺序为:spfilesid.ora->spfile.ora->initsid.ora):顺序去查找,一个找不到找下一个,三个全部找不到,直接提示错误。
c、分配INSTANCE实例的内存空间。
d、启动后台进程
e、初始化字典信息、V$、GV$
f、写入启动日志到:bdump/*.log内部。
UNMOUNT可做的是:
a、修改数据库初始化参数
b、创建数据库
c、创建控制文件
3.2、数据库启动到MOUNT状态:
ALTER DATABASE MOUNT;
MOUNT做了什么
a、确定控制文件的位置,并校验其完整性
b、读取控制文件到内存中
c、吸入bdump中
MOUNT下可以做什么
a、能够备份和恢复数据库
b、修改文件的名称和位置
控制文件为衔接数据文件和日志文件的中间件,也是一个领头者。
查看所有的控制文件为:
SELECT NAME FROM V$CONTROLFILE;
查看数据库的状态为:
SELECT STATUS FROM V$INSTANCE;
发现为:MOUNT
3.3、启动数据库到OPEN状态:
ALTER DATABASE OPEN;
数据库做了什么动作:
a.确定数据文件的位置
b.校验数据文件完整性,若一致则启动数据文件
c.如果不一致,通过日志文件恢复到一致性状态,若数据文件缺失,则不能启动须手工将其OFFLINE状态才可以启动。
d.写DUMP文件。
启动到OPEN状态后可以做的事情就是:
外部可以连接数据库,即认识到SID信息。
验证数据库状态:
SQL> connect / as sysdba;
已连接。
SQL> select status from v$instance;
STATUS
------------
OPEN
使用ORACLE关闭命令:
在SQL模式下,使用命令:HELP SHUTDOWN查看:
SQL> help shutdown
SHUTDOWN
--------
Shuts down a currently running Oracle Database instance, optionally
closing and dismounting a database.
SHUTDOWN [ABORT|IMMEDIATE|NORMAL|TRANSACTIONAL [LOCAL]]
这里顺便介绍一下,ORACLE的HELP其实是一张表,这个表是在SYSTEM用户下,上述命令的结果类似于查询SQL语句:
SELECT * FROM SYSTEM.HELP t
WHERE t.topic='SHUTDOWN';
一样的结果
说明其四种方式,默认为NORMAL,四种方式的区别分别介绍一下:
SHUTDOWN NORMAL
四种方式中若不指定关键字,直接使用SHUTDOWN关闭数据库,则认为是SHUTDOWN NORMAL关键字。该默认状况下,会有以下特点:
1、所有会话信息必须全部退出,包括外部程序连接和第三方工具以及sqlplus等连接须全部关闭,不然不能关闭数据库。
2、若会话没有关闭,这个命令将不会影响会话进行,即SQL可以继续运行,程序可以继续跑。
3、此时无法建立新的会话,可以使用操作系统认证 as sysdba连接到空闲进程,但是做不了任何事情。
SHUTDOWN TRANSCATIONAL
看名字就是是以事务级别关闭的了,不过很多人容易误解的是认为它的粒度应该比NORMAL更加细,其实是面对的对象更加细,但是关闭级别更加粗,因为它只需要没有事务没有提交就可以关闭,此时有以下特征:
1、当前未提交的事务必须提交或回滚后,才能关闭掉数据库,否则用这个命令键无法关闭。
2、新的数据库操作语句和新发起的数据库会话将无法再建立。
3、对于多个事务需要修改数据库同一行记录的排队事务,还未征用到该行记录的将会自动放弃执行。
4、如果没有尚未提交或回滚的事务,即使有会话存在也会关闭数据库。
SHUTDOWN IMMDIATE
1、会进行存盘操作
2、不会管当前是否有事务还没有进行COMMIT。
3、将已经提交的事务存入磁盘。
SHUTDOWN ABORT
1、直接关闭,不进行存盘
2、会导致数据文件和日志文件不一致的问题。
3、从外部看,和IMMDIATE没有太大区别,不过内部唯一区别就是不会存盘操作。
4、这种方式关闭数据库后,启动时,会发现SMON进程通过控制文件会发现数据文件和日志文件不一致的问题,并对其进行同步恢复。
以只读方式启动数据库:
STARTUP OPEN READ ONLY
这种启动方式前数据库关闭的方式不能是ABORT方式,因为只读方式不允许对数据库进行修改操作,而ABORT关闭的数据库需要用SMON来同步数据文件和日志文件做相应恢复操作,所以一般情况下这是不成立的,除非存盘前,两者本身就是一致的,这个可能性很小。
1、以只读方式打开数据库,只能查看,不能修改任何信息。
2、如果前一次是以“非只读”方式启动,并做了一些操作后,使用ABORT关闭数据库,本次启动使用READ ONLY方式启动,只能启动到MOUNT状态。
3、如果为其他状态,应当修改为:ALTER DATABASE OPEN READ ONLY;
4、如果在ABORT后,以非READ ONLY方式启动,SMON恢复过程是内置的,对外部透明。
启动过程中的文件信息,包含在以下视图中:
V$DATAFILE、V$CONTROLFILE、V$LOGFILE、V$TEMPFILE
快速重启数据库:
最后,快速关闭带启动数据库,即快速重启数据库命令:
STARTUP FORCE;
4、控制文件
查看控制文件的位置:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
----------------------------------------
D:/oracle/oradata/orcl102/control01.ctl
D:/oracle/oradata/orcl102/control02.ctl
D:/oracle/oradata/orcl102/control03.ctl
查看内存中所使用的控制文件:
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------
D:/ORACLE/ORADATA/ORCL102/CONTROL01.CTL
D:/ORACLE/ORADATA/ORCL102/CONTROL02.CTL
D:/ORACLE/ORADATA/ORCL102/CONTROL03.CTL
上述两个控制不一定是一样的,在内存中修改了的信息,根据设置有些时候需要重启数据库后才能修改掉前者的信息(spfile)。
另外,控制文件为自我保护,自我镜像,丢掉一个也没事,即使全部丢掉也没事,吟为它只需要存储一些控制信息,控制文件无论多少个(1~8个),内容都是一摸一样的。
实现内存信息和磁盘信息不一样的情况:
alter system set control_files=
'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL'
SCOPE=spfile;
此时再次查询上述两个SQL:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
------------------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL
重启数据库后再次查询:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
------------------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
重启前数据不一致,重启后数据保持一致了。
1、ALTER SYSTE就是修改参数信息,修改INSTANCE内部的信息,对应ALTER DATABASE是修改数据库的信息。
如:
ALTER SYSTEM SWITCH LOGFILE;--切换在线日志文件组
ALTER SYSTEM checkpoint; --手工存盘
ALTER SYSTEM register;--手工注册
ALTER SYSTEM ARCHIVE LOG CURRENT;--归档日志
ALTER SYSTEM的SCOPE一般有几类参数:
1、memory 仅仅针对内存有效。
2、spfile 重启时针对数据库文件和内存才有效果
3、both 修改内存和文件。
恢复控制文件3后重启的效果:
上述已经闲置了控制文件3,此时将3恢复:
alter system set control_files=
'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL'
SCOPE=spfile;
再次启动时报错:
SQL> startup force;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-00214: ???? 'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL' ?? 257 ???
'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL' ?? 251 ???
内容看不懂是因为数据库安装使用了中文字符集,这里将其修改为英文字符集:
SQL>alter session set nls_language=american;
SQL> ALTER DATABASE MOUNT;
alter database mount
*
ERROR at line 1:
ORA-00214: controlfile 'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL' version 257
inconsistent with file 'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL' version 251
说明控制文件也是有版本的,并且所有控制文件的版本必须保持一直,此时不一致的时候,要同步成一致的,最简单的办法就是COPY,操作系统级别的拷贝操作:
在SQL下可是用HOST+操作系统命令实现相应命令操作:
SQL> HOST COPY D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL
然后再次启动数据库就没有问题了。
备份控制文件:
控制文件基本只需要记录一些版本信息,所以如果文件系统的数量没有变化后,须对控制文件做相应的备份工作,控制文件备份工作非常简单:
SQL> alter database backup controlfile to trace;
数据库已更改。
这样就完成了,那么备份了那里去了呢?使用一下命令就能找到:
SQL> show parameter user_dump;
NAME TYPE VALUE
---------- ----------- ------------------------------
user_dump_dest string D:/ORACLE/ADMIN/ORCL102/UDUMP
到这个目录下可能会找到很多文件,找日期最近的一个即可,如果不好找,就先删除掉这个目录下的文件后,再执行控制文件备份的命令,这样这个目录下就只有一个trc文件,也就是那个备份文件了,内部包含对控制文件的创建以及对日志文件、数据文件、临时表空间文件等的一些控制信息,可以详细阅读,后续会介绍如何通过这个文件恢复所有的控制文件被删除的情况。
破坏控制文件:
将所有控制文件删除掉,此时数据库会自动关闭掉,并以ABORT方式关闭。启动时报错:
SQL> startup;
ORACLE instance started.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 176163716 bytes
Database Buffers 427819008 bytes
Redo Buffers 7135232 bytes
ORA-00205: ?????????, ??????, ???????
此时数据库自动到NOMOUNT状态(因为MOUNT状态需要启动控制文件,现在无法启动),此时将备份的TAC文件中的信息拷贝出来执行:
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL10" NORESETLOGS NOARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 'D:/ORACLE/ORADATA/ORCL10/REDO01.LOG' SIZE 50M,
9 GROUP 2 'D:/ORACLE/ORADATA/ORCL10/REDO02.LOG' SIZE 50M,
10 GROUP 3 'D:/ORACLE/ORADATA/ORCL10/REDO03.LOG' SIZE 50M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF',
14 'D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF',
15 'D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF',
16 'D:/ORACLE/ORADATA/ORCL10/USERS01.DBF',
17 'D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF'
18 CHARACTER SET ZHS16GBK
19 ;
控制文件已创建。
然后进行介质恢复:
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
完成介质恢复。
SQL> alter database open;
数据库已更改。
5、日志文件
查询日志文件组信息:
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
1 1 5 52428800 1 NO INACTIVE 627440 2009-10-08
2 1 6 52428800 1 NO CURRENT 651249 2009-10-08
3 1 4 52428800 1 NO INACTIVE 598150 2009-10-07
ORACLE数据库在线日志文件都是以组问单位(同一组日志写,一起工作,一般一个组一个文件,多个文件同事写在RAC集群下解决一些性能瓶颈):GROUP#为组编号,STATUS字段为:CURRENT代表正在运行的日志组,BYTES代表日志组的文件的大小;SEQUENCE#代表第几次对这个日志组
查看正在编写的日志文件:
SQL> SELECT * FROM V$LOGFILE;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ------------------------------------------------ ---------------------
1 STALE ONLINE D:/ORACLE/ORADATA/ORCL10/REDO01.LOG NO
3 STALE ONLINE D:/ORACLE/ORADATA/ORCL10/REDO03.LOG NO
2 ONLINE D:/ORACLE/ORADATA/ORCL10/REDO02.LOG NO
状态为:STALE就是过期的信息。
日志组就是类似上班组,某些组上夜班,某些组上白班,交替接班的过程。管理对象以组为单位进行管理。
组内每一个文件叫做:成员。
在开始的控制文件中有以下语句,用于控制日志文件的信息:
MAXLOGFILES 16 最多可以有多少个日志文件组
MAXLOGMEMBERS 3 一个组最多可以有多少个成员
MAXDATAFILES 100 最多数据文件个数
MAXINSTANCES 8 最多实例个数(集群中)
在线日志切换的条件:
1、写满后进行切换(切换中只会切换到所有日志满的时候,前面的日志文件进行存盘,否则不会存盘)
2、手工使用命令:ALTER SYSTEM SWITCH LOGFILE;
切换日志导致增量存盘,一般存盘方式:1、完全存盘;2、增量存盘
完全存盘触发的两种方式:
1、手工存盘:ALTER SYSTEM CHECKPOINT;
2、停止数据库(非ABORT方式)
完全存盘的意思是:完全存盘是将内存中所有的脏块写入磁盘中。
查看系统检查点号码:
SQL> select checkpoint_change# FROM v$database;
CHECKPOINT_CHANGE#
------------------
289534543
查看系统SCN号码:
SQL> SELECT CURRENT_SCN,CHECKPOINT_CHANGE#
2 FROM V$DATABASE;
CURRENT_SCN CHECKPOINT_CHANGE#
----------- ------------------
289553912 289534543
这两个号码之间的差距就是还在存盘时需要写入的部分。
算下差距:
SQL> SELECT CURRENT_SCN-CHECKPOINT_CHANGE#
2 FROM V$DATABASE;
CURRENT_SCN-CHECKPOINT_CHANGE#
------------------------------
19369
即有19369个地方需要存盘,
查看日志组信息:
SQL> SELECT FIRST_CHANGE#
2 FROM V$LOG WHERE STATUS='CURRENT';
FIRST_CHANGE#
-------------
289548398
说明将会从289548398这个时候开始存盘。
此时存盘后再次查询:
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------- --- ---------------- -------------
1 1 3209 52428800 1 NO CURRENT 289562771
2 1 3207 52428800 1 NO INACTIVE 289534543
3 1 3208 52428800 1 NO ACTIVE 289548398
发现当前文件将会从289562771开始编写,这里的ACTIVE状态在后面说明。
查询数据文件的检查点编号:
SELECT CHECKPOINT_CHANGE#,NAME FROM V$DATAFILE;
会发现所有的数据文件的检查点编号都是289562771。
日志文件的最小值为(8192个扇区*512个字节=4M):一般为默认为5M.
增加在线日志组:
SQL> alter database add logfile group 7
2 'D:/ORACLE/ORADATA/ORCL102/REDO07.LOG' size 5m;
数据库已更改。
查看信息:
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 3213 52428800 1 NO INACTIVE 289588737 24-6月 -10
2 1 3210 52428800 1 NO INACTIVE 289570945 24-6月 -10
3 1 3211 52428800 1 NO CURRENT 289584829 24-6月 -10
7 1 3212 5242880 1 YES UNUSED 0
发现状态为UNUSED,说明还没有使用过。切换日志组:
SQL> alter system switch logfile;
系统已更改。
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -----------
1 1 3213 52428800 1 NO CURRENT 289588737 24-6月 -10
2 1 3210 52428800 1 NO ACTIVE 289570945 24-6月 -10
3 1 3211 52428800 1 NO ACTIVE 289584829 24-6月 -10
7 1 3212 5242880 1 NO ACTIVE 289587946 24-6月 -10
ACTIVE状态代表这个日志组已经被切换过,但是还没有存盘,当你切换日志的时候,只会在所有日志写满后,顺序将前面的一个日志组存盘,此时使用命令:
SQL> alter system checkpoint;
系统已更改。
再次查看:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS最后更新:2017-04-02 06:51:17