一、導出數據庫
exp 用戶名/密碼@數據庫實例地址:端口/實例名 file=導出dmp文件路徑 rows=y owner=(導出用戶列表)
例如:
exp system/admin@ZSKYDZXYY file=f:\dbfile\db.dmp rows=y owner=(user1,user2,user3)
ps:@ZSKYDZXYY 爲Oracle Net Manager中配置的數據庫地址,等同於 ip:端口/實例名
二、導入數據庫
imp 用戶名/密碼@數據庫實例地址:端口/實例名 file=dmp文件存放路徑 full=y
例如:
imp system/admin@ORCLYDYY file=F:\dbfile\db.dmp full = y
PS:
- 爲待導入的數據庫實例建立表空間、對應的用戶
- 使用imp語句導入dmp文件
導入後,可以使用select count(*)from user_tables;
檢查導入的表數量(含空表)。
三、導入/導出,注意事項
查看當前實例下,表空間相關信息。(可選)
ps:可以使用system直接登錄,避免各種權限等問題。
desc dba_tablespaces;
select t.tablespace_name from dba_tablespaces t;
查看用戶信息(可選)
desc dba_users;
select username,account_status from dba_users;
四、空表導出問題
oracle 11g中,默認對空表不分配segment,因此會導致直接導出空表時報錯
- 解決方案1(不推薦,表太多時不方便)
向表中插入一條記錄,然後rollback,就會產生segment,就可繼續導出 - 解決方案2(使用空表腳本)
腳本如下:
//顯示segment參數
show parameter deferred_segment_creation
//修改參數爲false,即在空表狀態下也創建segment
alter system set deferred_segment_creation=false
//查看當前用戶下空表數量
select table_name from user_tables where NUM_ROWS=0;
//形成alter語句
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
手動執行以上語句,便可使用exp語句導出空表
- 執行exp腳本
五、exp/imp參數
imp help=y 即可查看,網上也有其他人詳細做了介紹,本文不再贅述。
六、自動導出(備份)腳本
以Windows服務器爲例,可以使用以下腳本,結合Windows的計劃任務完成數據庫定時備份工作。(排除了使用oracle的自動備份策略,可以通過腳本,完成特定表、特定表空間、等的細粒度備份)
@echo off
echo ================================================
echo Oracle DB
echo ================================================
::以“YYYYMMDD”格式取出當前時間。
::設置導出的路徑
set bakDirectory=D:\dpdump\bak
del %bakDirectory%\*.dmp
set BACKUP_DIR=D:\dpdump
copy %BACKUP_DIR%\*.dmp %bakDirectory%\
del %BACKUP_DIR%\*.dmp
set BACK_NAME=%date:~0,4%%date:~5,2%%date:~8,2%
set BACK_FULL_NAME=%BACKUP_DIR%\kyeedb%BACK_NAME%
exp system/admin@ZSKYDZXYY file=%BACK_FULL_NAME%.dmp grants=n rows=y owner=(user1,user2,user3)
exit
腳本含義: 定時從數據庫服務器備份,備份至 D:\dpdump\bak
目錄。其中,bak
子文件夾爲上上一次
的備份。每次將bak
子文件夾中的備份刪掉,如2019.12.21日
舊備份文件,再將外部父目錄2019.12.22日
的備份拷貝至其中,再刪除外部的備份,最後將2019.12.23日
的新備份文件寫入。形成間隔一天
的冗餘備份。
exp、imp命令的詳細參數網上有詳細介紹,本文不再贅述。如非特殊exp腳本,可使用full=y,rows=y等基本參數即可。