Oracle   发布时间:2022-05-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Oracle 12c 数据库链接导出与删除(Database Link)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

前阵子在漏洞扫描后,有些暂时不再使用的数据库链接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上@R_634_10589@,用户配置从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
通过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_scheR_374_11845@a=hr;

--通过get_ddl函数提取DDL,如下,我们看到密码部分为一个绑定变量
--很显然,这个没有起到绝对备份的作用
sql> set long 5000
sql> SELEct DBMS_R_374_11845@etadata.get_ddl('DB_link','TO_CDB1PDB2.YDQ05.COM','HR') FROM DUAL;

DBMS_R_374_11845@etaDATA.GET_DDL('DB_link','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
scheR_374_11845@as=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_scheR_374_11845@A_01":  sys/********@cdb1pdb1 AS SYSDBA parfile=prfile.par 
Processing object type scheR_374_11845@A_EXPORT/DB_link
Master table "SYS"."SYS_EXPORT_scheR_374_11845@A_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYs.SYS_EXPORT_scheR_374_11845@A_01 is:
  /app/Oracle/ora12c/admin/cdb1/dpdump/50DDF77203BA2CCBE053F401A8C03639/hrdblink.dmp
Job "SYS"."SYS_EXPORT_scheR_374_11845@A_01" successfully completed at Tue Mar 27 17:38:29 2018 elapsed 0 00:00:07
--此处模拟我们不知道创建数据库链接的用户名和密码,所以用sys登陆
sql> show user;
USER is "SYS"

sql> show con_name;

CON_name
------------------------------
CDB1PDB1

sql> alter session set current_scheR_374_11845@a=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
$ impdp directory=DATA_PUMP_DIR dumpfile=hrdblink.dmp full=y

import: Release 12.2.0.1.0 - Production on Wed @H_641_299@mar 28 09:15:11 2018

copyright (C) 1982,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
@H_641_299@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 scheR_374_11845@A_EXPORT/DB_link
Job "SYS"."SYS_import_FulL_01" successfully completed at Wed @H_641_299@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

五、参链接

删除数据库链接
expdp impdp中 exclude/include 的使用

大佬总结

以上是大佬教程为你收集整理的Oracle 12c 数据库链接导出与删除(Database Link)全部内容,希望文章能够帮你解决Oracle 12c 数据库链接导出与删除(Database Link)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: