设为首页 收藏本站
查看: 606|回复: 0

[经验分享] ORACLE体系结构-真正的数据库-文件系统

[复制链接]

尚未签到

发表于 2016-7-25 13:18:34 | 显示全部楼层 |阅读模式
  前面文章,对于ORACLE部分前面主要阐述的是INSTANCE实例内部的一些东西,主要从共享池、数据缓冲区两大块去讲解,其实对于细节的说明还有一些知识点,如RMAN中的大池应用或PGA中的后台线程会在后面逐步说明,本文以ORACLE物理结构来讲解点点物理层的东西,其实这也是真正的数据库了,其余的都是实例,为此先明白一个在ORACLE数据库上容易误会的名词:INSTANCE(实例)和DATABASE(数据库),数据库是一组文件结构,而INSTANCE是一段内存结构,包含了对文件结构的操作过程和中间件,保证高效、稳定、安全等目的,而实体存放数据库的还是文件结构,一般一个实例对应一个数据库,在ORACLE集群中,可以完成多个实例对应一个数据库,实现内存共享,负载均衡、节点失败切换、分布式计算的高可用性,再配合相关容灾技术,如:Data Guard(这部分属于高可用部分知识,在后面逐步会牵涉)。
  
  本文主要说明一下部分内容:
  1、ORACLE逻辑结构说明
  2、ORACLE文件分类和组织关系
  3、ORACLE启动关闭详细
  4、控制文件
  5、日志文件
  6、数据文件
  
  
  
  
  1、ORACLE逻辑结构说明:
  对于ORACLE的逻辑结构,普遍的教材和大学的老师会给出类似于下面的图形,我们也先来看下一下图形,用于帮助进一步说明(下面图形对于体系结构阐述了大部分的情况):
  
   DSC0000.gif
  
  简单描述就是:
  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、创建数据库的名称以及其SIDSID一般和数据库的名称一致,但是也不一定,外部系统要连接数据库需要按照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]]
  这里顺便介绍一下,ORACLEHELP其实是一张表,这个表是在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$DATAFILEV$CONTROLFILEV$LOGFILEV$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
  
  重启前数据不一致,重启后数据保持一致了。
  1ALTER SYSTE就是修改参数信息,修改INSTANCE内部的信息,对应ALTER DATABASE是修改数据库的信息。
  如:
  ALTER SYSTEM SWITCH LOGFILE;--切换在线日志文件组
  ALTER SYSTEM checkpoint; --手工存盘
  ALTER SYSTEM register;--手工注册
  ALTER SYSTEM ARCHIVE LOG CURRENT;--归档日志
  
  ALTER SYSTEMSCOPE一般有几类参数:
  1memory 仅仅针对内存有效。
  2spfile 重启时针对数据库文件和内存才有效果
  3both 修改内存和文件。
  
  
  恢复控制文件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) 120block可以被使用,从第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,即使表空间内部什么也没有,也就是相当于16BLOCK,其中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

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249268-1-1.html 上篇帖子: 在Windows64位环境下.net访问Oracle解决方案 下篇帖子: Oracle OCI和Thin 连接方式的区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表