暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

新功能!Oracle Database 23ai 中的大文件表空间收缩

想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。

加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。

同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。

如果你有想了解的知识点希望我们发文可以后台私信。

另外锦鲤活动还在继续,截止到月末,请大家多多参与,多多宣传,后续持续为大家带来福利。

震撼全网!青学会 MOP 技术社区 1024 程序员节“锦鲤”活动启动,谁能成为下一个幸运之星?

文章出处

作者:Tim Hall,大名鼎鼎的ORACLE ACE总监

著名网站OracleBase的作者,以下文章翻译自:

https://oracle-base.com/articles/23/bigfile-tablespace-shrink-23

正文开始

这篇文章是关于在Oracle数据库23ai版本中如何收缩大文件表空间以回收未使用的空间。以下是文章的主要内容翻译:

设置

我们需要一个表空间来运行一些测试。在Oracle数据库23ai中,默认的表空间文件大小是大文件(bigfile),所以我们不需要明确指定。

conn sys/SysPassword1@//localhost:1521/freepdb1 as sysdba

-- 创建一个表空间和用户进行测试。
drop user if exists reclaim_user cascade;
drop tablespace if exists reclaim_ts including contents and datafiles;

create tablespace reclaim_ts datafile size 10m autoextend on next 1m;

create user reclaim_user identified by reclaim_user default tablespace reclaim_ts quota unlimited on reclaim_ts;
grant create session, create table to reclaim_user;
grant select_catalog_role to reclaim_user;

-- 在测试模式中创建并填充两个表。
conn reclaim_user/reclaim_user@//localhost:1521/freepdb1

create table t1 (
  id   number,
  col1 varchar2(4000),
  col2 varchar2(4000),
  constraint t1_pk primary key (id)
);

create table t2 (
  id   number,
  col1 varchar2(4000),
  col2 varchar2(4000),
  constraint t2_pk primary key (id)
);

insert /*+append*/ into t1
select rownum, rpad('x', 4000, 'x'), rpad('x', 4000, 'x')
from dual
connect by level <= 100000;
commit;

insert /*+append*/ into t2
select rownum, rpad('x', 4000, 'x'), rpad('x', 4000, 'x')
from dual
connect by level <= 100000;
commit;

exec dbms_stats.gather_table_stats(null, 't1');
exec dbms_stats.gather_table_stats(null, 't2');

我们检查与表空间关联的数据文件的大小和表的大小。

select tablespace_name, blocks, bytes/1024/1024 as size_mb
from   dba_data_files
where  tablespace_name = 'RECLAIM_TS';

TABLESPACE_NAME                    BLOCKS    SIZE_MB
------------------------------ ---------- ----------
RECLAIM_TS                         427520       3340

SQL>

column table_name format a10

select table_name, blocks, (blocks*8)/1024 as size_mb
from   user_tables
where  table_name in ('T1''T2')
order by 1;

TABLE_NAME     BLOCKS    SIZE_MB
---------- ---------- ----------
T1             200696  1567.9375
T2             200694 1567.92188

SQL>

我们截断第一个表,留下数据文件中的一个间隙。

truncate table t1;

exec dbms_stats.gather_table_stats(null, 't1');

我们可以在测试之间重复这个设置,以便从头开始。

分析大文件表空间

我们运行一个分析,看看通过执行收缩可以节省多少空间。我们调用DBMS_SPACE
包中的SHRINK_SPACE
过程,传入大文件表空间的名称和TS_MODE_ANALYZE
收缩模式常量。

conn sys/SysPassword1@//localhost:1521/freepdb1 as sysdba

set serveroutput on
execute dbms_space.shrink_tablespace('RECLAIM_TS', shrink_mode => dbms_space.ts_mode_analyze);
-------------------ANALYZE RESULT-------------------
Total Movable Objects: 2
Total Movable Size(GB): 1.56
Original Datafile Size(GB): 3.39
Suggested Target Size(GB): 3.19
Process Time: +00 00:00:00.053777

PL/SQL procedure successfully completed.

SQL>

分析结果认为我们不能节省多少空间,这听起来很可疑,因为我们截断了一个表,这个表大约占据了数据文件一半的空间。

收缩大文件表空间

我们通过调用SHRINK_SPACE
过程来运行收缩操作,并传入表空间名称。

set serveroutput on
execute dbms_space.shrink_tablespace('RECLAIM_TS');
-------------------SHRINK RESULT-------------------
Total Moved Objects: 2
Total Moved Size(GB): 1.56
Original Datafile Size(GB): 3.26
New Datafile Size(GB): 1.63
Process Time: +00 00:00:30.586722

PL/SQL procedure successfully completed.

SQL>

尽管分析结果如此,我们已经将相关数据文件减少到大约原始大小的一半。

之前的命令相当于调用过程时使用TS_MODE_SHRINK
收缩模式和TS_TARGET_MAX_SHRINK
目标大小。

set serveroutput on
execute dbms_space.shrink_tablespace('RECLAIM_TS', shrink_mode => dbms_space.ts_mode_shrink, target_size => dbms_space.ts_target_max_shrink);

附加信息

以下是关于收缩大文件表空间的一些附加信息:

  • 对象被移动以压缩数据文件中的段,因此所有未使用的空间都在数据文件的末尾。这允许数据文件被收缩以回收未使用的空间。
  • 通过SHRINK_SPACE
    进行的在线移动没有传统ALTER TABLE ... MOVE
    的所有限制,尽管文档是这么说的。分析阶段将指示是否有不支持的对象。
  • 如果表空间没有设置为自动扩展,操作结束时将没有空间供段在末端增长。你需要手动调整表空间的大小以腾出空间。
  • 收缩可能会失败,但如果任何移动成功完成,它仍然可以减少数据文件的大小。
  • 我们可以收缩SYSAUX表空间。
  • SHRINK_TABLESPACE
    过程有一个重载版本,包括一个SHRINK_RESULT
    输出参数,因此操作的结果可以作为CLOB返回,而不是通过DBMS_OUTPUT
    推送。

更多信息请参见:

  • 收缩大文件表空间
  • DBMS_SPACE

希望这有帮助。此致敬礼,Tim...

END

往期文章回顾

MOP社区新闻

  青学会MOP技术社区成立了!

  青学会专家顾问团成员介绍

金仓专栏

  告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)

  KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)

  KingbaseES数据脱敏-青学会&金仓专栏(3)

  KingbaseES后台服务管理-青学会&金仓专栏(4)

  电科金仓KES日常运维命令集锦-青学会&金仓专栏(5)

DBA实战小技巧

  推荐一款超实用的openGauss数据库安装工具!

  实战:记一次RAC故障排查
  DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
  DBA实战运维小技巧存储篇(一)根目录满了如何处理
  DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储

MOP社区投稿-内核开发

  浅谈 PostgreSQL GUC 模块原理

  简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理

  简单讨论 PostgreSQL C语言拓展函数返回数据表的方式

  简单分析 pg_config 程序的作用与原理
  Redis 日志机制简介(一):SlowLog
  Redis 日志机制简介(二):AOF 日志
  Redis 日志机制简介(三):RDB 日志
  pg_cron插件使用介绍
  Redis 的指令表实现机制简介
  pg几款源码工具介绍
  Redis 事务功能简介

MOP顾问说

   MOP顾问说:MOP 三种主流数据库常用 SQL(一)

  MOP顾问说:服务器内存

  MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘



文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论