1. 程式人生 > >數據庫導入導出expdp,impdp

數據庫導入導出expdp,impdp

語句 版本 principal 相關 地址 wait fighting ace bject

數據庫操作

(1)數據庫導入導出expdp,impdp

在導入導出數據庫的時候,經常會用到exp和imp,在數據量小的情況下可以隨意使用,但是當數據量大,表中數據有百萬,千萬條的時候,就要等好久好久好久。。
oracle官方肯定也考慮到了這樣的問題,於是出現了expdp和impdp,這是oracle 10g版本出的一個新功能,使用數據泵導入導出數據,據官方推薦說使用數據泵導入導出會比普通的導入導出快十倍,可以說是非常強大了。
首先連接到數據庫,使用cmd執行以下命令

sqlplus /nolog
conn / as sysdba

數據庫泵的步驟(以下是在數據庫所在的電腦上操作)

導出數據
  • (a)創建DIRECTORY

    即在數據庫所在電腦上創建一個文件夾,用來存放導出的dmp文件
create directory expdp_dmp as 'F:/dmpfile'
  • (b)授權
    給當前數據庫用戶賦予讀寫文件的權限
grant read,write on directory expdp_dmp to salespa;

查看權限

SELECT privilege, directory_name, DIRECTORY_PATH FROM user_tab_privs t, all_directories d
?WHERE t.table_name(+) = d.directory_name ORDER BY 2, 1;
  • (c)執行導出
expdp SALESPA/SALESPA@SALESPA  directory=expdp_dmp dumpfile=salespa.dmp
導入數據
impdp E43001/E43001 directory=expdp_dmp dumpfile=salespa.dmp remap_schema=salespa:E43001  transform=OID:N

REMAP_SCHEMA 該參數的含義是將一個用戶的的數據遷移到另外一個用戶,如上從salespa用戶遷移到 E43001用戶上。
transform 在導入數據的時候,之前的數據庫中可能存在type,把一個Object從一個schema導入到另外一個schema的時候(在同一個數據庫上),如果這個OID也保持不變的話,那麽就會出現多個Object共享同一個object id的問題,會出現invalid object identifier。

設置transform 參數為OID:N,意思是新創建的表或這個類型會賦予新的OID,而不是dmp文件中包含的OID的值。

參考博客地址:
數據庫導入導出exp和expdp以及imp和impdp的區別
ORACLE EXPDP命令使用詳細
ORA-02304: ORACLE導入TYPE

(2)cmd執行sql文件

往數據庫中插入數據量較大時,例如幾萬,十幾萬條的時候,使用PLSQL工具的時候就會卡死。這裏就要在命令行中執行sql語句。

//1.首先連接到要連的數據庫
sqlplus scott/scott@orcl
//2.@+“sql文件放置的路徑”
SQL> @C:\people.sql

(3)查看Oracle數據庫表空間的使用率

SELECT C.TABLESPACE_NAME,
       A.BYTES / 1048576 MEGS_TOTAL,
       (A.BYTES - B.BYTES) / 1048576 MEGS_USED,
       B.BYTES / 1048576 MEGS_FREE,
       (A.BYTES - B.BYTES) / A.BYTES * 100 PCT_USED,
       B.BYTES / A.BYTES * 100 PCT_FREE
  FROM (SELECT TABLESPACE_NAME,
               SUM(A.BYTES) BYTES,
               MIN(A.BYTES) MINBYTES,
               MAX(A.BYTES) MAXBYTES
          FROM SYS.DBA_DATA_FILES A
         GROUP BY TABLESPACE_NAME) A,
       (SELECT A.TABLESPACE_NAME, NVL(SUM(B.BYTES), 0) BYTES
          FROM SYS.DBA_DATA_FILES A, SYS.DBA_FREE_SPACE B
         WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
           AND A.FILE_ID = B.FILE_ID(+)
         GROUP BY A.TABLESPACE_NAME) B,
       SYS.DBA_TABLESPACES C
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
   AND A.TABLESPACE_NAME = C.TABLESPACE_NAME
 ORDER BY 6;

查看所有表空間大小

select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;

手動修改表空間的大小

查看表空間的目錄
select * from dba_data_file
更改表空間的大小為30G
alter database datafile 'E:\APP\LABOGUEST\SALESPA\SALESPA_INDEX.DBF' resize 30720

(4)ORA-24247: 網絡訪問被訪問控制列表 (ACL) 拒絕

  • 創建訪問控制列表
BEGIN
 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
  acl          => 'email_server.xml',  --這裏為任意的文件名,用於刪除時標識
  description  => 'ACL for 123.125.50.112',
  principal    => 'PRODUCE', --此為將來要進行操作的用戶
  is_grant     => TRUE, 
  privilege    => 'connect');
END;
  • 將用戶或角色添加到訪問控制列表中
BEGIN
 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
  acl          => 'email_server.xml',  --和創建訪問控制列表中的acl名相同
  principal    => 'PRODUCE', --要添加的用戶
  is_grant     => TRUE, 
  privilege    => 'resolve');
END;
  • 給網絡分配訪問控制列表(ACL與郵件服務器相關聯)
BEGIN
 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
  acl          => 'email_server.xml',  --和創建訪問控制列表中的acl名相同
  host         => '123.125.50.112', --主機名,域名,ip地址或分配的子網
  lower_port   => '25',
  upper_port   => NULL);
END;
  • 查詢創建的ACL
SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
SELECT acl,
       principal,
       privilege,
       is_grant,
       TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
       TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
  FROM dba_network_acl_privileges;
  • 刪除ACL
BEGIN
  DBMS_NETWORK_ACL_ADMIN.drop_acl(acl => 'email_server.xml');
COMMIT;
END;

(5)解鎖被鎖的表

在調試程序的時候,有時debug忘記點結束,又去數據庫中操作表,很有可能會造成鎖表,無法對該表進行操作。以下是查看被鎖的表和解鎖表的語句。

select a.object_name,b.session_id,c.serial#,c.username,c.command,c.machine,c.lockwait
from all_objects a,v$locked_object b,v$session c where a.object_id=b.object_id and c.sid=b.session_id;

alter system kill session'SID,serial# ';

數據庫導入導出expdp,impdp