目录
oracle10G,11G...环境
一、oracle数据库的启动关闭
oracle数据库的启动涉及一系列的文件读取和数据一致性检查等操作,但首先启动数据库实例(lnstance),在这个过程数据库获取一些内存空间,并启动必需的后台监控进程。启动流程涉及3个状态。
- NOMOUNT状态:打开数据库实例(lnstance),读取参数文件(一些缓冲大小、内存等参数)
- MOUNT状态:oracle根据参数文件找到控制文件位置,并打开控制文件读取控制文件中的参数(数据文件、日志文件位置等),此时不打开数据文件。
- OPEN状态:打开数据文件 并 进行一系列检查工作,这些检查工作用于数据恢复
DBA权限下 启动、更改数据到3个状态(进入sqlplus操作):
从数据库关闭状态启动到3个状态的命令
startup nomount;
startup mount;
startup; (open状态)由nomount切换到mount:alter database mount;
由nomount或mount切换到open:alter database open;
关闭数据库的几个参数及含义
shutdown nomal:正常安全关闭方式,是默认关闭方式。在这种关机方式下,数据库服务器必须等待所有客户端从Oracle中正常退出时,才可以关闭数据库。可能因为连接的存在耗时很长才能关闭数据库
shutdown immediate:相对NORMAL方式较快且安全关闭数据库,DBA常用的一种方式。统将连接到数据库的所有用户尚未提交的事务全部回退,中断连接,然后关闭数据库
shutdown transactional:数据库必须等待所有的客户运行的事务结束,提交或回退
shutdown abort:一种数据不完全的关闭方式,系统立即将数据库实例关闭,对事务膛数据完整性不作检查。是最快的关机方式
数据库启动过程记录在告警追踪文件中,名为:alert_orcl.log
查看告警追踪文件存放路径的参数:show parameter background_dnmp_dest;
4. 受限状态[restricted]
在受限状态下,可以保证在做维护的操作时,没有其他的用户更改数据库.也可以通过命令修改.命令如下:
alter system [enable|disable] restricted session;
在受限状态下可以kill session.
这个命令是由进程监控进程来完成的,主要的操作是回滚用户当前事务;释放在表和行上的锁;释放用户占有的内存的资源.
5. 只读状态
在这个状态下,可以完成的操作有:查询;在线或离线数据文件,而不是表空间;完成离线的表空间或数据文件的恢复;可以使用临时表空间排序.
二、参数、控制文件和数据库启动
1. 数据库启动和控制文件的关系
oracle数据库控制文件是一个重要的二进制文件,记录了数据库的重做日志和数据文件的名字和位置、归档重做日志的历史等。控制文件在数据库启动到MOUNT状态时被读取。由于其重要性建议多重存储到不同磁盘(3个以上实现冗余可用性)
数据库启动文件读取顺序:
启动数据库实例读取参数文件 ---> 打开控制文件 ---> 打开数据文件、日志文件open数据库
过程:根据参数文件找到控制文件,根据控制文件找到数据、日志文件等
为控制文件安全:建议多重存储到不同磁盘(3个以上实现冗余可用性)
2. 相关查询、指令语句
查询控制文件位置及大小:
select name,value from v$parameter where name='control_files';
show parameter control_files;
select * from v$controlfile;查看控制文件中存放内容:
select * from v$controlfile_record_section
很多字典视图就是从控制文件中获得数据的查看参数文件名及路径:
show parameter pfile; --传统pfile(init.ora)
show parameter spfile; --二进制文件,不能直接修改,通过指令修改
参数文件有传统pfile(init.ora)文件和spfile文件两种
3. 移动控制文件实现多重(冗余)控制文件,存在不同磁盘位置。一个控制文件损坏不影响数据库启动
使用spfile文件时移动控制文件(进入sqlplus操作)
1)alter system set control_files='/opt/oracle/oradata/orcl/control01.ctl', '/orabak/disk2/control02.ctl', '/orabak/disk3/control03.ctl' scope=spfile; --更改3个控制文件存放3个不同的地方
2)shutdown immediate; --关闭数据库
3)startup; --启动数据库
4)show parameter spfile; --验证是否使用spfile启动数据库
5)select * from v$controlfile; --验证控制文件修改结果
4. 控制文件备份恢复
alter database backup controlfiles to '/orabak/disk4/xxx.ora'; --备份控制文件
alter database backup controlfile to trace as '/opt/oracle/flash_recovery_area/ORCL/autobackup/hbkcontrol.log';--备份controlfile,这条命令会把控制文件的信息转存出来,包括数据文件信息等等,然后就可以查看到控制文件中的信息了。此处转储为.log文件
恢复控制文件略...
三、重做日志管理
1. 重做日志文件结构
1)oracle引入重做日志的原因:数据恢复。属于日志写优先机制。
2)重做日志文件结构
日志组1(日志文件1、日志文件2、日志文件3)
日志组2(日志文件1、日志文件2、日志文件3)
日志组3(日志文件1、日志文件2、日志文件3)
生产数据库一般至少3个重做日志组,每个组多于3个日志文件成员(每个日志成员大小相同,多个日志文件实现冗余提高安全性、可用性)。日志组之间写满一个后切换到下一个日志组,如此循环使用。
归档模式下:重做日志文件切换时,进行重做日志文件归档。
2. 读取日志文件信息,归档模式
select * from v$log; --查看日志组号、日志序列号、每个日志文件大小、每个日志组成员数量、日志组状态等信息
select * from v$logfile; --查看日志组文件路径,状态等archive log list; --查看数据库是否归档模式
--设置归档模式步骤(oracle 1oG以后版本)
1)shutdown immediate; --关闭数据库
2)startup mount; --启动mount状态
3)alter database archivelog; --更改数据库为存档模式
4)alter database open; --更改打开数据库--查看存档终点参数的值
show parameter DB_RECOVERY_FILE_DEST;
3. 重做日志组、日志组成员的管理
1)添加、删除日志组
alter database add logfile group 4('/oracle/redo/redo4a.log','/oracle/redo/redo4b.log'); --指定参数group的值添加重做日志组,括号中为日志组成员
alter database add logfile('/oracle/redo/redo5a.log','/oracle/redo/redo5b.log'); --不指定参数group的值添加重做日志组,括号中为日志组成员
--删除重做日志组时注意,当前的重做日志组和ACTIVE状态的重做日志组都无法删除,如果要删除当前在用的日志组,必须先进行日志切换。另外使用指令删除重做日志组会留下垃圾文件,就是说删除了重做日志组后,作为重做日志组成员的操作系统文件还存在,需要使用操作系统指令删除掉这些垃圾文件
alter database drop logfile group 4,group 5; --删除重做日志组4和5。2)添加、删除日志组成员
alter database add logfile member '/oracle/redo/redo1a.log' to group 1,'/oracle/redo/redo2a.log' to group 2; --向重做日志组1和2中添加日志成员
注:无论是否是当前正在使用的重做日志组,都可以添加重做日志成员。如果添加的日志成员已经存在,则需要使用REUSE参数。alter database drop logfile member '/oracle/redo/redo5a.log'; --删除重做日志组成员,然后操作系统级别去删除残留文件
注:删除重做日志组成员的一些限制:
1)如果要删除的日志成员是重做日志组中最后一个有效的成员,则不能删除。
2)如果该日志组当前正在使用,在日志切换前不能删除该组中的成员。
3)如果数据库正运行在ARCHIVELOG模式,并且要删除的日志成员所属的日志组没有被归档,该组中的日志成员不能被删除。3)重设联机重做日志的大小
oracle没有提供直接修改联机重做日志大小的方法,而是需要先删除该日志文件所在的日志组,然后再重建日志文件,通过这种方式间接地设置联机重做日志的大小。
4)清除联机重做日志
归档模式时,如果重做日志组中日志成员损坏不能归档,使得数据库无法归档挂起,可以清除联机重做日志:alter database clear logfile group n;
注:使用清除联机重做日志文件指令后,已经删除的重做日志组中重做日志的序列号变为0,所以此时需要做数据库的全备份,因为oracle在进行数据库恢复时,需要连续的序列号。5)强制日志切换和强制产生检查点事件
alter system switch logfile; --强制性产生重做日志文件切换
alter system checkpoint; --强制性产生校验点事件6)归档模式下归档重做日志就是联机重做日志的脱机备份。
四、归档日志管理
注意数据挂起的可能情况:
1)写重做日志出现等待事件可能造成数据库挂起。
2)不能重写重做日志文件数据库会挂起。
3)归档目录空间不足数据库会挂起。
归档直观讲就是重做日志的备份。数据库运行在归档模式下,归档设置要合理。归档模式的好处是保证数据库发生介质故障时可以完全恢复数据库,虽然介质故障的现象不同,恢复的方法也有差异,但是基本原理就是使用备份的数据和归档日志实现数据库的完全恢复。(rman备份与恢复)
重做日志及归档的工作过程:
【Log buffer日志缓冲区】--lgwr进程-->【Redo log】--Arch进程-->【Archived log】
1. 设置为归档模式
archive log list; --查看数据库是否归档模式
--设置归档模式步骤(oracle 1oG以后版本)
1)shutdown immediate; --关闭数据库
2)startup mount; --启动mount状态
3)alter database archivelog; --更改数据库为存档模式
4)alter database open; --更改打开数据库
--查看默认归档目录
show parameter DB_RECOVERY_FILE_DEST;
注:归档目录可以自定义,最多可以30个,实现冗余归档备份。归档进程在之前的版本是不能在启动为归档模式后自动启动的,需要手动启动。--关闭归档模式步骤(oracle 1oG以后版本)
1)shutdown immediate; --关闭数据库
2)startup mount; --启动mount状态
3)alter database noarchivelog; --更改数据库为非归档模式
4)alter database open; --更改打开数据库
2. 设置归档进程与归档目录
show parameter log_archive_max_processes; --查看最大归档进程数
alter system set log_archive_max_processes=4; --修改最大归档进程数,提高并发进程数可提升归档效率show parameter log_archive_dest; --查看归档目录相关参数
alter system set log_archive_dest_1='location=/oracle/archive/ mandatory'; --自定义设置归档目录
show parameter log_archive_dest_1; --查看log_archive_dest_1参数的归档目录
mandatory参数:强制该目录下的归档日志写成功,否则对应的重做日志文件不能被重新使用(数据库可能挂起)。
optional参数:即使该归档目录对应的重做日志没有向该目录写成功,所对应的重做日志文件依然可以重新使用。
mandatory和optional参数不指定的情况下默认使用的optional参数当然不设置mandatory参数的情况下,受log_archive_min_succeed_dest参数默认值1的影响,也至少会保证有一个归档目录必须归档成功。
show parameter log_archive_min_succeed_dest; --设置最小必须归档成功的目录数量,默认值1
alter system set log_archive_min_succeed_dest=3; --更改最小必须归档成功的目录数,设置这个参数时不能大于实际设置好的归档目录数另注意两个参数:只需要一个归档目录可设置log_archive_dest参数,如果需要主备两个目录可设置log_archive_dest和log_archive_duplex_dest参数
log_archive_format--此参数可以设置归档文件的格式show parameter log_archive_format; --查看log_archive_format参数的默认值
select * from v$archive_dest; --查看归档目录状态等
alter system set log_archive_dest_state_1=defer; --修改log_archive_dest_1归档目录状态为defer(该目录被临时禁制)