Oracle 11g R2网络侦听器实验

 

单实例环境(不是RAC),侦听器和实例必须要在同一台机器上。两台机器通信必须使用一个网络协议才能进行通信,假如浏览网页需要使用http协议,远程连接需要使用RDP/ssh/telnet等等。

有一台oracle服务器,有个客户端要连接到oracle服务器上,两台机器通信就要使用oracleNET协议,和以上的协议是一样的。有协议就要有相应的端口,所以oracleNET有个默认的侦听端口1521.

其实配置oracle网络就是配置oracle侦听器,侦听器很重要,如果没有配置侦听器,客户端是无法连接到oracle服务器上面的。其实即使是在本地连接oracle服务器,侦听器也是必须要运行的。客户端远程连接到oracle服务器时使用oracleNet协议,是被封装到了tcp/ip

协议中。如果是直接在本地连接数据库用的是IPCIPC是指<进程间的通信>

侦听器是用来接收外面的请求,在将外面的请求通过服务器进程交给实例,所以实例必须要向侦听器注册。如果监听器不知道有相应的实例肯定是不行的--即让侦听器知道有

实例可以连接。oracle默认侦听器的端口是1521

 

侦听器的配置文件存放在:$ORACLE_HOME/network/admin/中的instener.ora是侦听器的配置文件

wKioL1kUPIrBoJFSAABLYefSkpo486.png-wh_50

如果listerner的端口使用默认的1521的话,可以没有listener.ora,但是建议最好不要删除这个文件。

1.1. 创建侦听器

可以通过修改listener.ora来配置侦听器以外,还可以使用其他工具来配置侦听器

1. netca

2. netmgr

使用netca添加侦听器的方法

wKiom1kUPKCxVtwhAAATpZwiud4236.png-wh_50 

 wKiom1kUPLfi_dX-AADoLi6fGx4411.png-wh_50

wKioL1kUPNSxokTjAADY9oVDHOQ123.png-wh_50

wKioL1kUPPWQiqSQAADM5XgJZ1g431.png-wh_50

wKiom1kUPROhB4qSAADTJHIS6vc973.png-wh_50

wKiom1kUPTKAfkYXAADNEmM_EII800.png-wh_50

wKioL1kUPVLBhtYjAADKwTehQeQ444.png-wh_50

wKiom1kUPYSCyfJRAADLcBO28Fk854.png-wh_50

wKioL1kUPZTRIhKlAADPQEebK7M859.png-wh_50

wKioL1kUPayyUMfQAADbo7OmXy0148.png-wh_50

wKiom1kUPcGToyT7AABhNbAd7S4699.png-wh_50 

查看默认侦听器的状态

wKiom1kUPePydYp_AAC_AgFJMbE744.png-wh_50 

查看LISTENER1的状态

wKiom1kUPe_wxwDaAACQ5MmYq60044.png-wh_50 

wKioL1kUPfuTulc_AAAz_Bt2bpc557.png-wh_50 

现在侦听器已经配置好了,如何通过远程客户端连接到oracle服务器呢?

1.2. 远程客户端连接方式

远程客户端连接oracle服务器可以使用以下两个方式:

1.easy connect: conn user/password@ip:port/orcl as sysdba

2.tnsnames: conn user/password@XX

使用easy connect方式远程连接oracle服务器

客户端是win7系统,需要安装oracle客户端程序

wKioL1kUPjDyZuRwAAANi8wBFa8167.png-wh_50 

wKioL1kUPj2TITFtAAAPClxf5V8495.png-wh_50 

删除listener.ora文件中的标识的行

wKiom1kUPkfQfiy2AABw9MM18gI135.png-wh_50 

停止侦听器服务

[oracle@orclsrv admin]$ lsnrctl stop

启动侦听器服务

[oracle@orclsrv admin]$ lsnrctl start

再去连接实例时,就无法连接,提示没有listener.

wKioL1kUPlDwPIezAAAM2H6PT-M181.png-wh_50 

将侦听器还原到没有删除之前的状态,然后重启服务lsnrctl stop/start

 

使用netmgr工具


删除listener1侦听器,单击左侧“X”按钮

wKioL1kUPlzylvkOAABPnVyQC_0634.png-wh_50 

wKioL1kUPoqy3GBQAAA9Tvws3qA118.png-wh_50

wKiom1kUPpSA7Lo1AABgZmXFy8M232.png-wh_50 

可以使用easy connecttnsnames的方式连接

wKiom1kUPp_AcoZ_AAA56YQJcWE353.png-wh_50 

Tnsnames连接方法:<推荐的客户端连接方式> conn user/password@XX

Tnsnames涉及到一个文件:tnsnames.ora是一个客户端的工具,将tnsnames.ora拷贝到oracle客户端安装目录中。

wKioL1kUPrDB0kVRAAAy-d94Puc173.png-wh_50

wKiom1kUPr2T41j-AABRCRnghWY692.png-wh_50 

使用记事本打开tnsnames.ora文件,原始内容如下

wKioL1kUPtPjoJxVAABOWfJez-M340.png-wh_50 

对原始内容中如图所示部分复制并粘贴到tnsnames.ora中的空白位置,进行修改

wKioL1kUPvGxNPycAAAikA2S0Ns859.png-wh_50 

修改为

 wKiom1kUPwjRYOiDAACPtEhFYWc692.png-wh_50

然后保存退出。

连接实例

wKioL1kUPyKyKNwBAAAGBsjW2QQ213.png-wh_50 

使用netmgr添加监听器

wKioL1kUPzqTeqf_AABkLIujlF8138.png-wh_50

wKioL1kUP2WTX-L6AABAT5unUw4362.png-wh_50

wKiom1kUP3aDvxSvAABJAvYsYnQ427.png-wh_50

wKioL1kUP4aSvgV_AABAkf5nVkI471.png-wh_50

wKioL1kUP52Su46uAAAj1Q_5Xy4455.png-wh_50 

使用listener1侦听器连接实例,结果是无法连接到实例,因为实例orcl并没有在listener1侦听器上注册。默认情况下orcl实例注册到了默认的侦听器1521上面,所以目前只能使用1521来连接。

wKioL1kUP7KAcUdtAAAOIty6ddQ745.png-wh_50 

实例注册到侦听器的方法有:

静态注册:在listener.ora文件中手工指定

动态注册:pmon进程每隔一分钟将服务名和实例名注册到侦听器上面

将实例注册到侦听器的方法

 wKiom1kUP9miU2z-AAALYjkZvjg386.png-wh_50

使用alter system register可以将实例注册到侦听器上。这个命令将实例注册到哪个侦听器上了呢?这条命令将实例注册到了默认的侦听器上面了。

wKioL1kUP_agb4z5AACeHJEsKw0347.png-wh_50

wKiom1kUQA-SJghRAAAhzkYY8mE073.png-wh_50 

ORCLtnsnames中的解析名:即使用ORCL就能够解析出(ADDRESS = (PROTOCOL = TCP)(HOST = orclsrv)(PORT = 1521))这个地址。

SQL>alter system set local_listener="(ADDRESS = (PROTOCOL = TCP)(HOST = orclsrv)(PORT = 1521))";alter system set local_listener=ORCL是等价的。

 

将实例注册到listener1上面

SQL>alter system set local_listener="(ADDRESS = (PROTOCOL = TCP)(HOST = orclsrv)(PORT = 1522))";

wKioL1kUQDOD6TZ6AAAWkUjGweE917.png-wh_50 

此时使用默认的侦听器就无法连接到实例了。

wKiom1kUQErQwmWxAACm2SuyCAQ434.png-wh_50 

修改tnsnames.ora中的文件

wKiom1kUQGKQyBlGAABKeOPt_sY691.png-wh_50 

SQL>alter system set local_listener=LISTENER2;

 

系统已更改。

查看实例注册到了哪个侦听器上面:show parameter local

 

 

 

1.3. 管理控制文件

oracle数据库控制文件是非常重要的文件,它是数据库创建的时候自动生成的二进制文件,其中记录了数据库的状态信息,主要包括以下内容

 数据库的名称,一个控制文件只能属于一个数据库

 数据库创建时间

 数据文件的名称、位置、联机、脱机状态信息

 重做日志文件的名称、位置及归档信息

 所有表空间信息

 当前日志序列号

 最近检查点信息

控制文件在数据库启动的Mount阶段被读取,在数据库启动时首先使用默认规则找到并打开参数文件,在参数文件中含有控制文件的位置信息,打开控制文件后,会通过控制文件中记录的各种数据库文件的位置打开数据库,从而启动数据库到可用状态。当成功启动数据库后,在数据库的运行过程中,数据库服务器可以不断的修改控制文件中的内容,所以在数据库被打开的阶段,控制文件必须是可读写的。但是其他任何用户都无法修改控制文件,只有数据库的实例才可以修改控制文件中的信息。

查看控制文件信息,可以从V$controlfile视图中查看控制文件信息,控制文件名称

wKioL1kUQJKze0KrAABegX7fR-Q678.png-wh_50

除了从V$controlfile视图查看控制文件信息外,还可以从V$parameter视图中查看

wKiom1kUQJ7SqEtoAAA1ivpUs6k250.png-wh_50 

如何查看控制文件中所存的内容信息

可以使用V$controlfile_record_section

wKioL1kUQKqi0c8RAAA61G4T3Ao572.png-wh_50 

查看V$controlfile_record_sectiontype,record_size,records_total,records_used

wKiom1kUQLqQwucRAACGZ6-Udro295.png-wh_50 

从截图当中可可以看到控制文件中存放了创建数据库的信息、重做日志信息、数据文件及归档日志文件记录等信息。这些有价值的信息用于数据维护和管理,很多数据字典视图是从控制文件中获得的信息。

1.3.1. 存储多重控制文件

由于控制文件非常重要,所以要求控制文件不能只有一个,通常数据库中控制文件要多于3个,并且存放在不同的磁盘上,这种使用控制文件的方法也称为控制文件的多路复用。实现多重的一个方法就是通过复制控制文件到多个位置并修改初始化参数文件中的CONTROL_FILES参数,使之包含所有控制文件名称。需要注意,当存在多个控制文件时,oracle会同时更新所有的控制文件,但是仅对CONTROL_FILES中所列举的第一个控制文件进行读取操作。

举例说明实现多路复用控制文件的方法:

数据库状态为打开状态,修改SPFILE中的CONTROL_FILES参数wKiom1kUQNTDqjWLAAATmrvRyy8888.png-wh_50

wKioL1kUQN7B9xiRAAAkZq_Ry_c261.png-wh_50 

关闭数据库

wKioL1kUQP_TDAL9AAATeQ2gloA657.png-wh_50

使用操作系统命令将文件复制到新的位置

wKiom1kUQQqgztnmAAAR0vZC0Dk400.png-wh_50 

重新启动实例

wKioL1kUQRbSKLs3AAA4AvLZ0qQ321.png-wh_50

 

1.3.2. 备份控制文件

备份控制文件

为了确保数据库的安全,在数据文件或日志文件位置信息发生变化时,例如新增数据文件到表空间时,对控制文件进行备份。有两种备份方式:备份为二进制文件和备份为脚本文件

举例说明备份为二进制文件的方法:

备份控制文件之前先查看当前系统中存在几个控制文件

wKiom1kUQT3iCjSoAAAxkiMiOWs878.png-wh_50 

备份控制文件

wKiom1kUQUjSJW7_AAATUbdvKRE608.png-wh_50 

修改系统参数文件

wKioL1kUQVPy9lVzAAAXqu3eTwk710.png-wh_50 

关闭数据库之后启动数据库之后报ORA-00214错误,原因是控制文件版本不一致导致的,control01.ctl控制文件版本是817, control02.ctl的版本是806.

wKiom1kUQX2iYLg0AABTTX70MW8339.png-wh_50 

使用control01.ctl覆盖control03.ctl,使得控制文件版本保持一致即可。

wKioL1kUQYfxtRo3AAAMGbR2dp8942.png-wh_50 

关闭数据库

wKioL1kUQZGzrZkAAAASs1u6YUk659.png-wh_50 

在重新启动数据库就可以了

wKiom1kUQZvTBGgzAAA3GLZ3tnI092.png-wh_50 

1.3.3. 恢复控制文件

假设CONTROLD_FILES所指定的控制文件已经损坏,但在数据字典中还能访问控制文件,则可以采用下面的步骤进行恢复:

关闭数据库实例

wKiom1kUQcrT-ggJAAAUNnY-XlI725.png-wh_50 

删除控制文件

wKioL1kUQdXw8lxdAAAOC_UY7A8631.png-wh_50 

启动数据库

wKioL1kUQeDAmsfyAAA0cjJnX_Y262.png-wh_50 

此时数据库的状态是

wKiom1kUQeySit5cAAAROmW0hsc888.png-wh_50 

用操作系统将完好的控制文件覆盖掉损坏的控制文件

wKiom1kUQgnx0tGqAAAUIyV3z88211.png-wh_50 

关闭当前数据库

wKiom1kUQh-z_FHgAAAUIyV3z88891.png-wh_50 

重新启动数据库实例

 wKioL1kUQjjzTQXDAAA3b_hFIoA291.png-wh_50

 

1.4. 管理重做日志文件

重做日志也称联机重做日志。引入重做日志的目的是数据恢复。在数据库运行过程中,用户更改的数据会暂时存放在数据库的高速缓冲区中。为了提高写数据的速度,并不是一旦有数据变化,就把变化的数据写到数据文件中。频繁的读写磁盘文件会使数据库系统效率降低,所以要等到数据库高速缓冲区中的数据达到一定的量或者满足一定的条件时,DBWR进程才会将变化了的数据写到数据文件中。这种情况下如果在DBWR把变化了的更改写到数据文件之前发生了宕机,那么数据高速缓冲区中的数据就会全部丢失。如果在数据库重新启动后无法恢复这部分用户更改的数据,显然是不可以的。

重做日志就是把变化了数据首先保存起来,其中LGWR进程负责把用户更改的数据写到重做日志文件中,这样数据库启动时,数据库系统从重做日志文件中读取这些变化了的数据,将用户更改的数据提交到数据库中,写入数据文件。

为提高磁盘效率和防止重做日志文件的损坏,oracle使用特殊的重做日志文件结构,是由3个重做日志组,每组包含两个重做日志组成员,当第一个日志组写满后,就会停止写入,向第二个日志组写入,第二个日志组写满后,向第二个日志组写入,第三个日志组写满后向第一个日志组写入,oracle使用这种循环方式使用重做日志组。

oracle规定每个数据库至少有两个日志组,每组至少包含一个或多个日志成员。oracle循环的使用重做日志组,当一个重做日志组写满后进行日志切换,切换到它可以找到的其他重做日志组。使用新的重做日志组之前,DBWR进程需要将所有的数据更改写入到数据文件中。如果数据库处于归档模式下,当发生日志切换时,归档进程(ARCH)会把当前已满的重做日志文件中的数据复制到归档日志中。

设计成多个日志成员的目的是在日志组内某个日志文件损坏后及时提供备份,所以同一组的日志成员一般内容信息相同,但是存放位置不同。

1.4.1. 读取重做日志文件信息

数据字典视图V$log记录当前数据库的日志组序号,日志序列号,每个日志文件大小,每个日志组的成员数量,以及日志组的当前状态。

使用V$LOG查看重做日志信息

输出结果有三个日志组,每个日志组分别有一个日志文件。日志组2为当前正在使用的重做日志组,称为当前日组,当前日志文件还没有归档,其他非活动重做日志文件已经归档。

数据字典V$LOGFILE记录了当前日志组号,该日志组的状态、类型和日志组成员信息。

使用V$LOGFILE查看重做日志组信息

其中,status参数的含义如下:

空白:此文件正在使用。

stale:该文件内容是不完整的

invalid:该文件不可以被访问,如刚建立

deleted:该文件已不再有用

根据上面输出结果可以知道,数据库有3个重做日志组,每个日志组有1个重做日志文件。

 

1.4.2. 重做日志组及其成员管理

创建重做日志组:

一个oracle数据库日志组太少,可能导致日志文件切换频繁,影响系统性能,所以有时需要增加新的日志组。如果日志组内只有一个日志成员,为避免损坏则需要增加新的日志成员。

使用v$log查看重做日志信息

wKiom1kUQnngGpdKAAA1iatjo2U503.png-wh_50 

使用v$logfile查看重做日志组信息

wKioL1kUQoTD6k5iAAA295Onda8873.png-wh_50 

创建重做日志组的方法:
wKiom1kUQpLzWCwxAABCxZjs4XY905.png-wh_50

删除重做日志组

wKiom1kUQqGyKL-AAAA2E0iM6NE318.png-wh_50 

添加删除重做日志文件

wKiom1kUQq3Cwu_vAABKqCP8UxI279.png-wh_50 

会发现新添加的日志文件redo33.log是无效状态,三个日志组的日志成员还没有写满,所以redo33.log是无效状态,只要做两次强制日志切换就可以发现是ONLINE状态了

wKioL1kUQrqRO6d9AADgzk7P-S0086.png-wh_50 

删除重做日志文件

wKioL1kUQsXiXaspAAAWFb9MxrM649.png-wh_50 

到操作系统日志文件存放目录上查看是否还存在redo33.log

wKiom1kUQvKRZbNdAAAs-_yTGAY717.png-wh_50 

查看重做日志信息,group 3是当前日志组

wKioL1kUQvyAhf3KAAAxrFlef_0668.png-wh_50 

删除日志组3中的日志文件redo33.log,会发现当前日志组中的日志文件是没有办法删除的

wKiom1kUQwajKjjgAAA6dOTbxa0802.png-wh_50 

强制切换日志后,就可以删除新添加的日志文件了。

wKiom1kUQxCC3_3qAACKd-ICAas345.png-wh_50 

删除重做日志文件的限制条件如下

 不能删除当前组的成员,若要删除则先执行强制性切换重做日志的命令:alter system switch logfile

 活动日志成员不可以删除

 没有归档的日志成员不可删除

 当前日志组中只有一个成员是也不能删除

1.4.3. 日志组切换和检查点事件

日志切换就是停止写当前日志组,转向另一个新的日志组。系统可以自动切换,也可以手动切换。当发生日志切换时,系统会在后台完成检查点操作,以减少实例的恢复时间。

检查点是一个事件,用于减少实例恢复的时间。当检查点发生时,它会出发DBWR进程,把数据高速缓冲区中变化了的数据写入数据文件,同时检查点进程更新控制文件和数据文件头部,保证数据的一致性。检查点其实是一个后台进程,用来保证所有修改过的数据库缓冲区的数据写入数据文件。

检查点事件越频繁,则一旦数据库发生故障,需要数据恢复的重做日志中的数据就越少(因为在恢复时,就不必检查恢复检查点之前的重做日志中的数据),所以就减少实例的恢复时间。

强制日志切换并强制产生检查点事件。

强制日志切换

wKioL1kUQyqhInIaAAANWBxH71g815.png-wh_50 

强制产生检查点事件

wKiom1kUQzWxDF5xAAAQhqNOIN8518.png-wh_50 

 

1.5. 管理归档日志文件

oracle数据库有两种运行方式:归档(ARCHIVELOG)方式和非归档(NO ARCHIVELOG)方式。在非归档模式下,日志切换时直接覆盖以前的重做日志文件,不产生归档日志。数据库在归档方式下运行,在日志切换后,ARCH进程会对已写满的重做日志文件进行存档,默认情况下,oracle采用非归档模式下运行,主要因为归档方式会给系统带来一定的性能问题。只有当数据库运行在归档方式时,ARCH进程才存在。ARCH进程是oracle的可选后台进程,将日志存档,以便保存对数据库的所有更改。这样即使在数据文件磁盘损坏的情况系下,数据库管理员也能将数据库恢复到故障发生时的状态。

 

1.5.1. 配置数据库归档日志

配置数据库归档日志的方式包括以下3个步骤:

查询数据库的归档方式,确定当前不处于归档方式

sys用户作为SYSDBA连接目标数据库,然后执行ARCHIVE LOG LIST命令查看数据库归档模式:

wKiom1kUQ4eRalyuAAAov1xe3eM175.png-wh_50 

关闭数据库并启动数据库到mount状态

wKioL1kUQ5LQ01WMAABIsNnBIZ8425.png-wh_50 

使用ALTER DATABASE ARCHIVELOG命令将数据库设置为归档模式,并验证数据库的归档模式是否改变

wKiom1kUQ6LzgUJmAAA39th7raE352.png-wh_50 

1.5.2. 获取归档日志信息

数据字典视图可帮助用户获取数据库配置信息。用户通过使用V$ARCHIVE_DESTV$ARCHIVE_LOG视图获取归档日志信息

V$ARCHIVE_DEST:显示当前所有归档日志存储位置及其状态

V$ARCHIVE_LOG:显示历史归档日志信息

如何查看所有有效的归档日志文件存储目录

wKioL1kUQ62QQW-lAABHg985KkI907.png-wh_50 

获取已归档的日志文件的信息,归档进程会在每次日志切换后将联机重做日志文件复制到一个归档日志文件,从而生成一串连续的且能用于恢复一个备份的日志文件。这些日志文件的名称和位置由若干初始化参数控制。

wKiom1kUQ7mT1KZLAAA1iQKxtwc537.png-wh_50 

1.6. 数据字典

数据字典是oracle存储关键信息的表和视图的集合。oracle进程会在sys模式中维护这些表和视图,也就是说数据字典的所有者为sys用户,数据存放在system表空间中,数据字典描述了实际数据是如何组织的,如一个表的创建者者信息,创建时间信息,所属的表空间信息,用户访问权限等等。对数据字典可以向处理其他数据库和表或试图一样进行查询,但不能进行任何修改。

oracle数据字典通常是在创建和安装数据库时被创建的。oracle数据字典是oracle数据库系统工作的基础。没有数据字典的支持,oracle数据库系统就不能进行任何工作。

数据字典的构成:数据字典分为数据字典表和数据字典视图。数据字典中的表不可以直接被访问,但是可以访问数据字典中的视图。数据字典视图分为两类:静态数据字典视图和动态数据字典视图。数据字典视图分为两类:静态数据字典视图和动态数据字典视图;

数据字典表:数据字典表中的数据是oracle系统存放的系统数据,而普通表存放的是用户的数据,为了方便的区别这些表,这些表的名称都是用“$”结尾,这些表属于SYS用户。

为了方便用户对数据字典表的查询,oracle对这些数据字典分别建立了用户视图,这样既容易记住,还隐藏了数据字典表之间的关系。

1.6.1. 静态数据字典视图

静态数据字典中的视图分为3类:他们分别有3个前缀构成:USER_*ALL_*DBA_*

USER_*:该视图存储了当前用户的所拥有的对象的信息(即所有在该用户模式下的对象)

ALL_*:该视图存储了当前用户的能够访问的对象的信息(与USER_*相比,ALL_*并不需要拥有该对象,只需要具有访问该对象的权限即可);

DBA_*:该视图存储了数据库中所有对象的信息(前提是当前用户具有访问权限,一般来说必须具有管理员权限)

列举常用的数据字典视图

user_tables:主要描述当前用户所拥有的所有表的信息,主要包括表名,表空间等信息,使用SCOTT用户连接数据库实例,查看SCOTT用户下的所有表的信息。

wKiom1kUQ8PDx4uOAABXY4gpzBk293.png-wh_50 

查看SCOTT用户拥有哪些索引

wKioL1kUQ8-x5ZvbAABEehznRRg029.png-wh_50 

查看SCOTT用户所拥有的数据库对象

 wKiom1kURHzjhPCFAAAllcicleE989.png-wh_50

查看SCOTT用户能够访问的所有表,过程,函数等信息

 wKioL1kURJKiYfz7AAAM5Tfxduk754.png-wh_50

 

查看数据字典:如果需要了解每个视图更多的信息,可以通过DICTIONARY命令来查看所有的视图和其他描述,该表只有两个字段,表名和描述

wKiom1kURBDwtUycAABOWot-mKM787.png-wh_50 

 

1.6.2. 动态数据字典视图及使用

除了静态数据字典中有3类视图,其他的字典视图中主要是V$视图,之所以这样命名是因为这些视图会不断的进行更新,可以以反映出当前实例和数据库的运行状况。动态性能表用于记录当前数据库的活动,只存在于数据库运行期间,实际的信息都取自内存和控制文件。DBA可以使用动态视图来监视和维护数据库。

举例说明动态数据字典的使用

wKioL1kURB3zfKIUAABVS-RkfwQ581.png-wh_50 

从结果中可以看出,当前数据库正在使用的日志组是GROUP 3,数据库运行在非归档模式下,该日志组有一个日志成员,存储目录为/u01/app/oracle/oradata/orcl/,日志文件名为redo03.log