注册
达梦数据库回收空间
专栏/写意人生/ 文章详情 /

达梦数据库回收空间

写意人生 2024/06/26 1364 5 0
摘要 大批量数据更新和删除过程中,会导致数据页的分裂,产生数据碎片。导致查询需要大量的I/O操作,从而影响数据库性能。所以在必要的时候,需要对数据库进行空间回收。

数据库系统经过长时间运行后,数据量会达到一定容量,系统中的数据,由于不同的业务需求,数据的保存周期各有不同。业务数据保存一年、三年或更长时间。一些基础数据,系统运行的整个生命周期中,会一直保存,偶尔会有新增和修改。系统中日志数据保留周期几天或几个月都有可能,临时数据或中间数据,在业务处理完成后,就会立即删除。特别是OLAP系统和有很多批量业务的OLTP系统,数据的新增、更新、删除非常频繁。特别是大批量数据更新和删除过程中,会导致数据页的分裂,产生数据碎片。导致查询需要大量的I/O操作,从而影响数据库性能。所以在必要的时候,需要对数据库进行空间回收。
数据回收空间涉及到逻辑部分和物理部分。
逻辑部分:包括数据表和索引。数据表目前不能直接回收空间,可以通过数据表迁移或移动表所在的表空间实现。数据库索引可以直接进行索引重构,实现索引空间回收。
物理部分:包括数据文件的回收,直接使用resize命令,重置数据文件大小。

达梦逻辑存储结构:
01.png
达梦数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在达梦数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。
在DM8中存储的层次结构如下:
1、数据库由一个或多个表空间组成;
2、每个表空间由一个或多个数据文件组成;
3、每个数据文件由一个或多个簇组成;
4、段是簇的上级逻辑单元,一个段可以跨多个数据文件;
5、簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
6、页是数据库中最小的分配单元,也是数据库中使用的最小的IO单元。

一、查询表空间使用情况

SELECT
A.TABLESPACE_NAME "表空间名称",
MAX_TOTAL_SIZE /(1024 * 1024) "表空间最大大小(M)",
TOTAL /(1024 * 1024) "表空间当前大小(M)",
(TOTAL-FREE)/(1024 * 1024 ) "表空间使用大小(M)",
ROUND((TOTAL-FREE)/MAX_TOTAL_SIZE, 4) * 100 "使用率%"
FROM
(SELECT TABLESPACE_NAME,SUM(BYTES) FREE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) A,
(SELECT TABLESPACE_NAME,SUM(BYTES) TOTAL FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) B,
(SELECT TABLESPACE_NAME,SUM(CASE WHEN MAXBYTES = 0 THEN BYTES ELSE MAXBYTES END ) MAX_TOTAL_SIZE
FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME AND A.TABLESPACE_NAME = C.TABLESPACE_NAME ORDER BY 5 DESC;
02.png
可以详细看到每个表空间的最大大小、表空间当前大小、表空间使用大小和表空间使用率。表空间空闲大小=表空间当前大小-表空间使用大小。

二、重构聚集索引

当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片,从而影响访问速度。当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能占用了大量并不使用的簇,从而浪费了存储空间。可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,从而提高访问效率和空间效率。
达梦数据库索引可分为聚集索引和非聚集索引,在索引重构的过程中,两类索引使用的系统函数不同。
重构索引的系统函数为:
SP_REBUILD_INDEX(SCHEMA_NAME varchar(256), INDEX_ID int);
SCHEAM_NAME为索引所在的模式名,INDEX_ID为索引ID。
特别说明:此系统函数虚索引和聚集索引不支持重建,可以使用SP_REORGANIZE_INDEX系统函数对聚集索引进行重构。
示例:聚集索引重构方法:
(1)查询表的聚集索引
select owner,index_name,index_type,table_owner,table_name
from dba_indexes where owner='CCRM'
and table_name in('ACRM_A_CI_DEP_BAL_TRD_M','ACRM_A_CI_ORG_DEP_BAL_TRD_D',
'ACRM_A_CI_ORG_DEP_BAL_TRD_M')
and DBA_INDEXES.INDEX_TYPE='CLUSTER';
03.png
去掉查询语句中的in条件就可以查询用户下的全部聚集索引。
(2)重构聚集索引。
SP_REORGANIZE_INDEX('CCRM','INDEX33573599');

三、重构非聚集索引

SELECT
'ALTER INDEX '
||T.OWNER
||'.'
||T.INDEX_NAME
|| ' REBUILD ONLINE;'
FROM
DBA_INDEXES T
WHERE
T.OWNER='CCRM'
AND TABLE_OWNER='CCRM'
AND DBA_INDEXES.INDEX_TYPE!= 'CLUSTER';
通过查询语句全部获取重构非聚集索引的语句,在管理工具或DISQL中执行。
示例:
ALTER INDEX CCRM.ACRM_F_CI_CST_ADDR_INFO_PK REBUILD ONLINE;
也可以获取索引的INDEX_ID,通过函数SP_REBUILD_INDEX重构索引。
示例:
SP_REBUILD_INDEX(SCHEMA_NAME varchar(256), INDEX_ID int);

四、缩减数据文件的大小

(1)缩减前表空间使用情况
04.png
如上图TBS_IMASDATA_INDEX表空间,表空间最大大小819G,当前大小是779G,使用大小是222G,空闲大小大约是557G(779G-222G),理论上可以回收500G左右的空间。
(2)通过DEM管理平台查看每个数据文件大小
05.png
通过DEM平台的实时监控工具,可以看到TBS_IMASDATA_INDEX表空间每个数据的使用大小。以IMASDATA_INDEX10.DBF为例,该文件最大大小和分配大小都是50G,空闲大小是44G。理论上该文件可以回收44G空间。如果下图所示,IMASDATA_INDEX10.DBF文件在服务器操作系统中的实际大小,占用系统空间是50G。
06.png

(3)使用管理工具缩减数据文件
07.png
以IMASDATA_INDEX10.DBF为例,将该文件由50G缩减到20G。对应的DDL语句如下所示,
alter tablespace "TBS_IMASDATA_INDEX" resize datafile '/home/dmdba/dmdata/IMASDATA/IMASDATA_INDEX10.DBF' to 20480;
(4)数据文件回收后
08.png

如上图所示,IMASDATA_INDEX10.DBF文件在服务器操作系统上显示为20G,说明缩减文件成功。方法都是一样的,其他数据文件缩减就不一一介绍。
如果没有部署DEM管理平台,也可以通过以下SQL语句查询每个数据文件的空闲大小。
SELECT
T.NAME,
D.PATH,
T.TOTAL_SIZE PAGE()/(10241024) 表空间分配大小MB,
T.USED_SIZE * PAGE()/(1024*1024) 数据文件使用大小MB,
D.FREE_SIZE PAGE()/(10241024) 数据文件空闲大小MB
FROM V$TABLESPACE T,
V$DATAFILE D
WHERE T.ID=D.GROUP_ID
ORDER BY T.ID,
D.ID;
09.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服