ASM使用的镜像算法并不是镜像整个disk,而是作extent级的镜像。
Normal冗余 :一块以上的磁盘损坏,会导致数据丢失
HIgh 冗余:两块以上的磁盘损坏,会导致数据丢失
创建High冗余度的磁盘组,一个3个failgroup,每个failgroup组下面有2个磁盘。
测试发现
1 每个failgroup组下面,可以删除1个磁盘,剩余1个磁盘
2 每个failgroup组下面,需要保留1个磁盘,是因为只有3个failgroup组,high冗余度必须要有3个failgroup组
3 增加failgroup组为4个,然后将某一个failgroup组里面的磁盘全部删除,这样剩余了3个failgroup组,是可以的。
-- 创建冗余度为high的磁盘组,失败组必须要3个。否则会出错
SQL> create diskgroup test high redundancy
failgroup fa1 disk
'/dev/asm-disk1' name fa1_disk1,
'/dev/asm-disk2' name fa1_disk2
failgroup fa2 disk
'/dev/asm-disk4' name fa2_disk4,
'/dev/asm-disk5' name fa2_disk5 2 3 4 5 6 7 ;
create diskgroup test high redundancy
*
ERROR at line 1:
ORA-15018: diskgroup cannot be created
ORA-15072: command requires at least 3 regular failure groups, discovered only 2
-- 创建ASM磁盘组
SQL> create diskgroup test high redundancy
failgroup fa1 disk
'/dev/asm-disk1' name fa1_disk1,
'/dev/asm-disk2' name fa1_disk2
failgroup fa2 disk
'/dev/asm-disk4' name fa2_disk4,
'/dev/asm-disk5' name fa2_disk5
failgroup fa3 disk
'/dev/asm-disk7' name fa3_disk7,
'/dev/asm-disk8' name fa3_disk8 2 3 4 5 6 7 8 9 10
11 ;
Diskgroup created.
--ASMCMD下查看,已经可以看到创建的TEST磁盘组了。
[oracle@asm dev]$ export ORACLE_SID=+ASM
[oracle@asm dev]$ asmcmd
ASMCMD> ls
DATA/
SBDB1/
TEST/
ASMCMD> cd test
ASMCMD> ls
ASMCMD>
-- 创建一个表空间,表,插入数据
SYS@PROD1>create tablespace test datafile '+test' size 10M autoextend on;
Tablespace created.
SYS@PROD1>create tablespace test datafile '+test' size 10M autoextend on;
Tablespace created.
SYS@PROD1>create tablespace test1 datafile '+test';
Tablespace created.
SYS@PROD1>drop tablespace test1 including contents and datafiles;
Tablespace dropped.
SYS@PROD1>
-- ASMCMD下查看
ASMCMD> ls
TEST.256.961123057
TEST1.257.961123095
ASMCMD> pwd
+TEST/PROD1/DATAFILE
ASMCMD> ls
TEST.256.961123057
ASMCMD>
-- 创建表
SYS@PROD1>create table t1 tablespace test as select * from dba_objects;
Table created.
SYS@PROD1>
SYS@PROD1>select tablespace_name ,owner from dba_tables where table_name='T1';
TABLESPACE_NAME OWNER
------------------------------ ------------------------------
TEST SYS
SYS@PROD1>
SYS@PROD1>select count(*) from t1;
COUNT(*)
----------
96294
SYS@PROD1>
--一共有 3个failgroup组, fa1,fa2,fa3 .
--删除掉fa1失败组 中的一个磁盘
alter diskgroup test drop disk fal_disk1;
SQL> alter diskgroup test drop disk fa1_disk1;
Diskgroup altered.
SQL>
-- 查询
SYS@PROD1>/
COUNT(*)
----------
96294
SYS@PROD1>
-- 删除掉fa1失败组中的另一个磁盘,是不可以的。因为这样只剩下2个失败组了。不符合high冗余度。但是删除第二个失败组里面的一个磁盘,是可以的。同时,删除第三个失败组里面的一个磁盘,也是可以的。
SQL> alter diskgroup test drop disk fa1_disk2;
alter diskgroup test drop disk fa1_disk2
*
ERROR at line 1:
ORA-15067: command or option incompatible with diskgroup redundancy
SQL> alter diskgroup test drop disk fa2_disk4;
Diskgroup altered.
SQL> alter diskgroup test drop disk fa3_disk8;
Diskgroup altered.
--再添加一个failgroup组 ,第四个失败组,这样,就有4个失败组了。就可以把之前的失败组中的一个磁盘删除,这样剩余3个失败组。
SQL> alter diskgroup test add
failgroup fa4 disk
'/dev/asm-disk3' name fa4_disk3,
'/dev/asm-disk6' name fa4_disk6 rebalance power 5 wait; 2 3 4
Diskgroup altered.
SQL>
*/
-- 继续删除fal1里面的diskgroup
SQL> alter diskgroup test drop disk fa1_disk2;
Diskgroup altered.
--删除掉失败组1里面的最后一个磁盘后,剩余3个失败组了
继续查询表,是可以查询的
SYS@PROD1>/
COUNT(*)
----------
96294
SYS@PROD1>/
COUNT(*)
----------
96294
SYS@PROD1>/
COUNT(*)
----------
96294
SYS@PROD1>
End
-- 2019-12-06 add
以下测试,在虚拟机上模拟exadata,测试exadata下的更换磁盘
-- 磁盘情况
磁盘6 7 failgroup是test_normal1
磁盘8 9 failgroup是test_normal2
-- 创建表空间tbs_normal,表t_normal。使用磁盘组TEST_NORMAL 。
create tablespace tbs_normal datafile '+TEST_NORMAL' size 200M autoextend on maxsize 1G;
create table t_normal tablespace tbs_normal as select * from dba_objects;
SYS@exa>create tablespace tbs_normal datafile '+TEST_NORMAL' size 200M autoextend on maxsize 1G;
Tablespace created.
SYS@exa>create table t_normal tablespace tbs_normal as select * from dba_objects;
Table created.
SYS@exa>
SYS@exa>select count(*) from t_normal;
COUNT(*)
----------
75204
SYS@exa>
-- 删除掉磁盘,并查看磁盘的reblance情况。
alter diskgroup TEST_NORMAL drop disk DATA_CD_DISK08_CELL1;
SYS@+ASM>alter diskgroup TEST_NORMAL drop disk DATA_CD_DISK08_CELL1;
Diskgroup altered.
SYS@+ASM>select * from v$asm_operation;
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
3 REBAL RUN 1 1 12 46 42
0
SYS@+ASM>
SYS@+ASM>/
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
3 REBAL RUN 1 1 57 57 51
0
SYS@+ASM>/
no rows selected
SYS@+ASM>
-- 在cell上查看各个状态。其实这个看不出什么,都是正常的。
CellCLI> list physicaldisk '/opt/oracle/cell11.2.3.2.0_LINUX.X64_120713/disks/raw/disk08'
/opt/oracle/cell11.2.3.2.0_LINUX.X64_120713/disks/raw/disk08 /opt/oracle/cell11.2.3.2.0_LINUX.X64_120713/disks/raw/disk08 normal
CellCLI>
CellCLI> list lun '/opt/oracle/cell11.2.3.2.0_LINUX.X64_120713/disks/raw/disk08'
/opt/oracle/cell11.2.3.2.0_LINUX.X64_120713/disks/raw/disk08 /opt/oracle/cell11.2.3.2.0_LINUX.X64_120713/disks/raw/disk08 normal
CellCLI>
CellCLI> list celldisk 'CD_disk08_cell1'
CD_disk08_cell1 normal
CellCLI>
CellCLI> list griddisk 'DATA_CD_DISK08_CELL1'
DATA_CD_disk08_cell1 active
CellCLI>
查询视图查看磁盘的情况,8号磁盘没有了
-- 隔一段时间,将磁盘再加上,在添加磁盘的时候,没有指定failgroup,使用了默认的failgroup名称。
ALTER DISKGROUP TEST_NORMAL ADD DISK 'o/10.10.10.1/DATA_CD_disk08_cell1'
SYS@+ASM>ALTER DISKGROUP TEST_NORMAL ADD DISK 'o/10.10.10.1/DATA_CD_disk08_cell1';
Diskgroup altered.
SYS@+ASM>select * from v$asm_operation;
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
3 REBAL RUN 1 1 2 61 25
2
SYS@+ASM>
SYS@+ASM>/
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
3 REBAL RUN 1 1 58 58 47
0
SYS@+ASM>/
no rows selected
SYS@+ASM>
-- 此时视图查询到的磁盘信息如下:8号磁盘的failgroup是cell1. 因为在添加磁盘的时候,没有指定failgroup。
-- 再次将该盘drop掉,
SYS@+ASM>alter diskgroup TEST_NORMAL drop disk DATA_CD_DISK08_CELL1;
Diskgroup altered.
SYS@+ASM>select * from v$asm_operation;
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
3 REBAL RUN 1 1 26 75 191
0
SYS@+ASM>/
no rows selected
SYS@+ASM>
-- 重新加入,使failgroup和之前一样
ALTER DISKGROUP TEST_NORMAL ADD FAILGROUP TEST_NORMAL2 DISK 'o/10.10.10.1/DATA_CD_disk08_cell1';
END