Oracle+11g+笔记(7)-数据库空间管理

server/2024/10/21 18:07:36/

Oracle+11g+笔记(7)-数据库空间管理

7、数据库空间管理

存储空间是数据库系统中非常重要的资源,无论是数据库中的对象还是数据库中的数据都需要空间进行存储,一旦

数据库空间被全部占用,那么该数据库系统就不能再接受任何对象和数据,数据库系统的运行基本上会处于停滞状

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

几种方法。

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

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

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

    表空间和增加表空间大小。

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

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

7.1 建立数据库时的空间设计

从逻辑上说,数据库空间是由若干个表空间组成的,而表空间只是一个逻辑概念,它与数据库的物理结构有着密切

的关系。表空间与磁盘上的若干个数据文件对应,表空间的所有内容其实都存储在数据文件中。数据文件是实际存

在的文件,在创建表空间时就需要指定该表空间中各个数据文件的大小。因此,为了防止以后数据库存储空间不够

用,在建立数据库时需要对可能的空间需求做出合理的估计,然后为其设置一个较大的预分配空间。

在建立数据库之初,合理估计可能用到的存储空间大小,并为表空间中的数据文件设置较大的存储空间,甚至设置

为空间大小不受限制,则在以后使用过程中就会较少或几乎碰不到空间不够用的情况。

根据表空间的类型不同,空间设计可分为以下两种:

  • system表空间初值:创建数据库时指定。

  • 其他表空间初值:创建表空间时指定。

7.1.1 指定system 表空间初值

数据库运行期间如果出现存储空间不够用的现象,会对数据库的运行造成较大的影响,虽然可以通过增加数据文件

以扩充存储空间,但还是会或多或少地影响数据库的性能,因此在创建数据库时,为表空间中的数据文件设置足够

大的值是必要的。下面我们通过两种方法来设置system表空间的初值。

1、通过DBCA工具创建数据库并指定system表空间的初值。

##############################################################################
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
#########################################################################################################################
# Shared Server
###########################################
dispatchers="(PROTOCOL=TCP) (SERVICE=mydbXDB)"###########################################
# Miscellaneous
###########################################
compatible=11.2.0.0.0
diagnostic_dest=D:\app\zhangshixing
memory_target=1287651328###########################################
# Security and Auditing
###########################################
audit_file_dest=D:\app\zhangshixing\admin\mydb\adump
audit_trail=db
remote_login_passwordfile=EXCLUSIVE###########################################
# Database Identification
###########################################
db_domain=""
db_name=mydb###########################################
# File Configuration
###########################################
control_files=("D:\app\zhangshixing\oradata\mydb\control01.ctl", "D:\app\zhangshixing\flash_recovery_area\mydb\control02.ctl")
db_recovery_file_dest=D:\app\zhangshixing\flash_recovery_area
db_recovery_file_dest_size=5218762752###########################################
# Cursors and Library Cache
###########################################
open_cursors=300###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_tablespace=UNDOTBS1###########################################
# Network Registration
###########################################
local_listener=LISTENER_MYDB###########################################
# Processes and Sessions
###########################################
processes=150###########################################
# Cache and I/O
###########################################
db_block_size=8192
CREATE DATABASE mynewdbUSER SYS IDENTIFIED BY sys_passwordUSER SYSTEM IDENTIFIED BY system_passwordLOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log') SIZE 100M BLOCKSIZE 512,GROUP 2 ('/u01/logs/my/redo02a.log','/u02/logs/my/redo02b.log') SIZE 100M BLOCKSIZE 512,GROUP 3 ('/u01/logs/my/redo03a.log','/u02/logs/my/redo03b.log') SIZE 100M BLOCKSIZE 512MAXLOGFILES 5MAXLOGMEMBERS 5MAXLOGHISTORY 1MAXDATAFILES 100CHARACTER SET AL32UTF8NATIONAL CHARACTER SET AL16UTF16EXTENT MANAGEMENT LOCALDATAFILE '/u01/app/oracle/oradata/mynewdb/system01.dbf' SIZE 325M REUSESYSAUX DATAFILE '/u01/app/oracle/oradata/mynewdb/sysaux01.dbf' SIZE 325M REUSEDEFAULT TABLESPACE usersDATAFILE '/u01/app/oracle/oradata/mynewdb/users01.dbf'SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITEDDEFAULT TEMPORARY TABLESPACE tempts1TEMPFILE '/u01/app/oracle/oradata/mynewdb/temp01.dbf'SIZE 20M REUSEUNDO TABLESPACE undotbsDATAFILE '/u01/app/oracle/oradata/mynewdb/undotbs01.dbf'SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

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

参考连接:

https://docs.oracle.com/cd/E11882_01/server.112/e25494/create.htm#ADMIN002

通过命令的方式创建数据库比较复杂,实现起来难度较大,下面将给出具体的实现步骤。

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

C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle
C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\adump
C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\bdump
C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\udump
C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\cdump
C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\pfile
C:\>mkdir D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\create
C:\>mkdir D:\app\zhangshixing\product\11.2.0\oradata\eygle

建好的目录结构如下所示:

在这里插入图片描述

在这里插入图片描述

其中D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle目录下的几个子目录主要用于存放数据

库运行过程中的跟踪信息。最重要的两上子目录是bdumpudump目录,bdump目录存放的是数据库动行过程中

的各个后台进程的跟踪信息,当中alert文件是警告文件,其文件名称为alert_eygle.log,当数据库出现问题

时,首先就可以去查看此文件以找出原因,手工创建过程中出现的各种问题往往也可以通过查看这个文件找到原

因。udump目录存放和特定会话相关的跟踪信息。D:\app\zhangshixing\product\11.2.0\oradata\eygle

目录存放各种数据库文件,包括控制文件、数据文件、重做日志文件。

step2创建初始化参数文件

数据库系统启动时须要用初始化参数文件的设置分配内存、启动必要的后台进程的。因此,初始化参数文件创建的

是否正确、参数设置是否正确关系着整个建库的命运”

创建初始化参数文件可以通过拷贝现在的初始化参数文件并将其做适当的修改即可,从而不必要用手工去一句一句

地写出来,因为初始化参数文件的结构体系基本上都是一样的。在我们安装Oracle的时候,系统已经为我们安装

了一个名为orcl的数据库,于是我们可以从它那里得到一份初始化参数文件。

打开D:\app\zhangshixing\admin\orcl\pfile,找到init.ora.827202214438文件,把它拷贝到

D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\pfile目录下,并将其改名为

initeygle.ora。接着用记事本的方式打开initeygle.ora,修改以下的内容:

db_domain=""
db_name=eygle
memory_target=320M
processes=50
audit_file_dest=D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\adump
audit_trail=db
db_block_size=4096
db_recovery_file_dest=D:\app\zhangshixing\flash_recovery_area
db_recovery_file_dest_size=64M
diagnostic_dest=D:\app\zhangshixing
open_cursors=100
remote_login_passwordfile=EXCLUSIVE
undo_tablespace=UNDOTBS1
control_files=("D:\app\zhangshixing\product\11.2.0\oradata\eygle\control01.ctl", "D:\app\zhangshixing\product\11.2.0\oradata\eygle\control02.ctl")
compatible=11.2.0.0.0
dispatchers="(PROTOCOL=TCP) (SERVICE=eygleXDB)"
local_listener=LISTENER_EYGLE

step3设置环境变量oracle_sid

C:\>set oracle_sid=eygle

设置环境变量的目地是在默认的情况下,指定命令行中所操作的数据库实例是eygle

step4创建实例(即后台控制服务)

C:\>oradim -new -sid eygle -startmode manual -pfile "D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\pfile\initeygle.ora"
实例已创建。

step5启动sql*plus

connect sys/sysroot as sysdba;

如果服务没有启动去启动服务。

step6启动例程

SQL> startup pfile="D:\app\zhangshixing\product\11.2.0\dbhome_1\admin\eygle\pfile\initeygle.ora" nomountORACLE 例程已经启动。Total System Global Area  334786560 bytes
Fixed Size                  1374444 bytes
Variable Size             209717012 bytes
Database Buffers          117440512 bytes
Redo Buffers                6254592 bytes

Step7创建数据库并指定SYSTEM空间的初始大小。

编写一个创建数据库的SQL文件,保存为createDB.sql,其内容如下:

Create database eygle
maxinstances 4 
maxloghistory 1 
maxlogfiles 16 
maxlogmembers 3 
maxdatafiles 10 
logfile group 1 'D:\app\zhangshixing\product\11.2.0\oradata\eyglee\redo01.log' size 10M,group 2 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\redo02.log' size 10M
datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\system01.dbf' size 50M autoextend on next 10M extent management local
sysaux datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\sysaux01.dbf' size 50M autoextend on next 10M
default temporary tablespace temp
tempfile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\temp.dbf' size 10M autoextend on next 10M
undo tablespace UNDOTBS1 datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\undotbs1.dbf' size 20M
character set ZHS16GBK
national character set AL16UTF16
user sys identified by sys
user system identified by system

其中,datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\system01.dbf' size 50M就是

设置SYSTEM表空间的初值语句,这里我们设置SYSTEM 表空间的初值为50MB

调用该文件的方法为:

sql>@D:\createDB.sql;

这样我们就成功创建了数据库并为SYSTEM表空间赋了初值。

7.1.2 设置其他表空间初值

对于其他表空间中的数据文件,可以在创建表空间的同时指定该表空间中数据文件的初值,最好能够设置一个较大

的值,这样就能防止以后出现空间不够用的现象。

CREATE TABLESPACE student_informationdatafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\stud01.dbf' size 100M,'D:\app\zhangshixing\product\11.2.0\oradata\eygle\stud02.dbf' size 100Mdefault storage(initial 10Mnext 10Mminextents 1maxextents 10pctincrease 20)online;

storage语句指定表空间的存储参数,这些参数对于数据库的性能影响很大,选择时应慎重。

  • initial 10M:表空间 student_information 初始区间大小为10MB。

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

  • pctincreace 20:当再填满时,按照20%的增长速率分配区间大小。

  • minextents 1:初始为该表空间分配1个区间。

  • maxextents 10:最多为该表空间分配10个区间。

7.2 空间充足时的管理

由于表空间不够用时会极大地影响数据库性能,因此平时对于表空间的状态应多加观察,在空间接近上限时及时采

取措施,而不是等到空间不够用并对数据库的运行产生不良影响时才急着去扩充空间。通常,可以采用以下方法避

免空间的不足:

  • 动态空间监视方法。

  • 向表空间增加数据文件方法。

7.2.1 使用数据字典动态监视

可以通过观察相应数据字典中的数据来获得空间使用信息。这里使用的数据字典是表dba_free_space

user_free_space,可以查看其内容来得到有关表空间的空间信息。

SELECT * FROM dba_free_space;
TABLESPACE_NAME    |FILE_ID|BLOCK_ID|BYTES    |BLOCKS|RELATIVE_FNO|
-------------------+-------+--------+---------+------+------------+
SYSTEM             |      1|   87520|   262144|    32|           1|
SYSTEM             |      1|   87936|  3145728|   384|           1|
SYSAUX             |      2|   71256| 34930688|  4264|           2|
UNDOTBS1           |      3|     216|    65536|     8|           3|
UNDOTBS1           |      3|     248|    65536|     8|           3|
UNDOTBS1           |      3|     264|    65536|     8|           3|
UNDOTBS1           |      3|     288|    65536|     8|           3|
UNDOTBS1           |      3|     304|   458752|    56|           3|
UNDOTBS1           |      3|     376|    65536|     8|           3|
UNDOTBS1           |      3|    1024|  2752512|   336|           3|
UNDOTBS1           |      3|    1368|   262144|    32|           3|
UNDOTBS1           |      3|    1408|  4194304|   512|           3|
UNDOTBS1           |      3|    2432|  2097152|   256|           3|
UNDOTBS1           |      3|    2944| 73400320|  8960|           3|
UNDOTBS1           |      3|   12032|  6291456|   768|           3|
USERS              |      4|     640|  1310720|   160|           4|
EXAMPLE            |      5|     480|  2031616|   248|           5|
EXAMPLE            |      5|    1416|   589824|    72|           5|
EXAMPLE            |      5|   10400| 19660800|  2400|           5|
STUDENT_INFORMATION|      6|     128|103809024| 12672|           6|
STUDENT_INFORMATION|      7|     128|103809024| 12672|           7|
USERS              |      4|     568|    65536|     8|           4|
USERS              |      4|     576|    65536|     8|           4|

从中可以看出每个表空间的空闲空间,根据这些值可以判断空间是否够用,若不够用,则要考虑扩充表空间的大

小。

7.2.2 向表空间增加数据文件

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

# 给表空间 student information 再增加2MB的存储空间
ALTER TABLESPACE student_information ADD DATAFILE 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\stud03.dbf'  size 2M;

注意:通过上述方法给表空间分配太多的空间并不好,这是因为这样做无疑会造成较大空间的浪费。因此,建议做

好空间估计,并合理利用空间,无论对减少资源浪费还是提高系统性能都有好处。

7.3 解决空间不足的方法

数据库中存储的数据是动态变化的,并且一般是向不断增加的方向变化,随着时间的推移,数据库文件的空间可能

会被全部用尽,导致无法再向数据库中增加数据,数据库系统的运行会受到极大的影响,解决空间不足的方法是扩

充数据库的存储空间,以便继续增加数据。扩充数据库存储空间的常用方法有如下3种:

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

  • 创建新的表空间。

  • 创建新的数据文件。

7.3.1 增加数据文件大小

数据库中的数据其实都是存储在数据文件中的,SYSTEM表空间的数据文件是在创建数据库时给定的,并且给其大

小指定了一个初值。那么在SYSTEM表空间存储空间不够时就可以用ALTER DATABASE命令动态增加SYSTEM表空

间数据文件的大小。

7.3.1.1 ALTER DATABASE 命令简介

改变SYSTEM表空间数据文件的大小可以用ALTER DATABASE命令,此命令还可以改变一些有关数据库的其他信

息,其语法格式如下。

ALTER DATABASE 数据库名
mount[standby|close database]
| open [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 数值}
|end backup
|autoextend off|on;

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

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

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

  • archivelog|noarchivelog:改变数据库日志归档状态为有效或无效。

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

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

  • drop logfile:删除日志组。

  • drop logfile member:删除日志组成员。

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

  • renamefile···to···:将数据文件或日志组成员文件更名。

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

  • backup controlfile:备份控制文件。

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

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

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

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

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

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

7.3.1.2 ALTER DATABASE 命令的使用

在上述选项中,我们要扩充数据库的存储空间用的是datafile项的resize子项。当然这里的数据文件必须是在

SYSTEM表空间中。ALTER DATABASE命令的具体应用如下:

ALTER DATABASE mydb datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\system01.dbf' resize 750M;
7.3.2 创建新表空间

表空间其实是一个逻辑概念,它的所有数据和结构信息都存储在一个或多个数据文件中,当需要扩充数据库存储空

间时,可以创建新的表空间并指定它的数据文件,系统就会划出一块磁盘空间给这个表空间,而这个表空间当然也

是属于这个数据库的,因此就扩大了数据库的存储空间。

提示:创建数据库时最好能创建几个私用的表空间,因为SYSTEM表空间是系统表空间,其中存储着数据字典和数

据库结构等重要信息,它是数据库系统运行的基础,若是把所有数据信息都存储在这个表空间里,一方面会迅速占

满它的空间,另一方面也加大了出错的可能性。

7.3.2.1 CREATE TABLESPACE命令简介

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

CREATE TABLESPACE 表空间名
dataflle {文件名[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:指定表空间用来包含永久对象或暂时对象。

7.3.2.2 用CREATE TABLESPACE创建表空间
CREATE TABLESPACE test
datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\test01.dbf' size 5M
default storage(initial 5Mnext 5Mminextents 2maxextents 10pctincrease 20)
Online;

表空间创建后,系统就从磁盘中划分出一块空间给此表空间使用,不过只是逻辑上的划分,物理上磁盘空间还是自

由的,但所创建的新表空间已经作为了数据库的一部分,所以数据库可以存储更多的数据了。

7.3.3 动态增加表空间

表空间中的数据文件大小是在创建表空间时就指定了的,在数据库运行过程中不能超过此限制,一旦表空间的数据

文件被占满,则不能继续增加数据。解决办法是向表空间中增加新的数据文件,以此来扩充表空间的存储能力。

7.3.3.1 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 only|write
permanent|temporary

其中,有些选项在前面已经作过介绍,在此就不再赘述。下面仅给出以前没有介绍过的选项说明。

  • add datafile:用于增加表空间的数据文件,可在联机或脱机时增加,但所增加的数据文件不能是其他表空

    间或数据库已经使用的,它同样可带autoextend参数选项。

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

  • {begin|end}backup:用于开始和结束联机备份表空间中的数据文件,在备份过程中用户可以续访问该表空

    间,但备份过程中不能将表空间脱机,也不能关闭数据库。

  • read only|write:其中read only表示此表空间内容是只读的,不能向其中写入任何数据,而read

    write 则表示可以对此表空间的数据进行读写操作。

7.3.3.2 具体应用

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

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

ALTER TABLESPACE test
add datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\test02.dbf' size 10M,'D:\app\zhangshixing\product\11.2.0\oradata\eygle\test03.dbf' size 10M;
7.3.4 三种方法的区别与比较

第一种方法是通过增加SYSTEM表空间中的数据文件的大小的方法来扩充数据库的存储能力,使用的命令是

ALTER DATABASE。 SYSTEM表空间是整个数据库最重要的表空间,它的存储空间不够将直接影响到数据库的运

行。

第二种方法是创建新的表空间来扩充存储能力。在一个数据库系统中往往存在多个数据文件,如果仅用 SYSTEM

表空间来管理所有的数据文件会导致数据管理的压力很大。通过增加表空间的方法,一方面扩充了数据库的存储能

力,另一方面也方便了数据的管理。

第三种方法是增加表空间中的数据文件来扩充数据库的存储空间。这是在数据库运行过程中经常需要做的工作,因

为在一开始不可能将数据文件的大小设计得很合理,有时为了节省不必要的空间开支,一般倾向于将数据文件设得

较小,当不够用时,只好增加此表空间的数据文件了。

【下面给出一个查看数据库表空间信息的过程space_report

-- SET SERVEROUTPUT ON FORMAT WRAPPED;
CREATE OR REPLACE PROCEDURE space_report
is 
CURSOR one IS SELECT tablespace_name,file_id,max(bytes) AS largest,sum(bytes) AS total FROM sys.dba_free_space GROUP BY tablespace_name,file_id ORDER BY tablespace_name,file_id;
CURSOR two(id integer) is SELECT name,bytes FROM V$datafile WHERE file# = id;
database_name varchar2(9);
BEGIN SELECT name INTO database_name FROM V$database;dbms_output.put_line('A Report of Database:'|| database_name);dbms_output.put_line('*********************');for space in one loopdbms_output.put_line('Tablespace Name:' || space.tablespace_name);for datafile in two(space.file_id) loopdbms_output.put_line('Data file name:'|| datafile.name);dbms_output.put_line('Total file size:' || datafile.bytes);dbms_output.put_line('The percent of free space in file:' || round((space.total/datafile.bytes)*100,0) || '%');dbms_output.put_line('Largest extent:' || space.largest);end loop;end loop;
END space_report;
execute space_report;

7.4 合理利用存储空间

存储空间是数据库系统中非常重要的资源,数据库所拥有的存储空间一旦用尽,整个数据库系统就会处于停滞状

态,所以应该合理利用空间。一方面要对数据库中的对象进行合理的设计以达到节省空间的目的;另一方面应该对

空间进行及时回收,将不再使用的空间置为自由空间,以便给其他应用程序或对象使用。

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

  • 采用合适的数据类型。

  • 合理设置存储参数。

  • 回收无用的表空间。

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

7.4.1 采用正确的数据类型

数据表是数据库中最为重要的对象,因为数据库中的数据都要存储在数据表中。数据表设计的优劣会直接影响到存

储空间的利用效率。

7.4.2 存储参数的正确设置

在创建对象时,若不指定存储参数,则会采用表空间默认的存储参数。为了节省存储空间,在创建每个对象时,应

设计和指定该对象的存储参数。

本小节将对与节省空间有关的几个参数进行逐一说明。

7.4.2.1 使用 initial 参数

首先要说的是initial参数,正如前面估计空间时所设计的那样,此值应比对象所需的空间大一点,此时将具有

最佳的性能和空间分配。如估计需要10MB左右的空间,若将initial 参数设置为100MB,当然不会出现空间不

够用的情况,但空间设得太大就会造成空间的浪费,因此比较合理的设置是20MB

CREATE TABLE student_01
student_no NUMBER(5),
student_memo VARCHAR2(200),
......
Storage(initial 20M)
);
7.4.2.2 使用 next和 pctincrease 参数

参数nextpctincrease也会影响到空间的使用情况,若不容易估计空间大小,设计initial参数就不能将表

正好完全装入,此时一般为了节省空间,要将initial值设置得小一些,然后动态分配新片,分配新片就需要

next 参数的值,此值若不合理,也会造成空间浪费。

对于一般的表,设计next值与 initial值相等即可,这样即使第一个片不够用,再分配一个新片也不会占用太多

空间。若是next值设置得太大,而initial值又设得与表所需空间差不多,则多出来的空间基本就浪费掉了。此

外,参数pctincrease也会影响到空间的使用,如对于增长不太快的表,若将此值设置得太大,则下次分配片时

都将比上一个片大许多,因此造成了很大的浪费。

综上所述,在创建对象时应根据实际情况综合考虑来合理设计这3个参数值,并在命令中加以体现。

CREATE TABLE student_02
student_no NUMBER(5),
student_memo VARCHAR2(200),
......
Storage(initial 20Mnext 200Mpctincrease 10)
);
7.4.2.3 使用 pctfree和 pctused 参数

在数据库中,由于某行特别长,或是由于某行动态增长超出了数据块的存储空间,就必须开辟新的数据块,这样一

行存储在两个数据块上,就产生了行链。为了防止行链的产生,尤其是为了防止第二种情况产生的行链,就需要合

理设置pctfree参数。此外,为了能在某数据块中数据减少时,可以重新使用释放的空间,也需要设计pctused

参数。

参数pctfreepctused的使用是非常关键的。其中,pctfree表示每个数据块空闲的空间比例,若小于此比例

就要分配新的数据块,这样剩下一部分自由空间可以在数据变长时使用;pctused表示当数据块中数据减少到多

大比例时重新使用该数据块装入新的数据,这样是为了动态回收释放的空间。这两个参数设计不合理,也会造成很

大的浪费。

对于一个行比较稳定的表,即行一般不动态增长,若将pctfree设计得太大,就会留出太多的自由空间而造成浪

费;同样,对于一个数据减少很频繁的表,若将pctused设计得太小,则释放的空间不能即时得到利用,也会造

成浪费。

这两个值的设计不能太小也不能太大,若pctfree设计得太小,则很容易产生行链,从而影响数据库的性能;若

pctused设计得太大,则一旦减少一些行,就马上把自由间利用上,造成数据太杂乱,也会影响到性能。

CREATE TABLE student_03
student_no NUMBER(5),
student_memo VARCHAR2(200),
......
Storage(initial 20Mnext 200Mpctincrease 10)
pctgree 15
pctused 60
);
7.4.3 定期回收无用表空间

上述两种方法是在创建对象时通过合理设计对象结构和设置参数来节省空间的,这当然是减少存储空间的有效办

法。此外,还以删除一些不再使用的对象,以释放相应的空间,以此来减少存储空间的使用。

7.4.3.1 删除无用对象
DROP TABLE student_01;
7.4.3.2 删除表空间
DROP TABLESPACE 表空间名
including contents
cascade constraints;

其中,including contents 表示是否删除表空间中对象和其他内容,若不带此参数,而表空间又不为空时,则

会返回错误并将此删除操作停止,若带上此参数,则连带所有内容和表空间一起删除;cascade constraints

示当此表空间中对象与其他表空间的对象有关联时使用,如某个表与其他表空间中的某个表有一对多关联,若带上

此选项,则会将此关联取消,若不带此参数,而又存在关联,则会在删除表空间时出现错误并将删除操作停止。

需要注意的是,不能删除包含任何活动段的表空间。如果表空间中的一个表当前正在被使用,或者表空间包含一个

活动的撤销段,就不能删除该表空间。为此,应该先使表空间脱机,然后再将其删除。

ALTER TABLESPACE test OFFLINE;
DROP TABLESPACE test;

注意:一旦一个表空间被删除,该表空间的数据就不能再恢复了,因而要确保一个将被删除的表空间所包含的所有

数据将来都不再需要。

7.4.3.3 删除表空间数据文件

表空间只是一个逻辑概念,所以删除一个表空间只是删除了一个逻辑概念,而物理存在的数据文件并没有被删除,

为了能够真正地回收空间,需要在操作系统状态下将物理数据文件删除。在对一个已删除的表空间的数据文件进行

删除之前,需要将数据库关闭,这是因为在现场启动过程中,Oracle 系统要专门打开联机表空间中的所有数据文

件,并且只有当表空间脱机或关闭数据库服务时才关闭相应的数据文件。

SHUTDOWN normal;
del C:\test01.dbf;
7.4.4 归档历史表空间

随着时间的推移,数据库中会累积一些以后不再使用或很少使用的数据。这些数据往往需要占用大量的存储空间,

显然这是很不合理的。但我们又不能把它们全部删除,因为担心它们以后可能还会用到,为此需要将这些先进行存

档,回收相应的空间,待用到这些数据时再将其恢复即可。

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

7.4.4.1 创建历史表空间

创建历史表空间的语句如下。

CREATE TABLESPACE eygle_history datafile 'D:\app\zhangshixing\product\11.2.0\oradata\eygle\eygle.history01.dbf' size 20M
online;
7.4.4.2 分离历史数据

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

假设有两个表tbl_01tbl_02,则可以按照下面的方法来做。

CREATE TABLE his_tbl_01
as
SELECT * FROM tbl_01 tablespace eygle_history;CREATE TABLE his_tbl_02
as
SELECT * FROM tbl_02 tablespace eygle_history;
7.4.4.3 删除原数据表释放空间

删除tbl_01tbl_02以释放它们所占用的空间。

DROP TABLE tbl_01;
DROP TABLE tbl_02;
7.4.4.4 备份历史表空间

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

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

删除历史表空间的数据文件的步骤和方法已经在上一小节中作过详细的介绍,在此不再赘述。

上述5个操作步骤结束后,就完成了对历史数据的存档工作,并释放历史数据所占用的存储空间。当然,也可以使

ALTER TABLESPACEBACKUP来进行备份,其基本原理与步骤是相同的。


http://www.ppmy.cn/server/133686.html

相关文章

运维怎么转行网络安全?

经常有人问我:干网工、干运维多年遇瓶颈,想学点新技术给自己涨涨“身价”,应该怎么选择? 聪明人早已经用脚投票:近年来,越来越多运维的朋友寻找新的职业发展机会,将目光聚焦到了网络安全产业。…

CICD 持续集成与持续交付

目录 一 CICD是什么 1.1 持续集成(Continuous Integration) 1.2 持续部署(Continuous Deployment) 1.3 持续交付(Continuous Delivery) 二 git工具使用 2.1 git简介 2.2 git 工作流程 三 部署git …

linux 系统怎么使用

Linux系统的使用涉及多个方面,包括文件管理、目录操作、用户管理、进程管理、网络配置等。以下是对Linux系统基础使用的详细介绍: 一、文件管理 查看文件和目录 ls:列出当前目录的内容。ls -l:以长格式列出当前目录的内容&#x…

vulnhub靶场之JOY

一.环境搭建 1.靶场描述 Does penetration testing spark joy? If it does, this machine is for you. This machine is full of services, full of fun, but how many ways are there to align the stars? Perhaps, just like the child in all of us, we may find joy in …

Vue3中ref和reactive的对比

1. ref 定义 用途: 用于创建基本数据类型或单一值的响应式引用。语法: const myRef ref(initialValue); 特性 返回一个包含 .value 属性的 Proxy 对象。适用于基本数据类型(如数字、字符串、布尔值等)和单一值。 import { ref } from vue;const co…

MySQL创建和管理表

1. 基础知识 存储数据是处理数据的第一步,只有正确地把数据存储起来,才能进行有效的处理和分析。 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。 从系统架构的层次上看…

手机、固话号码想要认证,需要显示企业名称该怎么设置?

在现如今激烈竞争的商业环境中,依然有越来越多的企业意识到品牌的力量与价值,作为吸引客户关注、打造客户第一印象的关键环节。如何让企业外呼号码展示品牌与企业名称就变得格外关键。 那么手机、固话号码申请号码品牌认证究竟是什么?申请的…

Mac通过键盘选取内容

问题: 我们在使用键盘的时候经常懒得动手去拿鼠标了,并且熟练使用键盘可以提高我们的工作效率,比如在我们需要复制内容的时候,可以仅仅通过键盘来选取想要的内容; 解决: 将鼠标光标移动到想要选取的内容…