Oracle数据空间的管理

数据库空间管理

    存储空间是数据系统中非常重要的资源,无论是数据库中的对象还是数据库中的数据都需要空间进行存储,一旦数据库空间被占用,那么该数据库喜用不能再接受任何对象和数据,数据库系统的运行基本上处于停滞状态。

合理利用空间不但能节省空间,还可以提高数据系统的效率和工作性能,对数据库空间的管理主要通过以下几种方式:

 、建立数据库时分配存储空间,建立数据库可以指定SYSTEM表空间和其他表空间的大小

 、空间充足时,通过动态空间监视和增加数据文件的方法管理数据库空间

 、空间不够用时,需要增加存储空间,增加存储空间的方法主要包括:改变系统表空间数据文件的大小,创建新表空间和增加表空间大小

、减少存储空间的使用,主要方法包括:为表中的列设置合理的数据类型和长度、为对象设置合理的存储参数

、回收存储空间,主要方法包括:对历史数据进行存档并回收相应的空间;删除无用的对象和表空间

  1. 建立数据库时的空间设计

从逻辑上说,数据库空间是有若干一个表空间组成的,而表空间只是一个逻辑概念,它与数据库的物理结构有着密切的关系,表空间与磁盘上的若干个数据文件对应,表空间的所有内容其实都存储在数据文件中。数据文件是实际存在的文件,在创建表空间时就需要指定该表空间中各个数据文件的大小。

所以指定一个合理的表空间是非常重要的,根据表空间的类型不同,空间设计可分为以下俩种:

   、system 表空间初始值:创建数据库时指定

   、其他表空间初始值:创建表空间时指定

、指定system表空间初值

    数据库运行期间如果出现存储空间不够用的现象,会对数据库的运行造成较大的影响,虽然可以通过增加数据文件以扩充存储空间,但还是会或多或少的影响数据的性能,因此在创建数据库时,为表空间中的数据文件设置足够大的值。

    通过俩种方式来设system表空间的初始值

    、通过DBCA工具创建数据库并指定system表看哦昂件的初始值

       通过DBCA创建数据库的操作步骤如下

        、启动DBCA,进入“欢迎使用”窗口,直接单击“下一步”按钮进入“操作”窗口

        、选择“创建数据库”单选项,并单击“下一步”按钮,进入“数据库模板”

        、选择“定制数据库”单选项,单击“下一步按钮”进入“数据库标识”窗口。

        、单击“下一步”按钮,进入“管理选项”窗口;继续单击“下一步”按钮,进入“数据库身份证明”窗口

        、按照默认设置,继续单击“下一步”按钮,直到进入“数据库存储”窗口

        、展开窗口左侧的“表空间”节点,并选择“SYSTEM”选项

        、双击窗口右侧的数据文件system01.dbf所在的行,弹出“b编辑数据文件”窗口

        、设置文件大小为100MB,并单击“确定”按钮返回“数据库存储”

    、通过命令方式创建数据库并指定system表空间的初始值

        、创建文件目录,用户存放数据库的各个不同类型的文件

        C:>mkdir E:\oracle\admin\eygle\adump

C:>mkdir E:\oracle\admin\eygle\bdump

C:>mkdir E:\oracle\admin\eygle\cdump

C:>mkdir E:\oracle\admin\eygle\dpdump

C:>mkdir E:\oracle\admin\eygle\pfile

C:>mkdir E:\oracle\admin\eygle\udump

C:>mkdir E:\oracle\flash_recoery_area

C:>mkdir E:\oracle\oradata

C:>mkdir E:\oracle\aoradata\eygle

、创建参数文件

E:\oracle\admin\eygle\pfile\init.ora

文件内容:

db_name=’eygle’

instance_name=’eygle’

memory_target=320M

processes=50

audit-file_dest=’E:\oracle\admin\eygle\adump’

audit_trail=’db’

db_block_size=4096

db_domain=’’

db_recovery_file_dest=’E:\oracle\flash_recovery_area\eygle’

db_recovery_file_dest_size=64M

diagnostic_dest=’E:\oracle\’

dispatchers=’(PROTOCOL=TCP)(SERVICE=ORCLXDB)’

open_cursors=100

#remote_login_passwordfile=’EXCLUSIVE’

Undo_tablespace=’UNDOTBS1’

Control-files=(‘E:\oracle\oradata\eygle\CONTROL01.CTL’,

‘E:\oracle\oradata\eygle\CONTROL02.CTL’)

           Compatible=’11.1.0’

           、设置环境变量ORACLE_SID即选择数据库实例

           C:>set ORACLE_SID=eygle

           、创建例程

           C:\oradin –new –sid eygle –startmode manual –pfile “E:\oracle\eygle\pfile\init.ora”

           、启动SQL*Plus

           C:\sqlplus sys/123456 as sysdba

           、启动例程

           SQL>STARTUP pfile=”E:\oracle\admin\eygle\pfile\init.ora” nomount;

、创建数据库指定SYSTEM空间的初始大小,编写一个创建数据的SQL文件,保存CreateDB.SQL,其内容:

CREATE  DATABASE eygle

maxinstances 4

maxloghistory 1

maxlogfile 16

maxlogmembers 3

maxdatafiles 10

logfile group 1 'e:\oracle\oradata\eygle\redo01.log' size 10M,

group 2 'e:\oracle\oradata\eygle\redo02.log' size 10M

datafile 'e:\oracle\oradata\eygle\system01.dbf' size 50M

autoextend on next 10M extent management local

sysaux datafile 'e:\oracle\oradata\eygle\sysaux01.dbf' size 50M

autoextend on next 10M

default temporary tablespace temp

tempfile 'e:\oracle\oradata\eygle\temp.dbf' size 10M autoextend on next 10M

undo tablespace UNDOTBS1 datafile 'e:\oracle\oradata\eygle\undotbs1.dbf' size 20M

character sez ZHS16GBK

national character set AL16UTF16

user sys identified by sys

user system identified by system

 

 

其中datafile ‘e:\oracle\oradata\eygle\system01.dbf’ size 50Mj就是设置SYSTEM 表空间的初值语句,这里我们设置SYSTEM表空间的初值为50MB。

调用该文件的方法为:

SQL>@C:\crateDB.SQL;

    、设置其他表空间初值

          对于其他表空间中的数据文件,可以在创建表空间的同时指定该表空间的中的数据文件的初值,最好能够设置一个较大的值,这样就能防止以后出现空间不够用的现象。

 

          例如:学生信息库,要把有关学生信息的一些表放到一个表空间中,如果有2000多名学生则存储学生个人信息最多也不会超过100MB的空间,但为了保险期间,可以设置俩个数据文件,每个数据文件的大小均设置为100MB,使得整个表空间的大小超出存储数据的实际需要。

       CREATE TABLESPACE student_information

       datafile 'E:\oracle\oradata\student\stud01.dbf'  size 100M,

              'E:\oracle\oradata\student\stud02.dbf'  size 100M

                  default storage(

                            initial 10M

                            next  10M

                            minextents 1

                            maxextents 10

                            pctincrease 20

                                )

                      online;

 

        storage语句指定表空间的存储参数,这些参数对于数据的性能影响很大,选择时好注意:

        initial   10M --表空间student_information 初始区间大小为10MB

        next    10M --当初始区间填满后,分配第二个区间大小为10MB

        pctincreace  20  --当再填满的时,按照20%的增长速度分配区间大小

        minextents  1   --初始为该表空间分配1个区间

        maxextents  10  --最多为该表空间分配10个区间

 

空间充足时的管理

   由于表空间不够用时会极大地影响数据性能,因此平时对于表空间的状态应多加观察,在空间接近上线时候一是采取措施,而不是等到空间不够用并对数据库的运行产生不良影响时才急着扩充。童超可以采用以下方法避免表空间的不足:

、动态表空间监视方法。

、像表空间增加数据文件方法。

 

、使用数据字典动态监视

          可以通过观察相应数据字典中的数据来获得空间使用信息,这里使用的数据字典是表dba_free_space或user_free_space,可以查看其内容来得到有管表表空间的空间信息。

       例如通过dba_free_space查看表空间的空间信息:

       SELECT *

       FROM DBA_FREE_SPACE;

、像表内空间增加数据文件

       如果用数据字典查看到某个表空间不够用了,可用add datafile语句动态的给表空间增加数据文件

       例如:

           给表空间student_information再增加2MB的存储空间

 

           ALTER TABLESPACE student_information

           ADD DATAFILE ‘e:\oracle\oradata\student\stud03.dbf’ size 2M;

解决空间不足的方法

       数据库中存储的数据是动态变化的,并且一般是向不断增加的方向变化,随着时间的推移,数据库文件的空间可能会呗全部用尽,导致无法再向数据库增加数据,数据库系统的运行会受到极大的影响,解决空间不足的方法是扩充数据库的存储空间。扩充数据库存储空间的常用方有如下3种:

        、增加SYSTEM 表空间中数据文件的大小

        、创建新的表空间

        、创建心的数据文件

 

 

 

、增加数据文件大小

       数据库中的数据其实都是存储在数据文件中的,SYSTEM表空间的数据文件是在创建数据库时给定的,并且给其大小指定了一个初值。那么在SYSTEM表空间存储空间不够时就可以用ALTER DATABASE命令动态增加SYSTEM表空间数据文件的大小。

、ALTER DATABASE命令简介

  改变SYSTEM表空间数据文件的大小可以用ALTER DATABASE命令,此命令还可以改变一些有关数据库的其他信息,其语法格式如下:

  ALTER DATABASE 数据库名

       Mount [standby   |  close database]

       | opne [resetlogs  | noresetlogs ]

       | archivelog | noarchivelog

       | add logfile [thread  数值] {[group  数值] 文件名,…..}

       | add logfile member {{文件名[reuse],…}  to group 数值| 文件名}

       | drop logfile {group 数值 | 文件名,….}

       | drop logfile member {文件名,….}

       | clear [unarchived]  logfile {group 数值文件名,…}

       | rename file旧文件名 to 新文件名

       | create standby controlfile as 文件名 [reuse]

       | backup controlfile {to 文件名 [reuse]  |  to trace}

       | reset compatability

       | enable | disable [public] thread 数值

       | create datafile {文件名….}

       | datafile {文件名…} {online | offline [drop] resize s数值}

       | end backup

       | autoextend off | on;

 其中,上述各选项的具体介绍如下:

    、 mount:只在未安装数据库启动方式下使用,它使数据装入现场,其中standby项是装配数据库备份。

    、open:使数据库打开,只在安装启动数据库方式下使用

    、archivelog | noarchivelog :该变数据库日志归档状态为有效或无效

    、add logfile: 增加一个或多个日志组

    、add logfile member: 为指定日志组增加日志成员

    、drop logfile :删除日志组。

    、drop logfile member:删除日志组成员

    、drop logfile member :删日志组成员。

    、clearlogfile:重新初始化日志组内容

    、renamefile …to …: 将数据文件或日志组成员文件更名

    、create standby : 创建一个用来维护备用数据库的控制文件

    、backup  controlfile :备份控制文件

    、reset comparability :在数据库下次启动时,标记数据库恢复到早期版本

    、enable | disable thread : 使线程有效或无效

    、create datafile :在旧数据文件上创建一个新的空数据文件

    、datafile :改变数据文件的一些内容,例如脱机或联机以及重新定义其大小

    、end backup:在一个联机表空间备份被系统或现场错误中断后,避免在数据库启动时做介质恢复

    、autoextend:允许或禁止自动扩充数据文件

  例如:

修改SYSTEM表空间中数据文件的大小

ALTER DATABASE orcl

 Datafile  ‘E:\app:jinsh\oradata\orcl\system01.dbf’

 Resize 750M;

 

  创建新表空间:

    表空间其实是一个逻辑概念,它的所有数据和结构信息都存储在一个或多个数据文件中,当需要扩充数据库存储表空间时,可以创建新的表空间并指定它的数据文件,系统就会划出一块磁盘空间给这个表空间,而这个表空间当然也是属于这个数据库的,因此就扩大了数据的存储空间。

  创建数据库时最好能创建几个私用的表空间,因为SYSTEM表空间是系统表空间,其中存储着数据字典和数据结构等重要信息,它是数据系统运行的基础,若是把所有数据信息都存储在这个表空间里,一方面会迅速占满它的空间,另一方面加大了出错的可能性。

 

  1. CREATE TABLESPACE命令简介

创建表空间的命令是CREATE TABLESPACE,它的语法格式如下:

 CREATE TABLESPACE 表空间名

DataFILE {文件名[autoextend {off | on next 数值 maxsize 数值}],

….}

               Minimum extent 数值

               Logging  | nologging

               Default storage {…}

               Online  | offline

               Permanent | temporary;

          其中各项的意义和作用如下:

                、datafile :为此表空间指定数据文件的名字

                、autoextend:使自动扩展数据文件为有效或无效,并在有效时指定next值为下一次分配给数据文件爱你的磁盘空间,maxsize为可分配的最大磁盘空间,若用unlimited则表示不受限制

                、minimum extent:控制表空间中的自由空间,方法是保证表空间中每个使用的或自由的扩充尺寸至少是指定数值的倍数。

                、logging | nologging :指定该表空间的所有表、索引和区分的默认日志使用方式,其中logging表示数据操作需要记录到日志,nologging表示数据操作不做日志

                、default storage :为在该表空间中建立的全部对象指定默认的存储参数。

                、online | offline :使表空间联机或脱机

                、permanent | temporary :指定表空间用来包含永久对象或暂时对象。

 

       例如:创建表空间,并指定一个数据文件,同时设存储参数。

          CREATE TABLESPACE test

          Datafile ‘E:\oracle\oradata\test01.dbf’  size 5M

            DEFAULT storage (

                          Initial 5M

                          Next 5M

                          Minextents 2

                          Maxextents 10

                          Pctincrease 20

)

           Online;

 

动态增加表空间

      表空间中的数据文件大小是在创建表空间时就指定了的,在数据运行过程中不能超过此限制,一旦表空间的数据文件被沾满,则不能继续增加数据。解决办法向表空间增加新的数据文件,以此来扩充表空间的存储能力。

     、ALTER TABLESPACE命令简介

       向表空间增加数据文件使用的命令是ALTER TABLESPACE ,其语法格式如下:

       ALTER TABLESPACE 表空间名

       Logging | nologging

       Add datafile {数据文件名 [autoextend] ,….}

       Rename datafile 原文件名to新文件名

       Coalesce

       Default storage

       Minimum extent 数值

       Online | offline [ normal | temporary | immediate | for recover]

       {begin | end}  backup

       Read onlye | write

       Permanent | temporary

     其中

        、add datafile :用于增加表空间的数据文件,可在联机或脱机时增加,但所增加的数据文件不能是其他表空间或数据库已经使用的,它同样可带 autoextend参数

        、coalesce:用于将所有相连接的空间范围合并到相邻的较大的范围中去,这一项不能被其他命名指定。

        、{begin | end} backup:用于开始和结束联机备份表空间中的数据文件,在备份过程中用户可以继续访问该表空间,但备份过程中不能将表空间脱机,也不能关闭数据库

        、read only | write :其中read only表示此表空间内容是只读的,不能向其中写入任何数据,而read write则表示可以对此表空间的数据进行读写操作。

 

        例如:

利用ALTER TABLESPACE 语句的ADD DATAFILE选项,向表空间增加数据文件

   向表空间test中增加俩个大小为10MB的数据文件

   ALTER TABLESPACE test

         Add datafile ‘E:\oracle\oradata\test02.dbf’  size 10M,

                   ‘E:\oracle\oradata\test03.dbf’   size 10M

三种方法的区别与比较

   第一种方法是通过增加SYSTEM表空间中的数据文件的大小的方法来扩充数据库的存储能力,使用的命令是ALTER DATABASE。SYSTEM表空间是整个数据库最重要的表空间,它的存储空间不够将直接影响到数据库的运行。

   第二种方法是创建新的表空间来扩充存储能力,在一个数据库系统中往往存在多个数据文件。所有一般通过增加表空间的方法,一方面扩充了数据库的存储能力,另一方面也方便了数据的管理。

   第三种方法是增加表空间中的数据文件来扩充数据库的存储空间。这是在数据运行过程中经常需要做的工作,因为在一开始不能将数据文件的大小设计得很合理,所有动态的添加数据文件

合理利用存储空间

   合理利用存储空间包括以下几个方面:

      、采用合适的数据类型

      、合理设置存储参数

      、回收无用的表空间

      、对历史数据进行归档备份,然后回收其占用的空间

 

、采用正确的数据类型

   此处的数据类型是指设计数据表各列的数据类型和长度。

 

   例如:创建student_01

   CREATE TABLE student_01(

         Student_no  NUMBER(5),                 --用于存储学生的序号

         Student_name  CHAR(50)                 --存储学生的姓名(此列长度为50个字符,实际用户存储实际的数据的一般为6个字符)

                                                --实际上即使CHAR(50)修改为CHAR(16)都不是很合理,应为多出的空间系统会用空格补充

                                                --VARCHAR2数据类型,它也有最大长度限制,但当列数据达不到最大长度时,就只存储

                                                --有效信息,剩余的空间可以被别的对象使用。

         Student_name  VARCHAR2(16)

);

 

 

、存储参数的正确设置

   在创建对象时,若不指定存储参数,则会采用表空间默认的存储参数,当然应设计和指定该对象的存储参数。

、使用initial参数

  Initial参数,同前面估计空间是所设计的那样,此值应比对象所需要的空间大一点,此时将具有最佳的性能和空间分配。

、使用pctfree和pctused

  在数据库中,由于某行特别长,或是由于某行动态增长超出了数据块的存储空间,就必须开辟新的数据块,这样一行存储在俩个数据块上,就产生了行链,为了防止行链的产生,尤其是为了防止第二种情况产生的行链,就需要合理设置pctfree参数。此外为了能在某数据块中数据减少时,可以重新使用释放的空间,也需要设计pctused参数。

参数pctfree和pctused的使用是非常关键的。其中pctfree表示每个数据块空闲的空间比例,若小于此比例就要分配新的数据块,这样就剩下一部分自由空间可以在数据变长时使用,pctused表示当数据块中数据减少到多大比例时重新使用该数据块装入新的数据,这样是为了动态释放的空间。这俩个参数设计不合理,也会造成很大的浪费。

对于一个行比较稳定的表,即行一般不动态增长,若将pctfree设计的太大,就会留出太多的自由空间而造成浪费,同样对于一个数据减少很频繁的表,若将pctused设计的太小,则释放的空间不能即时得到利用,也会造成浪费。

这俩个值的设计不能太小也不能太大,若pctfree设计得太小,则很容易产生行链,从而影响数据的性能;若pctused设计得太大,则一旦减少一些行,就马上把自由空间利用上,造成数据太造乱,也会影响到性能。

 

例如:创建表格student_06初始化空间20M下次分配空间20M,按照10%动态增长,数据块空闲低于15%导致新的数据块分配,数据块中数据占用空间低于60%会导致数据块重新接受数据装入:

 Create table student_06(

   Student_no  NUMBER(5),

   Student_name VARCHAR2(200),

   …..

   Storage(

      Initial  20M

      Next   20M

      Pctincrease 10

)

Pctfree 15

Pctused 60

);

 

定期回收无用表空间

   、删除无用对象

         数据库里的某些对象在使用了一段时间之后就没用了,对于这些对象应该马上删除并回收空间,以免以后忘记。

删除无用的数据表student_01

   DROP TABLE student_01;

对于其他对象也是如此,如索引,过程,函数等。

、删除表空间

   如果不再需要一个表空间及其内容(该空间所包含的段或所有的数据文件)就可以将该表空间从数据库删除,除系统表空间(SYSTEM/SYSAUX/TEMP)外,Oracle数据库中的任何表空间都可以被删除。

删除表空间的语句为DROP TABLESPACE,其语法格式如下所示:

DROP TABLESPACE 表空间名

Including contents

Cascade constraints;

其中,including contents表示是否删除表看哦昂件中对象和其他内容,若不带此参数,而表空间又不为空时,则会返回错误并将此删除操作停止,若带上此参数,则连带所有内容和表空间一起删除,cascade constraints表示当此表空间中对象与其他表空间的对象有关联时使用,如某个表与其他表空间中的某一对多关联,若带上此选项,则会将此关联取消,若不带参数,而又存在关联,则会在删除表空间时出现错误并将删除操作停止。

需要注意的是,不能删除包含任何活动段的表空间,如果表空间中的一个表当前正在被使用,或者表空间包含一个活动的撤销段,就不能删除该表空间,谓词,应该先是表空间脱机,然后再将其删除。

 

例如:下面的语句就是删除一个空的表空间:

ALTER TABLESPACE test OFFLINE;

DROP TABLESPACE test;

、删除表空间数据文件

表空间只是一个逻辑概念,所以删除一个表空间只删除了一个逻辑概念,而物理存在的数据文件并没有被删除,为了能够真正地回收空间,需要在操作系统状态下将物理物件删除。在对一个已删除的表空间的数据文件进行删除之前,需要将数据库关闭,这是因为在现场启动过程中,Oracle系统要专门打开联机表空间中的所有数据文件,并且只有当表空间脱机或关闭数据服务时,才关闭相应的数据文件。

、关闭数据库

   SQL>SHUTDOWN normal;

、删除test表空间的数据文件

  Delc:\test.dbf

 

归档历史表空间

      数据库中不再使用或很少使用的数据,但又不能把它们全部删除,因为担心它们以后可能会用到,为此需要将这些先进行存档,回收相应的空间,待用到这些数据时再将其恢复即可:

   对历史数据进行归档,释放相应空间的步骤:

1、  创建历史表空间

CREATE TABLESPACE eygle_history

   Datafile ‘D:\oracle\oradata\eygle_history01.dbf’ size 20M

   ONLINE;

2、  将所有数据分离出来,存储到对应的历史表中,并将与之对应的历史表放在历史表空间中。

假设俩个表tbl_01和tbl_02则可以按照下面的方法来做

CREATE TABLE his_tbl_01

As

  SELECT *

  FROM tbl_01

  Tablespace eygle_history;

CREATE TABLE his_tbl_02

AS

  SELECT *

  FROMM tbl_02

  Tablespace eygle_history;

3、  删除原数据表是释放放空间

删除tbl_01和tbl_02以释放它们所占用的空间

DROP TABLE tbl_01;

DROP TABLE tbl_02;

4、  备份历史表空间

对历史表空间进行备份的方法非常简单,只需要将历史表空间的数据文件拷贝到其他介质上即可。

5、  删除历史表空间中的数据文件

 

posted @ 2012-08-18 15:29  Xiao方丈  阅读(402)  评论(0编辑  收藏  举报