?
雖然是按照用戶的方式導出的,但導入之前,還是必須要有相同的用戶存在,刪除用戶以后,是無法進行導入的
--重新創建回zlm用戶 SQL> create user zlm identified by zlm;
盡管zlm用戶的默認表空間是USERS,但是用imp導入后的表還是會去找原來的表空間進行恢復,即“ZLM”,那么我們把原來的表空間也刪除掉,會怎么樣呢?
--刪除ZLM表空間后測試恢復情況 SQL> drop tablespace zlm including contents;
注意,使用including contents只是把可控制文件中相應的信息刪除,物理上還是存在于OS的磁盤上的,如果要連同文件一起刪除,那么就要使用including contents and datafiles,那么就連渣渣也不剩了
當我們把原來zlm用戶導出時的表空間ZLM刪除以后再倒入,此時會發現imp會把用戶導到數據庫缺省的USERS表空間上去,基于這種原理,當我們做邏輯導入導出的時候,盡量保持源端與目標端有相同的環境,當然還包括字符集(這里沒有做測試)等。否則在導入數據后,可能會產生意外地狀況,比方說源庫的表空間是很大的,但是由于在目標庫中沒有創建相應的表空間,默認放到了USERS表空間中,環境和源庫產生了不同,可能導入的時候就直接報錯了。當然了,字符集更是一個要注意的問題。
exp/imp通常在Oracle 8i/9i等早期的版本中用得較多,到了10g以后基本全面被數據庫泵(Data Pump)取代,即expdp/impdp,雖然說已經是過時的技術,但作為DBA也不能完全不了解,因為和數據泵還是有異曲同工之處的,只是數據泵的功能更強大了。本篇實驗采用了一個最不實用的方法來演示exp/imp的使用方法,即:交互方式,該方式可支配的參數非常少,如,不能指定log,feedback等參數,也不能指定按條件進行導出,且每次使用起來都要一步步確認非常多的步驟,非常繁瑣,不推薦使用,即便要使用,也推薦采用另外兩種方式:1.命令行模式、2.參數文件模式(推薦)。
?
先備份相關表
分為按用戶導與按表導,
按表的話,需要指定表名。
備份內容有:
一個表中所有的數據
一個表的數據與結構
按用戶的話,該用戶下的所在模式對象都導出來了
exp help=y
exp hr/123456
回答幾個問題
帶著問題去學習!!!!到這里所產生的問題
1.exp-00091:exporting questionable statistics.是什么東西
2.用exp導出所有的表如何做。上面的需要事先知道表名,然后一個一個導出。
經baidu查詢,
問題1解決辦法如下:
指定Linux系統的NLS_LANG環境變量為數據庫的字符集
1)查詢數據庫的字符集(方法很多只用一種)
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
2)設置Linux操作系統的NLS_LANG環境變量
[oracle@RH207 exp]$export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
Window系統的環境變量的修改方法是:
C:\>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
這樣再次exp時就不會報EXP-00091: Exporting questionable statistics.錯誤了
?
按用戶導
[oracle@db Downloads]$ expExport: Release 11.2.0.4.0 - Production on Sun Dec 18 12:50:18 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Username: lcpsys Password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Enter array fetch buffer size: 4096 > Export file: expdat.dmp > (1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > Export grants (yes/no): yes > Export table data (yes/no): yes > Compress extents (yes/no): yes > Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
--about to 即將,行將;剛要 About to export specified users ...
--指定要導出的用戶名 User to be exported: (RETURN to quit) > lcpsys --如果沒有其它的用戶名,直接回車退出配置模式,就開始導了。 User to be exported: (RETURN to quit) > --開始了 . exporting pre-schema procedural objects and actions . exporting foreign function library names for user LCPSYS . exporting PUBLIC type synonyms . exporting private type synonyms . exporting object type definitions for user LCPSYS About to export LCPSYS's objects ... . exporting database links . exporting sequence numbers . exporting cluster definitions . about to export LCPSYS's tables via Conventional Path ...
?
?
問題2解決辦法如下:
具體命令參數可以參考
exp help=y
1、EXP:
????? 有三種主要的方式(完全、用戶、表)
????? 1、完全:
????????? EXP SYSTEM/123456 BUFFER=64000 FILE=full.dmp FULL=Y
????????? 如果要執行完全導出,必須具有特殊的權限
????? 2、用戶模式:
????????? EXP hr/123456??? BUFFER=64000 FILE=hr.dmp OWNER=hr
????????? 這樣用戶hr的所有對象被輸出到文件中。
????? 3、表模式:
????????? EXP hr/123456??? BUFFER=64000 FILE=hr-xue.dmp TABLES=xue
????????? 這樣用戶hr的表xue就被導出
2、IMP:
????? 具有三種模式(完全、用戶、表)
????? 1、完全:
????????? IMP SYSTEM/123456 BUFFER=64000 FILE=full.dmp FULL=Y
????? 2、用戶模式:
????????? IMP hr/123456??? BUFFER=64000 FILE=hr.dmp FROMUSER=hr TOUSER=hr
????????? 這樣用戶hr的所有對象被導入到文件中。必須指定FROMUSER、TOUSER參數,這樣才能導入數據。
????? 3、表模式:
????????? IMP hr/123456??? BUFFER=64000 FILE=hr-xue.dmp TABLES=xue
????????? 這樣用戶hr的表xue就被導入。有一個問題是,如果表存在,數據不能導入,只需要在后面加入ignore=y參數就可以了
問題的現象:
EXP-00026: conflicting modes specified
EXP-00000: Export terminated unsuccessfully ?
備份文件會生成 但是沒有內容。
這個問題主要是 exp的時候 里面參數發生了沖突。
?? 比較常見的:
1.同時指定了 owner? 和 tables
2.同時指定了 FULL 和tables
3.同時指定了多個owner和full
owner 表示導出整個用戶或者多個用戶? 而tables表示只導出其中的表 。
要么只導出其中的表? 要么導出整個用戶。不然就會沖突了、
增刪改相關行或表,再用備份的數據進行恢復。
sqlplus hr/123456
set pagesize 200
set linesize 200
create table xue(id integer,name varchar(25));
insert into xue values(1,'wang');
insert into xue values(2,'liu');
commit;
將表刪除
drop table xue;
如果有索引關系的表,用下面
drop table mytest cascade constraints;
留下表結構,刪除一行或所有數據。
delete from regions where region_id=5;
delete from regions
imp hr/123456
回答幾個問題
帶著問題去學習!!!!到這里所產生的問題
1.所要回答的問題有些不清楚,需要細查一下。
2.字符集的問題要處理一下。
經baidu查詢,結果如下:
以上的這種方法算是一種邏輯備份,將數據導入到一個臨時的文件之中。
還可以物理備份的方法,即將oradata/下面的所有數據全部復制到另外一個安全的地方,也叫冷備
還可以熱備的方法。
ORACLE數據庫有兩類備份方法。第一類為物理備份,該方法實現數據庫的完整恢復,但數據庫必須運行在歸擋模式下(業務數據庫在非歸擋模式下運行),且需要極大的外部存儲設備,例如磁帶庫;第二類備份方式為邏輯備份,業務數據庫采用此種方式,此方法不需要數據庫運行在歸擋模式下,不但備份簡單,而且可以不需要外部存儲設備。
數據庫邏輯備份方法
ORACLE數據庫的邏輯備份分為三種模式:表備份、用戶備份和完全備份。
表模式
備份某個用戶模式下指定的對象(表)。業務數據庫通常采用這種備份方式。
若備份到本地文件,使用如下命令:
exp icdmain/icd rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0
file=exp_icdmain_csd_yyyymmdd.dmp
log=exp_icdmain_csd_yyyymmdd.log
tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo
若直接備份到磁帶設備,使用如下命令:
exp icdmain/icd rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0
file=/dev/rmt0
log=exp_icdmain_csd_yyyymmdd.log
tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo
注:在磁盤空間允許的情況下,應先備份到本地服務器,然后再拷貝到磁帶。出于速度方面的考慮,盡量不要直接備份到磁帶設備。
用戶模式
備份某個用戶模式下的所有對象。業務數據庫通常采用這種備份方式。
若備份到本地文件,使用如下命令:
exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0
file=exp_icdmain_yyyymmdd.dmp
log=exp_icdmain_yyyymmdd.log
若直接備份到磁帶設備,使用如下命令:
exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0
file=/dev/rmt0
log=exp_icdmain_yyyymmdd.log
注:如果磁盤有空間,建議備份到磁盤,然后再拷貝到磁帶。如果數據庫數據量較小,可采用這種辦法備份。
??? 完全模式
1、 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
? 2、 將數據庫中system用戶與sys用戶的表導出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3、 將數據庫中的表table1 、table2導出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4、 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
上面是常用的導出,對于壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。不過在上面命令后面 加上 compress=y 就可以了
刪除某用戶下的所有對象
Oracle刪除用戶下所有對象的方法未必人人都會,下面就為您介紹兩種常用的Oracle刪除用戶下所有對象的方法,希望對您學習Oracle刪除用戶方面能有所幫助。
方法1:
drop user hr cascade;
?? ?要退出所有的hr用戶連接,才能正確執行。
drop tablespace USERS INCLUDING CONTENTS;
?? ?不能刪除默認永久表空間。
create user hr profile default identified by 123456 default tablespace USERS temporary tablespace TEMP account unlock;
--授權
grant dba to hr;
grant connect,resource to hr;
方法2:
寫存儲過程實現
DECLARE
TYPE name_list IS TABLE OF VARCHAR2(40);
TYPE type_list IS TABLE OF VARCHAR2(20);
Tab_name name_list:=name_list();
Tab_type type_list:=type_list();
sql_str VARCHAR2(500);
BEGIN
sql_str := 'select uo.object_name,uo.object_type from user_objects uo where uo.object_type not in(''INDEX'',''LOB'') order by uo.object_type desc';
EXECUTE IMMEDIATE sql_str BULK COLLECT INTO tab_name,tab_type;
FOR i IN Tab_name.FIRST.. Tab_name.LAST LOOP
sql_str := 'DROP ' || Tab_type(i) || ' ' || Tab_name(i);
EXECUTE IMMEDIATE sql_str;
END LOOP;
END;
sqlplus hr/123456
drop table jobs cascade constraints;?? ?這樣直接刪除可能會有問題。所以盡量用下面的步驟解決,因為看了以后,沒有明白后續步驟。
drop table jobs
ORA-02449: unique/primary keys in table referenced by foreign keys
報錯,用下面的方法解決
1.檢查哪些表的外鍵引用了要刪除的表的唯一/主鍵.
select A.*
from user_constraints A, user_constraints B
where b.table_name = 'MYTEST'
and a.constraint_type = 'R'
and a.r_constraint_name = b.constraint_name;
2.生成所有引用要刪除表的外鍵的創建語句.
????? select 'select dbms_metadata.get_ddl(''REF_CONSTRAINT'',''' ||
????????? A.CONSTRAINT_NAME || ''') FROM DUAL;'
?????? from user_constraints A, user_constraints B
?????? WHERE b.table_name = 'JOBS'
??????? and a.constraint_type = 'R'
??????? and a.r_constraint_name = b.constraint_name;
select 'drop table '|| table_name ||' cascade constraints' sql1 from user_tables;
??? ?
3.執行步驟2中產生的SQL語句,獲取外鍵定義.
????? set long 3000
????? set linesize 3000
????? set pagesize 300
????? 執行步驟2產生的語句.
4.刪除表.
????? drop table mytest cascade constraints;
5.刪除并重建表.
6.建立因創建該表所刪除的外鍵約束.
????? 執行步驟3中獲取到的sql語句.
7.檢查各外鍵是否得到恢復,系統是否正常.
?
?
drop table emp purge;
purge recyclebin;
commit,事務與刪除表沒有關系,可以不用敲。
exp
沒有數據的表是不導出的。
在實際的備份操作中,exp與imp用不了,因為在其導出的過程中,必須保證其他用戶不更新數據。
數據庫的冷備份,嚴格稱為歸檔備份。指的是數據庫要關閉服務,所有的事務都需要提交。
備份如下內容:oradata/目錄下的內容
1.控制文件:通過v$controlfile數據字典找到
2.重做日志文件:通過v$logfile數據字典找到
3.數據文件:通過v$datafile數據字典找到
4.參數文件: 通過show parameter pfile找到
5.記錄好相關文件的路徑
6.關閉oracle服務,但是這個關有個問題,比如超市說關門,不是立馬就關的,有時能關一個小時,在關閉其間還有少量的io.
?? ?shutdown immediate
7.復制出所有的相關文件
8.重新啟動oracle服務,多種方式
?? ?startup或者將計算機關機一下,再開機,再startup
?