Oracle减小数据文件大小
收集表空間的統計信息,查詢表空間的使用率
| -- 查詢非臨時表空間的使用率 SELECT d.Tablespace_Name, ?????? Space "SUM_SPACE(M)", ?????? Blocks "SUM_BLOCKS", ?????? Space - Nvl(Free_Space, 0) "USED_SPACE(M)", ?????? Round((1 - Nvl(Free_Space, 0) / Space) * 100, 2) "USED_RATE(%)", ?????? Free_Space "FREE_SPACE(M)" ? FROM (SELECT Tablespace_Name, ?????????????? Round(SUM(Bytes) / (1024 * 1024), 2) Space, ?????????????? SUM(Blocks) Blocks ????????? FROM Dba_Data_Files ???????? GROUP BY Tablespace_Name) d, ?????? (SELECT Tablespace_Name, ?????????????? Round(SUM(Bytes) / (1024 * 1024), 2) Free_Space ????????? FROM Dba_Free_Space ???????? GROUP BY Tablespace_Name) f ?WHERE d.Tablespace_Name = f.Tablespace_Name(+) |
如果表空間的使用率較低,可以通過resize datafile減小數據文件的大小
需要清楚數據文件的真實使用空間,可以通過查詢dba_extents
| SELECT Ddf.File_Name, De.File_Id, SUM(De.Bytes) / 1024 / 1024 AS Mb ? FROM Dba_Extents De ? JOIN Dba_Data_Files Ddf ??? ON De.File_Id = Ddf.File_Id ?GROUP BY Ddf.File_Name, De.File_Id; |
可以看出DEV1_oim02.dbf 實際使用空間為304.6M,但實際存儲中可能存在很多存儲碎片,例如收縮到1024M,就會出現如下的錯誤。
| SQL> alter database datafile 115 resize 1024M; alter database datafile 115 resize 1024M * ERROR at line 1: ORA-03297: file contains used data beyond requested RESIZE value |
這種情況可能有以下原因
原因1:壓縮表空間大小,最小必須是該表空間目前最大塊段的大小
? ? ? ? ? ? ---可以通過移動表空間來收縮表空間大小。
原因2:表的初始大小分配的太大
? ? ? ? ? ? ---可以通過減小表或索引的初始大小來收縮表空間
但在實際過程中對于表空間中表比較多,且關系比較復雜的時候,操作是有難度的,可以直接找出最小可收縮大小。
找出目前DEV1_OIM最大的block_id
| SELECT MAX(block_id) ? FROM dba_extents ?WHERE tablespace_name = 'DEV1_OIM'; ? MAX(BLOCK_ID) ------------------------- 1008888 |
Block大小
| SQL>? show parameter db_block_size ; ? NAME???????????????????????????????? TYPE??????? VALUE ------------------------------------ ----------- ------------------------------ db_block_size???????? ???????????????integer???? 8192 ? SQL> SELECT 1008888 * 8192 / 1024 / 1024 FROM Dual; 7881.9375 |
因此該表空間收縮到7882M是沒有問題的。
總結
以上是生活随笔為你收集整理的Oracle减小数据文件大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 构建 REST 风格接口
- 下一篇: 设计实用的RESTful API的最佳实