Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259665
  • 博文数量: 70
  • 博客积分: 2120
  • 博客等级: 大尉
  • 技术积分: 820
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 10:52
文章分类

全部博文(70)

文章存档

2012年(2)

2011年(53)

2010年(6)

2009年(1)

2008年(8)

我的朋友

分类: Oracle

2010-11-09 08:48:01

保证数据库安全 在硬盘上合理放置重做日志文件
    摘要:在Oracle数据库中,重做日志文件是同数据文件一样重要的文件。数据文件存储着用户操作数据库的最后结果。而重做日志文件还保存着数据中间修改的过程。为此可以利用重做日志文件用来修复任何时刻的数据,只要这个重做日志文件完整。

    在Oracle数据库中,重做日志文件是同数据文件一样重要的文件。数据文件存储着用户操作数据库的最后结果。而重做日志文件还保存着数据中间修改的过程。为此可以利用重做日志文件用来修复任何时刻的数据,只要这个重做日志文件完整。另外,用户在更新数据的时候,会同时更新重做日志文件。所以这个重做日志文件又跟数据库的性能息息相关。故无论从哪个角度出发,给重做日志以足够多的关注,都是值得的。这里以“在硬盘上合理放置重做日志文件”这个角度,来谈谈管理重做日志文件的一些技巧。

一、将重做日志成员放到不同的硬盘上

    如果Oracle数据库采用的是归档模式,即当覆盖下一个重做日志文件的时候需要对目标重做日志文件进行归档,此时最好将重做日志成员放置到不同的硬盘中去。因为在日志切换的过程中,LGWR进程需要向重做日志文件保存数据,而ARCH进程则需要对重做日志文件成员进行归档。为此在日志切换的过程中,如果他们在同一个硬盘上的话,就会发生对重做日志成员争夺的现象,从而降低数据库的性能。为此最好将重做日志成员与归档的日志文件放到不同的硬盘上。如在归档模式下,有三个重做日志成员,同时也会有归档的日志文件。此时如果有多快硬盘的话,那么就可以将重做日志成员与归档的日志文件分开来存放。如此LGWR进程(向重做日志成员中写入信息)与ARCH进程(向归档日志文件中写入信息)就不会产生争夺重做日志成员的现象了。这主要是从提高数据库性能的角度出发。

二、将同一组的成员存放在不同的硬盘上

    如果存放重做日志文件的硬盘发生了故障,重做日志文件无法读取,此时后续的恢复工作就无法进行。即使有数据库备份的话,数据库也只能够恢复到备份的那一点。而不能够恢复到故障的那一点上。所以说,如果重做日志文件出现了损坏,那对于数据库恢复来说,是一种灾难性的后果。为此数据库管理员的一大任务就是保障重做日志文件的安全性。在Oracle数据库中,通过重做日志文件复用可以提高重做日志文件的安全性。

    在讲这个技术之前,各位可以先来回顾一下磁盘阵列(RAID5)的技术。几块硬盘可以组成一个磁盘这列。这几块硬盘之间相互为镜像。当其中某块硬盘损坏的话,则仍然可以通过可用的硬盘来修复数据。不过当同时损坏两块硬盘(这个几率可能同中500万的几率相当)则硬盘中的数据将无法修复。其实重做日志复用也是类似的道理。在系统中可能有四个重做日志文件,其中两个文件为一组。同一个组内的日志文件互为镜像。当同一个组内的某个重做日志文件(在多路复用重做日志文件中将这个重做日志文件叫做成员)发生故障时,数据库仍然可以向另外一个没有问题的重做日志成员写入信息,并利用其来恢复数据库。可见其可以在很大程度上保障重做日志文件的安全性。但是其有一个前提,就是同一个组内的成员(重做日志文件)要保存在不同的硬盘上。如此的话,某块硬盘发生故障时,也不会影响另外一块硬盘上的重做日志成员,数据库仍然可以正常运行、正常恢复等等。所以,如果采用了多路复用重做日志的话,最好将同一组中的成员存放到不同的硬盘上,以提高重做日志文件的安全性。可建议这么做,主要是从数据库的安全性上考虑。

    另外需要注意的是,在同一个组内的组成员(其实就是保存在硬盘上的两个独立文件)大小必须一致。即每个重做日志文件组中的成员必须有相同的大小。否则的话,就不能够进行同步的日志切换,也无法相互为镜像。不过不同组之间的成员大小可以不相同。此时LGWR进程往重做日志文件中写信息的话,是以组为单位,即同时往同一个组内的各个成员写入信息。此时,如果将各个成员都放置在不同的硬盘中,就可以降低硬盘的I/O冲突,从而提高数据库的性能。所以说,将同一个组的成员放置在不同的硬盘上,不但可以提高重做日志文件的安全性,而且还可以提高数据库的性能。一举两得,是一笔比较划算的买卖。

三、不要将重做日志文件与比较活跃的表空间放置在一起

    只要涉及到数据库的更新操作,包括数据更新与数据库结构的更新,数据库系统都需要往重做日志成员中写入相关的信息。所以说,这个重做日志成员所在的硬盘,其读写操作非常的频繁。如果其所在的硬盘,还存放在其他经常需要读取的数据,那么这个硬盘的I/O争用现象就会比较突出,从而降低数据库的性能。

    为此不要将重做日志文件与比较活跃的表空间放置在一起。如在Oracle数据库中,索引表空间就是一个很活跃的表空间。在查询、更改时都需要用到这个表空间。为此最好不要将重做日志文件与索引表空间放置在同一个硬盘上,以避免硬盘I/O冲突而降低数据库的性能。只要有足够的硬盘,将他们放置在不同的硬盘上,就可以明显降低硬盘的冲突,从而提高数据库的性能。如可以将重做日志文件放置在一块单独的硬盘上,那么就可以最大限度的提高重做日志文件的吞吐量,从而提高数据库的性能。在一些大型的数据库应用上,硬件上的投资是有限的。或者说,想比性能的提升来说,硬件上的投资是廉价,或者说是优化数据库性能的一个捷径。另外对于一些事务性的数据库系统来说,撤销表空间也是一个很活跃的表空间,重做日志文件最好也不要跟撤销表空间放在同一块硬盘上。

四、数据文件与重做日志文件要放到不同的硬盘上

    一般情况下需要将数据文件与重做日志文件分开存放到不同的硬盘。这有两个原因。一方面是出于安全的考虑,即鸡蛋不要放在一个篮子里的原因。如果将他们放在同一块硬盘上,当这块硬盘损坏的话,重做日志文件与数据文件同时无法读取,那么数据库中的数据就无法读取,从而给企业带来巨大的损失。相反,如果将数据文件与重做日志文件放在不同的硬盘上,即使数据文件所在的硬盘发生了故障,数据库无法读取这块硬盘中的文件。那么数据库系统仍然可以通过另一块硬盘上的重做日志文件来恢复数据。所以说,将重组日志文件与数据文件保存在不同的硬盘上,可以提高数据库的安全性。

    另一方面,也可以避免他们之间的磁盘争用。当数据库运行满足某个条件时, LGWR进程会像重做日志文件中写入记录,同时数据库也会像数据文件中写入信息。此时如果数据文件与重做日志文件都在同一块硬盘上,那么无疑他们之间就会发生一种硬盘资源的争用。要知道内存虽然没有硬盘那么大,但是硬盘与外界通信的口子很小,在这个口子上进程会发生I/O冲突。为此在同一时间同时更新同一块硬盘中的两个文件,那么就很容易造成竞争。也就是说,另一个进程需要等待这进程完成后才能够向硬盘中写入文件,这就好像车站买票。虽然票足够,但是售票的窗口就那么几个,必须要排队。如果这种竞争现象比较严重的话,那么就会在枕大程度上给数据库的性能带来负面的影响。所以说,将重做日志文件与数据文件存放在不同的硬盘上,以减少向数据文件写入数据库块和向重做日志文件写入重做记录之间出现的竞争。

    可见,在合适的硬盘上存放重做日志文件,主要是提高数据库的安全和优化数据库的性能。说句实话,跟其他一些数据库优化的手段,特别是SQL优化相比,这多硬盘的策略,可以说是最简单的、也是最便捷的方式之一。即使数据库管理员不了解其幕后的真正原理,只要按照上面的建议做,也可以很明显的优化数据库的性能,同时也提高了数据库的安全。故对于数据库优化来说,这是推荐的优选策略。

阅读(999) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~