打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
oracle新手入门指导之八—数据库远程访问小知识[天源迪科论坛]
oracle新手入门指导之八—数据库远程访问小知识

在平常的工作中,会遇到这样的需求:我新建一个数据库环境,里面的数据比较少,我想从其他地方导入数据进来。这包括很多方法,比如使用imp/exp工具,又或者使用sqlloader,还可以直接使用pl/sql工具直接copy数据到表中,再或者直接引用其它用户的表数据,还有通过创建databaselink链接到远程数据库来取数据,等等。总之,方法很多,只要你喜欢,就可以任你挑。

下面我就来详细讲述一下各种方法的具体实现步骤(限于帖子篇幅大小只有15K,所以不能弄些图片上来,只好以文字说明,不够详细的地方,请大家见谅

1:使用imp/exp工具
这个比较简单,借助pl/sql developer工具,菜鸟也可以轻松的掌握数据导入和数据导出的方法。这个就不多说了,动手试一下,就会了的。

2:使用sql loader
使用这个命令工具,需要2个基本文件。
1——原始数据文件,2——控制文件

举个例子如下:
原始数据文件
3|551|1|5513180000|10328|2002.12.21|2008.04.11|1|
53|551|1|5512875744|18700|2002.12.25|2007.03.01|3|
279|558|10|5583380564|-1867|2003.01.02|2007.07.28|2|
280|558|10|5583389887|-4031|2003.01.02|2007.06.28|2|
287|558|10|5583281357|201|2003.01.02|2007.11.18|1|
294|558|10|5583380246|567|2003.01.02|2009.06.03|1|
297|558|10|5583381199|7541|2003.01.02|2008.06.22|1|
298|558|10|5583386077|-1789|2003.01.02|2007.08.08|2|
301|558|10|5583281041|-3553|2003.01.02|2007.01.13|3|
307|558|10|5583381002|-73|2003.01.02|2007.09.13|2|

控制文件zte_userbasnews.ctl
load data
infile userbasnews.data
truncate into table zte_userbasnews
fields terminated by ‘|‘
(
 user_unique_id ,
 latn_id ,
 service_area_id ,
 phs_number ,
 balance ,
 created_date Date ‘YYYY.MM.DD‘,
 eff_day Date ‘YYYY.MM.DD‘,
 state  
)

以上文件要注意存放路径,当他们保存在同一目录下时,执行如下命令即可。
sqlldr ODSB/ODSB@AH_OCS control=zte_userbasnews.ctl direct=true

那么,原始数据文件的每一行,会被以 ‘|‘ 分割,而逐个字段的导入相应表中。

3:直接使用pl/sql工具直接copy数据到表中
如果你使用过pl/sql工具,应该熟悉.csv文件和.tsv文件,这是PL/SQL DEVELOPER 导出数据时候可以选择的一种文件存储格式。
当你执行了如下的命令: ‘select * from test for update;‘  的时候,你可以把你的.tsv和.csv文件直接copy到pl/sql developer的表中去。然后,提交,成功。
本来想截图演示的,可惜图片太大,所以抱歉拉!
其实pl/sql developer的这种数据导入格式也支持excel文档。

4:引用其它用户的表
比如在同一个数据库db1中有两个用户uesr1和user2。如何在登陆user1的时候也能操作user2的表呢?
很简单,在user2的表名称前面加上用户前缀user2.
例如登陆为user1的用户想访问user2的某张表test_table.
执行如下命令即可:
select * from user2.test_table;
这样就跟访问自己的表是一样的。千万要注意:默认情况下,这种访问方式的权限是很大的,select,insert,update,delete,以上权限都支持,要注意数据的安全性。

5:通过创建database link链接到远程数据库来取数据
关于database link的概念,请去下面这个网址上查看详细介绍。
http://www.haidao8.net/read.php?tid=1309

怎么创建database link?
-- Create database link
 --在知道tns名称的情况下,创建DATABASE LINK?
create [public] database link test_dblink (连接名称)
  connect to user (login 帐户) identified by password
  using ‘TNS_NAME‘ (login SID对应的TNS NAME);
 
  --在不知道tns名称的情况下,如何创建DATABASE LINK?
create database link test_dblink
  connect to user identified by password
  using
‘(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
      (SERVICE_NAME = testdb)
    )
  )‘;

创建了database link之后,那么如何访问远程数据呢?
以上面的database link为例,我们来访问
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
      (SERVICE_NAME = testdb)
    )
  )
上的某个表 liwp_test .
执行如下命令:select * from liwp_test@test_dblink;
很简单,只需要在表的后面加上 @test_dblink 就可以了。
这样就跟访问自己的表是一样的。千万要注意:默认情况下,这种访问方式的权限是很大的,select,insert,update,delete,以上权限都支持,要注意数据的安全性。

接下来,讲述一下在创建database link后常见的错误,及解决方法。
这后面的内容就是转贴自高手们的实际经验了,与大家共同分享。

---------------------------文章1----------------------------
ORA-02085错误解决过程!           
       今天看EYGLE的文章:http://www.eygle.com/archives/2005/06/oraclessoeaeaeo.html(Oracle高级复制的创建配置步骤-Step by Step),里面讲到了:本例的先决条件:你需要设置好相应的参数,job_queue_processes需要大于0,global_name=true,并且建立相应的db link.
      于是我这个菜鸟便检查主数据库job_queue_processes和global_names参数,并通过alter system set global_names=true;修改global_names参数,没有任何问题!
   然后在主数据库创建dblink:
 create database link test_link
  connect to myuser identified by pass
  using ‘mydb2‘;
创建过程也没有问题!但是使用dblink进行查询就出错了:
SQL> select count(*) from town@test_link;
select count(*) from town@test_link
ORA-02085: database link TEST_LINK connects to STIOMDB
SQL>
经过在网上搜看别人的帖子并测试发现:
当global_name参数设置为true,则dblink必须命名为和在目标数据库如下查询出的结果一致:
 select * from global_name,例如:
在目标数据库执行查询:
 
SQL>  select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
mydb
SQL>
 
则修改dblink:
 create database link mydb  connect to myuser identified by pass  using ‘mydb2‘;
然后执行查询:
SQL> select count(*) from town@mydb;
  COUNT(*)
----------
     13507
SQL>


-------------------------------文章2----------------------------------
  Q:建dblink成功,查询时报ORA-02085,寻求高手建议!
我在自己的机子上装了个8.1.6服务器,机子的操作系统是2000。现在要在自己的服务器上建个dblink,指向远端服务器 为此,我用dba帐户建立链接
create database link ora817
connect to lssw
identified by lssw
using ‘lsjf‘;
成功建立,但执行如下查询:
select * from hdsc04@ora817;
ORA-02085: 数据库链接ora817与LSJF相连结
补充:我用sqlplus 能用上述帐户及连接串联到远端服务器,
ora817和远端的sid名一样。

service@ora817也一样报错
select * from service@ora817
*
ERROR 位于第 1 行:
ORA-02085: 数据库链接ORA817与LSJF相连结
使用数据连接可以很方便的引用其它数据库的数据,但是设置不当可能遇到ORA-02085错误。如果被连接对方的GLOBAL_NAMES参数设置成了TRUE,那么要求数据库连接与对方实例名有相同的名称。这样就可以通过下面3中的任意一种方法来解决:
1.修改对方的GLOBAL_NAMES参数为FALSE
alter system set global_names = false;
2.将对方的GLOBAL_NAME设置成与数据库连接相同的名称
alter database rename global_name to new_name;
3.将数据库连接删掉重新创建成与对方实例名相同的数据库连接


PS:看了网上的一些技术帖子,我对oracle也更感兴趣了,也更加钦佩这些高手们了。
其实工作中,很多时候,公司需要的并不是仅能发现问题的人,而是能解决问题的人!

——与大家共勉

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[转]在oracle下如何创建database link全面总结 - 天堂的狼 - 博客园
分布式数据库组件——Database Link
oracle通过透明网关,创建dblink,访问ms sql server和其他数据库 -...
Oracle dblink详解(转)
深入剖析 - Oracle SCN机制详细解读
oracle建立dblink
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服