oracle刪除數據后表空間仍過大問題解決方法


-----親測有效-------

--一、備份原始數據庫庫
--1、備份空表
--在plsql里面執行一下這句話 然后把結果集 再執行一把 再導數據
select 'alter table '||table_name||' allocate extent(size 64k);' from tabs t
where not exists (select segment_name from user_segments s where s.segment_name=t.table_name);
2、在cmd窗口(以管理員身份運行),執行如下備份數據庫語句
exp userid=abc/abc@landdata222 file=D:\數據庫備份\abc20170622.dmp log=D:\數據庫備份\abc20170622.log


--二、降低每個表占用的大小
--在plsql命令窗口執行如下語句:
set heading off;
set echo off;
set feedback off;
set termout on;
spool C:\allocate.sql;
select 'ALTER TABLE ' || owner || '.' || table_name || ' MOVE TABLESPACE ' ||
tablespace_name || ' STORAGE(INITIAL 64K NEXT 1M);'
from dba_tables
where owner = 'abc'
and initial_extent > 1048576;
spool off;

--打開上一步的成果文件C:\allocate.sql,在plsql中執行
--由於以上過程雖然減少了表占用的大小,但是對應的索引和表空間大小沒有減少,需要備份數據后重新還原即可解決問題。

三 、再次備份數據庫
--1、備份空表
--在plsql里面執行一下這句話 然后把結果集 再執行一把 再導數據
select 'alter table '||table_name||' allocate extent(size 64k);' from tabs t
where not exists (select segment_name from user_segments s where s.segment_name=t.table_name);

2、在cmd窗口(以管理員身份運行),執行如下備份數據庫語句
exp userid=abc/abc@landdata222 file=D:\數據庫備份\abc20170622jianshao.dmp log=D:\數據庫備份\abc20170622jianshao.log

四、還原第三步備份的數據庫文件
1、在plsql中刪掉用戶abc、對應的表空間abc
a刪除用戶:在abc用戶右鍵刪除

b刪除表空間:右鍵刪除

2、創建新的表空間和用戶
--創建表空間,用sys用戶登錄創建
Create tablespace abc datafile
'C:\Soft\app\lenovo\oradata\landdata222\abc.DBF'size 100m  autoextend on next 100M maxsize 32000M;
(如果提示如下圖,則在對應路徑下先刪除數據文件


---創建用戶,權限包括dba、resource、connect
在plsql——users,右鍵“新建”



3、還原數據庫
在cmd窗口(以管理員身份運行),執行如下還原數據庫語句
imp userid=abc/abc@landdata222 file=D:\數據庫備份\abc20170622jianshao.dmp fromuser=abc touser=abc log=D:\數據庫備份\abc20170622huanyuan.log

(對於特殊自定義命名的主鍵,還原的時候發現還是會有問題,日志報錯,需要刪除索引后重建主鍵。根據日志內容重建即可。)

四、釋放表空間大小
----釋放表空間大小-------
select a.file#,a.name,a.bytes/1024/1024 CurrentMB, ceil(HWM * a.block_size)/1024/1024 ResizeTo, (a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB, 'alter database datafile '''||a.name||''' resize '|| ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD from v$datafile a, (select file_id,max(block_id+blocks-1) HWM
from dba_extents group by file_id) b where a.file# = b.file_id(+) and (a.bytes - HWM *block_size)>0 order by 5
--上述查詢語句最后一個字段的內容復制出來執行一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM