Oracle文件系统的历史

Oracle文件系统发展历程:

  • 操作系统—数据文件

  • 裸设备(不通过操作系统,直接通过磁盘设备的驱动访问磁盘)很少使用
    例如:

    1. create tablespace lkhr
    2. datafile '/dev/rac_hr' size 60G; -- 直接访问/dev中的设备,文件路径变成了设备名,而不是dbf文件路径


优点:读取速度比数据文件要快
缺点:一个表空间就需要一个设备,造成资源浪费,且没有数据文件方便管理。

  • ASM:Oracle自己的文件系统,既不用操作系统的文件系统,也不用直接的裸设备

  • OCFS(Oracle Cluster File System):oracle的集群文件系统,是集群共享的

OCFS、ASM都是可以共享访问的,但是OCFS更像操作系统的文件系统,但是ASM只能通过ASM的工具进行访问。

实际中,ASM的稳定性、性能等要比OCFS更好,所以即使是Rac,也一般会使用ASM。

ASM概述

ASM的优点:

  • 提供高效率的存储管理(比基于操作系统的数据文件的效率要高)
  • 提供完整的集群文件系统和卷管理能力

一个ASM可以为多个实例(单服务器上安装多实例、RAC多实例等都可以)提供服务。

CRS也有这个功能,一个Rac架构中,多个实例之间可以通过CRS实现共享。

listenter监听器也可以为多个实例提供服务。

ASM实例

ASM也是实例,包括内存架构和后台进程。

内存分为:

  • Fixed Area
  • Variable Area
  • ASM Cache

单服务器架构下的后台进程分为:

  • DBW0
  • LGWR
  • CKPT
  • SMON
  • PMON
  • VKTM
  • PSP0
  • MMAN
  • RBAL
  • GMON
  • X000
  • DIAG
  • DIA0

RAC架构下,ASM会多出几个后台进程:LMON、LMS0、LMD0、LCK0、DIAG、MARK、KATE等

ASM实例由自己的初始化参数,位于:$ORACLE_HOME/dbs/spfile+ASM.ora

ASM不需要控制文件。

ASM实例的正常状态为started,没有mountopen状态。

ASM的部分初始化参数:

*.asm_diskgroups='DG_LOG','DG_DATA'
*.asm_diskstring='/dev/rdsk/c*'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.user_dump_dest='/oracle/product/admin/+ASM/udump'
*.background_dump_dest='/oracle/product/admin/+ASM/bdump'
*.core_dump_dest='/oracle/product/admin/+ASM/cdump'

ASM磁盘组

有些大型企业会将Oracle实例和磁盘存储分开,例如某公司购买了7块磁盘存储,使用ASM进行管理,则ASM可以先对磁盘进行分组:

第1组:用来存放索引等数据量少一些的数据,分配2块磁盘

第2组:用来存放业务数据,数据量较大,分配4块磁盘

第3组:用来存放redo日志、归档日志、控制文件等小文件,分配1块磁盘。

磁盘组中创建的文件,可以跨越磁盘组内部的磁盘,但是不能跨越磁盘组。

例如在第1组中创建的表空间数据文件,可以同时使用磁盘2和磁盘2,但是不能跨越到第2个磁盘组中。

添加和删除设备

磁盘组操作:

-- 创建一个磁盘组
-- 服务器上新插入了多块硬盘,先将这些硬盘做成1个逻辑卷,然后将这个逻辑卷创建一个磁盘组
create DiskGroup diskGroup1
external redundancy
disk '/dev/oracleasm/disks/VOL1'; -- 逻辑卷

-- 删除一个磁盘组
drop DiskGroup diskGroup1
including contents;

ASM数据的再分布Rebalancing:ASM中添加或删除设备时,是不需要关闭数据库的,而且设备数量变更后,ASM可以自动对数据做一个平衡,将数据均匀分布在这些磁盘上。

存储的增加和删除时进行rebalance:

 -- 添加一个磁盘存储
alter DiskGroup diskGroup1
add disk '/dev/oracleasm/disks/VOL2'
rebalance power 0;

-- 移除一个磁盘存储
alter DiskGroup diskGroup1
drop disk 'DISKGROUP1_0002'
rebalance power 0;

-- 对磁盘组进行rebalance
alter DiskGroup diskGroup1
rebalance power 1;

Rebalance特点:

  • rebalance操作不会影响数据库的正常使用(但是会影响I/O效率)
  • 能通过数据的重新分布,使系统的I/O得到最大的提升
  • 从Oracle10R2之后,如果关闭数据库实例,Rebalance操作会更快

ASM数据冗余 Redundancy

ASM支持三种冗余方式:

  • 外部冗余:(大多数企业使用的方式)表示Oracle不会帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术;有效磁盘空间是所有磁盘设备空间的大小之和
  • 常规冗余:(默认方式)表示Oracle提供2路镜像来保护数据,会损失一部分磁盘空间用于数据冗余
  • 高冗余:表示Oracle提供3路镜像来保护数据,会损失更多磁盘空间用于数据冗余

常规冗余的两路镜像互为冗余。并不是将一块磁盘完整备份到另一个磁盘上,而是向其中一个磁盘写入数据时,将这个数据也在另一个磁盘上写入,是数据层面的冗余,不是整个磁盘的冗余。

ASM日常管理操作

使用sqlplus连接上ASM:

# 将实例切换成ASM实例
export ORACLE_SID=+ASM

# 使用sqlplus进行链接
sqlplus /nolog

sqlplus中启动ASM:

-- 启动asm
-- asm只是一个实例,状态不需要mount、open,只需要started
startup nomount;
-- 使用不加参数的startup命令也可以启动,oracle会在ASM启动到started状态后就自动停止,不再继续mount、open

-- 查看实例名称
select instance_name,status from v$instance;

查看相关进程:

# 查看oracle后台进程
ps -ef | grep ora_

# 查看ASM后台进程
ps -ef | grep asm

常用视图:

-- 查看asm的磁盘组的大小、可用大小等信息
select * from v$asm_diskgroup;

-- 查看asm每一个disk的大小、剩余空间等信息
select * from v$asm_disk;

-- 查看有哪些视图的名称(该sql查的是system表空间,所以需要在oracle实例查,在asm实例上查不了)
select table_name from dict where table_name like '%ASM%';

asm管理的磁盘内容在操作系统下是不可见的(特别是裸设备),使用oracle自带的asm命令行管理工具可以查看:

# 进入asm命令行管理界面(需要先设置ORACLE_SID实例)
asmcmd

# 退出asmcmd
exit

asmcmd提供了一些和操作系统很像的命令:cd(进入路径)、du(查看文件夹大小)、find( 查找)、help(查看帮助)、ls(显示文件)、lsct(显示连接到asm的实例)、lsdg(查看diskgroup相关信息)、mkalias(建别名)、mkdir(建路径)、pwd(查看路径)、rm(删除路径)、rmalias(删除别名)

查看给ASM的磁盘:

# 查看分配给ASM的磁盘
fdisk -l

# 操作系统命令查看不到这些磁盘
df -h

ASM的启停:

启动时,应该先启动ASM实例,再启动数据库实例;

停止时,应该先停止数据库实例,再停止ASM实例。

ASM的关闭:

使用sqlplus连接到ASM的实例后,进行关闭

-- asm不存在数据一致性。检查点等问题,可以直接使用abort参数关闭
shutdown abort;

数据字典视图

ASM视图 ASM实例 DB实例
v$asm_client 用磁盘组管理asm实例的db实例的数据行 DB实例中每个磁盘组的数据行
v$asm_diskgroup
v$asm_diskgroup_stat
asm实例所有磁盘的数据行 安装或非安装的磁盘组的数据行
v$asm_disk
v$asm_disk_stat
磁盘运行的统计数据 磁盘组中磁盘数据行
v$asm_file 磁盘组中数据文件等活动的记录 无数据
v$asm_operation 运行中活动的记录 无数据
v$_asm_alias 所有安装的磁盘组的别名 无数据