-----親測有效-------
--一、備份原始數據庫庫
--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
--上述查詢語句最后一個字段的內容復制出來執行一次