oracle數據備份還原 ,及oracle 11g備份出現空表解決方案



【數據庫部分】

1、連接登陸數據庫
sqlplus system/elpdb_1Pwd@wizbank


2、如果lms用戶及表空間已經存在則使用以下命令刪除lms用戶和表空間:

drop user lms cascade;
drop tablespace LMS including contents;
drop tablespace LMS_IND including contents;


3、重新使用以下命令來創建lms用戶和表空間:

CREATE TABLESPACE  LMS
 DATAFILE 'D:\app\jimmy\oradata\yitai\LMS.DBF' SIZE 5120M reuse autoextend on next 10m
 DEFAULT STORAGE (
  INITIAL 2000K
  NEXT 2000K
  MINEXTENTS 1
  MAXEXTENTS unlimited
  PCTINCREASE 0)
 ONLINE;


CREATE TABLESPACE  LMS_IND
 DATAFILE 'D:\app\jimmy\oradata\yitai\LMS_IND.DBF' SIZE 500M reuse autoextend  on next 10m
 DEFAULT STORAGE (
  INITIAL 200K
  NEXT 200K
  MINEXTENTS 1
  MAXEXTENTS unlimited
  PCTINCREASE 0)
 ONLINE;


4、創建lms賬號及oracle密碼

CREATE USER LMS IDENTIFIED BY oracle
DEFAULT TABLESPACE LMS
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON LMS;


5、賦予lms賬號權限

GRANT connect,resource TO LMS;

grant dba to lms;



6、oracle 11g  設置其值爲false  對其以後導入的表,無論其表爲空表還是非空表  都分配segment
alter system set deferred_segment_creation=false scope=both;


7、密碼無限期
ALTER  PROFILE  DEFAULT  LIMIT  PASSWORD_LIFE_TIME  UNLIMITED;


8、執行quit命令退出。


還原數據庫語句

imp system/oracle@yitaigroup fromuser=lms touser=lms  file=E:\datebase_bak\yitai1020\yitai1020.dmp log=E:\datebase_bak\yitai1020\yitai1020.log 


imp system/oracle@yitaigroup fromuser=lms touser=lms full=y ignore=y  file=D:\yitai1020\yitai1020.dmp log=D:\yitai1020\yitai1020.log 


 

備份數據庫語句

exp lms/oracle@yitaigroup file=D:\yitai1020\yitai1025.dmp owner=lms log=D:\yitai1020\yitai1025.log statistics=none  


exp lms/[email protected]:1521:gedibbyh file=E:\gedibak\gedi1121.dmp owner=lms log=E:\gedibak\gedi1121.log statistics=none  


查詢表空間大小


  SELECT UPPER(F.TABLESPACE_NAME) "表空間名",
  D.TOT_GROOTTE_MB "表空間大小(M)",
  D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
  F.TOTAL_BYTES "空閒空間(M)",
  F.MAX_BYTES "最大塊(M)"
  FROM (SELECT TABLESPACE_NAME,
  ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
  ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
  FROM SYS.DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME) F,
  (SELECT DD.TABLESPACE_NAME,
   ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
  FROM SYS.DBA_DATA_FILES DD
  GROUP BY DD.TABLESPACE_NAME) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 1; 

=================================================

oracle11g的新特性,數據條數是0時不分配segment,所以就不能被導出。
 
解決方法:
 
1插入一條數據(或者再刪除),浪費時間,有時幾百張表會累死的。
2創建數據庫之前
使用代碼:

Sql代碼
alter system set  deferred_segment_creation=false;
 
調整再建表
這兩種方都不好
下面是終極方法:
 
先查詢一下哪些表是空的:

Sql代碼
select table_name from user_tables where NUM_ROWS=0;
 
 
下面我們通過select 來生成修改語句:
Sql代碼
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
 
然後就在結果窗口裏面生成了下面那些東西:
 
Sql代碼
alter table E2USER_STATE allocate extent;
alter table ENTERPRISE_E2USER allocate extent;
alter table ENTERPRISE_INFO_TYPE allocate extent;
alter table ENTERPRISE_MAPMARK allocate extent;
alter table ENTERPRISE_NEEDTASK allocate extent;
alter table ENTERPRISE_PICTURE allocate extent;
alter table ENTERPRISE_REPORT allocate extent;
alter table ENTERPRISE_REPORT_TYPE allocate extent;
alter table ENTERPRISE_TEAM allocate extent;
alter table FROMUSER_ADJUNCT_TARGET allocate extent;
alter table FROMUSER_OFFER allocate extent;
alter table CALENDAR_TYPE allocate extent;
 
 
 
ok 執行上面那些sql,之後再exp吧,那就是見證奇蹟的深刻。


建議:
以後新建數據庫,最好設置deferred_segment_creation 參數
設置deferred_segment_creation 參數
該參數值默認是TRUE,當改爲FALSE時,無論是空表還是非空表,都分配segment。修改SQL語句:
alter system set deferred_segment_creation=false scope=both;

  需注意的是:該值設置後對以前導入的空表不產生作用,仍不能導出,只能對後面新增的表產生作用。如需導出之前的空表,只能用第一種方法。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章