我们在136上的oracle数据库进行压力测试时,发现数据库的数据文件占用物理空间达到20多个G,但是在我们清掉各个表的数据后(truncate掉各个日志表),发现数据库实际数据占用的空间只有20多M,但物理文件仍然20多G。
经查资料,这个是oracle的表和表空间的“高水位”问题造成的,解决方案如下:
前提知识:
1. Oracle数据库中的物理存储空间是以块(segment)为单位的
2. 修改数据库表空间大小的语句:
ALTER DATABASE DATAFILE 'D:\ORADATA\ECSS20' RESIZE 206M
但是直接运行该语句的话会报如下错误:
Failed to commit: ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
解决方案(以136上的ECSS20表空间为例):
1. 查询oracle数据文件及其编号。SQL语句如下
select file#,name from v$datafile;
查询出数据库的所有数据文件,其中包含如下,正是达到20多G的数据文件
FILE# NAME
------------------------------------------------------------------------------------------
6 D:\ORADATA\ECSS20
2. 查找该数据文件的最大块号。语句如下:
select max(block_id) from dba_extents where file_id=6;
查询结果如下:
MAX(BLOCK_ID)
-------------
534785
3. 计算该表空间目前实际占用的空间(不是物理文件的大小)
显示每个数据块的大小。语句如下:
show parameter db_block_size;
结果为8192,就是8K。
然后计算所有数据块占用的物理空间(拿计算器计算也一样)
select 534785*8/1024 from dual;
结果为4178.00781M,就是4G多
4. 然后我们知道目前用了4G多,我们就可以把数据文件大小Resize到4G多一点
ALTER DATABASE DATAFILE 'D:\ORADATA\ECSS20' RESIZE 4200M;
数据库已更改。正常。
到此为止,实际数据文件的大小就由20多G到4G多了。
5. 继续往下走,因为我们实际数据占用了几十M,但数据文件还有4G多,还是我们把之前的表truncate掉后才能得到的。现在查一下占用最大块(segment 534785)的是什么。语句如下:
select distinct owner, segment_name, segment_type,tablespace_name from dba_extents where file_id =6 and block_id=534785;
查到的结果如下:
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------------------------------------------------------------------------------
AJITA BIZTALKINGINFO TABLE ECSS
说明目前占用最大块的对象是表BIZTALKINGINFO
6. 把表挪动一下,把表从当前表空间转移到了另外一个表空间(要已经存在的),语句如下:
alter table biztalkinginfo move tablespace ECSS_LUCIFER;
再次查询物理文件中的最大块号(步骤2),本次查询结果为534761,结果已经变小了,再查询该块的数据时BizTalkingInfo的主键。
7. 分析可知,在我们数据表已经插入大量数据后,才建表BizTalkingInfo,然后该表占用的块就偏大。然后我们resize数据文件时就不能小于该块。最简单的办法是删掉该表相关的东西,然后重建即可。当然也有比较复杂的办法可以办到。
8. 有一个结论就是:建表一般要放在数据表初始化之前进行,最好不要再初始化了大量数据,尤其是日志数据后再建表。
分享到:
相关推荐
每当有数据修改时,Oracle会首先将这些更改写入redo日志文件,然后再更新到数据文件中。这种机制确保了在系统崩溃或突然断电的情况下,可以通过redo日志文件恢复未完成的事务,从而保证数据库的一致性和完整性。 ##...
本篇文章将详细介绍如何通过一系列步骤安全地将Oracle数据文件从一个位置移动到另一个位置。 #### 一、准备工作 1. **备份数据**:在进行任何更改之前,强烈建议先对数据库进行完整备份。 2. **了解当前的数据文件...
这可能是由于表空间的数据文件大小达到上限或者表空间已用尽所有可用空间所致。 - **解决方案**:解决ORA-1691错误的有效方法之一是扩展表空间,即增加新的数据文件或增大现有数据文件的大小。 #### 知识点三:使用...
创建表空间时需要指定数据文件的路径和名称,数据文件的大小和存储方式等。创建表空间时还需要指定表空间的 extent 管理方式,包括 DICTIONARY 和 LOCAL 两种方式。 Oracle 表空间的管理包括表空间的创建、修改和...
控制文件是Oracle数据库的核心组成部分,它存储了数据库的元数据,如数据文件的位置、表空间信息、数据库创建日期等。当需要修改控制文件时,通常涉及以下场景: 1. **备份与恢复**:在进行数据库备份或灾难恢复时...
Oracle数据库管理中,表空间数据文件大小的设置是数据库架构设计的一个重要方面。本知识点将详细阐述Oracle如何设置表空间数据文件大小,重点讨论与数据块大小(DB_BLOCK_SIZE)相关的参数设置,以及在不同操作系统...
在Oracle数据库管理中,将数据文件导入到指定的表空间是一项常见的操作,这对于数据迁移、备份恢复或测试环境的构建至关重要。"ORACLE导入数据文件到指定的表空间"这个主题涉及了Oracle数据库的导入工具(IMP)、...
"Oracle数据块结构分析说明" Oracle 数据块结构是 Oracle 数据库存储数据的基本单元。一个数据块(Block)是 Oracle 数据库中的最小存储单元,它是数据文件(Datafile)中的一部分。每个数据块的大小可以是 2k、4k...
检查点是数据库用来同步数据文件与缓存中更改的机制。 通过查询 `DBMS_ROWID` 包含的函数,可以获取该行数据所在的文件号(`file#`)和块号(`block#`)。在这个例子中,数据位于文件号 6 的第 135 块。 接下来,...
当需要更改数据文件的位置时,可以使用移动命令。移动数据文件通常需要先关闭数据库,然后通过操作系统移动文件,再重启数据库并重新映射数据文件。 - **关闭数据库**: ```sql SHUTDOWN IMMEDIATE; ``` - **...
- 数据文件头包含了数据库版本信息、DB ID(数据库标识符)、文件号、块大小、文件类型以及表空间信息。 - 检查点信息:文件头中记录了最近的检查点SCN(系统改变号),这与控制文件中的检查点SCN进行对比,以确定...
### 如何恢复只有完好数据文件的Oracle数据库 #### 一、引言 在数据库管理过程中,数据丢失或损坏是常见的问题之一。对于Oracle数据库来说,当遭遇数据文件损坏时,如果仅保留有完好的数据文件,那么恢复过程将更加...
以下是关于Oracle数据文件特性的详细说明: 1. **一对一关联性**:每个Oracle数据文件只能属于一个数据库,而一个数据库可以包含多个数据文件。这种一对一与一对多的关系确保了数据库的组织性和灵活性。 2. **自动...
- 数据库恢复:在数据文件损坏时进行完整恢复。 - 数据保护:归档日志文件的备份策略有助于防止数据丢失。 - **管理**: - 归档策略设置:包括何时进行归档、归档位置等。 - 归档日志的清理:根据归档日志的备份...
数据块大小的选择有限,只能是2k, 4k, 8k, 16k, 或32k。 二、SPFILE(服务参数文件) 自Oracle 9i开始引入SPFILE,它是一个二进制文件,如`spfileSID.ora`,同样存放于$ORACLE_HOME/dbs目录。SPFILE的一个显著优势...
同时,我们还学习了如何使用 SYS 登录到数据库,为 Users 表空间添加一个数据文件,修改上述数据文件为自动扩展方式,创建一个本地管理方式下自动分区管理的表空间,修改表空间的数据文件大小,添加一个数据文件,...
在故障处理过程中,可能需要查询表空间的大小,甚至在表空间大小为空或数据文件大小为空的情况下进行处理。这可能涉及到使用SQL命令,如`DBA_DATA_FILES`或`DBA_TABLESPACES`视图。 6. **重要日志号的关注**: 在...
FILESIZE 选项用于指定导出文件的最大尺寸,以便在执行数据泵操作时可以正确地限制文件大小。 9. FLASHBACK_SCN:指定到处特定 SCN 时刻的表的数据。 FLASHBACK_SCN 选项用于指定到处特定 SCN 时刻的表的数据,...
2. **SPFILE文件**:与INIT.ORA相比,SPFILE是一种更高级的参数文件,它可以动态存储和修改参数,无需重启数据库。优化SPFILE涉及到动态性能监视,定期分析并调整如DB_CACHE_SIZE、SHARED_POOL_SIZE等参数,以适应...