Oracle 11g R2网络侦听器实验
单实例环境(不是RAC),侦听器和实例必须要在同一台机器上。两台机器通信必须使用一个网络协议才能进行通信,假如浏览网页需要使用http协议,远程连接需要使用RDP/ssh/telnet等等。
有一台oracle服务器,有个客户端要连接到oracle服务器上,两台机器通信就要使用oracleNET协议,和以上的协议是一样的。有协议就要有相应的端口,所以oracleNET有个默认的侦听端口1521.
其实配置oracle网络就是配置oracle侦听器,侦听器很重要,如果没有配置侦听器,客户端是无法连接到oracle服务器上面的。其实即使是在本地连接oracle服务器,侦听器也是必须要运行的。客户端远程连接到oracle服务器时使用oracleNet协议,是被封装到了tcp/ip
协议中。如果是直接在本地连接数据库用的是IPC。IPC是指<进程间的通信>。
侦听器是用来接收外面的请求,在将外面的请求通过服务器进程交给实例,所以实例必须要向侦听器注册。如果监听器不知道有相应的实例肯定是不行的--即让侦听器知道有
实例可以连接。oracle默认侦听器的端口是1521。
侦听器的配置文件存放在:$ORACLE_HOME/network/admin/中的instener.ora是侦听器的配置文件
如果listerner的端口使用默认的1521的话,可以没有listener.ora,但是建议最好不要删除这个文件。
可以通过修改listener.ora来配置侦听器以外,还可以使用其他工具来配置侦听器
1. netca
2. netmgr
使用netca添加侦听器的方法
查看默认侦听器的状态
查看LISTENER1的状态
现在侦听器已经配置好了,如何通过远程客户端连接到oracle服务器呢?
远程客户端连接oracle服务器可以使用以下两个方式:
1.easy connect: conn user/password@ip:port/orcl as sysdba
2.tnsnames: conn user/password@XX
使用easy connect方式远程连接oracle服务器
客户端是win7系统,需要安装oracle客户端程序
删除listener.ora文件中的标识的行
停止侦听器服务
[oracle@orclsrv admin]$ lsnrctl stop
启动侦听器服务
[oracle@orclsrv admin]$ lsnrctl start
再去连接实例时,就无法连接,提示没有listener.
将侦听器还原到没有删除之前的状态,然后重启服务lsnrctl stop/start
使用netmgr工具
删除listener1侦听器,单击左侧“X”按钮
可以使用easy connect和tnsnames的方式连接
Tnsnames连接方法:<推荐的客户端连接方式> conn user/password@XX
Tnsnames涉及到一个文件:tnsnames.ora是一个客户端的工具,将tnsnames.ora拷贝到oracle客户端安装目录中。
使用记事本打开tnsnames.ora文件,原始内容如下
对原始内容中如图所示部分复制并粘贴到tnsnames.ora中的空白位置,进行修改
修改为
然后保存退出。
连接实例
使用netmgr添加监听器
使用listener1侦听器连接实例,结果是无法连接到实例,因为实例orcl并没有在listener1侦听器上注册。默认情况下orcl实例注册到了默认的侦听器1521上面,所以目前只能使用1521来连接。
实例注册到侦听器的方法有:
2 静态注册:在listener.ora文件中手工指定
2 动态注册:pmon进程每隔一分钟将服务名和实例名注册到侦听器上面
将实例注册到侦听器的方法
使用alter system register可以将实例注册到侦听器上。这个命令将实例注册到哪个侦听器上了呢?这条命令将实例注册到了默认的侦听器上面了。
ORCL是tnsnames中的解析名:即使用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))";
此时使用默认的侦听器就无法连接到实例了。
修改tnsnames.ora中的文件
SQL>alter system set local_listener=LISTENER2;
系统已更改。
查看实例注册到了哪个侦听器上面:show parameter local;
oracle数据库控制文件是非常重要的文件,它是数据库创建的时候自动生成的二进制文件,其中记录了数据库的状态信息,主要包括以下内容
数据库的名称,一个控制文件只能属于一个数据库
数据库创建时间
数据文件的名称、位置、联机、脱机状态信息
重做日志文件的名称、位置及归档信息
所有表空间信息
当前日志序列号
最近检查点信息
控制文件在数据库启动的Mount阶段被读取,在数据库启动时首先使用默认规则找到并打开参数文件,在参数文件中含有控制文件的位置信息,打开控制文件后,会通过控制文件中记录的各种数据库文件的位置打开数据库,从而启动数据库到可用状态。当成功启动数据库后,在数据库的运行过程中,数据库服务器可以不断的修改控制文件中的内容,所以在数据库被打开的阶段,控制文件必须是可读写的。但是其他任何用户都无法修改控制文件,只有数据库的实例才可以修改控制文件中的信息。
查看控制文件信息,可以从V$controlfile视图中查看控制文件信息,控制文件名称
除了从V$controlfile视图查看控制文件信息外,还可以从V$parameter视图中查看
如何查看控制文件中所存的内容信息
可以使用V$controlfile_record_section
查看V$controlfile_record_section中type,record_size,records_total,records_used
从截图当中可可以看到控制文件中存放了创建数据库的信息、重做日志信息、数据文件及归档日志文件记录等信息。这些有价值的信息用于数据维护和管理,很多数据字典视图是从控制文件中获得的信息。
由于控制文件非常重要,所以要求控制文件不能只有一个,通常数据库中控制文件要多于3个,并且存放在不同的磁盘上,这种使用控制文件的方法也称为控制文件的多路复用。实现多重的一个方法就是通过复制控制文件到多个位置并修改初始化参数文件中的CONTROL_FILES参数,使之包含所有控制文件名称。需要注意,当存在多个控制文件时,oracle会同时更新所有的控制文件,但是仅对CONTROL_FILES中所列举的第一个控制文件进行读取操作。
举例说明实现多路复用控制文件的方法:
数据库状态为打开状态,修改SPFILE中的CONTROL_FILES参数
关闭数据库
使用操作系统命令将文件复制到新的位置
重新启动实例
备份控制文件
为了确保数据库的安全,在数据文件或日志文件位置信息发生变化时,例如新增数据文件到表空间时,对控制文件进行备份。有两种备份方式:备份为二进制文件和备份为脚本文件
举例说明备份为二进制文件的方法:
备份控制文件之前先查看当前系统中存在几个控制文件
备份控制文件
修改系统参数文件
关闭数据库之后启动数据库之后报ORA-00214错误,原因是控制文件版本不一致导致的,control01.ctl控制文件版本是817, control02.ctl的版本是806.
使用control01.ctl覆盖control03.ctl,使得控制文件版本保持一致即可。
关闭数据库
在重新启动数据库就可以了
假设CONTROLD_FILES所指定的控制文件已经损坏,但在数据字典中还能访问控制文件,则可以采用下面的步骤进行恢复:
关闭数据库实例
删除控制文件
启动数据库
此时数据库的状态是
用操作系统将完好的控制文件覆盖掉损坏的控制文件
关闭当前数据库
重新启动数据库实例
重做日志也称联机重做日志。引入重做日志的目的是数据恢复。在数据库运行过程中,用户更改的数据会暂时存放在数据库的高速缓冲区中。为了提高写数据的速度,并不是一旦有数据变化,就把变化的数据写到数据文件中。频繁的读写磁盘文件会使数据库系统效率降低,所以要等到数据库高速缓冲区中的数据达到一定的量或者满足一定的条件时,DBWR进程才会将变化了的数据写到数据文件中。这种情况下如果在DBWR把变化了的更改写到数据文件之前发生了宕机,那么数据高速缓冲区中的数据就会全部丢失。如果在数据库重新启动后无法恢复这部分用户更改的数据,显然是不可以的。
重做日志就是把变化了数据首先保存起来,其中LGWR进程负责把用户更改的数据写到重做日志文件中,这样数据库启动时,数据库系统从重做日志文件中读取这些变化了的数据,将用户更改的数据提交到数据库中,写入数据文件。
为提高磁盘效率和防止重做日志文件的损坏,oracle使用特殊的重做日志文件结构,是由3个重做日志组,每组包含两个重做日志组成员,当第一个日志组写满后,就会停止写入,向第二个日志组写入,第二个日志组写满后,向第二个日志组写入,第三个日志组写满后向第一个日志组写入,oracle使用这种循环方式使用重做日志组。
oracle规定每个数据库至少有两个日志组,每组至少包含一个或多个日志成员。oracle循环的使用重做日志组,当一个重做日志组写满后进行日志切换,切换到它可以找到的其他重做日志组。使用新的重做日志组之前,DBWR进程需要将所有的数据更改写入到数据文件中。如果数据库处于归档模式下,当发生日志切换时,归档进程(ARCH)会把当前已满的重做日志文件中的数据复制到归档日志中。
设计成多个日志成员的目的是在日志组内某个日志文件损坏后及时提供备份,所以同一组的日志成员一般内容信息相同,但是存放位置不同。
数据字典视图V$log记录当前数据库的日志组序号,日志序列号,每个日志文件大小,每个日志组的成员数量,以及日志组的当前状态。
使用V$LOG查看重做日志信息
输出结果有三个日志组,每个日志组分别有一个日志文件。日志组2为当前正在使用的重做日志组,称为当前日组,当前日志文件还没有归档,其他非活动重做日志文件已经归档。
数据字典V$LOGFILE记录了当前日志组号,该日志组的状态、类型和日志组成员信息。
使用V$LOGFILE查看重做日志组信息
其中,status参数的含义如下:
空白:此文件正在使用。
stale:该文件内容是不完整的
invalid:该文件不可以被访问,如刚建立
deleted:该文件已不再有用
根据上面输出结果可以知道,数据库有3个重做日志组,每个日志组有1个重做日志文件。
创建重做日志组:
一个oracle数据库日志组太少,可能导致日志文件切换频繁,影响系统性能,所以有时需要增加新的日志组。如果日志组内只有一个日志成员,为避免损坏则需要增加新的日志成员。
使用v$log查看重做日志信息
使用v$logfile查看重做日志组信息
删除重做日志组
添加删除重做日志文件
会发现新添加的日志文件redo33.log是无效状态,三个日志组的日志成员还没有写满,所以redo33.log是无效状态,只要做两次强制日志切换就可以发现是ONLINE状态了
删除重做日志文件
到操作系统日志文件存放目录上查看是否还存在redo33.log
查看重做日志信息,group 3是当前日志组
删除日志组3中的日志文件redo33.log,会发现当前日志组中的日志文件是没有办法删除的
强制切换日志后,就可以删除新添加的日志文件了。
删除重做日志文件的限制条件如下
不能删除当前组的成员,若要删除则先执行强制性切换重做日志的命令:alter system switch logfile
活动日志成员不可以删除
没有归档的日志成员不可删除
当前日志组中只有一个成员是也不能删除
日志切换就是停止写当前日志组,转向另一个新的日志组。系统可以自动切换,也可以手动切换。当发生日志切换时,系统会在后台完成检查点操作,以减少实例的恢复时间。
检查点是一个事件,用于减少实例恢复的时间。当检查点发生时,它会出发DBWR进程,把数据高速缓冲区中变化了的数据写入数据文件,同时检查点进程更新控制文件和数据文件头部,保证数据的一致性。检查点其实是一个后台进程,用来保证所有修改过的数据库缓冲区的数据写入数据文件。
检查点事件越频繁,则一旦数据库发生故障,需要数据恢复的重做日志中的数据就越少(因为在恢复时,就不必检查恢复检查点之前的重做日志中的数据),所以就减少实例的恢复时间。
强制日志切换并强制产生检查点事件。
强制日志切换
强制产生检查点事件
oracle数据库有两种运行方式:归档(ARCHIVELOG)方式和非归档(NO ARCHIVELOG)方式。在非归档模式下,日志切换时直接覆盖以前的重做日志文件,不产生归档日志。数据库在归档方式下运行,在日志切换后,ARCH进程会对已写满的重做日志文件进行存档,默认情况下,oracle采用非归档模式下运行,主要因为归档方式会给系统带来一定的性能问题。只有当数据库运行在归档方式时,ARCH进程才存在。ARCH进程是oracle的可选后台进程,将日志存档,以便保存对数据库的所有更改。这样即使在数据文件磁盘损坏的情况系下,数据库管理员也能将数据库恢复到故障发生时的状态。
配置数据库归档日志的方式包括以下3个步骤:
查询数据库的归档方式,确定当前不处于归档方式
以sys用户作为SYSDBA连接目标数据库,然后执行ARCHIVE LOG LIST命令查看数据库归档模式:
关闭数据库并启动数据库到mount状态
使用ALTER DATABASE ARCHIVELOG命令将数据库设置为归档模式,并验证数据库的归档模式是否改变
数据字典视图可帮助用户获取数据库配置信息。用户通过使用V$ARCHIVE_DEST和V$ARCHIVE_LOG视图获取归档日志信息
V$ARCHIVE_DEST:显示当前所有归档日志存储位置及其状态
V$ARCHIVE_LOG:显示历史归档日志信息
如何查看所有有效的归档日志文件存储目录
获取已归档的日志文件的信息,归档进程会在每次日志切换后将联机重做日志文件复制到一个归档日志文件,从而生成一串连续的且能用于恢复一个备份的日志文件。这些日志文件的名称和位置由若干初始化参数控制。
数据字典是oracle存储关键信息的表和视图的集合。oracle进程会在sys模式中维护这些表和视图,也就是说数据字典的所有者为sys用户,数据存放在system表空间中,数据字典描述了实际数据是如何组织的,如一个表的创建者者信息,创建时间信息,所属的表空间信息,用户访问权限等等。对数据字典可以向处理其他数据库和表或试图一样进行查询,但不能进行任何修改。
oracle数据字典通常是在创建和安装数据库时被创建的。oracle数据字典是oracle数据库系统工作的基础。没有数据字典的支持,oracle数据库系统就不能进行任何工作。
数据字典的构成:数据字典分为数据字典表和数据字典视图。数据字典中的表不可以直接被访问,但是可以访问数据字典中的视图。数据字典视图分为两类:静态数据字典视图和动态数据字典视图。数据字典视图分为两类:静态数据字典视图和动态数据字典视图;
数据字典表:数据字典表中的数据是oracle系统存放的系统数据,而普通表存放的是用户的数据,为了方便的区别这些表,这些表的名称都是用“$”结尾,这些表属于SYS用户。
为了方便用户对数据字典表的查询,oracle对这些数据字典分别建立了用户视图,这样既容易记住,还隐藏了数据字典表之间的关系。
静态数据字典中的视图分为3类:他们分别有3个前缀构成:USER_*、ALL_*、DBA_*
USER_*:该视图存储了当前用户的所拥有的对象的信息(即所有在该用户模式下的对象)
ALL_*:该视图存储了当前用户的能够访问的对象的信息(与USER_*相比,ALL_*并不需要拥有该对象,只需要具有访问该对象的权限即可);
DBA_*:该视图存储了数据库中所有对象的信息(前提是当前用户具有访问权限,一般来说必须具有管理员权限)
列举常用的数据字典视图
user_tables:主要描述当前用户所拥有的所有表的信息,主要包括表名,表空间等信息,使用SCOTT用户连接数据库实例,查看SCOTT用户下的所有表的信息。
查看SCOTT用户拥有哪些索引
查看SCOTT用户所拥有的数据库对象
查看SCOTT用户能够访问的所有表,过程,函数等信息
查看数据字典:如果需要了解每个视图更多的信息,可以通过DICTIONARY命令来查看所有的视图和其他描述,该表只有两个字段,表名和描述
除了静态数据字典中有3类视图,其他的字典视图中主要是V$视图,之所以这样命名是因为这些视图会不断的进行更新,可以以反映出当前实例和数据库的运行状况。动态性能表用于记录当前数据库的活动,只存在于数据库运行期间,实际的信息都取自内存和控制文件。DBA可以使用动态视图来监视和维护数据库。
举例说明动态数据字典的使用
从结果中可以看出,当前数据库正在使用的日志组是GROUP 3,数据库运行在非归档模式下,该日志组有一个日志成员,存储目录为/u01/app/oracle/oradata/orcl/,日志文件名为redo03.log
本文出自 “李世龙” 博客,谢绝转载!
原文地址:http://lwm666.blog.51cto.com/11811339/1924691