oracle-备份工具exp-imp
?
雖然是按照用戶的方式導(dǎo)出的,但導(dǎo)入之前,還是必須要有相同的用戶存在,刪除用戶以后,是無法進(jìn)行導(dǎo)入的
--重新創(chuàng)建回zlm用戶 SQL> create user zlm identified by zlm;
盡管zlm用戶的默認(rèn)表空間是USERS,但是用imp導(dǎo)入后的表還是會去找原來的表空間進(jìn)行恢復(fù),即“ZLM”,那么我們把原來的表空間也刪除掉,會怎么樣呢?
--刪除ZLM表空間后測試恢復(fù)情況 SQL> drop tablespace zlm including contents;
注意,使用including contents只是把可控制文件中相應(yīng)的信息刪除,物理上還是存在于OS的磁盤上的,如果要連同文件一起刪除,那么就要使用including contents and datafiles,那么就連渣渣也不剩了
當(dāng)我們把原來zlm用戶導(dǎo)出時的表空間ZLM刪除以后再倒入,此時會發(fā)現(xiàn)imp會把用戶導(dǎo)到數(shù)據(jù)庫缺省的USERS表空間上去,基于這種原理,當(dāng)我們做邏輯導(dǎo)入導(dǎo)出的時候,盡量保持源端與目標(biāo)端有相同的環(huán)境,當(dāng)然還包括字符集(這里沒有做測試)等。否則在導(dǎo)入數(shù)據(jù)后,可能會產(chǎn)生意外地狀況,比方說源庫的表空間是很大的,但是由于在目標(biāo)庫中沒有創(chuàng)建相應(yīng)的表空間,默認(rèn)放到了USERS表空間中,環(huán)境和源庫產(chǎn)生了不同,可能導(dǎo)入的時候就直接報錯了。當(dāng)然了,字符集更是一個要注意的問題。
exp/imp通常在Oracle 8i/9i等早期的版本中用得較多,到了10g以后基本全面被數(shù)據(jù)庫泵(Data Pump)取代,即expdp/impdp,雖然說已經(jīng)是過時的技術(shù),但作為DBA也不能完全不了解,因為和數(shù)據(jù)泵還是有異曲同工之處的,只是數(shù)據(jù)泵的功能更強大了。本篇實驗采用了一個最不實用的方法來演示exp/imp的使用方法,即:交互方式,該方式可支配的參數(shù)非常少,如,不能指定log,feedback等參數(shù),也不能指定按條件進(jìn)行導(dǎo)出,且每次使用起來都要一步步確認(rèn)非常多的步驟,非常繁瑣,不推薦使用,即便要使用,也推薦采用另外兩種方式:1.命令行模式、2.參數(shù)文件模式(推薦)。
?
先備份相關(guān)表
分為按用戶導(dǎo)與按表導(dǎo),
按表的話,需要指定表名。
備份內(nèi)容有:
一個表中所有的數(shù)據(jù)
一個表的數(shù)據(jù)與結(jié)構(gòu)
按用戶的話,該用戶下的所在模式對象都導(dǎo)出來了
exp help=y
exp hr/123456
回答幾個問題
帶著問題去學(xué)習(xí)!!!!到這里所產(chǎn)生的問題
1.exp-00091:exporting questionable statistics.是什么東西
2.用exp導(dǎo)出所有的表如何做。上面的需要事先知道表名,然后一個一個導(dǎo)出。
經(jīng)baidu查詢,
問題1解決辦法如下:
指定Linux系統(tǒng)的NLS_LANG環(huán)境變量為數(shù)據(jù)庫的字符集
1)查詢數(shù)據(jù)庫的字符集(方法很多只用一種)
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
2)設(shè)置Linux操作系統(tǒng)的NLS_LANG環(huán)境變量
[oracle@RH207 exp]$export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
Window系統(tǒng)的環(huán)境變量的修改方法是:
C:\>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
這樣再次exp時就不會報EXP-00091: Exporting questionable statistics.錯誤了
?
按用戶導(dǎo)
[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 ...
--指定要導(dǎo)出的用戶名 User to be exported: (RETURN to quit) > lcpsys --如果沒有其它的用戶名,直接回車退出配置模式,就開始導(dǎo)了。 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解決辦法如下:
具體命令參數(shù)可以參考
exp help=y
1、EXP:
????? 有三種主要的方式(完全、用戶、表)
????? 1、完全:
????????? EXP SYSTEM/123456 BUFFER=64000 FILE=full.dmp FULL=Y
????????? 如果要執(zhí)行完全導(dǎo)出,必須具有特殊的權(quán)限
????? 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就被導(dǎo)出
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的所有對象被導(dǎo)入到文件中。必須指定FROMUSER、TOUSER參數(shù),這樣才能導(dǎo)入數(shù)據(jù)。
????? 3、表模式:
????????? IMP hr/123456??? BUFFER=64000 FILE=hr-xue.dmp TABLES=xue
????????? 這樣用戶hr的表xue就被導(dǎo)入。有一個問題是,如果表存在,數(shù)據(jù)不能導(dǎo)入,只需要在后面加入ignore=y參數(shù)就可以了
問題的現(xiàn)象:
EXP-00026: conflicting modes specified
EXP-00000: Export terminated unsuccessfully ?
備份文件會生成 但是沒有內(nèi)容。
這個問題主要是 exp的時候 里面參數(shù)發(fā)生了沖突。
?? 比較常見的:
1.同時指定了 owner? 和 tables
2.同時指定了 FULL 和tables
3.同時指定了多個owner和full
owner 表示導(dǎo)出整個用戶或者多個用戶? 而tables表示只導(dǎo)出其中的表 。
要么只導(dǎo)出其中的表? 要么導(dǎo)出整個用戶。不然就會沖突了、
增刪改相關(guān)行或表,再用備份的數(shù)據(jù)進(jìn)行恢復(fù)。
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;
如果有索引關(guān)系的表,用下面
drop table mytest cascade constraints;
留下表結(jié)構(gòu),刪除一行或所有數(shù)據(jù)。
delete from regions where region_id=5;
delete from regions
imp hr/123456
回答幾個問題
帶著問題去學(xué)習(xí)!!!!到這里所產(chǎn)生的問題
1.所要回答的問題有些不清楚,需要細(xì)查一下。
2.字符集的問題要處理一下。
經(jīng)baidu查詢,結(jié)果如下:
以上的這種方法算是一種邏輯備份,將數(shù)據(jù)導(dǎo)入到一個臨時的文件之中。
還可以物理備份的方法,即將oradata/下面的所有數(shù)據(jù)全部復(fù)制到另外一個安全的地方,也叫冷備
還可以熱備的方法。
ORACLE數(shù)據(jù)庫有兩類備份方法。第一類為物理備份,該方法實現(xiàn)數(shù)據(jù)庫的完整恢復(fù),但數(shù)據(jù)庫必須運行在歸擋模式下(業(yè)務(wù)數(shù)據(jù)庫在非歸擋模式下運行),且需要極大的外部存儲設(shè)備,例如磁帶庫;第二類備份方式為邏輯備份,業(yè)務(wù)數(shù)據(jù)庫采用此種方式,此方法不需要數(shù)據(jù)庫運行在歸擋模式下,不但備份簡單,而且可以不需要外部存儲設(shè)備。
數(shù)據(jù)庫邏輯備份方法
ORACLE數(shù)據(jù)庫的邏輯備份分為三種模式:表備份、用戶備份和完全備份。
表模式
備份某個用戶模式下指定的對象(表)。業(yè)務(wù)數(shù)據(jù)庫通常采用這種備份方式。
若備份到本地文件,使用如下命令:
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
若直接備份到磁帶設(shè)備,使用如下命令:
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
注:在磁盤空間允許的情況下,應(yīng)先備份到本地服務(wù)器,然后再拷貝到磁帶。出于速度方面的考慮,盡量不要直接備份到磁帶設(shè)備。
用戶模式
備份某個用戶模式下的所有對象。業(yè)務(wù)數(shù)據(jù)庫通常采用這種備份方式。
若備份到本地文件,使用如下命令:
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
若直接備份到磁帶設(shè)備,使用如下命令:
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
注:如果磁盤有空間,建議備份到磁盤,然后再拷貝到磁帶。如果數(shù)據(jù)庫數(shù)據(jù)量較小,可采用這種辦法備份。
??? 完全模式
1、 將數(shù)據(jù)庫TEST完全導(dǎo)出,用戶名system 密碼manager 導(dǎo)出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
? 2、 將數(shù)據(jù)庫中system用戶與sys用戶的表導(dǎo)出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3、 將數(shù)據(jù)庫中的表table1 、table2導(dǎo)出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4、 將數(shù)據(jù)庫中的表table1中的字段filed1以"00"打頭的數(shù)據(jù)導(dǎo)出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
上面是常用的導(dǎo)出,對于壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。不過在上面命令后面 加上 compress=y 就可以了
刪除某用戶下的所有對象
Oracle刪除用戶下所有對象的方法未必人人都會,下面就為您介紹兩種常用的Oracle刪除用戶下所有對象的方法,希望對您學(xué)習(xí)Oracle刪除用戶方面能有所幫助。
方法1:
drop user hr cascade;
?? ?要退出所有的hr用戶連接,才能正確執(zhí)行。
drop tablespace USERS INCLUDING CONTENTS;
?? ?不能刪除默認(rèn)永久表空間。
create user hr profile default identified by 123456 default tablespace USERS temporary tablespace TEMP account unlock;
--授權(quán)
grant dba to hr;
grant connect,resource to hr;
方法2:
寫存儲過程實現(xiàn)
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;?? ?這樣直接刪除可能會有問題。所以盡量用下面的步驟解決,因為看了以后,沒有明白后續(xù)步驟。
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.生成所有引用要刪除表的外鍵的創(chuàng)建語句.
????? 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.執(zhí)行步驟2中產(chǎn)生的SQL語句,獲取外鍵定義.
????? set long 3000
????? set linesize 3000
????? set pagesize 300
????? 執(zhí)行步驟2產(chǎn)生的語句.
4.刪除表.
????? drop table mytest cascade constraints;
5.刪除并重建表.
6.建立因創(chuàng)建該表所刪除的外鍵約束.
????? 執(zhí)行步驟3中獲取到的sql語句.
7.檢查各外鍵是否得到恢復(fù),系統(tǒng)是否正常.
?
?
drop table emp purge;
purge recyclebin;
commit,事務(wù)與刪除表沒有關(guān)系,可以不用敲。
exp
沒有數(shù)據(jù)的表是不導(dǎo)出的。
在實際的備份操作中,exp與imp用不了,因為在其導(dǎo)出的過程中,必須保證其他用戶不更新數(shù)據(jù)。
數(shù)據(jù)庫的冷備份,嚴(yán)格稱為歸檔備份。指的是數(shù)據(jù)庫要關(guān)閉服務(wù),所有的事務(wù)都需要提交。
備份如下內(nèi)容:oradata/目錄下的內(nèi)容
1.控制文件:通過v$controlfile數(shù)據(jù)字典找到
2.重做日志文件:通過v$logfile數(shù)據(jù)字典找到
3.數(shù)據(jù)文件:通過v$datafile數(shù)據(jù)字典找到
4.參數(shù)文件: 通過show parameter pfile找到
5.記錄好相關(guān)文件的路徑
6.關(guān)閉oracle服務(wù),但是這個關(guān)有個問題,比如超市說關(guān)門,不是立馬就關(guān)的,有時能關(guān)一個小時,在關(guān)閉其間還有少量的io.
?? ?shutdown immediate
7.復(fù)制出所有的相關(guān)文件
8.重新啟動oracle服務(wù),多種方式
?? ?startup或者將計算機關(guān)機一下,再開機,再startup
?
總結(jié)
以上是生活随笔為你收集整理的oracle-备份工具exp-imp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASCLL码对照表02(可显示字符)
- 下一篇: [Leetcode][第17题][JAV