DM8 归档日志挖掘导致 TEMP 表空间不释放的问题排查
- [DM8 归档日志挖掘导致 TEMP 表空间不释放的问题排查](#DM8 归档日志挖掘导致 TEMP 表空间不释放的问题排查)
- [1 环境介绍](#1 环境介绍)
- [2 数据库准备](#2 数据库准备)
-
- [2.1 配置归档](#2.1 配置归档)
- [2.2 开启逻辑附加日志](#2.2 开启逻辑附加日志)
- [2.3 开启DBMS_LOGMNR 系统包](#2.3 开启DBMS_LOGMNR 系统包)
- [2.4 创建数据库用户](#2.4 创建数据库用户)
- [2.5 创建测试表并构造数据](#2.5 创建测试表并构造数据)
- [2.6 查询归档日志SCN](#2.6 查询归档日志SCN)
- [3 归档日志挖掘](#3 归档日志挖掘)
-
- [3.1 查询会话与TEMP临时表空间使用率](#3.1 查询会话与TEMP临时表空间使用率)
- [3.2 模拟归档日志挖掘后TEMP表空间不释放](#3.2 模拟归档日志挖掘后TEMP表空间不释放)
- [4 总结](#4 总结)
- [5 更多达梦数据库全方位指南:安装 优化 与实战教程](#5 更多达梦数据库全方位指南:安装 优化 与实战教程)
DM8 归档日志挖掘导致 TEMP 表空间不释放的问题排查
1 环境介绍
CPU X86
OS Kylin v10
DM8-03134284368-20250902-290952-20149 Pack32
DM8-03134284604-20260707-335949-20228
2 数据库准备
2.1 配置归档
bash
--配置归档
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/data/dmdba/dmdata/dmarch,TYPE=LOCAL,FILE_SIZE=128,SPACE_LIMIT=2048';
ALTER DATABASE OPEN;
CHECKPOINT(100);
2.2 开启逻辑附加日志
bash
--开启逻辑附加日志
SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);
2.3 开启DBMS_LOGMNR 系统包
bash
-- 开启DBMS_LOGMNR 系统包
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');
2.4 创建数据库用户
sql
--将其中的 CESHI 替换为要创建的用户名即可
--用户默认密码: Dameng@123
--通用机创建用户 CESHI
--创建用户默认表空间
CREATE TABLESPACE "CESHI01_DATA"
DATAFILE 'CESHI_DATA_01.DBF' SIZE 1024 AUTOEXTEND
ON NEXT 1024 MAXSIZE 409600 CACHE = NORMAL;
--创建用户索引表空间
CREATE TABLESPACE "CESHI02_INDEX" DATAFILE
'CESHI_INDEX_01.DBF' SIZE 1024 AUTOEXTEND
ON NEXT 1024 MAXSIZE 409600 CACHE = NORMAL;
--创建用户
CREATE USER "CESHI" IDENTIFIED BY "Dameng@123"
--ENCRYPT BY OPENSSL_SM3 (存储加密)
DEFAULT TABLESPACE "CESHI01_DATA"
DEFAULT INDEX TABLESPACE "CESHI02_INDEX";
GRANT "PUBLIC","RESOURCE","SOI","SVI","VTI" TO "CESHI";
--根据实际需求 考虑是否授予DBA角色
GRANT "DBA" TO "CESHI";
2.5 创建测试表并构造数据
sql
--创建测试表 并构造数据
CREATE TABLE "CESHI"."TEST"
(
"ID" INT NOT NULL,
"NAME" VARCHAR(64),
"ADDRES" VARCHAR(512),
"E-MAIL" VARCHAR(50),
"PHONE" VARCHAR(11),
"BAK" TEXT,
NOT CLUSTER PRIMARY KEY("ID") USING INDEX TABLESPACE "CESHI02_INDEX" ) ;
BEGIN
FOR I IN 1..10000000 LOOP
INSERT INTO "CESHI"."TEST" VALUES(I,'李明','中国上海','888888@qq.com','18911110000','备注记录');
END LOOP;
END;
2.6 查询归档日志SCN
sql
--查询归档日志SCN
SELECT NAME, FIRST_CHANGE#, FIRST_TIME, NEXT_CHANGE#, NEXT_TIME FROM V$ARCHIVED_LOG;
3 归档日志挖掘
3.1 查询会话与TEMP临时表空间使用率
sql
--占用临时表空间的会话
SELECT
"TMP_USED_TYPE",
"TMP_USED_EXTENT_NUM" * (SF_GET_EXTENT_SIZE()) * (PAGE() / 1024) / 1024 AS TEMP_MB,
*
FROM "SYS"."V$SESSIONS"
ORDER BY TEMP_MB DESC;
--查询表空间使用率
DECLARE
K INT:=(SELECT cast(PAGE()/1024 as varchar));
BEGIN
SELECT
F.CLIENT_PATH,
G.NAME 所属表空间,
F.MAX_SIZE||'M' 文件扩展限制,
(CASE F.AUTO_EXTEND WHEN '1' THEN '是' ELSE '否' END) 文件自动扩容,
(CASE F.NEXT_SIZE WHEN '0' THEN '默认值' ELSE F.NEXT_SIZE||'M' END) 文件下次扩容值,
F.TOTAL_SIZE*K/1024 ||'M' 文件当前大小 ,
ROUND((F.FREE_SIZE * K/1024 /(F.TOTAL_SIZE * K/1024.0)),2)*100 ||'%' AS 空闲率,
(1-ROUND((F.FREE_SIZE * K/1024 /(F.TOTAL_SIZE * K/1024.0)),2))*100 ||'%' AS 使用率
FROM SYS."V$DATAFILE" F LEFT JOIN SYS.V$TABLESPACE G ON F.GROUP_ID=G.ID
WHERE G.NAME='TEMP' ORDER BY 1;
END;
3.2 模拟归档日志挖掘后TEMP表空间不释放
sql
--添加归档日志
CALL DBMS_LOGMNR.ADD_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-53-57.log');
CALL DBMS_LOGMNR.ADD_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-58-17.log');
CALL DBMS_LOGMNR.ADD_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-58-25.log');
CALL DBMS_LOGMNR.ADD_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-58-33.log');
--启动归档日志挖掘 根据2.6 查询出的SCN 填入对应位置
CALL DBMS_LOGMNR.START_LOGMNR(89572063, 105527164, OPTIONS => 2130);
--移除归档日志
CALL DBMS_LOGMNR.REMOVE_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-53-57.log');
CALL DBMS_LOGMNR.REMOVE_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-58-17.log');
CALL DBMS_LOGMNR.REMOVE_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-58-25.log');
CALL DBMS_LOGMNR.REMOVE_LOGFILE('/data/dmdba/dmdata5241/dmarch/ARCHIVE_LOCAL1_0x35D10A12_EP0_2026-08-20_14-58-33.log');
--关闭归档挖掘
CALL DBMS_LOGMNR.END_LOGMNR();
4 总结
- 1 操作顺序A:在调用 END_LOGMNR 前执行 REMOVE_LOGFILE,导致临时表空间(TEMP)未正常释放。
- 2 操作顺序B:跳过 REMOVE_LOGFILE 步骤,直接调用 END_LOGMNR,临时表空间释放正常。
- 3 操作顺序C:先调用 END_LOGMNR 结束挖掘,再执行 REMOVE_LOGFILE,系统抛出异常 -2849(无法删除未列出的日志文件)。
- 4 操作顺序D:在 START_LOGMNR 前调用 REMOVE_LOGFILE,验证挖掘过程中不调用 REMOVE_LOGFILE 时,临时表空间能正常释放。