使用DBLink在两个DB间导入/导出数据

原创 2007年10月07日 22:44:00
 
背景
    由于目要求,需要将数据从一个DB(DB1)入到另一个DB(DB2)中。两个DB有相同的表构,只是字段名字不一:DB1中的字段是字的,而DB2中的字段是英文的。需要建立两个表之接,再从DB1中索数据插入到DB2中。因此,问题关键在于在DB1中建立同DB2的接(也可以在DB2中建立同DB1的接)。Oracle提供了DataBase Link接两个DB,从而方便的实现跨DB的操作。 
 
点摘要
从本上来DBLink也是Oracle数据中的一个象。我可以想建其它Oracle 象一样创建和除DBLink。只是有两点需要注意:一是问题,登的用要有建DBLink的限。二是建的DBLink的访问权限,如果建了一个非管理只能建具有公有(public)访问权限的DBLink。
 
 实现细节
首先要确保你的DB能正确的接。接一个DB有两个法:1是在本地安装Oracle的客端,在TNSNAMES.ora中配置对远程机器的接。2是直接程的数据器。如:假IP172.16.97.131的机器上有一个DB服器,服OraServer,那也可以这样指定接:172.16.97.131/OraServer。而不用在本地配置TNS。不管采用哪方式必你的机器能正常接到DB1和DB2。 
然后就是确保连接的用户要有创建DBLink的权限。如果你需要用DB1连接DB2,那你登陆DB1的用户必须要有创建DBLink的权限。可以用SYSDBA的身份登陆DB执行下面的语句为指定用户授权:
grant create public database link to username
 
     用户有了权限后就可以创建DBLink了:
CREATE PUBLIC DATABASE LINK LKNAME
CONNECT 
TO
 USERNAME
IDENTIFIED 
BY
 PASSWORD
USING ‘DBSERVER’

 

     建立连接后可以用语句查看创建的DBLink下面的     使用完了以后要删除已创建的DBLink: 

select db_link from dba_db_links;

 

DROP PUBLIC DATABASE LINK LKNAME

     需要说明的是,如果你创建的不是PUBLICDBLINK,那只能有创建者删除自己创建的DBLINK,而非管理员权限的用户创建的DBLink只能由SYS用户删除

 

        /**//// <summary>
        
/// DBリック作成
        
/// </summary>
        
/// <returns>エラーがある場合、エラーメッセージを戻す</returns>

        private string CreateDBLink()
        
...{
            
try
            
...{
                
//DB接続処理
                if (cnnDestDB.State != ConnectionState.Open)
                
...{
                    cnnDestDB.Open();
                }


                OracleCommand cmdCreateLink 
= new OracleCommand();

                cmdCreateLink.Connection 
= cnnDestDB;

                
//DBリックSQL文
                
//CREATE PUBLIC DATABASE LINK LINKNAME CONNECT TO USERNAME IDENTIFIED BY PASSWORD USING 'SID'
                string strCreateLink = "CREATE PUBLIC DATABASE LINK " + strLinkName + " CONNECT TO " + txtUserId2.Text.Trim() + " IDENTIFIED BY " + txtPassWord2.Text + " USING '" + txtSid2.Text.Trim() + "'";

                cmdCreateLink.CommandText 
= strCreateLink;

                
//DBリック作成
                cmdCreateLink.ExecuteNonQuery();

                cnnDestDB.Close();

                
return string.Empty;
            }

            
catch (Exception ex)
            
...{
                
if (cnnDestDB.State != ConnectionState.Closed)
                
...{
                    cnnDestDB.Close();
                }


                
return ex.Message;
            }

        }


        
/**//// <summary>
        
/// DBリックの削除
        
/// </summary>
        
/// <returns>エラーがある場合、エラーメッセージを戻す</returns>

        private string DeleteDBLink()
        
...{
            
try
            
...{
                
//DB接続処理
                if (cnnDestDB.State != ConnectionState.Open)
                
...{
                    cnnDestDB.Open();
                }


                OracleCommand cmdDropLink 
= new OracleCommand();

                cmdDropLink.Connection 
= cnnDestDB;

                
//DBリックSQL文
                
//DROP PUBLIC DATABASE LINK LINKNAME
                string strDropLink = "DROP PUBLIC DATABASE LINK " + strLinkName;

                cmdDropLink.CommandText 
= strDropLink;

                
//DBリック削除
                cmdDropLink.ExecuteNonQuery();

                cnnDestDB.Close();

                
return string.Empty;
            }

            
catch (Exception ex)
            
...{
                
if (cnnDestDB.State != ConnectionState.Closed)
                
...{
                    cnnDestDB.Close();
                }


                
return ex.Message;
            }

        }
     需要说明的是这里的USERNAME PASSWORDDBSERVER都是DB1连接DB2时,访问DB2的参数。

oracle导入大数据、数据库之间迁移数据简单方法

oracle导入数据的方式比较多:主要介绍
  • skate29
  • skate29
  • 2014年07月18日 20:39
  • 4623

数据泵联合dblink 使用场景

一 、 expdp可以通过dblink来实现把导出文件直接放在客户端 1、在客户端数据库创建db link和要保存数据文件的目录(在system 用户下操作) create database link...
  • huangliang0703
  • huangliang0703
  • 2015年08月24日 19:14
  • 960

oracle 数据泵 network link使用

在进行数据导出导入时,若源端存储空间不足,exp工具可以将目录指定到目标端路径。而数据泵是服务器进程,不能直接将导出目录指定到远端,但我们可以通过network_link参数将数据直接导入至目标库,同...
  • hellokidss
  • hellokidss
  • 2017年06月05日 10:56
  • 483

数据泵使用总结

Oracle10g 数据泵导出命令 expdp 使用总结(一)   1.1.1 expdp使用   使用EXPDP工具时,其转储文件只能被存放在DIRECTORY对象对应的OS目录中,而不能直...
  • DEMO_LOMO
  • DEMO_LOMO
  • 2016年07月26日 14:54
  • 1681

【EXPDP】expdp/impdp数据泵远程导入导出

Oracle在10g的时候有一个很好用的导出工具expdp(数据泵) 但是这个工具好用的同时,有一个局限,就是必须用本地的用户才可以导出数据,也就是说数据泵只能导出本地数据库的数据 但是如果业务需...
  • imliuqun123
  • imliuqun123
  • 2017年11月24日 15:21
  • 323

Oracle DBLink 将远程数据库的数据拷贝到本地数据库

需求场景: 远程数据库B,本地数据库A,A和B的数据库结构完全相同。 现在需要从远程机器数据库B上取数据,写入到本地数据库A中,保证本地数据库具有最新的数据,oracle自动执行此任务,可在断网恢复后...
  • wangdonghao137
  • wangdonghao137
  • 2015年04月07日 14:05
  • 1676

使用expdp(非本地)远程导出数据

背景:前段时间,需要从异地一个测试数据库中将测试数据(一张表)导入本地库,表数据量大约500万,字段160多个,开始用了exp/imp方式,速度奇慢,不能忍,于是转而使用expdp/impdp方式。e...
  • bisal
  • bisal
  • 2015年04月15日 09:50
  • 9751

expdp 数据泵 rman copy

exp/imp大数据量的时候,性能低 近似于select/insert exp 4   imp 16 10g 新特性,理论上expdp  10倍的性能exp 工作的原理不同,api程序端口...
  • bff1022
  • bff1022
  • 2013年12月07日 12:01
  • 555

ORACLE使用DBLINK导入导出数据

场景: ORACLE数据库A:172.18.169.81:1521/orcl ORACLE数据库B:127.0.0.1:1521/orcl 要将数据库A的所有数据导入到数据库B。 由于数据量极...
  • lhjllff12345
  • lhjllff12345
  • 2018年01月09日 18:23
  • 104

利用DB Link实现Oracle两个数据库间的表同步

1,在目标机上建立Oracle DB Link: A,在network/admin/tnsname.ora文件中加入源库的连接信息,如: AAA=   (DESCRIPTION =    ...
  • zmx729618
  • zmx729618
  • 2016年04月28日 13:57
  • 2531
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用DBLink在两个DB间导入/导出数据
举报原因:
原因补充:

(最多只允许输入30个字)