暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 远程连接数据库

oracleEDU 2017-08-11
610

本节将要讲到的知识点如下:

    一、监听配置

    二、服务名注册方式

    三、客户端本地名称解析

    四、专有模式和共享模式

    五、DBLink

监听配置

问题:要求服务器有3个监听?

已有一个默认listener,端口1521,还需配置两个。

处理这个问题的两种方式:

1. 使用图形界面做

    $netca

    Step 1 of 6    选择Listener configuration

    Step 2 of  6   选ADD添加

    Step 3 of  6   设置监听名

    Step 4 of  6   选择协议TCP

    Step 5 of  6   设置端口号

    Step 6 of  6   next直到完成

2. 使用grid用户修改listener.ora文件

    文件位置:$ORACLE_HOME/network/admin/listener.ora

    加入如下内容:

LSNR2 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = oracleEDU)(PORT = 1531))

  )

LSNR3 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = oracleEDU)(PORT = 1541))

  )

:wq 保存修改。

$ lsnrctl start lsnr2

$ lsnrctl start lsnr3

查看监听是否启用:

[grid@oracleEDU admin]$  ps -elf |grep tns |grep -v  grep

0 S grid      8680     1  0  75   0 - 19335 502738 22:11 ?        00:00:00 u01/app/grid/product/11.2.0/grid/bin/tnslsnr LISTENER -inherit

0 S grid     27562     1  0  79   0 - 19284 -      23:40 ?        00:00:00 u01/app/grid/product/11.2.0/grid/bin/tnslsnr lsnr2 -inherit

0 S grid     27579     1  0  78   0 - 19285 -      23:40 ?        00:00:00 u01/app/grid/product/11.2.0/grid/bin/tnslsnr lsnr3 -inherit

查看监听开启了哪些端口:

[grid@oracleEDU admin]$ netstat -tunlp |grep tns |grep -v grep

(Not all processes could be identified, non-owned process info

 will not be shown, you would have to be root to see it all.)

tcp        0      0 0.0.0.0:1541                0.0.0.0:*                   LISTEN      27579/tnslsnr

tcp        0      0 0.0.0.0:1521                0.0.0.0:*                   LISTEN      8680/tnslsnr

tcp        0      0 0.0.0.0:1531                0.0.0.0:*                   LISTEN      27562/tnslsnr

服务名注册方式

1. 动态注册(默认)

    实例启动时,会由Oracle PMON进程将数据库实例信息动态注册到监听上,当实例关闭时,会由Oracle PMON自动从监听里面撤销当前实例信息。所以要实现动态注册,数据库至少要是在nomount状态

监听动态注册的实例状态有三种:

i. READY    数据库处于mount或者open,可以接受客户端连接

ii. BLOCKED    数据库处于nomount状态或实例类型是ASM,不接受客户端连接

iii. RESTRICED    不接受普通权限的远程客户连接

2. 静态注册(直接把监听写入配置文件listene.ora)

    没有延迟,但不一定能够连接,状态为UNKNOWN

将orcl数据库全部静态注册到listener  lsnr2  lsnr3

grid用户修改listener.ora文件

    全局数据库名 :orcl.example.com

    数据库的home:/u01/app/oracle/product/11.2.0/dbhome_1

    实例名:orcl

修改内容如下:

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcl.example.com)

      (ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)

      (SID_NAME = orcl)

    )

  )

SID_LIST_lsnr2 =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcl.example.com)

      (ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)

      (SID_NAME = orcl)

    )

  )

SID_LIST_lsnr3 =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcl.example.com)

      (ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)

      (SID_NAME = orcl)

    )

  )

:wq 保存。

使配置生效:

$ lsnrctl reload

$ lsnrctl reload lsnr2

$ lsnrctl reload lsnr3

查看监听状态:

$ lsnrctl status 

Service "orcl.example.com" has 2 instance(s).

  Instance "orcl", status UNKNOWN 静态注册, has 1 handler(s) for this service...

  Instance "orcl", status READY动态注册, has 1 handler(s) for this service...

lsnrctl status lsnr2

Service "orcl.example.com" has 1 instance(s).

  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...

lsnrctl status lsnr3

Service "orcl.example.com" has 1 instance(s).

  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...

Tips:实例同时可以静态注册和动态注册,状态分别显示为UNKNOWN 和 READY。

要求动态注册到 lsnr2

修改参数实现:(value为空就是用默认值(1521侦听))

SQL> show parameter local

NAME                                 TYPE        VALUE

------------------------------------ ----------- ---------------------------

local_listener                       string      

修改local_listener参数

SQL>alter system set local_listener =' (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracleEDU)(PORT=1531)))' scope=both; 

检查

$ lsnrctl status lsn2 

Service "orcl.example.com" has 2 instance(s).

  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...

  Instance "orcl", status READY动态注册, has 1 handler(s) for this service...

$ lsnrctl status 

Service "orcl.example.com" has 1 instance(s).

  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...

 只有静态注册了。

客户端本地名称解析

名称解析:

  1. Easy Connect 简易连接

    不需要做任何配置(不支持SSH,不支持高级属性),语法:connect 账户名/密码@主机名或者ip地址:监听的端口/服务名

    例如:CONNECT scott/tiger@db.us.oracle.com:1521/orcl

  2. Local Naming 本地名称解析

    通过配置名称解析文件tnsnames.ora(支持SSH,支持高级属性:连接时故障转移,负载均衡,源路由)

    使用Oracle用户配置安装目录下network/admin目录下tnsnames.ora文件

    语法:sqlplus 账户名/密码@服务别名

    或者使用图形界面配置,命令:netmgr

    增加一个TEST的服务名

    $ su - oracle 

    $ cd $ORACLE_HOME/network/admin 

    $ vi tnsnames.ora      (增加如下内容)

    TEST =

      (DESCRIPTION =

        (ADDRESS_LIST =

          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

        )

     (CONNECT_DATA =

          (SERVICE_NAME = orcl.example.com)

        )

      )

:wq 保存。

检查:tnsping 服务名

检查语法是否正确,不保证通过服务别名一定能够连接数据库

$ tnsping test

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl.example.com)))

OK (40 msec)

现在就可以通过TEST去连接数据库:

$ sqlplus scott/oracle@test

扩展

如果服务器配置了多个监听,则客户端可以配置高级属性:

1.连接时故障转移(当用户连接时判断监听是否可用,不可用就搜索下一个监听)

    例

    建立一个监听t_orcl,可以向3个监听连接

    使用Oracle用户修改配置文件tnsnames.ora或者使用图形界面添加 netmgr

    添加如下内容:

T_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1531))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1541))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl.example.com)

    )

  )

如果你的服务别名中有多个监听,则默认开启连接时故障转移 

实际省略了关键字   (FAILOVER = on)

检查语法:tnsping t_orcl

测试连接

sqlplus scott/oracle@t_orcl 

关闭任何监听,只要有一个是好的 就可以成功!

2.负载均衡

    

    建立服务名f_orcl

F_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1531))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1541))

      (LOAD_BALANCE = yes)

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl.example.com)

    )

  )

检查语法:tnsping f_orcl

测试连接

sqlplus scott/oracle@f_orcl

专有模式和共享模式

专有模式: Dedicated Server

    每个用户进程独享一服务器进程。

共享服务器模式:Shared Server

    数据启动的时候预先启动几个服务进程(共享服务进程) ,还有启动调度进程 ,用户把请求给监听,监听判断如果是共享模式则把用户请求转给调度进程,调度放入一个队列,共享服务进程从队列取任务,处理完毕后,把结果在放入一个结果队列,然后由调度进程吧结果给用户进程,如果服务进程处理完毕,继续在队列里找任务执行。

怎么查看当前数据库是专有还是共享模式?

    如果存在共享服务进程或者存储调度进程 --> 共享模式

    如果没有 --> 专有模式

共享模式下,建立专有连接,也可以建立共享连接(不产生新的服务进程,交给调度进程).

专有模式下,不能建立共享连接,只能建立专有连接。

判断:(shared_servers 非0就是共享模式)

SQL> show parameter SHARED_SERVERS

NAME                                 TYPE        VALUE

-------------------------------- ----------- ------------------------------

max_shared_servers             integer

shared_servers                  integer     1

SQL> show parameter disp

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

cell_offload_plan_display            string      AUTO

dispatchers                          string      (PROTOCOL=TCP) (SERVICE=orclXD

                                                 B)

怎么配置共享模式?

参数:

SHARED_SERVERS:表示数据库启动的时候最小保持的共享服务进程数

MAX_SHARED_SERVERS:同时允许最多的共享服务进程数

DISPATCHERS:调度进程

MAX_DISPATCHERS:最大调度进程

MAX_SHARED_SERVERS:指定允许同时存在的最多的共享服务进程

设置共享模式,只需要设置4个参数:

要求shared server最多5个,开启3个

$ alter system set SHARED_SERVERS=3 scope=both;

$ alter system set  MAX_SHARED_SERVERS=5;

[oracle@oracleEDU admin]$ ps -elf |grep ora_ |grep orcl |grep s0

0 S oracle    6404     1  0  78   0 - 185439 ?     01:37 ?        00:00:00 ora_s000_orcl

0 S oracle    9002     1  0  78   0 - 185439 ?     01:59 ?        00:00:00 ora_s001_orcl

0 S oracle    9010     1  0  78   0 - 185439 ?     01:59 ?        00:00:00 ora_s002_orcl

允许tcp/ip的调度进程3 最多5个

alter system set DISPATCHERS='(PROT=tcp)(DISP=3)';

alter system set MAX_DISPATCHERS=5;

我的数据库是共享模式:

SQL> show parameter shared_servers

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

max_shared_servers     integer 5

shared_servers     integer 3

SQL> 

此时,在客户端,你可以建立专有连接,也可建立共享连接。

Tips:共享连接必须只能对动态注册的监听,静态注册监听不可以。

建立专有连接:

D_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.example.com)

    )

  )

测试:服务器进程数

[oracle@oracleEDU ~]$ ps -ef|grep oracleorcl |wc -l

11

$ sqlplus scott/oracle@d_orcl

SQL> !ps -ef|grep oracleorcl|wc -l

12

系统产生一个新的服务进程。

建立共享连接:

S_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVER = SHARED)

      (SERVICE_NAME = orcl.example.com)

    )

  )

测试:

$ tnsping s_orcl 

是ok ,路径没有问题。

[oracle@oracleEDU ~]$ sqlplus scott/oracle@s_orcl

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 11 21:44:20 2017

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:

ORA-12523: TNS:listener could not find instance appropriate for the client

connection

原因是s_orcl是共享连接,必须通过动态注册的侦听连接

我的环境里面1531是动态注册  所以修改s_orcl指定1531

S_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1531))

    )

    (CONNECT_DATA =

      (SERVER = SHARED)

      (SERVICE_NAME = orcl.example.com)

    )

  )

再测试:

 $ ps -elf |grep oracleorcl |wc -l

11

$ sqlplus scott/oracle@s_orcl

SQL> !ps -elf |grep oracleorcl |wc -l

11

服务进程数没有变化

现在有中间件,一般不配置共享式 ,中间件和数据用专有连接。

把数据库从共享模式设置成专有模式

SQL> alter system set shared_servers=0 scope=both;

System altered.

SQL> alter system set max_shared_servers=0;

System altered.

SQL> alter system set dispatchers='';

System altered.

SQL> alter system set max_dispatchers=0;

System altered.

sqlplus scott/oracle@s_orcl

ERROR:

ORA-12520: TNS:listener could not find available handler for requested type of

server

专有模式,没有调度进程。

一个数据库最多建立的会话数

SQL> show parameter sessions

NAME                                 TYPE        VALUE

------------------------------------ ----------- -----------------------------

sessions                             integer     247

DBLink

使用 create database link 语句创建一个数据库连接,可以在一个数据库中访问另外一个数据库的对象。

语法:

CREATE DATABASE LINK <remote_global_name>

CONNECT TO <user> IDENTIFIED BY <pwd>

USING '<connect_string_for_remote_db>';

用dbca新建建另一个测试数据库

SID:ocp

字符:zhs16gbk

内存:512M

[oracle@oracleEDU ~]$ ps -elf |grep smon  |grep ocp

0 S oracle   13488     1  0  75   0 - 187402 ?     02:32 ?        00:00:00 ora_smon_ocp

在orcl数据库上建一个表:

SQL> create table test as select * from emp;

要求在ocp数据库上访问orcl库上的这个表test

操作步骤:

1.在ocp数据服务器上建立服务别名,可以连接orcl数据库   

export ORACLE_SID=ocp

TO_ORCL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl.example.com)

    )

  )

测试; sqlplus scott/oracle@to_orcl

2.建立去连orcl的dblink

    $ export ORACLE_SID=ocp

    $ sqlplus as sysdba

    SQL> CREATE DATABASE LINK torcl

              CONNECT TO scott IDENTIFIED BY oracle

              USING 'to_orcl';

3.使用方式:对象名@dblink的名字

    SQL> select count(*) from test@torcl;

        COUNT(*)

        ----------

14

    SQL> update test@torcl set sal=0;

    SQL> commit;

实际操作的是orcl数据库的scott.test表。


反过来,如果orcl想去访问ocp数据库

1.登录orcl数据库服务器配置一个服务别名去连接ocp

export ORACLE_SID=orcl

TO_OCP =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ocp)

    )

  )

2.登录orcl数据库建立一个dblink

$ export ORACLE_SID=orcl 

$ sqlplus as sysdba

   SQL> CREATE public DATABASE LINK tocp

              CONNECT TO scott IDENTIFIED BY oracle

              USING 'to_ocp';

3.用dblink就可以访问ocp库的数据    SQL> select * from emp@tocp;

    SQL> create view v1 as seelct * from emp@tocp;


查看DB link

SQL> select owner,object_name from dba_objects where object_type = 'DATABASE LINK';

OWNER     OBJECT_NAME

-------------------- ------------------------------

SYS              TORCL


或者:

SQL> select * from dba_db_links;


删除DB Link

SQL> drop database link torcl;

Database link dropped.





本篇的内容有点多,没有很详细的讲解,主要是例子操作,更多内容请看文末推荐的文档。

参考文档:

Net Services Reference  7 Oracle Net Listener Parameters

Net Services Administrator's Guide

Administrator's Guide   5 Managing Processes


最后修改时间:2021-04-28 19:29:22
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论