六、配置Oracle数据库的网络环境

1. 连接建立的过程
场景:oracle默认监听器1521,把数据库服务注册到监听器中,客户端才能通过监听器登录到数据库上操作,
数据库的名称是orcl,注册后,叫服务命名

[oracle@oracledemo ~]$ sqlplus scott/tiger@localhost:1521/orcl.example.com

建立连接
注意:监听器只是在连接建立的过程中起作用,一旦连接建立,客户端直接与serverprocess交互
描述:客户端执行sqlplus的登录连接,服务器端有一个1521的监听器,要通过监听器登录到数据库的服务上,需要把数据库的服务注册到监听器上,如orcl.example.com叫服务命名


(1)执行sqlplus登录语句时,发送登录请求,监听器接收到后就会解析请求
(2)解析出来的结果有两种:第一就是请求信息不识别,也就是发出过来的请求是错误的请求,这时监听器就会直接拒绝登录的请求,这时客户端就会出错,第二种请求就是解析出来的信息是正确的,就可以让客户端进行登录
(3) 请求信息正确的情况下监听器会做两件事情: 创建PGA和ServerProcess(服务器请求,处理客户端请求)
(4) 执行sql语句,实际是直接发送给serverprocess

[oracle@oracledemo ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 09-JUL-2018 04:55:50
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                09-JUL-2018 00:49:26
Uptime                    0 days 4 hr. 6 min. 24 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora   ###配置文件
Listener Log File         /u01/app/oracle/diag/tnslsnr/oracledemo/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracledemo)(PORT=1521)))   #######监听端口
Services Summary...
Service "orcl.example.com" has 1 instance(s).                          #######服务的名称
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.example.com" has 1 instance(s).                   
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

  

2. 配置监听器
描述:配置完数据库后,有个默认监听器1521,要操作必须要把数据库(orcl.example.com)注册到监听器上,然后再使用不同的方法来配置监听器


- netca


- netmgr


- OEM


- 修改配置文件: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

[oracle@oracledemo ~]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER03 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledemo)(PORT = 1523))
  )

LISTENER02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledemo)(PORT = 1522))
  )

ADR_BASE_LISTENER03 = /u01/app/oracle

ADR_BASE_LISTENER02 = /u01/app/oracle

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledemo)(PORT = 1521))
  )

ADR_BASE_LISTENER = /u01/app/oracle

  

3. 注册数据库的服务
描述:把数据库的服务注册到监听器上后,才能通过监听器登录,而且会有不同的名称如my.example.com,就对应orcl这个名称,
有了这种关联就可能登录到数据库实例上
注册方式
- 静态注册:通过修改配置文件实现
OEM操作描述: netservices管理 --> 选择对应的lister --> 编辑 --> 静态数据库注册 --> 添加 --> 填写名称、目录(已经设置的目录/u01/app/oracle/product/11.2.0/dbhome_1)、SID(数据库名称)

[oracle@oracledemo ~]$ vim /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora  #描述中的操作相当于修改配置文件
(SID_LIST =
    (SID_DESC =
        (GLOBAL_DBNAME = myorcl.exmple.com)
        (SID_NAME = orcl)
        (ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)
)
)
[oracle@oracledemo ~]$ lsnrctl status listener02   
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 09-JUL-2018 07:49:44
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER02
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                09-JUL-2018 05:41:06
Uptime                    0 days 2 hr. 8 min. 38 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oracledemo/listener02/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracledemo)(PORT=1522)))
The listener supports no services      #启动的,没有注册任何服务
The command completed successfully

- 动态注册:通过修改service_names参数
动态注册问题:
(*)默认只能注册到1521的端口上
(*)如果要注册到不是默认的监听端口上要修改参数,需要修改一个参数local_listener
(*)由PMON进程来实成

[oracle@oracledemo ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 09-JUL-2018 08:17:15
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))   ###
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                09-JUL-2018 00:49:26
Uptime                    0 days 7 hr. 27 min. 49 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oracledemo/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracledemo)(PORT=1521)))   ####默认
Services Summary...
Service "orcl.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

[oracle@oracledemo ~]$ . oraenv
ORACLE_SID = [orcl] ? orcl
The Oracle base for ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 is /u01/app/oracle
[oracle@oracledemo ~]$ sqlplus / as sysdba
SQL> show parameter service_names
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
service_names			     string	 orcl.example.com

SQL> show parameter listene
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
listener_networks		     string
local_listener			     string
remote_listener 		     string

新开一个窗口

[oracle@oracledemo ~]$ . oraenv
ORACLE_SID = [orcl] ? orcl
The Oracle base for ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 is /u01/app/oracle
[oracle@oracledemo ~]$ sqlplus / as sysdba
SQL> show parameter service_name 
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
service_names			     string	 orcl.example.com
SQL> alter system set service_names='dev.exapmle.com';
System altered.
SQL> show parameter service_name
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
service_names			     string	 dev.exapmle.com

另一个窗口查看

[oracle@oracledemo ~]$ lsnrctl status
Service "dev.exapmle.com" has 1 instance(s).

windows上测试:
[c:\~]$ cd D:\oracleclient\oracle10g\instantclient_12_1
[D:\oracleclient\oracle10g\instantclient_12_1]$ sqlplus scott/tiger@192.168.56.90:1521/dev.exapmle.com
SQL*Plus: Release 12.1.0.1.0 Production on Sat Jul 21 13:00:32 2018
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

  

4. 客户端的连接的方式
- 简便命名法(easy connect)

eg: sqlplus scott/tiger@192.168.56.90:1521/orcl.example.com
    JDBC(JAVA来连接): jdbc:oracle:thin:@192.168.56.90:1521/orcl.example.com

- 服务命名法: service name
客户端的配置:本地服务名称 --> 包含服务器IP、端口、服务名称(netmgr)

 

[oracle@oracledemo ~]$ ls /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/
listener1807095AM2956.bak  listener.ora  samples  shrept.lst  tnsnames1807095AM2956.bak  tnsnames.ora -->配置完后新增的
[oracle@oracledemo ~]$ more /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
MYDEMO =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.90)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl.example.com)
    )
  )

[oracle@oracledemo ~]$ sqlplus scott/tiger@mydemo            ##直接使用mydemo来连接
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jul 9 10:52:53 2018
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> 

- 目录命名法(使用LADP服务器作为连接的方式,少用)
- 外部命名法(external naming几乎没人使用)

 

5. 共享服务器模式
- 专有服务器模式(默认)
(*)有一个客户端,就有一个PGA和服务器server process
描述:客户端登录时,监听器如果信息正确,监听器就会去创建PGA和server process,server process用来接受客户端发送过来的sql语句并执行,
如果客户端和PGA、server process是一对一的关系,这就是专有服务器模式

- 共享服务器模式(类似于数据库的连接池)
描述:服务器端的服务器进程包括一定信息数量是一定的,可能被一些客户端共享
注意:管理员登录一定是专有有服务器模式,RMAN备份和恢复也是只是专有服务器模式
工作原理:有100个客户端,在共享服务器模式下服务器进程是一定的,如在服务器端存在5个服务器进程,也就意味着在同一个时间,服务器端只能处理5个客户端的请求,如果有更多的请求就需要排队,也就是5个服务器的进程会被100个客户端所共享的,需要有一个排队的机制在服务器端有一个监听器,要通过它才能登录到oracle的数据库上,在共享服务器的模式下需要有分发器,如有3个分发器,分发器主要作用是转发请求,不会做具体的处理
如客户端1连接到监听器上需要连接登录,监听器会在所有的分发器中找一个最不Busy的分发器进行分配给客户端,如找到分发器1,这时监听器就会把分发器1分配给客户端1,这时客户端1就可以直接执行sql语句,最终还是由server process来执行sql语句,分发器接收到请求后,会把请求放入一个请求队列中,如果有一个server process空闲了,它就会从请求队列中取出一个请求来执行处理
当sql语句执行完后,server process把执行的结果放入响应队列中,当分发器将sql放入请求队列时,实际把分发器执行的信息也放入到请求队列中,所以当服务器进程执行完成后,实际上服务器进程的响应队列是知道返回给那个对应的分发器,分发器得到结果后就会返回给对应的客户端
与专有服务器模式区别是:客户端是直接发送给server process进程
summary: 服务器端的服务进程是一定的,如果存在过客户端就需要有一种队列的机制来共享服务器的进程


配置:服务器进程数、分发器个数

SQL> show parameter shared_servers
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers		     integer
shared_servers			     integer	 1   #共享服务器进程个数,默认是一个表示专有服务器进程
修改配置:
SQL> alter system set shared_servers=5;
配置分发器:
SQL> show parameter dispatcher
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
dispatchers			     string	 (PROTOCOL=TCP) (SERVICE=orclXDB)  ###默认是没配置
max_dispatchers 		     integer
SQL> alter system set dispatchers='(PROTOCOL=TCP) (dispatchers=3)';  

  

6. 分布式数据库基础


- 数据物理上被存放在网络的多个节点上,逻辑上是一个数据库
- 特点:数据的独立性,指的是用户不必关心数据如何分割和存储,只需要关心它需要什么数据,如下的订票,用户不会关心票的信息存在那里
例子描述:一个火车订票的系统,网络像是12306,可以订全国各地的火车票,实际上北京的是存在北京的数据库中,上海的是存在上海的数据库中,它们在物理上就不在一个地方,但是可以通过逻辑上整合在一起

- 操作分布式数据库:oracle支持分布式操作
描述:两个数据库如红色在北京,绿色在上海,物理上不一起,可以从逻辑上看作一个数据库,如在北京的数据为中保存部门表的信息dept,在上海的数据库中保存上海表的信息emp,它们组成了一个分布式的环境,要在分布式的环境中操作,如要在红色的数据库中访问绿色的数据库中的数据,可以通过网络来实现,这是数据库的链路,它是有方向的.

- 定义数据库的链路

CREATE DATABASE LINK [db_link_name] CONNECT TO
[user_name] IDENTIFIED BY [password] USING '[tns_name]';
[db_link_name]: 是所要连接的数据库的服务名,也就是该数据库的真实名称(通常就是SID)
[user_name]: 是所要连接的用户名称
[password]: 是所要连接的用户密码,是远程的数据库
[tns_name]: 是所要连接数据库的服务命名
如:create database link l2 conncet to scott identified by tiger using 'remoteorcl';  #不是12是l2

实际配置

node1: windows xp oracle10g     192.168.56.128
node2: oracle linux oracle11g   192.168.56.90

测试连接通性:

[root@oracledemo ~]# ping 192.168.56.128
PING 192.168.56.128 (192.168.56.128) 56(84) bytes of data.
64 bytes from 192.168.56.128: icmp_seq=1 ttl=128 time=1.75 ms

建立数据库链路(linux上oracle访问windows xp上的oracle)
创建服务命名:linux上oracle访问windows xp上的oracle,所有在linux机器上建立服务命名,去代表远端windows oracle数据库上的信息
在vnc上操作:创建一个服务命名代表远端

在vnc上操作:创建一个服务命名代表远端
[oracle@oracledemo ~]$ ls /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/  #VNC配置过程保存在tnsnames.ora中
listener1807095AM2956.bak  listener.ora  samples  shrept.lst  tnsnames1807095AM2956.bak  tnsnames.ora
[oracle@oracledemo ~]$ more /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora 
REMOTEORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.128)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

创建数据库的链路(建立通道)

[oracle@oracledemo ~]$ sqlplus scott/tiger
SQL> create database link l2 connect to scott identified by tiger using 'remoteorcl';
create database link l2 connect to scott identified by tiger using 'remoteorcl'
ERROR at line 1:
ORA-01031: insufficient privileges  #没有创建的权限
SQL> conn / as sysdba   #切换到管理员
Connected.
SQL> grant create database link to scott;   #授权
Grant succeeded.
SQL> conn scott/tiger                       #切换到scott
Connected.
SQL> create database link l2 connect to scott identified by tiger using 'remoteorcl';
Database link created.

分布式数据库查询

SQL> select ename,dname     #@l2是访问windows上的oracle
  2  from dept,emp@l2  
  3  where dept.deptno=emp.deptno;
ENAME	   DNAME
---------- --------------
SMITH	   RESEARCH
ALLEN	   SALES
WARD	   SALES
JONES	   RESEARCH
MARTIN	   SALES
BLAKE	   SALES
CLARK	   ACCOUNTING
SCOTT	   RESEARCH
KING	   ACCOUNTING   ###
TURNER	   SALES
ADAMS	   RESEARCH
ENAME	   DNAME
---------- --------------
JAMES	   SALES
FORD	   RESEARCH
MILLER	   ACCOUNTING

修改windows某个用户的数据来测试

update emp set ename='KING123' where empno='7839';
commit

再查询

SQL> /
ENAME	   DNAME
---------- --------------
SMITH	   RESEARCH
ALLEN	   SALES
WARD	   SALES
JONES	   RESEARCH
MARTIN	   SALES
BLAKE	   SALES
CLARK	   ACCOUNTING
SCOTT	   RESEARCH
KING123    ACCOUNTING   #######已经改变
TURNER	   SALES
ADAMS	   RESEARCH

ENAME	   DNAME
---------- --------------
JAMES	   SALES
FORD	   RESEARCH
MILLER	   ACCOUNTING

其他操作

创建别名:create synonym emp1 for emp@L2;   #创建同义词来代表远端数据库的表
建立远程表的视图:create view emp as select * from emp1@L1 union select * from emp2@L2
插入操作:insert into emp select * from emp@L2;
数据复制: create table emp as select * from emp@L2;
操作:
SQL> conn / as sysdba
Connected.
SQL> grant create synonym to scott;
Grant succeeded.
SQL> conn scott/tiger
Connected.
SQL> create synonym remoteemp for emp@l2;
Synonym created.
SQL> select ename,dname
  2  from dept , remoteemp
  3  where dept.deptno=remoteemp.deptno;
ENAME	   DNAME
---------- --------------
SMITH	   RESEARCH
ALLEN	   SALES
WARD	   SALES
JONES	   RESEARCH
MARTIN	   SALES
BLAKE	   SALES
CLARK	   ACCOUNTING
SCOTT	   RESEARCH
KING123    ACCOUNTING
TURNER	   SALES
ADAMS	   RESEARCH

ENAME	   DNAME
---------- --------------
JAMES	   SALES
FORD	   RESEARCH
MILLER	   ACCOUNTING
14 rows selected.

分布式数据库的跨节点更新
描述:分布式数据库是物理上不在一起,逻辑上是整体,如北京是主数据库,上海是从数据库,如果在主上的数据发生更新,可以copy到从上进行备份
实现的方式
* 快照
* 定义快维护关系表的异步副本
* 指在主表修改后指定的时间内刷新副本,用于主表修改少,但频繁查询的表

* 触发器
* 利用触发器实现数据的同步,如北京的数据库发生的更改,可以利用触发器同步到上海

* 区别
* 触发器是同步的,快照是异步的,使用触发器时如果主发生更改马上会copy到从不会有延时,这是同步,快照是过一段时间才会copy
* 触发器是定义在主数据库上,快照是定义在从数据库上

触发器的实现:当主数据库的员工工资更改后,需要马上同步到从数据库的上,主是linux上的oracl,从是xp上的oracle
主数据库上:

SQL> select ename,sal from emp;   #在这例子中:涨工资前的工资,从数据库上也是一样
ENAME		  SAL
---------- ----------
SMITH		  800
ALLEN		 1600
WARD		 1250
JONES		 2975
MARTIN		 1250
BLAKE		 2850
CLARK		 2450
SCOTT		 3000
KING		 5000
TURNER		 1500
ADAMS		 1100

ENAME		  SAL
---------- ----------
JAMES		  950
FORD		 3000
MILLER		 1300

定义触发器

create or replace trigger syncSalary
after update
on emp 
for each row
begin
    update remoteemp set sal=:new.sal where empno=:new.empno;
end;
/
# 触发器的名称为syncSalary,针对是更新后的操作update,定义在主数据库的emp上,涨工资是要把每个员工的数据都更新到从数据库上,
  所以这是一个针对行的触发器,触发器不需要使用变量就直接使用begin和end,这个触发器就会在主数据库update操作执行后去更新从
  数据库,从数据为上的表同义词remoteemp,

SQL> create or replace trigger syncSalary
after update
on emp 
for each row
begin
    update remoteemp set sal=:new.sal where empno=:new.empno;
end;
Trigger created.
SQL> select ename,sal from emp where empno=7839;
ENAME		  SAL
---------- ----------
KING		 5000

从数据库上的king的工资
SQL> select ename,sal from emp where empno=7839;
ENAME             SAL
---------- ----------
KING123          5000

主数据库上更新:
SQL> update emp set sal=6000 where empno=7839; 
SQL> commit;
SQL> select ename,sal from emp where empno=7839;
ENAME		  SAL
---------- ----------
KING		 6000

从数据库上检查:
SQL> select ename,sal from emp where empno=7839;
ENAME             SAL
---------- ----------
KING123          6000

  

7. 使用跟踪文件诊断监听器
* 跟踪文件
后缀为trc文件 --》 跟踪会话的信息、监听器的信息
如在会话中打开会话的跟踪,它就会把当前会话的信息,包括执行的sql语句,以及统计信息记录到trc文件中,通过格式化文件就可以分析当前会话中的内容
位置:

SQL> show parameter dump

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
background_core_dump		     string	 partial
background_dump_dest		     string	 /u01/app/oracle/diag/rdbms/orcl/orcl/trace  ##跟踪文件的位置
core_dump_dest			     string	 /u01/app/oracle/diag/rdbms/orcl/orcl/cdump  
max_dump_file_size		     string	 unlimited
shadow_core_dump		     string	 partial
user_dump_dest			     string	 /u01/app/oracle/diag/rdbms/orcl/orcl/trace
[oracle@oracledemo ~]$ cd /u01/app/oracle/diag/rdbms/orcl/orcl/trace/
[oracle@oracledemo trace]$ ls
orcl_ora_20258.trc    跟踪文件
orcl_ora_28025.trm    跟踪文件的元信息文件

确定当前会话的跟踪文件
(1) 授权scott用户dba权限方便操作

SQL> grant dba to scott;
SQL> conn scott/tiger   这是一个新的会话连接

(2)确定当前会话的ID

SQL> select sid from v$mystat where rownum=1;  #v$是一个数据字典
       SID
----------
	37

(3) 根据会话的ID来确定内存中的地址信息

SQL> select PADDR from v$session where SID=37;           ##PADDR == address of process
PADDR
--------
7745FC94

(4) 根据地址信息确定跟踪的会话ID,也就是操作系统的进程ID

SQL> select SPID from V$PROCESS where ADDR='7745FC94';
SPID
------------------------
18691

(5) 开启会话跟踪

SQL> alter session set sql_trace=true;   #关闭是false,不关闭会话文件会变得很大
Session altered.
[oracle@oracledemo trace]$ ls *18691*  #产生了对应的文件
orcl_ora_18691.trc  orcl_ora_18691.trm

(*) oracle的SQL优化: 以下的是重复的SQL,可以通过这样的跟踪信息找到问题,不用生成多个执行计划

注意:解决重复SQL的方法:使用绑定变量或游标共享
select count(*) from scott.emp where deptno=10;
select count(*) from scott.emp where deptno=20;
select count(*) from scott.emp where deptno=30;
select count(*) from scott.emp where deptno=40;
select count(*) from scott.emp where deptno=50;
SQL> alter session set sql_trace=false;

(*)使用tkprof工具对跟踪文件进行格式化,方便人阅读

[oracle@oracledemo trace]$ tkprof orcl_ora_18691.trc ~/a.txt sys=no sort=fchela
# sys=no使用管理员产生的信息就不要进行格式化    sort=fchela根据sql的时间排序
[oracle@oracledemo trace]$ vim ~/a.txt
SQL ID: 8xkd0hm6ys0p0
Plan Hash: 2083865914   会生成sql的执行计划,这个是ID号,通过分析得到它们的执行计划的ID号都是一样的,会影响SQL的性能
select count(*)
from
 scott.emp where deptno=10
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          7          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0          8          0           1

  

8. 使用监听器的跟踪信息
(*) 监听器参数配置

[oracle@oracledemo ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 09-JUL-2018 15:15:55

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                09-JUL-2018 00:49:26
Uptime                    0 days 14 hr. 26 min. 29 sec
Trace Level               off       表示监听器跟踪是关闭状态,如果打开的话会产生另一个文件trc文件来跟踪
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora   监听器的配置文件
Listener Log File         /u01/app/oracle/diag/tnslsnr/oracledemo/listener/alert/log.xml       监听器的日志文件,不记录跟踪信息
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracledemo)(PORT=1521)))
Services Summary...
Service "orcl.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 4 handler(s) for this service...
Service "orclXDB.example.com" has 1 instance(s).
  Instance "orcl", status READY, has 0 handler(s) for this service...
The command completed successfully

(*) 开启跟踪

[oracle@oracledemo ~]$ lsnrctl 
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 09-JUL-2018 15:18:45
Copyright (c) 1991, 2009, Oracle.  All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> show
The following operations are available after show
An asterisk (*) denotes a modifier or extended command:
rawmode                            displaymode                        
rules                              trc_file                            使用trace文件来记录跟踪信息
trc_directory                      trc_level                           跟踪的级别
log_file                           log_directory                       跟踪文件保存的目录
log_status                         current_listener                    
inbound_connect_timeout            startup_waittime                    
snmp_visible                       save_config_on_stop                 
dynamic_registration               enable_global_dynamic_endpoint      
oracle_home                        pid 

使用show命令查看每个参数

LSNRCTL> show trc_file 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))
LISTENER parameter "trc_file" set to ora_8267_3086763712.trc   ####对应的文件
The command completed successfully

LSNRCTL> show trc_level
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))
LISTENER parameter "trc_level" set to off   ##级别
The command completed successfully

LSNRCTL> show log_directory
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))
LISTENER parameter "log_directory" set to /u01/app/oracle/diag/tnslsnr/oracledemo/listener/alert  ###保存的目录
The command completed successfully
[oracle@oracledemo ~]$ cd /u01/app/oracle/diag/tnslsnr/oracledemo/listener/alert 
[oracle@oracledemo alert]$ ls
log.xml

使用trace命令来开启监听器的跟踪

LSNRCTL> help trace
trace OFF | USER | ADMIN | SUPPORT [<listener_name>] : set tracing to the specified level
参数:
off: 关闭监听器的跟踪,对应数字0
USER: 开启用户级别的跟踪,对应数字4
ADMIN: 开启管理级别的跟踪,对应数字10
SUPPORT: 开启ORACLE监听器所支持的跟踪信息,对应数字16
一般:设置成support(或者16),记录所有的支持的跟踪信息
LSNRCTL> trace support
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledemo)(PORT=1521)))
Opened trace file: /u01/app/oracle/diag/tnslsnr/oracledemo/listener/trace/ora_8267_3086763712.trc  生成一个跟踪文件
The command completed successfully
[oracle@oracledemo ~]$ ls /u01/app/oracle/diag/tnslsnr/oracledemo/listener/trace
listener.log  ora_8267_3086763712.trc  ora_8267_3086763712.trm

使用tracasst命令格式化监听器的跟踪文件

Usage : trcasst [options] <filename>  #还可以加转向输出符>
[oracle@oracledemo trace]$ trcasst -la ora_8267_3086763712.trc > ~/b.txt
参数:
   -s  Statistics 显示监听器的统计信息
[oracle@oracledemo trace]$ trcasst -s ora_8267_3086763712.trc    比较常用的参数

Trace Assistant Utility: Version 11.2.0.1.0 Production on July 9, 2018 3:49:12 PM

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


    *************************************************************************
    *                        Trace Assistant                                *
    *************************************************************************


----------------------
Trace File Statistics:
----------------------
Start Timestamp : 018-07-09 15:43:27.055475
End Timestamp   : 018-07-09 15:48:57.022934
Total number of Sessions: 2

DATABASE:
  Operation Count:    0 OPENS,     0 PARSES,     0 EXECUTES,     0 FETCHES


ORACLE NET SERVICES:
  Total Calls  :        12 sent,         11 received,           0 oci
  Total Bytes  :      2059 sent,       3602 received
    Average Bytes:       171 sent per packet,        327 received per packet
    Maximum Bytes:       178 sent,        350 received

  Grand Total Packets:     12  sent,      11 received


    *************************************************************************
    *                    Trace Assistant has completed                      *
    *************************************************************************

    -e[0|1|2]  Error information, default is 0  监听器中的错误信息
    [oracle@oracledemo trace]$ trcasst -e1 ora_8267_3086763712.trc   显示所有错误信息

    -l[a|i <connection_id>]  Connection information  列出所有的连接
    [oracle@oracledemo trace]$ trcasst -la ora_8267_3086763712.trc 
Connection ID: 2      每个代表数据库的连接
	Socket Id: 12
	Operation: Receive
	Multiplex: OFF
	Connect Data: 
Connection ID: 1
	Operation: Receive
	Multiplex: OFF
	Connect Data: 

  

posted @ 2018-10-19 10:03  Reid21  阅读(418)  评论(0编辑  收藏  举报