文章目录
一、引言
在使用asm磁盘进行扩缩容的时候,往往建议新磁盘的大小和就磁盘保持一致(特别是在normal、high级别模式下)。但是,往往由于底层存储、操作系统的一些计量单位误差,可能导致给到我数据库磁盘的大小并不能完全和原磁盘保持一致,从而造成报错。今天,我就在19c数据库遇到了这个问题,那么在主机、存储不介入的情况下,该如何解决问题呢?
二、案例分析
在对某数据库的OCR磁盘进行替换操作,新增磁盘的时候,报了以下错误:
ORA-15410: Disks in disk group OCRDG do not have equal size.
这个报错很明显,就是说ocrdg里的磁盘大小不一致,无法增加。
从操作系统上查看,抽取一块旧磁盘,一块新磁盘,查看大小:
旧盘:
root@uppsdb1:/root]#fdisk -l /dev/sdd1
Disk /dev/sdd1: 5385 MB, 5385486336 bytes, 10518528 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
新盘:
root@uppsdb1:/root]#fdisk -l /dev/sdk1
Disk /dev/sdk1: 5368 MB, 5368315904 bytes, 10484992 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
可以看到旧盘分区大小要比新盘分区大小大17m,而就是这17m的差异,导致我无法将磁盘加入磁盘组。
根据我们扩缩容的原理,确实新的盘比旧盘小是会有分布不均匀、丢数据(或者说空间不足)的风险的,而在oracle数据库中,数据库自身机制帮我们对这个风险做了细致的检查,当出现磁盘不一致的情况下,则会报错不让我们加入磁盘组。
三、解决方案
通常,磁盘大小不一致的情况,我们可以分为两种,一种是旧磁盘比新磁盘大,另一种是旧磁盘比新磁盘小;针对两种情况,我们可以通过以下方式解决。
1.旧磁盘比新磁盘大
我们上面的案例就是这种情况,针对这种情况,主要可以通过以下步骤进行处理。
1.判断磁盘大小是否足够
我们可以通过以下sql,查看磁盘空间的分布,看看每块磁盘的使用量和剩余量
select name,os_mb,total_mb,free_mb,hot_used_mb,cold_used_mb,sector_size from v$asm_disk;
此时,可以从视图中看到,我们的旧ocr磁盘有3块,每块5136M,总共15408M,剩余量最少为4810M,总共14430M左右。而我们新的ocr磁盘也有3块,每块5119M,总共15357M。因此,用来替换是足够的,因此理论上做了替换不会造成任何影响,磁盘大小足够。
2.重新设置旧盘大小
此时,我们则可以对旧盘大小进行resize操作,让其每块磁盘的total_mb等于新盘的os_mb。这里需要注意,我们必须要一次性将所有的磁盘resize,单独resize每一块同样会报错。
单独resize磁盘,报错:
SQL> alter diskgroup ocrdg resize disk OCRDG_0000 size 5119M;
alter diskgroup ocrdg resize disk OCRDG_0000 size 5119M
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15410: Disks in disk group OCRDG do not have equal size.
同时resize所有磁盘,成功:
SQL> alter diskgroup ocrdg resize disk OCRDG_0000 size 5119M,OCRDG_0001 size 5119M,OCRDG_0002 size 5119M;
Diskgroup altered.
检查此时磁盘数据分布情况:
SQL> select name,os_mb,total_mb,free_mb,hot_used_mb,cold_used_mb,sector_size from v$asm_disk;
3.增加新磁盘,进行扩容:
进行新增磁盘操作:
SQL>alter diskgroup ocrdg add disk '/dev/oracleasm/disks/ASM_OCR1','/dev/oracleasm/disks/ASM_OCR2','/dev/oracleasm/disks/ASM_OCR3';
Diskgroup altered.
4.删除旧磁盘,进行缩容:
待磁盘重平衡完成后,进行删盘缩容
SQL> alter diskgroup ocrdg drop disk OCRDG_0000,OCRDG_0001,OCRDG_0002;
Diskgroup altered.
2.旧磁盘比新磁盘大
旧磁盘比新磁盘大的时候,我们基本可以不用关心剩余空间是否足够的问题了,可以直接指定size增加新磁盘即可正常扩缩容。
1.新增磁盘
alter diskgroup ocrdg add disk '/dev/oracleasm/disks/ASM_OCR1' size 5119M,'/dev/oracleasm/disks/ASM_OCR2' size 5119M,'/dev/oracleasm/disks/ASM_OCR3' size 5119M;
2.删除磁盘
SQL> alter diskgroup ocrdg drop disk OCRDG_0000,OCRDG_0001,OCRDG_0002;
Diskgroup altered.
3.resize磁盘
alter diskgroup ocrdg resize disk ASM_OCR1 size 5236M,ASM_OCR2 size 5236M,ASM_OCR3 size 5236M;