达到 Oracle XE 数据限制 - 如何减小表空间大小?
Oracle XE data limit reached - how to reduce tablespace size?
我有一个包含多个 tablespace 的 Oracle XE 数据库。其中一个用于存储图像数据,这个 tablespace 已经变得很大了。我们决定不再需要这些图像,因此将它们全部删除。
这释放了很多 space,但 tablespace 的大小仍然很大。我怎样才能将它减少到实际数据的大小?
我会做一个完整的数据库导出,删除表空间,创建一个较小的新表空间,然后导入回它
这有点棘手,您会发现 DATAFILE RESIZE 是最常见的答案。但是,您需要注意 Jonathan Lewis 提到的几件事,以避免在调整数据文件大小时出现 ORA-03297: file contains used data beyond requested RESIZE value
。
你需要先找到space的tablespace来确定您可以 回收多少 。
Tim Hall 编写的以下脚本很方便:
SET PAGESIZE 140
COLUMN used_pct FORMAT A11
SELECT tablespace_name,
size_mb,
free_mb,
max_size_mb,
max_free_mb,
TRUNC((max_free_mb/max_size_mb) * 100) AS free_pct,
RPAD(' '|| RPAD('X',ROUND((max_size_mb-max_free_mb)/max_size_mb*10,0), 'X'),11,'-') AS used_pct
FROM (
SELECT a.tablespace_name,
b.size_mb,
a.free_mb,
b.max_size_mb,
a.free_mb + (b.max_size_mb - b.size_mb) AS max_free_mb
FROM (SELECT tablespace_name,
TRUNC(SUM(bytes)/1024/1024) AS free_mb
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name,
TRUNC(SUM(bytes)/1024/1024) AS size_mb,
TRUNC(SUM(GREATEST(bytes,maxbytes))/1024/1024) AS max_size_mb
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
)
ORDER BY tablespace_name;
现在剩下的就是调整数据文件的大小了。
ALTER DATABASE DATAFILE '/directory/datafile.dbf' RESIZE value;
我有一个包含多个 tablespace 的 Oracle XE 数据库。其中一个用于存储图像数据,这个 tablespace 已经变得很大了。我们决定不再需要这些图像,因此将它们全部删除。
这释放了很多 space,但 tablespace 的大小仍然很大。我怎样才能将它减少到实际数据的大小?
我会做一个完整的数据库导出,删除表空间,创建一个较小的新表空间,然后导入回它
这有点棘手,您会发现 DATAFILE RESIZE 是最常见的答案。但是,您需要注意 Jonathan Lewis 提到的几件事,以避免在调整数据文件大小时出现 ORA-03297: file contains used data beyond requested RESIZE value
。
你需要先找到space的tablespace来确定您可以 回收多少 。
Tim Hall 编写的以下脚本很方便:
SET PAGESIZE 140
COLUMN used_pct FORMAT A11
SELECT tablespace_name,
size_mb,
free_mb,
max_size_mb,
max_free_mb,
TRUNC((max_free_mb/max_size_mb) * 100) AS free_pct,
RPAD(' '|| RPAD('X',ROUND((max_size_mb-max_free_mb)/max_size_mb*10,0), 'X'),11,'-') AS used_pct
FROM (
SELECT a.tablespace_name,
b.size_mb,
a.free_mb,
b.max_size_mb,
a.free_mb + (b.max_size_mb - b.size_mb) AS max_free_mb
FROM (SELECT tablespace_name,
TRUNC(SUM(bytes)/1024/1024) AS free_mb
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name,
TRUNC(SUM(bytes)/1024/1024) AS size_mb,
TRUNC(SUM(GREATEST(bytes,maxbytes))/1024/1024) AS max_size_mb
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
)
ORDER BY tablespace_name;
现在剩下的就是调整数据文件的大小了。
ALTER DATABASE DATAFILE '/directory/datafile.dbf' RESIZE value;