表空间回收操作判断

今天刚上班,一个朋友问我“我们这边有个表空间扩大到,1.4T,但是删除数据没有用,这个都不变小?”。

我给他这样解释了下

"这个数据文件;你删除数据是不会影响到它的大小;可以这样理解;这个数据文件相当于一个水桶;这个水桶的大小是1.4T;删除数据这个操作相当于把里面水抽出来。 水桶的大小是不变的;水是变少了。水桶可用的空间变大了;可以装更多的水。"

想一个表空间扩张到1T多。有下面两种可能

1. 真的有怎么多的数据量的业务。

2. 这表空间一定是设置为自动扩张的;导致数据文件暴涨;其中里面有99%的数据是无用数据;可以清理的。这是没有维护好。

那有没有办法减少这个数据文件呢?办法是有:就‘alter database datafile ‘****.dbf‘ resize ***G’;

可行吗?这个还是需要根据当时服务器环境来判断?

第一步:看下该表空间的使用情况

SELECT a.tablespace_name "表空间",
    a.bytes / 1024 / 1024 "表空间大小(M)",
    (a.bytes - b.bytes) / 1024 / 1024 "已使用空间(M)",
    b.bytes / 1024 / 1024 "空闲空间(M)",
    round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
FROM   (SELECT tablespace_name,
      SUM(bytes) bytes
  FROM   dba_data_files
  GROUP  BY tablespace_name) a,
    (SELECT tablespace_name,
      SUM(bytes) bytes,
      MAX(bytes) largest
  FROM   dba_free_space
  GROUP  BY tablespace_name) b
WHERE  a.tablespace_name = b.tablespace_name
ORDER  BY ((a.bytes - b.bytes) / a.bytes) DESE;

截图情况为:大约使用了250G;那就是不是可以resize到500G;减少了700G的磁盘空间呢?下面继续判断

我让她执行 select file#,name from v$datafile;  找到对应的文件号是多少?答案是9。

继续执行   select max(block_id) from dba_extents where file_id=9;

select file#,name from v$datafile;
select max(block_id) from dba_extents where file_id=9;

已经写到175382656块了。我当时凌乱了;换算为T;175392656*8/(1024*1024*1024)=1.3T;结果约为1.3T;看来用‘alter database datafile ‘****.dbf‘ resize ***G’并不可行。

若不明白;就以刚刚距离的水桶来解释:

刚刚那个水桶是1.4T; 里面放了260G的水;但这些水并不是连续放置的;水也不是直接放到水桶里面的;水是放在里面的空槽;空槽的理解相当于oracle中的段(可以理解为表,索引);现在是有一个空槽放到1.3T的位置; 现在我想压缩这个水桶;我只能压缩到1.3T 的位置;

最后:

1. 用逻辑备份这个数据文件;在删除表空间;重新建一个表空间;在进行导入;但是不建议操作;1.4T的数据文件;备份/还原是项巨大的工程;操作时该业务还需要停到。

2. 我建议还是不动为好;目前那个表空间有1.4T;只用了260G;意思是说目前不会有磁盘扩张的可能性。 那个/data1目录下还有90G可用;足够了。把所有的表空间都取消自动扩张。好好维护下。

时间: 2024-10-12 19:30:02

表空间回收操作判断的相关文章

数据库表空间的操作

文章地址: http://blog.csdn.net/yuliqi0429/article/details/40536387

表空间及回收

一. Innodb存储引擎表中所有数据都是存储在表空间中的,表空间又分为系统表空间,以ibdata1来命名,在数据安装初始化时系统会创建一个ibdata1的表空间文件,它会存储所有数据的信息以及回滚段(undo)的信息.在MySQL5.6以后,undo表空间可以通过参数单独设置存储位置了,可从ibdata1中独立出来.Innodb_data_file_path负责定义系统表空间的路径.初始化大小.自动化扩展策略.数据库默认的自动扩展大小是64MB. mysql> show variables l

Oracle表空间基础(4)

一.创建非标准块的表空间 在数据库中可以创建不同于数据库标准块大小的表空间,这个特征可以在两个具有不同块大小的数据库之间传输表空间.在创建非标准块表空间之前,必须保证设置了DB_CACHE_SIZE和至少一个DB_nK_CACHE_SIZE初始化参数,DB_nK_CACHE_SIZE即为非标准块表空间的块大小. # 查看参数db_16k_cache_size系统默认值,默认值为0,表示未启用. show parameter db_16k_cache_size NAME TYPE VALUE --

InnoDB独立表空间

使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:数据文件(.MYD),索引文件(.MYI)和表结构文件(.frm).我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而,当你使用InnoDB的时候,一切都变了. InnoDB默认会将所有的数据库的数据存储在一个共享表空间:ibdata1文件中,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题.通常只能将数据使用mysqldump导出,

Oracle 12c CDB 和 PDB 表空间管理和配置 说明

 注:本文谢绝转载. 1  管理CDB中的表空间 CDB表空间的管理和non-CDB 表空间的管理一样,CDB 也有一个实例,在安装的时候指定. --查看表空间: SQL> select instance_name fromv$instance; INSTANCE_NAME ---------------- Cndba SQL> col file_name for a50 SQL> selecttablespace_name,file_id,file_name from dba_data

Oracle 表空间

Oracle磁盘空间管理中的最高逻辑层是表空间(TABLESPACE),它的下一层是段(SEGMENT),并且一个段只能驻留在一个表空间内.段的下一层就是盘区,一个或多个盘区(EXTENT)可以组成一个段,并且每个盘区只能驻留在一个数据文件中.如果一个段跨越多个数据文件,它就只能由多个驻留在不同数据文件中的盘区构成.盘区的下一层就是数据块,它也是磁盘空间管理中逻辑划分的最底层,一组连续的数据块可以组成一个盘区. 如果要查询表空间与对应的数据文件的相关信息,可以DBA_DATA_FILES数据字典

Oracle表空间基础(5)

一.修改和维护表空间 1.增加表空间容量 可以通过修改表空间数据文件的大小或为表空间添加一个数据文件的方式增加表空间的容量,另外我们还可以使用表空间的自动扩展选项为大文件表空间增加容量.对于本地管理的临时表空间,即无法它增加空间容量,也无法修改它的段空间管理方式. a.小文件表空间增加容量 # 通过为表空间添加数据文件的方式增加表空间容量 SQL> alter tablespace test 2 add datafile '/u01/app/oracle/oradata/stdb/test02.

看懂MySQL怎样判断InnoDB表是独立表空间还是共享表空间

本文参考原文-http://bjbsair.com/2020-03-22/tech-info/5348/概述 InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话, 那些Innodb存储类型的表的数

optimize 回收表空间的一些说明

optimize命令回收表空间的说明 线上服务器,有张大表需要用pt-archiver根据时间划分归档大量数据到另一个新表中.原先200G的表,在归档完成后,du -hs 显示依然是200G的大小,删除了大量的行记录但是实际上空间是不会释放的. 这种情况下,我们就要使用optimize命令重建表以达到释放表空间的目的. (好像是从5.6.6之后,optimize不锁表了,但是optimize操作会进行rebuild表操作,要确保磁盘剩余空间足够存放新表的大小,不然操作会失败) 另外,如果在主库执