一 问题描述
生产DG从库的一个临时数据文件达到了5T,主库上有2T。
这个临时数据文件是bigfile的。
dba_tablespaces的bigfile值是'YES'
bigfile类型的表空间只能有一个数据文件,无法通过新增一个数据文件,再删除大数据文件的方式释放空间。
如果resize的话,这么大的文件可能会报错,这里计划在主库重建这个临时表空间来释放空间。
二 操作步骤
2.1 在主库新建一个新的临时表空间,并指定该临时表空间为用户的默认表空间
--为了避免删除大临时文件比较慢,删除过程中影响业务使用,所以先提前建一个新临时表空间。
2.1.1 在主库上新建临时表空间
示例:
create bigfile temporary tablespace ab_temp1 tempfile '/oracle/oradata/ab_temp01.dbf' size 200g AUTOEXTEND ON NEXT 1G MAXSIZE 1024G;
--黄色阴影部分根据实际情况,酌情修改
2.1.2 在从库上新增临时文件
由于在主库新建临时表空间,只会往从库同步数据字典,但不会同步临时文件,所以需要在从库手动创建临时文件。普通的数据文件是可以同步的,只临时文件不能同步。
示例:
alter tablespace ab_temp1 add tempfile '/oracle/oradata/ab_temp01.dbf' size 200g AUTOEXTEND ON NEXT 1G MAXSIZE 1024G;
2.1.3 在主库指定用新的临时表空间
alter user ab temporary tablespace ab_temp1;
select temporary_tablespace from dba_users where username='AB';
2.2 删除旧的比较占用空间的临时表空间
2.2.1 停业务或者杀掉占用老临时表空间的会话
杀会话影响更小些。
① 查出要杀哪些会话
SELECT S.sid,
S.serial# sid_serial,
S.username,
S.osuser,
S.module,
S.program,
T.tablespace,
P.spid,
'kill -9 ' || P.spid
FROM v$sort_usage T, v$session S, dba_tablespaces TBS, v$process P
WHERE T.session_addr = S.saddr
AND S.paddr = P.addr
AND T.tablespace = TBS.tablespace_name
and TBS.tablespace_name='AB_TEMP';
② 在操作系统上执行查出来的kill -9的杀会话的名称
2.2.2 在主库删除旧表空间
DROP TABLESPACE ab_temp INCLUDING CONTENTS AND DATAFILES;
在主库删除临时表空间,可以同步删除从库的临时表空间。
2.3 检查确认空间是否释放
……