💫《博主主页》:
🔎 CSDN主页__奈斯DB
🔎 IF Club社区主页__奈斯、
🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(Redis)有了解
💖如果觉得文章对你有所帮助,欢迎点赞收藏加关注💖
最近需要帮研发小伙伴导出数据,但遇到个小麻烦——没有直接连接到远端Oracle数据库服务器的权限😅。如果使用传统的exp工具,直接运行命令就搞定了,但这次需要导出的数据量比较大,并且需要导出高级数据类型(如SecureFiles LOB等),对于exp而言导出速度较慢,以及不支持导出部分数据库特性。因此需要使用导出速度更快,支持更多导出特性的数据泵expdp,没想到操作起来有点曲折💦。具体步骤有点复杂:
1️⃣ 先在本地部署一个Oracle实例
2️⃣ 然后在本地实例创建DBLINK和DIRECTORY对象
3️⃣ 最后通过 expdp+NETWORK_LINK 实现远端导出
虽然过程麻烦了点,但好在通过查看官方文档📚和参考DeepSeek🤖,解决了这个问题~ 果然办法总比困难多✨ (顺便夸夸DeepSeek写得真详细👍)
首先看看通过exp怎么实现直接从远端数据库备份至本地环境。
通过exp实现从远端数据库备份至本地环境:
通过 exp 远端备份的前提,本地安装了 Oracle 客户端(包含 exp 工具)即可,本地不需要有Oracle实例,就可以直接将远程数据库中的数据导出到本地。
exp \"sys/password@<db_alias>:<listener_port>/<instance_name> as sysdba\" compress=n buffer=4096000 feedback=100000 full=y file=exp_orcl_full.dmp log=exp_orcl_full.log
###1、这里直接使用了简便连接EZCONECT;如果使用TNS(@实例名)连接的话,则需要通过Tnsnames.ora文件的连接描述符来登录数据库。tns这种方式必须保证监听启动(listener.ora)不然报ORA-12541: TNS:no listener
###2、通过exp远端备份连接的用户和密码都是远程数据库的。
如上可以看到通过exp实现从远端数据库备份至本地环境非常简单,但exp本身有一定的局限性,比如速度不如expdp,以及不支持XMLType数据的完整导出,对某些高级数据类型(如SecureFiles LOB)支持有限等等。
exp相对于expdp的局限性 功能局限性:
- 性能较低:
- exp是单线程操作,而expdp支持并行处理
- expdp使用直接路径访问方式,速度更快
- 不支持部分数据库特性:
- 不支持XMLType数据的完整导出
- 对某些高级数据类型(如SecureFiles LOB)支持有限
- 不支持导出外部表定义
- 元数据处理能力弱:
- 不能选择性导出特定对象类型(如表但不含索引)
- 重映射功能有限
架构局限性:
- 服务器端处理:
- exp在客户端运行,所有数据需通过网络传输
- expdp在服务器端运行,减少网络流量
- 作业管理:
- exp没有作业控制功能
- expdp可以暂停、恢复和监控作业
- 空间效率:
- exp生成的转储文件通常较大
- expdp使用压缩技术(可选的),文件更小
可用性限制:
- 大对象处理:
- exp处理大型数据库效率低下
- expdp专为处理TB级数据库设计
- 安全特性:
- expdp支持加密导出数据
- expdp可与Oracle Wallet集成
因此11g之后建议使用expdp导出impdp导入数据,同样的11g之后最好也使用expdp实现从远端数据库备份至本地环境。
通过expdp实现从远端数据库备份至本地环境:
通过 expdp 远端备份的前提,本地安装了 Oracle 客户端(包含 expdp 工具),以及启动了本地Oracle实例,因为需要在本地Oracle实例上创建连接到远程数据库的dblink。
关于在本地安装Oracle数据库软件,以及启动和安装Oracle实例这里博主就不过多说明了,可以参考官方文档以及网上找部署资料,可以是Windows环境,也可以是Linux环境。
步骤 1:在本地创建 Database Link
首先,在本地数据库(或 Oracle 客户端)上创建一个Database Link,用于连接远程数据库:sqlplus / as sysdbacreate database link remote_to_liudbywc133 connect to liudbywcs identified by "123456" using -- CONNECT TO是远程数据库的认证用户和密码 ' (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.82.133) -- 远端数据库的IP地址(PORT = 1521)) ) -- 远端数据库的监听端口(CONNECT_DATA = (SERVICE_NAME = liudbywc) -- 远端数据库的连接服务名) )';
验证 Database Link 是否可用
SELECT COUNT(*) FROM remote_schema.remote_table@remote_to_liudbywc133;
步骤 2:在本地创建 DIRECTORY 对象
expdp 只能写入 Oracle 目录对象(DIRECTORY),因此需要在本地定义一个目录:sqlplus / as sysdbaCREATE OR REPLACE DIRECTORY remote_liudbywc133 AS '/home/oracle'; grant all on directory remote_liudbywc133 to sys;
步骤 3:使用expdp+NETWORK_LINK导出
expdp \"/ as sysdba\" NETWORK_LINK=remote_to_liudbywc133 directory=remote_liudbywc133 dumpfile=expdp_liudbywc_full_%U.dmp logfile=expdp_liudbywc_full.log full=y parallel=2 COMPRESSION=all
参数选项 描述 NETWORK_LINK 允许直接从远程数据库导出数据到本地,而无需在远程服务器上生成转储文件。
NETWORK_LINK 基本概念:
NETWORK_LINK 参数指定一个预先定义的数据库链接(database link),通过这个链接,expdp 可以:
1. 访问远程数据库中的数据和元数据
2. 将数据直接导出到本地系统的转储文件中
3. 完全避免在远程服务器上存储临时文件
工作原理:
当使用 NETWORK_LINK 时,Data Pump 会:
1. 通过指定的数据库链接连接到远程数据库
2. 从远程数据库读取数据
3. 通过数据库链接将数据传输到本地
4. 在本地系统上创建转储文件这里需要注意:这里"/ as sysdba"是本地Oracle数据库的登录用户名和密码,而远程数据库的访问是通过NETWORK_LINK对应的 Database Link 配置的(其中已包含远程数据库的用户名和密码)。
"/ as sysdba"是本地Oracle数据库的登录用户名和密码的原因如下:
- 在本地创建和执行 Data Pump 作业的权限(通常需要 DATAPUMP_EXP_FULL_DATABASE 或 EXP_FULL_DATABASE 角色)。
- 对 DIRECTORY=remote_liudbywc133 的读写权限。
###1、expdp的远端备份不同于exp,不能直接写简便连接加上远端数据库的密码和用户,这样会导致dmp文件在远端数据库的DIRECTORY目录下,而不是本地。比如在本地数据库上执行如下命令,本地数据库和远端数据库都有DATA_PUMP_DIR目录,执行如下命令后dmp文件在远端数据库的DATA_PUMP_DIR目录下,而不是本地数据库的DATA_PUMP_DIR目录上:
expdp \"sys/123456@192.168.82.133:1521/liudbywc as sysdba\" directory=DATA_PUMP_DIR dumpfile=expdp_liudbywc_full_%U.dmp logfile=expdp_liudbywc_full.log full=y parallel=2 COMPRESSION=all
###2、通过expdp远端备份连接的用户和密码都是本地数据库的,原因参考上面;对于远程数据库的访问是通过NETWORK_LINK对应的 Database Link 配置的(其中已包含远程数据库的用户名和密码)。
通过expdp实现从远端数据库备份至本地环境到这里就算介绍啦!实现起来不难,但就是比较麻烦,献给有需要的小伙伴。