找出表空间上的空闲空间
我们的应用程序由于'ORA-01536:超出表空间的空间配额'而失败了几次,我们希望能够通过定期检查表空间上的空闲空间并在下降到某个级别时发出警报。
有什么方法可以找出表空间剩余多less空闲空间?
经过一些研究(我不是DBA),我尝试了以下内容:
select max_bytes-bytes from user_ts_quotas; select sum(nvl(bytes,0)) from user_free_space;
但这些查询返回完全不同的结果。
我使用这个查询
column "Tablespace" format a13 column "Used MB" format 99,999,999 column "Free MB" format 99,999,999 column "Total MB" format 99,999,999 select fs.tablespace_name "Tablespace", (df.totalspace - fs.freespace) "Used MB", fs.freespace "Free MB", df.totalspace "Total MB", round(100 * (fs.freespace / df.totalspace)) "Pct. Free" from (select tablespace_name, round(sum(bytes) / 1048576) TotalSpace from dba_data_files group by tablespace_name ) df, (select tablespace_name, round(sum(bytes) / 1048576) FreeSpace from dba_free_space group by tablespace_name ) fs where df.tablespace_name = fs.tablespace_name;
一个更准确的SQL语句
SELECT a.tablespace_name, ROUND (((c.BYTES - NVL (b.BYTES, 0)) / c.BYTES) * 100,2) percentage_used, c.BYTES / 1024 / 1024 space_allocated, ROUND (c.BYTES / 1024 / 1024 - NVL (b.BYTES, 0) / 1024 / 1024,2) space_used, ROUND (NVL (b.BYTES, 0) / 1024 / 1024, 2) space_free, c.DATAFILES FROM dba_tablespaces a, ( SELECT tablespace_name, SUM (BYTES) BYTES FROM dba_free_space GROUP BY tablespace_name ) b, ( SELECT COUNT (1) DATAFILES, SUM (BYTES) BYTES, tablespace_name FROM dba_data_files GROUP BY tablespace_name ) c WHERE b.tablespace_name(+) = a.tablespace_name AND c.tablespace_name(+) = a.tablespace_name ORDER BY NVL (((c.BYTES - NVL (b.BYTES, 0)) / c.BYTES), 0) DESC;
这是我遇到的最简单的查询之一,我们也用它来监视:
SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024/1024 "FREE SPACE(GB)" FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;
关于Oracle表空间的完整文章: 表空间
有许多方法来检查大小,但作为一个开发人员我们没有太多的查询元表,我觉得这个解决scheme非常简单(注意:如果您得到错误消息ORA-01653 ORA-01653错误是由于你需要给表空间增加空间。')
--Size of All Table Space --1. Used Space SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS "USED SPACE(IN GB)" FROM USER_SEGMENTS GROUP BY TABLESPACE_NAME --2. Free Space SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS "FREE SPACE(IN GB)" FROM USER_FREE_SPACE GROUP BY TABLESPACE_NAME --3. Both Free & Used SELECT USED.TABLESPACE_NAME, USED.USED_BYTES AS "USED SPACE(IN GB)", FREE.FREE_BYTES AS "FREE SPACE(IN GB)" FROM (SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS USED_BYTES FROM USER_SEGMENTS GROUP BY TABLESPACE_NAME) USED INNER JOIN (SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS FREE_BYTES FROM USER_FREE_SPACE GROUP BY TABLESPACE_NAME) FREE ON (USED.TABLESPACE_NAME = FREE.TABLESPACE_NAME);
谢谢
column pct_free format 999.99 select used.tablespace_name, (reserv.maxbytes - used.bytes)*100/reserv.maxbytes pct_free, used.bytes/1024/1024/1024 used_gb, reserv.maxbytes/1024/1024/1024 maxgb, reserv.bytes/1024/1024/1024 gb, (reserv.maxbytes - used.bytes)/1024/1024/1024 "max free bytes", reserv.datafiles from (select tablespace_name, count(1) datafiles, sum(greatest(maxbytes,bytes)) maxbytes, sum(bytes) bytes from dba_data_files group by tablespace_name) reserv, (select tablespace_name, sum(bytes) bytes from dba_segments group by tablespace_name) used where used.tablespace_name = reserv.tablespace_name order by 2 /
除非我弄错了,上面的代码并没有考虑到未分配的空间,所以如果你真的想知道什么时候会遇到硬性限制,你应该使用最大字节数。
我认为下面的代码是这样的。 它将可用空间计算为“可用空间”+未分配空间。
select free.tablespace_name, free.bytes, reserv.maxbytes, reserv.bytes, reserv.maxbytes - reserv.bytes + free.bytes "max free bytes", reserv.datafiles from (select tablespace_name, count(1) datafiles, sum(maxbytes) maxbytes, sum(bytes) bytes from dba_data_files group by tablespace_name) reserv, (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) free where free.tablespace_name = reserv.tablespace_name;
您可以在此有用的软件包中使用名为tablespaces.sh的脚本: http : //dba-tips.blogspot.com/2014/02/oracle-database-administration-scripts.html