Oracle 12c 数据库链接导出与删除(Database Link)
时间:2022-06-05
本文章向大家介绍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上创建用户,用户配置从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
五、参考链接
删除数据库链接 expdp impdp中 exclude/include 的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java Lamada
- 试题 基础练习 高精度加法
- C# devExpress GridControl 行中行 子行 多级行
- 蓝桥杯 试题 基础练习 Huffuman树
- 蓝桥杯 试题 基础练习 2n皇后问题(包含n皇后问题讲解)
- 蓝桥杯 试题 基础练习 报时助手
- 蓝桥杯 试题 基础练习 回形取数
- 了解RefreshScope这篇短文就够了
- Educational Codeforces Round 83 (Rated for Div. 2) A~~E
- Codeforces Round #627 (Div. 3) 题解
- 牛客练习赛59 A~~D
- Codeforces Round #628 (Div. 2) A~~D
- AtCoder Beginner Contest 160 A ~ E
- SwiftUI:创建底部导航栏 tabBar
- AtCoder Beginner Contest 168 C