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

news2025/1/15 8:30:23

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 mynewdb
   USER SYS IDENTIFIED BY sys_password
   USER SYSTEM IDENTIFIED BY system_password
   LOGFILE 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 512
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET AL32UTF8
   NATIONAL CHARACTER SET AL16UTF16
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/u01/app/oracle/oradata/mynewdb/system01.dbf' SIZE 325M REUSE
   SYSAUX DATAFILE '/u01/app/oracle/oradata/mynewdb/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE users
      DATAFILE '/u01/app/oracle/oradata/mynewdb/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE '/u01/app/oracle/oradata/mynewdb/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs
      DATAFILE '/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" nomount

ORACLE 例程已经启动。

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_information
	datafile '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 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个区间。

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 5M
				next 5M
				minextents 2
				maxextents 10
				pctincrease 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 loop
		dbms_output.put_line('Tablespace Name:' || space.tablespace_name);
		for datafile in two(space.file_id) loop
			dbms_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 20M
		next 200M
		pctincrease 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 20M
		next 200M
		pctincrease 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.coloradmin.cn/o/2214719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浙大数据结构:09-排序2 Insert or Merge

这道题我们采用先判断是不是insert如果不是再用merge算一下 机翻 1、条件准备 首先存元素个数n&#xff0c;然后oldnum存原始数组&#xff0c;newnum存新数组 #include <iostream> #include<vector> #include<algorithm> using namespace std; #define e…

SSD | (三)NAND闪存(上)

文章目录 &#x1f4da;闪存基本原理&#x1f407;存储单元及相关操作&#x1f407;闪存类型&#x1f407;闪存组织结构&#x1f407;擦、写、读操作&#x1f407;阈值电压分布图 &#x1f4da;闪存基本原理 &#x1f407;存储单元及相关操作 闪存是一种非易失性存储器&#x…

ArkTS中的几个易错问题

问题1&#xff1a;copyWithin的乱用问题 由于鸿蒙开发者很多可能是安卓转的&#xff0c;在安卓侧尤其是kotlin写手觉得copyOfRange很好用&#xff0c;复制数组的某一段数据就用copyOfRange&#xff0c;而copyWithin其实不是同等作用。 下面是AI对copyWithin的解释&#xff1a…

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 Skywalking是什么&#xff1f;Skywalking与JDK版本的对应关系Skywalking下载Skywalking 数据存储Skywalking 的启动部署探针方式一&#xff1a;IDEA 部署探针方式二&#xff1a;Java 命令行启…

101 - Lecture 7

回顾冯诺依曼模型&#xff08;von Neumann Model&#xff09;&#xff0c;这是现代计算机体系结构的基础。以下是该模型的关键概念&#xff1a; 1.通用计算机&#xff1a; • 冯诺依曼提出的计算机是通用机器&#xff08;general- purpose&#xff09;&#xff0c;可以通过可…

如何防止架构师PM化?

目录标题 导读引言&#xff1a;什么是架构师PM化架构师PM化的特点亲力操刀的实质性工作越来越少更喜欢拉会催进度越来越难直接回答问题喜欢流程 架构师PM化的危害对项目的危害对组织的危害对架构师个人的危害对研发同学的危害 如何防止架构师PM化组织上要提倡做实事个人上要做点…

MySQL UDF提权原理

文章目录 前言一、MySQL架构二、什么是UDF三、UDF提权原理四、MSF实战参考 前言 看了许多视频和文章&#xff0c;对UDF提权讲得都不是很清楚&#xff0c;遂搜索了一下MySQL的基础知识&#xff0c;总结了一下&#xff0c;供各位初学的师傅参考。 一、MySQL架构 首先&#xff…

Broken pipe异常分析及处理

问题出现&#xff1a;生产上运行的系统业务正常&#xff0c;当在查询数据时&#xff0c;出现后台异常&#xff0c;检查后台日志出现Broken Pipe异常&#xff1b; 如图示&#xff1a; Broken Pipe定义&#xff1a;通常发生在服务器端尝试向已关闭的套接字&#xff08;客户端/端…

Datawhale 组队学习 文生图 Prompt攻防 task02随笔

往期task01链接&#xff1a;task01笔记 本期我们继续从赛季的评价方法切入&#xff0c;探讨如何通过大模型生成更加多样的提示词&#xff0c;让得分更高。 赛题评价方法 结合赛题的要求&#xff0c;赛题文生图大模型服务的全链路框架如下所示&#xff1a; 给定文本prompt&am…

盘点超好用的 Windows 录屏软件,轻松记录屏幕精彩

在当今数字化信息高速流转的时代&#xff0c;屏幕录制已经成为我们日常工作、学习和娱乐中不可或缺的一项技能。如果你是微软电脑&#xff0c;正好我今天想要介绍的就是windows怎么录屏相关工具的操作&#xff0c;感兴趣就继续往下看吧。 1.FOXIT录屏大师 链接直达&#xff1…

【机器学习(十三)】零代码开发案例之股票价格预测分析—Sentosa_DSML社区版

文章目录 一、背景描述二、Sentosa_DSML社区版算法实现(一) 数据读入(二) 特征工程(三) 样本分区(四) 模型训练和评估(五) 模型可视化 三、总结 一、背景描述 股票价格是一种不稳定的时间序列,受多种因素的影响。影响股市的外部因素很多,主要有经济因素、政治因素和公司自身因素…

开源:轻量级异步编排框架

前言 为了更快、更方便的对方法实现异步并排调用&#xff0c;因此实现了一个通过注解就可对方法/类进行异步调用的轻量级异步并排框架。 项目地址&#xff1a;https://gitee.com/madaoEE/my-async 介绍 一个简单实现的异步框架&#xff0c;通过注解对方法、类对象添加异步操…

SpringBoot实现的人事信息管理平台:技术与应用

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

MATLAB代码解析:利用DCGAN实现图像数据的生成

摘要 经典代码&#xff1a;利用DCGAN生成花朵 MATLAB官方其实给出了DCGAN生成花朵的示范代码&#xff0c;原文地址&#xff1a;训练生成对抗网络 (GAN) - MATLAB & Simulink - MathWorks 中国 先看看训练效果 训练1周期 训练11周期 训练56个周期 脚本文件 为了能让各位…

数据库初体验

这两天我学习了数据库的一点知识&#xff0c;我觉得最大的不同就是数据库的代码只能一行一行的运行。 接下来记录我学的东西吧。 第一步 肯定是一些定义知识啦&#xff0c;就不记录了 有一些写一下&#xff0c;数据库的分类为关系型数据库和非关系型数据库 关系型数据库是把复…

Firefox火狐浏览器打开B站视频时默认静音

文章目录 环境问题解决办法 环境 Windows 11家庭版Firefox浏览器 131.0.2 (64 位) 问题 用Firefox浏览器打开B站的视频时&#xff0c;默认是静音播放的&#xff1a; 而其它浏览器&#xff0c;比如Chrome和Edge&#xff0c;默认是带声音播放的。 虽然不是什么大问题&#xf…

工具篇:(一)MacOS 下使用 Navicat 管理 MySQL 数据库:详细图文教程与常见问题解决

MacOS 下使用 Navicat 管理 MySQL 数据库&#xff1a;详细图文教程与常见问题解决 在这篇文章中&#xff0c;我将分享如何在 macOS 上使用 Navicat 来管理 MySQL 数据库。这是一份详细的教程&#xff0c;包括 Navicat 的下载、安装、配置以及使用步骤&#xff0c;并附上亲测的…

优化UVM环境(二)-将error/fatal红色字体打印,pass绿色字体打印

书接上回&#xff1a; 优化UVM环境&#xff08;一&#xff09;-环境结束靠的是timeout&#xff0c;而不是正常的objection结束 将error/fatal红色字体打印&#xff0c;pass绿色字体打印 红色字体的error&#xff1a; 31表示字体颜色是红色 1m表示加粗 绿色字体的pass&#…

高可用之限流-05-slide window 滑动窗口

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…

ReferenceError: MutationEvent is not defined

解决&#xff1a;关闭tampermonkey&#xff08;篡改猴&#xff09;插件后也不可以&#xff0c;移除tampermonkey&#xff08;篡改猴&#xff09;插件仔刷新就可以了