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           FIRST_CHANGE# FIRST_TIME



---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------



1          1       3213   52428800          1 NO  INACTIVE             289588737 24-6月 -10



2          1       3214   52428800          1 NO  CURRENT              289595339 24-6月 -10



3          1       3211   52428800          1 NO  INACTIVE             289584829 24-6月 -10



7          1       3212    5242880          1 NO  INACTIVE             289587946 24-6月 -10



 



此时发现除了一个运行的其余全部为INACTIVE状态,查看SCN号码与检查点号码保持一致(这个需要快速查看,因为SCN号码变化非常快,即使没有操作,也会不断变化)。



给某日志组新增一个成员:



 



SQL> alter database add logfile member



  2   'D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG' to group 7;



 



数据库已更改。



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       3214   52428800          1 NO  ACTIVE               289595339 24-6月 -10



3          1       3215   52428800          1 NO  CURRENT              289609376 24-6月 -10



7          1       3212    5242880          2 NO  INACTIVE             289587946 24-6月 -10



 



发现GROUP#=7的行字段MEMBERS=2,说明这个组内有两个日志成员了。



查看文件信息:



SQL> SELECT * FROM V$LOGFILE;



 



GROUP# STATUS  TYPE  MEMBER                              IS_RECOVERY_DEST_FILE



---------- ------- ------- ----------------------------------------



3   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO03.LOG     NO



2   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO02.LOG     NO



1   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO01.LOG     NO



7   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO07.LOG     NO



7 INVALID ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG   NO



 



说明刚田间的文件还处于INVALID状态,如果当前正好是这个组在运行,此时需要等待第二次切换到这个日志组才能启动。



SQL> alter system switch logfile;



 



系统已更改。



 



SQL> SELECT * FROM V$LOGFILE;



 



GROUP# STATUS  TYPE    MEMBER                                   IS_RECOVERY_DEST_FILE



---------- ------- ------- ---------------------------------------- ----------------------



3   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO03.LOG     NO



2   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO02.LOG     NO



1   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO01.LOG     NO



7   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO07.LOG     NO



7   ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG   NO



 



删除某组内一个成员:



SQL> alter database drop logfile member



  2  'D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG';



 



数据库已更改。



注意:如果数据库正在使用这个日志组,不可以被删除,在执行上述语句时会报错:



ORA-01609: 日志 7 是线程 1 的当前日志 - 无法删除成员



ORA-00312: 联机日志 7 线程 1: ' D:/ORACLE/ORADATA/ORCL102/REDO07.LOG'



ORA-00312: 联机日志 7 线程 1: ' D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG'



 



使用日志切换命令切换一下就可以删除掉了。



 



修改成员的位置:



 



SQL> HOST COPY D:/ORACLE/ORADATA/ORCL102/REDO07.LOG D:/ORACLE/ORADATA/ORCL102/REDO071.LOG



已复制         1 个文件。



 



SQL> alter database rename file



  2  'D:/ORACLE/ORADATA/ORCL102/REDO07.LOG' to 'D:/ORACLE/ORADATA/ORCL102/REDO071.LOG';



 



数据库已更改。



 



SQL> select * from v$logfile;



 



GROUP# STATUS  TYPE    MEMBER                                   IS_RECOVERY_DEST_FILE



---------- ------- ------- ---------------------------------------- ---------------------



3    ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO03.LOG     NO



2    ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO02.LOG     NO



1    ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO01.LOG     NO



7    ONLINE  D:/ORACLE/ORADATA/ORCL102/REDO071.LOG    NO



 



清理日志组:



SQL> alter database clear logfile group 2;



 



数据库已更改。



 



SQL> select * from v$log;



 



GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME



---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------



1          1       3217   52428800          1 NO  ACTIVE               289619976 24-6月 -10



2          1       3218   52428800          1 NO  CURRENT              289633784 24-6月 -10



3          1       3215   52428800          1 NO  INACTIVE             289609376 24-6月 -10



7          1          0    5242880          1 NO  UNUSED               289619137 24-6月 -10



 



状态变化为:UNUSED的信息。



 



删除一个日志组信息:



SQL> ALTER DATABASE DROP LOGFILE GROUP 7;



 



数据库已更改。



 



SQL> select * from v$log;



 



GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME



---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -----------



1          1       3217   52428800          1 NO  ACTIVE               289619976 24-6月 -10



2          1       3218   52428800          1 NO  CURRENT              289633784 24-6月 -10



3          1       3215   52428800          1 NO  INACTIVE             289609376 24-6月 -10



 



删除组的时候如果不好用,一般为在用或ACTIVE状态,那么就切换日志并手工存盘吧,然后在执行就好了。



 



 



6、数据文件


数据文件就是核心的核心,也就是数据的中心,本来数据文件应该将表空间部分引入,不过本文篇幅所限,所以暂时先说到数据文件。

 

单从数据文件角度来说,应当从表空间开始说起,就表空间部分,后面会单独说明其常用的管理方式,所以就这里就不多提表空间的事情,这里先说下数据文件怎么查询的:

1、查询数据文件以及数据文件可使用大小:

SQL> SELECT FILE_NAME,TABLESPACE_NAME,BYTES,BLOCKS

  2  FROM dba_data_files;

 

FILE_NAME   TABLESPACE_NAME     BYTES     BLOCKS

---------------- ------------ ---------------- --------

D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF   EXAMPLE                                             104857600      12800

D:/ORACLE/ORADATA/ORCL10/USERS01.DBF     USERS                                                 5242880        640

D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF    SYSAUX                                              262144000      32000

D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF   UNDOTBS1                                             36700160       4480

D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF    SYSTEM                                              503316480      61440

 

--查看每一个块的大小

SQL> show parameter db_block_size;

 

NAME                                 TYPE        VALUE

------------ ----------- ------------------------------

db_block_size                        integer     8192

 

对比一下计算结果是否正确:

SQL> SELECT BLOCKS*8192,BYTES FROM dba_data_files;

 

BLOCKS*8192      BYTES

----------- ----------

  104857600  104857600

    5242880    5242880

  262144000  262144000

   36700160   36700160

  503316480  503316480

 

说明理论上的计算是准确的。

创建一个1M的表空间:

Create tablespace ORA10TEST

Datafile ‘D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF’ size 1m;

 

再次查询:

SQL> SELECT FILE_NAME,TABLESPACE_NAME,BYTES,BLOCKS

  2  FROM dba_data_files;

 

FILE_NAME                                TABLESPACE_NAME                                         BYTES     BLOCKS

---------------------------------------- -------------------------------------------------- --------

D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF   EXAMPLE                                             104857600      12800

D:/ORACLE/ORADATA/ORCL10/USERS01.DBF     USERS                                                 5242880        640

D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF    SYSAUX                                              262144000      32000

D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF   UNDOTBS1                                             36700160       4480

D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF    SYSTEM                                              503316480      61440

D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF  ORA10TEST                                             1048576        128

 

--查看表空间的大小:

SQL> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='ORA10TEST';

 

 

TABLESPACE_NAME                                       FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO

-------------------------------------------------- ---------- ---------- ---------- ---------- -----

ORA10TEST                                                   6          9     983040        120            6

 

说明两个问题:

a)    有120个block可以被使用,从第9块开始使用。

b)    前8个块为保留块,1个块为文件头,7个块为表空间位图信息,管理这个表空间中那些块是可以被使用的。

 

将表空间大小修改为2M:

SQL> ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF' resize 2m;

 

数据库已更改。

 

验证一下:

SQL> SELECT FILE_NAME,TABLESPACE_NAME,BYTES,BLOCKS

  2  FROM DBA_DATA_FILES;

 

FILE_NAME                                TABLESPACE_NAME                                         BYTES     BLOCKS

---------------------------------------- -------------------------------------------------- --------

D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF   EXAMPLE                                             104857600      12800

D:/ORACLE/ORADATA/ORCL10/USERS01.DBF     USERS                                                 5242880        640

D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF    SYSAUX                                              262144000      32000

D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF   UNDOTBS1                                             36700160       4480

D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF    SYSTEM                                              503316480      61440

D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF  ORA10TEST                                             2097152        256

 

SQL> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='ORA10TEST';

 

TABLESPACE_NAME                                       FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO

-------------------------------------------------- ---------- ---------- ---------- ---------- -----

ORA10TEST                                                   6          9    2031616        248            6

 

说明8个保留块始终保持不变,那么此时将表空间变小一些,变得特别小:

SQL> ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF' RESIZE 120k

  2  ;

ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF' RESIZE 120k

*

第 1 行出现错误:

ORA-03214: 指定的文件大小小于所需的最小值

 

说明不允许这么小,我们适当增大,直到到128K才完成:

 

SQL> ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF' RESIZE 128k;

 

数据库已更改。

 

SQL> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='ORA10TEST';

 

TABLESPACE_NAME                                       FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO

-------------------------------------------------- ---------- ---------- ---------- ---------- -----

ORA10TEST                                                   6          9      65536          8            6

 

SQL>  SELECT FILE_NAME,TABLESPACE_NAME,BYTES,BLOCKS

  2  FROM DBA_DATA_FILES;

 

FILE_NAME                                TABLESPACE_NAME                                         BYTES     BLOCKS

---------------------------------------- -------------------------------------------------- --------

D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF   EXAMPLE                                             104857600      12800

D:/ORACLE/ORADATA/ORCL10/USERS01.DBF     USERS                                                 5242880        640

D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF    SYSAUX                                              262144000      32000

D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF   UNDOTBS1                                             36700160       4480

D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF    SYSTEM                                              503316480      61440

D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF  ORA10TEST                                              131072         16

 

说明一个表空间最少128K,即使表空间内部什么也没有,也就是相当于16个BLOCK,其中8个位数据块,8个位保留块。

付:如果内部存在数据,将表空间变小的时候,不能小于表空间实际暂用的大小(这个暂用的大小包含在回收站为清空的以及空块为进行压缩的部分)。

 

数据文件是否自动增长(注意表空间的自动增长,依赖于数据文件的自动增长,而不是表空间本身,表空间只是一个逻辑上的空壳而已):

SQL> SELECT AUTOEXTENSIBLE,FILE_NAME,INCREMENT_BY,MAXBLOCKS

  2* FROM dba_data_files;

 

AUT FILE_NAME                                INCREMENT_BY  MAXBLOCKS

--- ---------------------------------------- ------------ ----------

YES D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF             80    4194302

YES D:/ORACLE/ORADATA/ORCL10/USERS01.DBF              160    4194302

YES D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF            1280    4194302

YES D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF            640    4194302

YES D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF            1280    4194302

NO  D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF             0          0

 

说明数据文件不会自动增长,修改一下属性,让其自动增长。

SQL> ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF'

  2  AUTOEXTEND ON;

 

数据库已更改。

 

SQL> SELECT AUTOEXTENSIBLE,FILE_NAME,INCREMENT_BY,MAXBLOCKS

  2  FROM dba_data_files;

 

AUT FILE_NAME                                INCREMENT_BY  MAXBLOCKS

--- ---------------------------------------- ------------ ----------

YES D:/ORACLE/ORADATA/ORCL10/EXAMPLE01.DBF             80    4194302

YES D:/ORACLE/ORADATA/ORCL10/USERS01.DBF              160    4194302

YES D:/ORACLE/ORADATA/ORCL10/SYSAUX01.DBF            1280    4194302

YES D:/ORACLE/ORADATA/ORCL10/UNDOTBS01.DBF            640    4194302

YES D:/ORACLE/ORADATA/ORCL10/SYSTEM01.DBF            1280    4194302

YES D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF             1    4194302

 

此时说明可以自动增长,并最大值为4194302-2个块,每块8K,那么这个大小为32G的大小,那么ORACLE一个数据文件的理论最大值为32G。

默认情况下,每次增长8K,即一个BLOCK,这时指定其最大值,让其每次增长64K。

SQL> ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF'

  2  AUTOEXTEND ON NEXT 64M MAXSIZE 128M;

 

数据库已更改。

 

付:一个数据文件可以存放32G内容,一个表空间可以存放1024个数据文件,一个表空间的最大容量为:1024*32G=32768G,即32TB数据。

 

指定表空间去创建表:

SQL> CREATE TABLE SCOTT.EMP_OTHER TABLESPACE ORA10TEST AS SELECT * FROM SCOTT.EMP;

 

表已创建。

 

验证一下表是否创建在指定的表空间中:

SQL> SELECT TABLESPACE_NAME,TABLE_NAME from DBA_TABLES

  2  WHERE TABLESPACE_NAME='ORA10TEST';

 

TABLESPACE_NAME                TABLE_NAME

------------------------------ ------------------------------

ORA10TEST                      EMP_OTHER

 

如果新创建的表空间通过下面查询语句:

SELECT CHECKPOINT_CHANGE#,NAME FROM V$DATAFILE;

查询出的CHECKPOINT_CHANGE#和其它表空间不一样,那么就进行一次手工存盘操作(存盘的基本概念,上面以及提及,有关细节存盘说明,在后面要阐述的后台进程的相关文章中会进行说明):

SQL> alter system checkpoint;

 

系统已更改。

 

付:将表空间设置为只读后,CHECKPOINT_CHANGE#是不会发生变化的,只读恢复后需要独立存盘操作。

SQL> ALTER TABLESPACE ORA10TEST READ ONLY;

 

表空间已更改。

SQL> SELECT CHECKPOINT_CHANGE#,name FROM v$datafile;

 

CHECKPOINT_CHANGE# NAME

------------------ --------------------------------------------------

         292489106 D:/ORACLE/ORADATA/ORCL102/SYSTEM01.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/UNDOTBS01.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/SYSAUX01.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/USERS01.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/SYSTEM02.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/USERS02.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/SYSAUX02.DBF

         292489106 D:/ORACLE/ORADATA/ORCL102/UNDOTBS02.DBF

 

CHECKPOINT_CHANGE# NAME

------------------ --------------------------------------------------

         292489106 D:/ORACLE/ORADATA/ORCL102/SYSTEM03.DBF

         292487970 D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF

 

 

再看下表空间是否变化:

SQL> SELECT NAME,FUZZY FROM V$DATAFILE_HEADER;

 

NAME                                                         FUZ

------------------------------------------------------------ ---

D:/ORACLE/ORADATA/ORCL102/SYSTEM01.DBF                       YES

D:/ORACLE/ORADATA/ORCL102/UNDOTBS01.DBF                      YES

D:/ORACLE/ORADATA/ORCL102/SYSAUX01.DBF                       YES

D:/ORACLE/ORADATA/ORCL102/USERS01.DBF                        YES

D:/ORACLE/ORADATA/ORCL102/SYSTEM02.DBF                       YES

D:/ORACLE/ORADATA/ORCL102/USERS02.DBF                        YES

D:/ORACLE/ORADATA/ORCL102/SYSAUX02.DBF                       YES

D:/ORACLE/ORADATA/ORCL102/UNDOTBS02.DBF                      YES

 

NAME                                                         FUZ

------------------------------------------------------------ ---

D:/ORACLE/ORADATA/ORCL102/SYSTEM03.DBF                       YES

D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF                     NO

 

看一下TABLESPACE的基本状态:

SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES;

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

SYSTEM                         ONLINE

UNDOTBS1                       ONLINE

SYSAUX                         ONLINE

TEMP                           ONLINE

USERS                          ONLINE

TS_ISM                         ONLINE

TS_TIF                         ONLINE

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

ORA10TEST                      READ ONLY

 

只读表空间:内部所有信息不能进行修改操作,即常用的UPDATE INSERTDELETE操作。但是可以对表进行删除操作,因为删除这个表的定义没有删除内容,这个定义不是存放在当前表空间的,而是存放在SYSTEM表空间内部的。

 

此时将表空间恢复为可使用状态:

SQL> alter tablespace ORA10TEST READ WRITE;

 

表空间已更改。

 

SQL> SELECT CHECKPOINT_CHANGE#,name FROM v$datafile;

 

CHECKPOINT_CHANGE# NAME

------------------ --------------------------------------------------

         292720516 D:/ORACLE/ORADATA/ORCL102/SYSTEM01.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/UNDOTBS01.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/SYSAUX01.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/USERS01.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/SYSTEM02.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/USERS02.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/SYSAUX02.DBF

         292720516 D:/ORACLE/ORADATA/ORCL102/UNDOTBS02.DBF

 

CHECKPOINT_CHANGE# NAME

------------------ --------------------------------------------------         292720516 D:/ORACLE/ORADATA/ORCL102/SYSTEM03.DBF

         292735451 D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF

                                                              

已选择18行。

 

checkPoint的位置还是不一致,那么我们手动存盘一次:

SQL> alter system checkpoint;

 

系统已更改。

 

SQL>SELECT CHECKPOINT_CHANGE#,name FROM v$datafile;

 

CHECKPOINT_CHANGE# NAME

------------------ --------------------------------------------------

         292736455 D:/ORACLE/ORADATA/ORCL102/SYSTEM01.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/UNDOTBS01.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/SYSAUX01.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/USERS01.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/SYSTEM02.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/USERS02.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/SYSAUX02.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/UNDOTBS02.DBF

 

CHECKPOINT_CHANGE# NAME

------------------ --------------------------------------------------

         292736455 D:/ORACLE/ORADATA/ORCL102/SYSTEM03.DBF

         292736455 D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF

 

时间: 2024-09-15 03:50:38

ORACLE体系结构-真正的数据库-文件系统的相关文章

Oracle实例和Oracle数据库(Oracle体系结构)

--========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --========================================== /*     对于初接触Oracle 数据库的人来讲,很容易混淆的两个概念即是Oracle 实例和Oracle 数据库.这两 概念不同于SQL sever下的实例与数据库,当然也有些相似之处.只是在SQL server我们根本不需要花费太 多的精力去搞清

oracle体系结构的两个基本概念

要了解oracle体系结构必须先了解两个基本的概念: 数据库和实例.一: 数据库数据库(database)是一个数据集合.无论数据库是采用关系结构还是面向对象结构, oracle数据库都将其数据存放在数据文件中. 在其内部, 数据库结构数据对文件的逻辑映射, 使不同的数据分开存储, 这些逻辑划分称为表空间. 表空间和文件介绍:1: 表空间表空间(tablespace)是数据库的逻辑划分, 每个数据库至少有一个表空间,叫做系统表空间(system 表空间). 一个表空间只能属于一个数据库.每个表空

Oracle体系结构:内存结构和进程结构

oracle|进程|体系 (一)内存结构和进程结构 Oracle数据库的总体结构如下图:  1:Oracle实例(Instance)           在一个服务器中,每一个运行的Oracle数据库都与一个数据库实例相联系,实例是我们 访问数据库的手段.  实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识, 它们两个的值是相同的.数据库启动时,系统首先在服务器内存中分配系统全局区(SGA), 构成了Oracle的内存结构,然后启动若干个常驻内

chapter2: 安装 Oracle 软件并构建数据库

oracle|数据|数据库 第 2 章: 安装 Oracle 软件并构建数据库 返回课程列表 目的 本章让您了解如何使用 Oracle Universal Installer (OUI) 安装您的 Oracle 数据库软件并创建数据库. 您将学习如何使用 Database Configuration Assistant (DBCA) 创建附加数据库. 主题 本章讨论了如下内容: 使用 Oracle Universal Installer (OUI) 安装软件 使用 Database Config

Oracle技术:异构数据库初始化大字段处理

一.source端 SOURCEISTABLE SOURCEDB oracle RMTHOST 127.0.0.1, MGRPORT 7820 RMTFILE D:\ogg\oracle\dirdat\i1 table dbo.t_v; table dbo.t_t; 二.target端 SPECIALRUN END RUNTIME SETENV (NLS_LANG =AMERICAN_AMERICA.ZHS16GBK) userid ogg,password xifenfei EXTFILE D

Oracle体系结构及备份(一) 了解体系结构

Oracle体系结构及备份开篇,了解体系结构.

如何在oracle中手工创建数据库

oracle中手工创建数据库的步骤: 1. 创建必要的相关目录 2. 创建初始化参数文件 3. 设置环境变量Oracle_sid 4. 创建实例 5. 创建口令文件 6. 启动数据库到nomount(实例)状态 7. 执行建库脚本 8. 执行catalog脚本创建数据字典 9. 执行catproc创建package包 10.      执行pupbld 11.      由初始化参数文件创建spfile文件 12.      执行scott脚本创建scott模式 13.      用命令测试数据

Oracle体系结构及备份(十三) bg-pmon

一 什么是PMON进程 The process monitor performs processrecovery when a user process fails. PMON is responsible for cleaning up thecache and freeing resources that the process was using. PMON also checks on thedispatcher processes (described later in this ta

java oracle-怎么在oracle用imp导入数据库前删除数据库里的表 触发器怎么写 或者java代码怎么写

问题描述 怎么在oracle用imp导入数据库前删除数据库里的表 触发器怎么写 或者java代码怎么写 // 还原 Button button_1 = new Button(composite_1, SWT.NONE); button_1.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableItem[] tis = table.get