所以我在Linux服务器上运行了一个Oracle 11G实例。如何验证数据库可以包含多少数据?
问题有一个转折点。
我正在对应用程序运行负载测试。数据库服务器开始耗尽其中一个/ u0X /文件系统(数据库本身位于其中)的可用空间。 40GB的剩余电量仅为93MB。我指示我的应用程序删除数据库上的大部分数据,但确实如此。但/ u0X /上的可用空间保持不变 - 93MB。
asktom解释说,一旦数据被删除,它就不会被标记为“自由空间”本身,并且“自由空间”不会在表空间上增加。相反,数据库重用已经占用的BUT标记为删除空间(或类似的smth)
再次......我如何关注我的数据库可以包含多少数据?我怎么知道是否应该考虑让应用程序再次清除其数据,然后再开始查看带有异常的日志并返回HTTP:500s?
编辑:回复Cyrille的回答
TABLESPACE_NAME MEGS_ALLOC MEGS_FREE MEGS_USED PCT_FREE PCT_USED MAX
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
APP01 34920 27 34893 0 100 65536
SIGNSERVER 10 7 3 70 30 32768
SYSAUX 1120 63 1057 6 94 32768
SYSTEM 4290 1 4289 0 100 32768
TEMP 1345 1343 2 100 0 32768
UNDOTBS1 1090 759 331 70 30 32768
USERS 5 4 1 74 26 32768
7 rows selected.
编辑#2
SQL> select segment_type,sum(bytes/power(1024,2)) as "Size MB" from dba_segments where tablespace_name='APP01' group by segment_type;
SEGMENT_TYPE Size MB
------------------ ----------
LOBINDEX 92,5625
LOBSEGMENT 31702,5625
TABLE 1857
INDEX 1241,125
答案 0 :(得分:1)
自由空间不会返回给操作系统,但并不意味着您的数据库中没有可用空间。您必须查看表空间使用情况,表空间是数据所在的逻辑空间,如果删除了表空间中的所有内容,则可以通过调整数据文件大小来回收操作系统级别的空间。
这是一个可用于检查表空间使用情况的脚本:
https://www.dba-scripts.com/scripts/administration/tablespace-usage-script/
您可以使用此报告通过调整数据库数据文件大小来验证您可以在操作系统级别回收多少空间:
https://www.dba-scripts.com/scripts/administration/datafile-space-reclaimable/
答案 1 :(得分:0)
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 size_mb desc;
SELECT name, free_mb, total_mb, round(free_mb/total_mb*100) as pct_free FROM v$asm_diskgroup order by TOTAL_MB desc;