Oracle12c資料庫連結匯出與刪除(DatabaseLink)
前陣子在漏洞掃描後,有些暫時不再使用的資料庫連結Database Link需要刪除。出於萬一後續需要再用的情況考慮,於是乎先備份這些Database Link。首先讓我想到的是直接生成DDL就行。事實上這DDL並不包含連結使用者的密碼。此路不通,所以就只能考慮用expdp工具來進行備份了。其次由於有些資料庫使用者的密碼未知,因此這些使用者建立的資料庫連結在sys賬號下無法刪除。下文則是這些個問題的描述與解決。
一、環境準備
12c中包含了2個pdb資料庫,分別是cdb1pdb1, cdb1pdb2
其中在cdb1pdb1上有一個db link指向了cdb1pdb2
--演示環境
SQL> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
--在cdb1pdb2上建立使用者,使用者配置從cdb1pdb1訪問
SQL> alter session set container=cdb1pdb2;
SQL> create user robin identified by xxx;
SQL> grant dba,connect,resource to robin;
$ sqlplus robin/xxx@cdb1pdb2
SQL> create table blog(ename varchar2(20),addr varchar2(60));
SQL> insert into blog values(`leshami`,`http://blog.csdn.net/leshami`);
SQL> commit;
--連線到cdb1pdb1,此時我們使用了hr賬號,密碼已知。
--真實的環境類似使用者密碼我們是未知的,此處演示。
$ sqlplus hr/hr@cdb1pdb1
SQL> show user;
USER is "HR"
--建立到cdb1pdb2的資料庫連結
SQL> create database link to_cdb1pdb2 connect to robin identified by xxx using `CDB1PDB2`;
SQL> select * from blog@to_cdb1pdb2;
ENAME ADDR
-------------------- ------------------------------------------------------------
leshami http://blog.csdn.net/leshami
二、備份資料庫連結(提取DDL,以及匯出DB Link)
通過get_ddl方式匯出DB Link
$ sqlplus / as sysdba
SQL> select db_link,username from cdb_db_links where owner=`HR`;
DB_LINK USERNAME
------------------------------ ----------------------------------------
TO_CDB1PDB2.YDQ05.COM ROBIN
SQL> alter session set container=cdb1pdb1;
SQL> alter session set current_schema=hr;
--通過get_ddl函式提取DDL,如下,我們看到密碼部分為一個繫結變數
--很顯然,這個沒有起到絕對備份的作用
SQL> set long 5000
SQL> select dbms_metadata.get_ddl(`DB_LINK`,`TO_CDB1PDB2.YDQ05.COM`,`HR`) FROM DUAL;
DBMS_METADATA.GET_DDL(`DB_LINK`,`TO_CDB1PDB2.YDQ05.COM`,`HR`)
--------------------------------------------------------------------------------
CREATE DATABASE LINK "TO_CDB1PDB2.YDQ05.COM"
CONNECT TO "ROBIN" IDENTIFIED BY VALUES `:1`
USING `CDB1PDB2`
通過expdp方式匯出DB Link
$ vi prfile.par
directory=DATA_PUMP_DIR
dumpfile=hrdblink.dmp
logfile=exp_dblink.log
schemas=hr
INCLUDE=DB_LINK:"LIKE `TO_CDB1PDB2.YDQ05.COM`"
$ expdp parfile=prfile.par
Export: Release 12.2.0.1.0 - Production on Tue Mar 27 17:38:11 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Username: sys@cdb1pdb1 as sysdba
Password:
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYS"."SYS_EXPORT_SCHEMA_01": sys/********@cdb1pdb1 AS SYSDBA parfile=prfile.par
Processing object type SCHEMA_EXPORT/DB_LINK
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
/app/oracle/ora12c/admin/cdb1/dpdump/50DDF77203BA2CCBE053F401A8C03639/hrdblink.dmp
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Mar 27 17:38:29 2018 elapsed 0 00:00:07
三、刪除資料庫連結(DB Link)
--此處模擬我們不知道建立資料庫連結的使用者名稱和密碼,所以用sys登陸
SQL> show user;
USER is "SYS"
SQL> show con_name;
CON_NAME
------------------------------
CDB1PDB1
SQL> alter session set current_schema=hr;
--以下操作均無法刪除DB Link,即使帶上owner也不行
SQL> drop database link to_cdb1pdb2;
drop database link to_cdb1pdb2
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> drop database link TO_CDB1PDB2.YDQ05.COM;
drop database link TO_CDB1PDB2.YDQ05.COM
*
ERROR at line 1:
ORA-01031: insufficient privileges
--下面通過一個專用的儲存過程來搞定
--關於這個使用sys刪除其他使用者下的dblink,感謝steve.tang支援提供了個參考連結
SQL> exec DROP_DBLINK(`HR`,`TO_CDB1PDB2.YDQ05.COM`);
PL/SQL procedure successfully completed.
SQL> select db_link,username from cdb_db_links where owner=`HR`;
no rows selected
四、恢復資料庫連結(DB Link)
$ impdp directory=DATA_PUMP_DIR dumpfile=hrdblink.dmp full=y
Import: Release 12.2.0.1.0 - Production on Wed Mar 28 09:15:11 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Username: sys@cdb1pdb1 as sysdba
Password:
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_FULL_01": sys/********@cdb1pdb1 AS SYSDBA directory=DATA_PUMP_DIR dumpfile=hrdblink.dmp full=y
Processing object type SCHEMA_EXPORT/DB_LINK
Job "SYS"."SYS_IMPORT_FULL_01" successfully completed at Wed Mar 28 09:15:27 2018 elapsed 0 00:00:03
SQL> conn hr/hr@cdb1pdb1
SQL> select * from blog@to_cdb1pdb2;
ENAME ADDR
-------------------- ------------------------------------------------------------
leshami http://blog.csdn.net/leshami
五、參考連結
刪除資料庫連結 http://www.oracle-ckpt.com/drop-db_links-of-a-private-user-from-sys/
expdp impdp中 exclude/include 的使用
相關文章
- DB2資料庫匯出表結構與匯入、匯出表資料DB2資料庫
- 資料結構之單連結串列的建立與刪除資料結構
- Mysql 資料庫匯入與匯出MySql資料庫
- [MYSQL] 資料庫建立與刪除MySql資料庫
- 資料結構:單迴圈連結串列的建立插入與刪除資料結構
- MongoDB資料庫中更新與刪除資料MongoDB資料庫
- Power Designer 連線SqlServer 資料庫 匯出表結構SQLServer資料庫
- PostgreSQL:資料庫的建立與刪除SQL資料庫
- xml與資料庫中資料的匯入匯出XML資料庫
- FlashBack總結之閃回資料庫與閃回刪除資料庫
- Oracle 資料庫備份與恢復總結-exp/imp (匯出與匯入裝庫與卸庫)Oracle資料庫
- Oracle12c中資料刪除(delete)新特性之資料庫內歸檔功能Oracledelete資料庫
- 資料庫 - 索引、基本表建立與刪除資料庫索引
- Oracle匯出資料庫與還原Oracle資料庫
- indexedDB 刪除資料庫Index資料庫
- 軟連結刪除
- 刪除當前資料庫連線使用者資料庫
- 【RAC】刪除RAC資料庫節點(一)——刪除資料庫例項資料庫
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- MySQL資料庫結構和資料的匯出和匯入 (轉)MySql資料庫
- 已為資料庫映象啟動資料庫,必須刪除資料庫映象才能刪除該資料庫資料庫
- 資料庫的匯入匯出資料庫
- mysql 資料庫匯入匯出MySql資料庫
- MySQL資料庫匯入匯出MySql資料庫
- OracleDatabase——資料庫表空間dmp匯出與匯入OracleDatabase資料庫
- 2.11 刪除資料庫資料庫
- 如何刪除oracle資料庫Oracle資料庫
- 刪除資料庫指令碼資料庫指令碼
- 手工刪除oracle資料庫Oracle資料庫
- 手動刪除資料庫資料庫
- MongoDB 資料庫建立刪除、表(集合)建立刪除、資料增刪改查MongoDB資料庫
- 誤刪出資料檔案,透過dbca無法刪除資料庫問題資料庫
- 軟連線與硬連結的區別,以及如何刪除軟連結
- MongoDB資料匯入與匯出MongoDB
- C#與資料庫訪問技術總結(十)之新增&刪除C#資料庫
- EM資料庫重建 手動刪除資料庫資料庫
- Laravel 資料庫裡的資料刪除Laravel資料庫
- 批量刪除Oracle資料庫的資料Oracle資料庫