数据库物理设计经验谈(二)

六.设置和管理表空间
数据库文件之间的I/O竞争是数据库之大忌, 所以对数据库规划之前要先对数据文件的I/O进行初步的评估, 通常情况下, 应用的产品数据库表所在的表空间会很活跃, 索引表空间和数据字典之类的表空间也很活跃的, 对于事物比较频繁的应用中, 重做表空间也很活跃的, 所以对不同类型的数据库其数据文件的I/O竞争也会略有不同的, 但是基本上还是遵从以下的原则比较好: 应用的表和索引通常应该被分配或分区到多个表空间中, 以降低单个数据文件的I/O, 最好把每一种功能相同的区域对象建立单独的表空间; 没有理由把除数据字典表和系统回退段外的其他东西放到系统表空间中, 要把能移出系统表空间的对象都移出; 索引段不应该和相关表放在同一表空间中, 因为他们在数据管理和查询时会产生很多的并发I/O; 临时表空间是用以存储大量的排序, 所以其它的应用对象是不能放在临时表空间。
以上讲的是数据库文件分布的原理, 原理归原理, 事实应用中, 我们还是以经验来设置分布比较好些, 当然在没有经验之前还是参考原理以致于不会走弯路。
数据库和表空间可以是一对多的关系,表空间和数据文件也可以是一对多的关系,数据文件和数据对象也可以是一对多的关系。当创建一个数据对象(如表或索引) 时,可以通过默认值或特殊命令将其赋予一个表空间,这样就会在该表空间中创建一个段(Segment)来存储与该对象有关的数据。一个段由一些称作区间 (Extent,一组连续的Oracle块)的区段组成,一但现有的区段不能存储数据时,这个段就要获得另一个区间来支持将数据插入到对象中。因此这个段 所使用的空间由它的参数决定的,这些参数可以在创建时指定,也可以在以后更改。如在Create table,Create index,Create cluster,Create rollback segment命令中没有指定存储参数,则数据库会默认它存储所在的表空间的参数,这些参数有initial,next,pctincrease, maxextents,minextents等。在创建后不能修改initial和minextents值,每个表空间的存储参数默认值可以在 Dba_tablespaces视图中查询出来。
磁盘I/O是系统性能的瓶颈,解决好磁盘I/O,可明显提高性能。通过查询V$filestat可以知道每个物理文件的使用频率(phyrds表示每个数据文件读的次数,phywrts表示每个数据文件写的次数)
  SELECT name,phyrds,phywrts FROM V$datafile df,V$filestat fs
  WHERE df.file# =fs.file#;
对于使用频率较高的物理文件,可以采用以下策略: 将I/O尽可能平均分配在尽可能多的磁盘上;为表和索引建立不同的表空间;将数据文件与重做日志文件分离在不同的磁盘上;减少不经Oracle server的磁盘I/O。
如果大家没有经验的情况下不小心把数据文件规划的不恰当, 以致于产生了大量的I/O竟争现象, 那么就要根据上面的原则重新调整数据文件的分布, 以平衡数据文件之间的I/O竟争, 具体如何移动数据文件, 各种数据库的方法不尽相同, 但是基本的原理还是相同的,下面是针对Oracle8i如何移动数据文件的两种方法的举例(9i略有不同):
第一种方法﹕(Alter database)
关闭数据库-移动数据库文件-装载并改名-启动

1> svrmgrl
2> connect internal
3> shutdown
4> exit
5> mv /u/product/oradata/foxmold/user01.dbf /db3/oradata
6> svrmgrl
7> connect internal
8> startup mount foxmold
9> alter database rename file
‘/u/product/oradata/foxmold/user01.dbf’ to
‘/db3/oradata/user01.dbf’
10> alter database open
第二种方法﹕(Alter tablespace)
关闭数据库-移动数据库文件-装载并改名-启动
1> svrmgrl
2> connect internal
3> shutdown
4> exit
5> mv /u/product/oradata/foxmold/user01.dbf /db3/oradata
6> svrmgrl
7> connect internal
10> alter database rename file
‘/u/product/oradata/foxmold/user01.dbf’ to
‘/db3/oradata/user01.dbf’
8> alter database open
上面的foxmold代表当前的database name。

七.设置和管理回滚段
回滚段一般可以处理任意大小的事物,所以也就需要大小不同的回滚段。回滚段的大小是通过创建回滚段时指定存储子句来设置,但一般会遵从下面原则:
OLTP事物特征有许多并发的事物,每个可能只修改少量的数据,可以建立10KB到20KB大小的回滚段,每个有2到4的范围;对于时间很长的查询为了维 护读一致性有大量的回滚信息,所以需要较大的回滚段,建立回滚段的大小最好为最大表的10%左右(大多数查询只影响到表约10%的数据量)。设置回滚段的 大小可以通过Create rollback segment和Alter rollback segment语句来实现。一般情况下,initial=next ,设置Optimal参数来节约空间的使用 ,不要设置maxextents为unlimited,回滚段应创建在一个特定的回滚段表空间内 。
回滚段的目标容量可以用存储参数Optimal来定义,它指定回滚段要缩小到的尺寸。如果发现回滚段由于Optimal的缘故持续地收缩,那么很可能是回滚段设置不恰当,这种可以通过动态性视图V$rollstat来确定是否有问题,如:
SELECT substr(name,1,40) name,extents,resize,aveactive,aveshrink,
extends,shrink FROM V$rollname rn,V$rollstat rs WHERE rn.usn=rs.usn;
结果如下:
name extents resize aveactive aveshrint extents shrinks
----- ------- ------ ------- -------- -------- --------
system 4 202876 0 0 0 0
csirsl 2 202876 55192 0 0 0
如果平均大小接近于Optimal,则Optimal正确,如果extents和shrinks高,则必须增加Optimal值。在设计Optimal值时如果有长时间查询和运行的事物,则应该把Optimal设置大些。
使用回滚段可以改善系统性能,减少竞争,回滚段的多少应该由数据库中的并发事物决定,太多的事物使用一个回滚段时会发生竞争,查看动态性能表V$WAITSTAT可以查看回滚段上是否有竞争:
SELECT class,count FROM V$waitstat WHERE class in(‘undo header’,’undo block’,’system undo header’,’system undo block’);
结果如下:
CLASS COUNT
------------------------------- ---------------
system undo header 0
system undo block 0
undo header 0
undo block 0
然后将这些值和数据请求的总数相比较。数据请求的总数等于V$sysstat中的db buffer gets和consistent gets之和,查询语句为:
SELECT sum(value) ‘Data Requests’ FROM V$systat where name in(‘db block gets’,’consistent gets’);
结果如下:
Data Requests
---------------------------
5105
如果任何一个class/sum(value)>10%,那么考虑增加回退段。回退段的数量一般按如下规律设定:
  用户数          回退段个数
n<16            4
1632<=n           n/4 但不超过50
  和回滚段有关的参数还有: transactions指出并发事物的数量;transcative_per_rollback_segment指出每个回滚段的事物数量。
使用set transaction语句将事物分配到适当大小的回滚段命令如下:
set transcation use rollback segment RBS13;
把当前的事物分配到回滚段RBS13。

八.设置和管理联机重做日志
重做日志的大小也能影响性能,因为数据库的写入和归档取决于重做日志的大小,通常情况下,更大的重做日志文件可以提供好一些的性能,小的能增加检查点的活动和降低频率。
不可能为一个重做日志文件提供特定大小的建议,重做日志文件在几百兆字节到几GB字节都被认为是合理的,根据系统产生的联机重做数量决定日志文件的大小,一般情况下应保持在约20分钟交换日志文件一次。
如果发生重做日志缓冲区竞争,对数据库的性能影响也将是很大的。为了减少重做日志缓冲区竞争,我们可以通过查询V$sysstat表判定redo log 文件缓冲区是否足够。
  SELECT name,value FROM V$sysstat WHERE log space request‘;
  此处value的值应接近于0,否则,应增大初始化参数文件的Log_buffers的值
重做日志文件被创建后大小不能被改变,但是可以增加新的、更大的文件,并且原来的文件能被删除。具体的实现方法如下:
1.假设现有三个日志组,每个组内有一个成员,每个成员的大小为1MB,现在想把此三个日志组的成员大小都改为20MB。
2.创建新的日志群组
alter database add logfile group4(‘d:\oradb\redo04.log’) size 2048k;
alter database add logfile group5(‘d:\oradb\redo05.log’) size 2048k;
3. 切换当前日志到新的日志组
alter system switch logfile;
alter system switch logfile;
4.删除旧的日志
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
5.到操作系统下删除原旧的日志文件组1,2,3中的文件。
6.重建日志组1,2,3
alter database add logfile group 1 ('d:\oradb\redo01_1.log') size 20M;
alter database add logfile group 2 ('d:\oradb\redo02_1.log') size 20M;
alter database add logfile group 3 ('d:\oradb\redo03_1.log') size 20M;
7.切换日志组
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
8.删除中间过渡的日志组4,5
alter database drop logfile group 4;
alter database drop logfile group 5;
9.到操作系统下删除过渡日志文件组4,5中的文件。
10.备份当前最新的控制文件
SQL>connect internal
SQL>alter database backup controlfile to trace resetlogs;
联机重做日志文件也是可以移动的,具体的方法是:首先关闭数据库,移动联机重做日志文件,然后安装数据库,使用alter database命令通知数据库联机重做日志文件的新位置。然后就可以用新位置上的日志文件打开实例。

九.设置和管理归档重做日志
当Oracle以archivelog模式运行时,数据库在每个联机重做日志文件写满后,对它进行拷贝,通常是写入磁盘,也可以写入别的设备,但这需要人 为的干预的。arch后台执行归档功能,如果有大量频繁的事物的时候,会产生重做日志文件磁盘方面的竞争,避免这种竞争的方式是将联机重做日志文件分布到 多个磁盘上。为了提高归档的性能,可以创建具有多个成员的联机重做日志文件组,但是必须考虑到每个设备的I/O。
归档重做日志文件不应与system、rbs、data、temp、indexes表空间等存储在同一个设备中,更不能与任何的联机重做日志文件存储在同一个设备中,以免发生磁盘的竞争。
归档重做日志文件备份之后是可以删除或移走的,否则会占据比较大的空间影响硬盘使用和降低系统的性能。

十.设置和管理控制文件
控制文件的位置在实例初始化参数文件中指定的,若要移动控制文件,必须先关闭数据库实例,移动控制文件,编辑初始化参数文件,然后重新启动该实例。
下面就以Oracle8i为例说明如何移动控制文件:
OS为Linux,Database为Oracle8i。
1. 查询当前数据库的控制文件的位置
SELECT * FROM v$controlfile;
2. 把控制文件/u/oradata/foxmold/control01.ctl
移到/db4/oradata/目录下。
3. svrmgrl
4. connect internal
5. shutdown
6. exit
7. cp /u/oradata/foxmold/control01.ctl /db4/oradata/control01.ctl
8. chmod 660 /db4/oradata/control01.ctl
9. initsid.ora control_files=…
10. startup mount foxmold
上面的foxmold代表当前的database name。

十一.总结
以上是针对Oracle数据库来对数据库物理设计作以简单陈述, 针对各种不同的数据库可能会略有不同, 但是整体思想还是一致的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15688952/viewspace-661721/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15688952/viewspace-661721/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值