Oracle11g RAC下ASM 的管理与维护


一,  基本维护  :  

注意: 以下除OS之外的命令及过程基本都可以通过ASMCA中的ASM相关操作以及
Oracle Enterprise Mananger 来管理 .


1. 查看ASM磁盘及磁盘组 :

--SQL查看有哪些磁盘组 .
[root@rac01 ~]# su - grid
[grid@rac01 ~]$ sqlplus "/as sysasm"

SQL> select group_number , name , state, type from v$asm_diskgroup ;

GROUP_NUMBER NAME STATE TYPE
------------ ------------------------------ ----------- ------
1 OCR_VOTE MOUNTED EXTERN
2 ORADATA MOUNTED EXTERN
3 ORAFLASH MOUNTED EXTERN

通过一些字段total_mb及free_mb 等可以看出磁盘组的空间使用情况.



-- 通过SQL语句查看ASM磁盘
SQL> set line 2000
SQL> select group_number, name,failgroup, path from v$asm_disk;

GROUP_NUMBER NAME FAILGROUP PATH
------------ ---------- -------------- ----------------------------------------------------------------
2 ASMDATA01 ASMDATA01 ORCL:ASMDATA01
3 ASMDATA02 ASMDATA02 ORCL:ASMDATA02
1 OCR_VOTE01 OCR_VOTE01 ORCL:OCR_VOTE01

通过group_number可以将磁盘与磁盘组联系起来(一个磁盘组可以对应多个磁盘). 这里
可以看到磁盘OCR_VOTE01对应OCR_VOTE磁盘组, 磁盘ASMDATA01对应ORADATA
磁盘组, 磁盘ASMDATA02 对应ORAFLASH 磁盘组 (建议名称一致比较好) 。



--通过asmcmd查看磁盘组(每个磁盘组表现为一个目录) :
[root@rac01 ~]# su - grid
[grid@rac01 ~]$ asmcmd
ASMCMD> ls -al
State Type Rebal Name
MOUNTED EXTERN N OCR_VOTE/
MOUNTED EXTERN N ORADATA/
MOUNTED EXTERN N ORAFLASH/
备注 : 或者 ASMCMD> lsdg



-- 通过OS下oracleasm 命令查看ASM磁盘 .
[root@rac01 bin]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
OCR_VOTE01






2. 认识ASM相关路径 :

通过asmcm 命令可以看到ASM会根据dbca时制定的datafile路径, 在ORADATA磁盘组
下面建立一些默认的路径 (一般是 db_name 下ARCHIVELOG/ , CONTROLFILE/,
DATAFILE/ , ONLINELOG/ , PARAMETERFILE/ , TEMPFILE/ , 目录都是大写, 其
中后面小写的arch是用户自己建的, SYS字段为Y的都是系统自建的, N是用户定义
的 )

[root@rac01 bin]# su - grid
[grid@rac01 ~]$ asmcmd
ASMCMD> ls
OCR_VOTE/
ORADATA/
ORAFLASH/
ASMCMD> cd oradata
ASMCMD> ls
RACDB/
ASMCMD> cd racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y ARCHIVELOG/
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N arch/
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265
N redo01.log => +ORADATA/RACDB/ONLINELOG/group_1.258.739387273
N redo02.log => +ORADATA/RACDB/ONLINELOG/group_2.259.739387281
N redo03.log => +ORADATA/RACDB/ONLINELOG/group_3.266.739393547
N redo04.log => +ORADATA/RACDB/ONLINELOG/group_4.267.739393547
N spfileracdb.ora => +ORADATA/RACDB/PARAMETERFILE/spfile.268.739393555
ASMCMD>


--归档路径ARCHIVELOG :

通过oracle数据库参数文件看到归档路径 :
SQL> show parameter log_archive_dest
log_archive_dest_1 string LOCATION=+ORADATA/RACDB/arch
可以看到归档路径 " +ORADATA/RACDB/arch " , 那么 +ORADATA/RACDB/ARCHIVELOG
下面又是保存的什么文件呢 ?

ASMCMD> pwd
+oradata/racdb/arch -- 查看参数中的归档路径
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N 1_204_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_28/thread_1_seq_204.478.768441403
N 1_205_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_205.481.768443221
N 1_206_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_206.482.768443233
N 1_207_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_207.483.768443239
N 1_208_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_208.485.768443253
N 1_209_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_209.486.768443277
N 1_210_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_210.487.768443293
N 1_211_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_211.489.768443319
N 1_212_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_212.490.768511059
N 1_213_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_213.493.768512249
N 1_214_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_214.494.768512253
N 1_215_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_215.499.768522885
N 1_216_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_30/thread_1_seq_216.500.768530093
N 2_100_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_100.488.768443301
N 2_101_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_101.491.768511059
N 2_102_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_102.492.768511065
ASMCMD>
用户自己定义的归档格式以及归档路径指向ASM自动建立的目录及文件, 自定义生成的
归档相当于快捷方式(或软连接), 实际文件为ASM默认路径的归档文件。


也可以手工为Oracle ASM Filename 生成别名:
ALTER DISKGROUP ORADATA ADD ALIAS
'+oradata/racdb/datafile/test01.dbf'
FOR '+oradata/racdb/datafile/TEST.340.740166807' ;




ASMCMD> pwd
+oradata/racdb/ARCHIVELOG --查看ASM系统自己默认的归档路径
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y 2011_11_28/
Y 2011_11_29/
Y 2011_11_30/

归档文件是按照每天来进行存储的 , 并且有目录分开 .

ASMCMD> cd 2011_11_29/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_205.481.768443221
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_206.482.768443233
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_207.483.768443239
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_208.485.768443253
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_209.486.768443277
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_210.487.768443293
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_211.489.768443319
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_212.490.768511059
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_213.493.768512249
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_214.494.768512253
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_1_seq_215.499.768522885
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_2_seq_100.488.768443301
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_2_seq_101.491.768511059
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_2_seq_102.492.768511065
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_103.495.768522877
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_104.496.768522879
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_105.497.768522883
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_106.498.768522883
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_2_seq_99.484.768443235
ASMCMD>




--控制文件路径 CONTROLFILE :
ASMCMD> cd racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265

查看初始化参数文件位置, 实际文件也是类似软链接方式 :
SQL> show parameter control

NAME TYPE VALUE
------------------------------------ ----------- ----------------------------
control_files string +ORADATA/racdb/control01.ctl,
+ORADATA/racdb/control02.ctl

如何增加控制文件呢 ? 例子如下:
SQL> alter database mount database;
SQL> alter database backup controlfile to '+ORADATA/racdb/control02.ctl';
SQL> alter database backup controlfile to '+ORADATA/racdb/control03.ctl';
SQL> alter system set control_files='+ORADATA/racdb/control01.ctl','+DATA/racdb/control02.ctl','+DATA/racdb/control03.ctl'

scope=spfile;
SQL> startup mount





--数据文件路径 DATAFILE :

ASMCMD> pwd
+oradata/racdb/datafile
ASMCMD>
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.317.754072293
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.318.754072319
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.319.754072331
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.320.754072345
N BASE_DATA01.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.317.754072293
N BASE_DATA02.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.318.754072319
N BASE_DATA03.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.319.754072331
N BASE_DATA04.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.320.754072345
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOGMNRTS.321.754072935
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.322.754072961
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.323.754072985
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.324.754073009
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.325.754073035
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => SYSAUX.261.754063795
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => SYSTEM.263.754063787
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y +ORADATA/RACDB/DATAFILE/undotbs101.dbf =>

UNDOTBS1.260.758741005
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => UNDOTBS2.258.754063807
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => UNDOTBS3.257.754063809
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => USERS.256.754063811

可以看出链接的名称及对应的实体文件名称都出现在 datafile目录下, 当然并
不是每个实体文件都有一个对应的链接的文件名称, 例如初始建立数据库的
时候指定 +ORADATA 磁盘组后, 数据库会自动建立初始数据文件, 那时候的
文件就只有系统生成的, 而没有用户指定的名称(链接名称) , 例如上面例子中
的 LOGMNRTS.321.754072935 , SYSTEM.263.754063787 等 .

在加入datafile或建立表空间时, 如果只是指定 +ORADATA, 而不明确写出路径
及文件名称 , 那么就会生成系统自建文件而没有链接名称, 如果文件使用类似
' +ORADATA/racdb/datafile/mytbs01.dbf ' , 那么就会生成系统自建文件及对应的
链接文件 . 同样可以利用ALTER DISKGROUP XX ADD ALIAS 增加别名.

----------------------------------------------------------------------------
-- 认识文件名
BASE_DATA.317.754072293 是表空间名+文件编号.Incarnation .

+group/dbname/file type/tag.file.incarnation 格式中分别是磁盘组名, file type是Oracle
文件类型, tag一般对一个表空间名, file.incarnation 结合在一起确保唯一性.
----------------------------------------------------------------------------


测试 : 新增数据文件或表空间

CREATE TABLESPACE MYTBS DATAFILE
'+ORADATA/racdb/datafile/mytbs01.dbf' SIZE 10M AUTOEXTEND OFF
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 5M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;

或者

CREATE TABLESPACE TONYTBS DATAFILE
'+ORADATA' SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE 1024M
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 5M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;

增加数据文件
ALTER TABLESPACE MYTBS ADD DATAFILE
'+ORADATA' SIZE 10M AUTOEXTEND OFF ;


如果设置了初始化参数db_create_file_dest(默认为空),连磁盘组名都不
需要写了,例如:
SQL> show parameter db_create_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +ORADATA

SQL> ALTER TABLESPACE MYTBS ADD DATAFILE SIZE 10M AUTOEXTEND OFF ;
ablespace altered.

Tips :
对于现有系统想迁入ASM存储,最简单的方式,莫过于使用RMAN了

3个语句建立完毕后, 查看系统文件:
[root@rac01 ~]# su - grid
[grid@rac01 ~]$
[grid@rac01 ~]$ asmcmd
ASMCMD> ls
OCR_VOTE/
ORADATA/
ORAFLASH/
ASMCMD> cd oradata/racdb

ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y MYTBS.504.768590521
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y MYTBS.505.768590741
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y SYSAUX.261.739387301
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y SYSTEM.260.739387283
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TEST.340.740166807
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TEST.341.740166937
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TONYTBS.506.768590761
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y UNDOTBS1.262.739387315
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y UNDOTBS2.264.739387351
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y USERS.265.739387361
N mytbs01.dbf => +ORADATA/RACDB/DATAFILE/MYTBS.504.768590521
N test01.dbf => +ORADATA/RACDB/DATAFILE/TEST.340.740166807
N test02.dbf => +ORADATA/RACDB/DATAFILE/TEST.341.740166937

我们可以看到, mytbs01 指定了路径 '+ORADATA/racdb/datafile/mytbs01.dbf' , 所以
显示时既有mytbs01.dbf, 也有对应的 MYTBS.504.768590521 , 新加入的 MYTBS表
空间文件只是写了 '+ORADATA' , 生成文件为 MYTBS.505.768590741 , 同样建立
的TONYTBS也是, 对应文件为 TONYTBS.506.768590761 , 没有链接文件 .

修改数据文件大小 (与文件系统操作相似) :
ALTER DATABASE DATAFILE '+DATA/wsjdell/datafile/users.256.754063811' RESIZE 200M;


对于归档目录及数据文件目录, 还有一个比较关心的问题就是空间问题, 我们如
何来判断磁盘组需要加入新的磁盘或新建磁盘组来满足数据增长呢 ?

ASMCMD> pwd
+oradata/racdb/datafile
ASMCMD> du
Used_MB Mirror_used_MB
2949 2949

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 465 0 465 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3999 0 3999 0 N ORAFLASH/

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL> select name , total_mb, free_mb,cold_used_mb from v$asm_diskgroup ;
NAME TOTAL_MB FREE_MB COLD_USED_MB
------------------------------ ---------- ---------- ------------
OCR_VOTE 10236 9840 396
ORADATA 10236 465 9771
ORAFLASH 4094 3999 95

可以看到通过asmcmd 及 asm 实例中的 sql 语句查询出来的 free_mb(或Usable_file_MB)
大小是一致的 .

表空间的使用情况需要通过数据库SQL或辅助工具(如Toad)来进行查看.




--在线日志文件路径 ONLINELOG

ASMCMD> pwd
+oradata/racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y ARCHIVELOG/
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N arch/
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265
N redo01.log => +ORADATA/RACDB/ONLINELOG/group_1.258.739387273
N redo02.log => +ORADATA/RACDB/ONLINELOG/group_2.259.739387281
N redo03.log => +ORADATA/RACDB/ONLINELOG/group_3.266.739393547
N redo04.log => +ORADATA/RACDB/ONLINELOG/group_4.267.739393547
N spfileracdb.ora => +ORADATA/RACDB/PARAMETERFILE/spfile.268.739393555
ASMCMD> cd onlinelog
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_1.258.739387273
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_2.259.739387281
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_3.266.739393547
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_4.267.739393547

和其他关键文件一样, 在建库的时候手工指定了目录 +oradata/racdb , 所以毕竟
好辨认的名称 redo01.log, redo02.log 等都以链接名称方式存在 .

Redo logfile的冗余设置可以设置在不同的磁盘组上, 比如 ORADATA和ORAFLASH .
加入冗余组的方式和文件系统下一样(唯一的区别是不能在file上加括号, 如果只加入
一个member的话 ) .

alter database add logfile member '+ORAFLASH' to group 1 ;
alter database add logfile member '+ORAFLASH' to group 2 ;
alter database add logfile member '+ORAFLASH' to group 3 ;
alter database add logfile member '+ORAFLASH' to group 4 ;

加入后查询 v$logfile 可以看到每组2个成员 .

ASMCMD> cd +oraflash
ASMCMD> ls
RACDB/
ASMCMD> cd racdb
ASMCMD> ls
ONLINELOG/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ONLINELOG UNPROT COARSE NOV 30 20:00:00 Y group_1.256.768602255
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_2.257.768603599
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_3.258.768603683
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_4.259.768603705

加入一个redo log group .
alter database add logfile group 5 ('+ORADATA' , '+ORAFLASH') size 50M ;


SQL> select member from v$logfile;
MEMBER
--------------------
+ORADATA/racdb/redo01.log
+ORADATA/racdb/redo02.log
+ORADATA/racdb/redo03.log
+ORADATA/racdb/redo04.log
+ORAFLASH/racdb/onlinelog/group_1.256.768602255
+ORAFLASH/racdb/onlinelog/group_2.257.768603599
+ORAFLASH/racdb/onlinelog/group_3.258.768603683
+ORAFLASH/racdb/onlinelog/group_4.259.768603705
+ORADATA/racdb/onlinelog/group_5.508.768604159
+ORAFLASH/racdb/onlinelog/group_5.260.768604161

10 rows selected.
SQL>



--参数文件路径 PARAMETERFILE (DB参数文件, 非ASM实例参数文件)

ASMCMD> pwd
+oradata/racdb/parameterfile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PARAMETERFILE UNPROT COARSE NOV 30 17:00:00 Y spfile.268.739393555
ASMCMD>



--临时文件路径 TEMPFILE

ASMCMD> cd tempfile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
TEMPFILE UNPROT COARSE NOV 30 17:00:00 Y TEMP.263.739387321






3. 扩充磁盘组大小

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 414 0 414 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/

通过lsdg或v$asm_diskgroup视图我们发现磁盘组空间可能不够了, 那么我们
是新加入一个磁盘组呢, 还是在原来磁盘组基础上加入新的磁盘呢 ? 为了
更好的得到I/O性能 , 一般采用在磁盘组中加入新的磁盘 . ASM磁盘组支持
动态扩展,我们可以向现有的磁盘组动态加入新的磁盘,新磁盘加入后,Oracle
通过后台RBAL进行Rebalance,将当前的数据均衡到新增加的磁盘上。Drop磁
盘亦会Rebalance。

asm_power_limit 参数用于控制Rebalance的速度,取值1~11,power表示启动的
rebalance的进程RBAL的个数数字越大,平衡速度越快,默认值是1。但是该数
字越大,可能因为Rebalance而影响性能, 一般为了平衡, 设置为 3~6之间。


加入新磁盘后, 假设为 /dev/sde, /dev/sdf , fdisk 划分分区为 /dev/sde1, /dev/sdf1 .

[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov 30 23:04:08 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter asm_power_limit

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_power_limit integer 1

SQL> alter system set asm_power_limit=5 ; -- 修改power值 .
System altered.
或者使用
ALTER DISKGROUP diskgroupname REBALANCE POWER 5 ;

-- 查看已有的磁盘 .
SQL> select group_number, name from v$asm_disk order by 1;

GROUP_NUMBER NAME
------------ ------------------------------
0
1 OCR_VOTE01
2 ASMDATA01
3 ASMDATA02


-- 查看已有的磁盘组 .
SQL> select group_number, name from v$asm_diskgroup order by 1 ;

GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE
2 ORADATA
3 ORAFLASH


创建新磁盘:
[root@rac01 ~]# /usr/sbin/oracleasm createdisk ASMDATA03 /dev/sde1
Writing disk header: done
Instantiating disk: done

[root@rac01 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

其他节点上:
[root@rac02 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...

[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

新磁盘ASMDATA03 需要加入到 ORADATA 磁盘组中:

[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL> ALTER DISKGROUP ORADATA ADD DISK 'ORCL:ASMDATA03' ;
Diskgroup altered .

或者( 需要在初始参数指定 ASM_DISKSTRING = '/dev/*' )
SQL>ALTER DISKGROUP ORADATA ADD DISK '/dev/sde1' name ASMDATA03 ;

速度还是非常快的(可能是没有多少数据需要在各磁盘间转移), 大家可以
找一些大的测试库进行不同power值时的速度及性能测试 . 注意完毕后将
asm_power_limit 值修改为默认的 1 .
SQL> alter system set asm_power_limit=1 ;
System altered.


-------------------------------------------------------------------------
注意, 如果扩容的磁盘组是Normal Redundant 的, 那么还需要failure group.
修改及新增磁盘组相关的语句类似 (需要设置初始参数ASM_DISKSTRING='/dev/*'):
具体参考:
http://docs.oracle.com/cd/E11882_01/server.112/e18951/asmdiskgrps.htm#CHDHHABI

一个磁盘组成failgroup (Normal):
ALTER DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/sde1' NAME ASMDATA05
FAILGROUP fg2 DISK '/dev/sdf1' NAME ASMDATA06 ;

一个磁盘组成failgroup (High):
create diskgroup data2 high redundancy
failgroup fg1 disk '/dev/raw/raw3' name d2a
failgroup fg2 disk '/dev/raw/raw4' name d2b
failgroup fg3 disk '/dev/raw/raw5' name d2c;

多个磁盘组成failgroup (Normal):
CREATE DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP controller1 DISK
'/dev/diska1',
'/dev/diska2',
'/dev/diska3',
'/dev/diska4'
FAILGROUP controller2 DISK
'/dev/diskb1',
'/dev/diskb2',
'/dev/diskb3',
'/dev/diskb4';

语法:
CREATE DISKGROUP diskgroup_name
[ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ]
[ FAILGROUP failgroup_name ]
DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ] ...;
-------------------------------------------------------------------------




可以通过v$asm_operation视图来查看正在进行的操作 .
--------------------------------------------------------------------------
这里有几点要注意:
(1), 首先 sqlplus登入需要 sysasm角色, 因为sysdba只能查看, 不能修改.
(2), add disk 后接的磁盘信息为 'ORCL:XXX' , XXX是listdisks看到的ASM磁盘label .
如果只是 add disk 'XXX' 会报错.
(3), 同样 add disk 后面直接写 '/dev/sde1' 也是不行的, 会报权限错误.
--------------------------------------------------------------------------

通过asmcmd 查看磁盘组空间扩展情况 :
[root@rac02 ~]# su - grid
[grid@rac02 ~]$
[grid@rac02 ~]$ asmcmd
ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN Y 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
ASMCMD>
可以看到ORADATA 磁盘组的 Total_MB变成了30G (30709M), 显然是
成功加入了20G 的 /dev/sde1 .

删除磁盘组中的磁盘(同样也需要设置power值来使RBAL速度加快) :
SQL> ALTER DISKGROUP ORADATA DROP DISK 'ASMDATA03' ;
Diskgroup altered.

如果执行后立刻查看的话, 可能ORADATA磁盘组大小不会变, 需要观察
v$asm_operation视图来查看正在进行的操作, 完毕后才会变化, 执行drop
命令后不等待和等待3分钟后查看的结果如下:

ASMCMD> lsdg -- 马上查看(大小没有变化)
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN Y 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
ASMCMD>
ASMCMD> lsdg -- 等待3分钟后查看 (当然数据量大的话等待时间更久)
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 223 0 223 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
可以看到 ORADATA 的total_mb 又变回 10G了 .

如希望ALTER DISKGROUP语句完成所有工作才返回用户控制权的话,可在执行时附加
REBALANCE WAIT子句,这样该语句就会等待自动平衡的操作,直接所有操作完成才
返回结果,当然在等待期间,如果你改主意了不愿意继续等待,CTRL+C中断即可获得
控制权,此时平衡的操作不受影响,会在后台继续进行。

ASMCMD> lsdsk -- ASMDATA03 磁盘消失.
Path
ORCL:ASMDATA01
ORCL:ASMDATA02
ORCL:OCR_VOTE01

注意 DROP DISK 只是将ASMDATA03 从磁盘组中删除 :
[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

--------------------------------------------------------------
备注:
(1), 也可以只对某个diskgroup设置rebalance power, 比如:
alter diskgroup ORADATA rebalance power 8 ;
(2), 或者在命令中设置
alter diskgroup ORADATA add disk 'ORCL:ASMDATA03' rebalance power 8;
alter diskgroup ORADATA drop disk 'ASMDATA03' rebalance power 8;
--------------------------------------------------------------


需要注意的是, add 及 drop之后都需要等待一些时间再做针对此磁盘
或磁盘组的动作, 否则可能报错, 或者观察v$asm_operation 来查看事务.
如下:
SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
2 REBAL RUN 8 8 173 6680 741
8

隔一段时间再次查看(直到相关事务从此视图消失) :

SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
2 REBAL RUN 8 8 2674 6677 1028
3

SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE
------------ ----- ---- ---------- ---------- ---------- ---------- ----------
EST_MINUTES ERROR_CODE
----------- --------------------------------------------
2 REBAL RUN 8 8 6458 6663 1254
0

SQL> select * from v$asm_operation ;
no rows selected



由于前面提到的ASM自动平衡的特性,上述语句返回后并不代表磁盘已经被删
除,此时后台可能由于正忙碌地执行着IO重平衡的工作,因此如果在这个时候,
DBA忽然意识到操作失误,其实磁盘并不需要被删除,那也可以马上
通过alter diskgroup dgname undrop disks语句来取消删除的操作,例如:

SQL> alter diskgroup ORADATA undrop disks;
Diskgroup altered.

  只要删除操作还没有真正完成,任务就会被取消,否则的话,上述语句
也挽回不了什么了,如果希望挽回,那DBA只能再通过ADD语句将该磁盘重
新加入到磁盘组了。





4. 增加新的磁盘组

-- 查看已有的磁盘 .
SQL> select group_number, name from v$asm_disk order by 1;
GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE01
2 ASMDATA01
2 ASMDATA03
3 ASMDATA02

-- 查看已有的磁盘组 .
SQL> select group_number, name from v$asm_diskgroup order by 1 ;

GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE
2 ORADATA
3 ORAFLASH

创建新磁盘 (/dev/sdf1):
[root@rac01 ~]# /usr/sbin/oracleasm createdisk ASMDATA04 /dev/sdf1
Writing disk header: done
Instantiating disk: done

[root@rac01 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
ASMDATA04
OCR_VOTE01

其他节点上:
[root@rac02 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "ASMDATA04"

[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
ASMDATA04
OCR_VOTE01

开始建立磁盘组(这里是external模式, 具体语法参考文档) :

在节点1 上建立新的磁盘组:

SQL> CREATE DISKGROUP ORAINDX EXTERNAL REDUNDANCY
DISK 'ORCL:ASMDATA04' ;

SQL> select group_number, name from v$asm_diskgroup ;
GROUP_NUMBER NAME
------------ ------------------------------
1 OCR_VOTE
2 ORADATA
3 ORAFLASH
4 ORAINDX

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files

Name
MOUNTED EXTERN N 512 4096 1048576 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
MOUNTED EXTERN N 512 4096 1048576 10236 10186 0 10186 0 N ORAINDX/
ASMCMD>

可以看到在节点1上都生效了. 但是其他节点没有生效(lsdg, lsdsk都看不到),
需要手工挂载新磁盘组 .

SQL> ALTER DISKGROUP ORAINDX MOUNT ;
Diskgroup altered.

在其他节点上查看即可以看到了 :
SQL> select name from v$asm_diskgroup;
SQL> select name from v$asm_disk;
ASMCMD> lsdsk
ASMCMD> lsdg



5 , 删除磁盘组

语法:drop diskgroup gpname, 如果删除的diskgroup非空的话,直接执行上述
语句会报错,这时候可以通过附加including contents子句,来自动删除该磁盘
组中包含的文件。删除磁盘组的操作会自动修改spfile中ASM_DISKGROUPS
初始化参数的值(如果使用了SPFILE的话) .

-- Tips :
如果删除的是文件的话,其关联的别名(Alias)也会被自动删除。
SQL> alter diskgroup asmdisk2 drop file '+ASMDISK2/repdb/datafile/temp01.dbf';
Diskgroup altered.






二 , ASM 实例相关


1. ASM 相关的权限及角色

安装Grid Infrastructure时候的常用用户及组:
Grid Infrastructure 操作系统用户grid , 主组为oinstall, 辅助组为asmadmin, asmdba, asmoper
Oracle RAC 操作系统用户 oracle , 主组为oinstall , 辅助组为dba, oper , asmdba

11g release2中oracle建议独立地管理Grid Infrastructure和ASM实例 .

OSASM(asmadmin)用户组
如果使用ASM,我们必须创建osasm(asmadmin)用户组,该OSASM用户组的成员将被赋予
SYSASM权限,以满足组成员管理Oracle Clusterware和 ASM的权限需求。

OSDBA for ASM group(asmdba)用户组
OSDBA(asmdba)用户组的成员将被赋予读写访问ASM文件的权限。GI/CRS拥有者用户和
所有oracle数据库软件的拥有者必须是该组的成员。同时所有OSDBA(dba)用户组的成员也
必须是asmdba组的成员。

OSOPER for ASM(asmoper)用户组
asmoper和osoper类似都是额外的可选择创建的用户组,创建该独立的用户组以满足赋予
用户一套受限的ASM实例管理权限(ASM的SYSOPER角色),该权限包括了启动和停止ASM
实例,默认情况下OSASM(asmadmin)组成员将拥有所有SYSOPER的ASM管理权限。

grid用户单独安装集群,比如包括asm实例,监听资源,节点资源等
oracle用户就只安装oracle代码

# groupadd oinstall  
# groupadd asmadmin   
# groupadd asmdba
# groupadd asmoper  
# groupadd dba
# groupadd oper

#useradd -g oinstall -G asmadmin,asmdba,asmoper grid
#useradd -g oinstall -G dba, oper, asmdba oracle

具体代表含义参考 :
http://www.oracledatabase12g.com/archives/oracle-installation-os-user-groups.html

用户组 所属该组的用户 用户组描述
oinstall grid, oracle Oracle Inventory and Software Owner
dba oracle Database Administrator
asmadmin grid Oracle ASM Group
asmdba grid, oracle ASM Database Administrator Group
asmoper grid ASM Operator Group
oper oracle Database Operator

如果对oracle用户没赋予asmdba组的话,则会导致oracle用户认不到diskgroup,
启动对应节点实例失败。

---------------------------------------------------------------------
备注 :
Oracle10g中还是使用sysdba管理asm实例,Oracle11g中使用一个新角色sysasm, 专用于
管理asm, 相当于针对asm实例的sysdba角色。 在Oracle11g RAC 中以grid用户登入后 , 以
sysdba登入也是可以查看asm实例相关的状态, 但是不能做变更, sysasm 角色连接后才
可以。
---------------------------------------------------------------------





2. ASM 实例

ASM 实例与 ORACLE 数据库实例差不多, 都是由SGA和后台进程组成, 区别在于
oracle实例管理的是数据库,而asm实例只管理ASM磁盘组. 这里grid用户是属于
asmadmin组, 用于管理ASM,

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@rac01 ~]$ORACLE_SID=+ASM1 (一般不用,因为grid用户下只有一个ASM实例)
[grid@rac01 ~]$ env | grep ORA
ORA_NLS11=/u01/grid/11.2.0/nls/data
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/grid/crs
ORACLE_TERM=vt100
ORACLE_HOME=/u01/grid/11.2.0

[grid@rac01 ~]$ sqlplus / as sysasm
SQL*Plus: Release 11.2.0.1.0 Production on Sat Dec 3 07:13:39 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string +ASM1

以grid用户身份, 连接到ASM实例 , 使用sysdba 及 sysasm 角色都可以,
以sysdba登入也是可以查看asm实例相关的状态 , 但是不能做变更,
sysasm 角色连接后才可以 .


A. ASM实例开启及关闭
同样的, ASM 实例也可以 startup nomount / mount / open / force .
nomount : 只是启动实例 ;
mount / open : 启动实例及加载磁盘组, open和mount一样 ;
force : 先执行shutdown abort , 然后再startup ;

测试 :
[grid@rac01 ~]$ sqlplus / as sysasm
SQL> startup nomount
ASM instance started
Total System Global Area 120023424 bytes
Fixed Size 2082208 bytes
Variable Size 102775392 bytes
ASM Cache 25165824 bytes

SQL> select name,state from v$asm_diskgroup;
NAME STATE
------------------------------ -----------
ASMDISK1 DISMOUNTED
ASMDISK2 DISMOUNTED

SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
+ASM1 STARTED

然后加载磁盘组,注意,不是alter database:

SQL> alter diskgroup all mount;
Diskgroup altered.

SQL> select name,state from v$asm_diskgroup;
NAME STATE
------------------------------ -----------
ASMDISK1 MOUNTED
ASMDISK2 MOUNTED


关闭ASM实例 : NORMAL/IMMEDIATE/TRANSACTIONAL/ABORT 几个选项
与关闭普通数据库实例一样 :
SQL> shutdown immediate
ASM diskgroups dismounted
ASM instance shutdown




B. ASM 实例的初始化参数

ASM初始化也分spfile及pfile, 操作也相同. 和RDBMS数据库比起来, 还是有一些差异
参数.
SQL> create pfile='/tmp/asminit.ora' from spfile;
File created.

因为ASM实例在内存占用方面非常小, 基本上100M内存空间就足够了, 内存相关就不提了.

INSTANCE_TYPE : 在ASM中值为ASM , 在数据库实例中是RDBMS .

ASM_POWER_LIMIT :指定磁盘rebalance的程度,有0-11个级别,默认值为1,指定
的级别越高,则rebalance的操作就会越快被完成(当然这也意味着这个时间段内将
占用更多的资源),指定级别较低的话,虽然rebalance操作会耗时更久,但对当前
系统的IO及负载影响会更少,这中间的度需要DBA根据实际情况衡量。另外,这个参
数指定的只是一个默认值,在操作过程中,即可以动态修改,也可以在语句级命令行
时指定power,覆盖该默认值。

ASM_DISKSTRING :用最简单的话说,就是设置ASM启动时检查的磁盘,该选项可以
同时指定多个值,并且支持通配符。比如说,只检查/dev/dsk/下的设备,可以设置
该参数如下:/dev/dsk/*,默认情况下该参数为空,为空的话,表示ASM将查找系统
中所有ASM拥有读写权限的设备。

ASM_DISKGROUPS : 指定实例启动或alter diskgroup all mount语句时要加载的磁
盘组,如果为空的话,那么实际就仅启动到NOMOUNT状态了。如果是使用SPFILE的话,
该参数一般不需要手动修改,ASM能够自动更新该初始化参数中的值。

[grid@rac01 tmp]$ sqlplus / as sysasm

SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 29 05:24:38 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_diskgroups string ORADATA, ORAFLASH
asm_diskstring string
asm_power_limit integer 1
......




3. ASM 相关视图

[root@rac01 ~]# su - oracle
[oracle@rac01 ~]$ sqlplus "/as sysdba"

SQL> select TABLE_NAME from dict where table_name like 'V$ASM_%';

TABLE_NAME
------------------------------
V$ASM_ACFSSNAPSHOTS
V$ASM_ACFSVOLUMES
V$ASM_ALIAS -- 记录文件别名
V$ASM_ATTRIBUTE -- 记录ASM磁盘组的属性
V$ASM_CLIENT -- 当前连接的客户端实例信息
V$ASM_DISK -- ASM管理的磁盘及磁盘组信息
V$ASM_DISKGROUP -- ASM磁盘组
V$ASM_DISKGROUP_STAT -- ASM磁盘组状态, 大小
V$ASM_DISK_IOSTAT -- ASM磁盘组I/O状态
V$ASM_DISK_STAT
V$ASM_FILE

TABLE_NAME
------------------------------
V$ASM_FILESYSTEM
V$ASM_OPERATION -- 当前磁盘的操作信息
V$ASM_TEMPLATE
V$ASM_USER
V$ASM_USERGROUP
V$ASM_USERGROUP_MEMBER
V$ASM_VOLUME
V$ASM_VOLUME_STAT

19 rows selected.



4. ASM 体系结构

ASM实例 :
1) RBAL: rebalancer进程,负责规划ASM磁盘组的Reblance活动
2) ABRn: 是RBAL进程的子进程,真正完成Reblance活动

RDBMS实例 :
1) RBAL: 负责打开每个磁盘组的所有磁盘
2) ASMB: 这个进程作为ASM实例和数据库实例之间的信息通道.这个进程负责与
ASM实例的通信,它先利用Diskgroup name从CSS获得管理该Diskgroup的ASM实例的
连接串,然后建立到ASM的持久连接,两个实例通过这条连接定期交换信息,同时也
是一种心跳机制.
3)O0nn 01-10:这组进程建立到ASM实例的连接,某些长时间操作比如创建数据文件,
RDBMS会通过这些进程向ASM发送信息


ASM Instance 与RDBMS 的交互
当ASM实例挂载一个磁盘组之后,ASM会把Disk Group Name, ASM Instance Name,
Oracle Home Path等信息注册到CSS(Cluster Sychronization Service), 这些信息会被用
来构造Connect String. 当RDBMS启动过程中需要访问某个ASM File时, RDBMS会
和CSS联系, 从CSS中获取Connect String,然后发起一个到ASM实例的连接, 这条
ASM和RDBMS实例之间的初始连接叫作Umbilicu(脐带), 只要RDBMS打开ASM File,
这个连接就会保持活动. 直到所有ASM File都被RDBMS实例关闭之后,这个连接才
会关闭.

对ASM的理解, ASM其实就是LVM披上了Oracle的马甲, Disk 对应PV, Diskgroup 对应VG,



5. ASM 高效存储技术

   自动存储管理直接在Oracle 内核提供了文件系统和卷管理器的垂直整合,
从而带来了存储区域网系统提供的“虚拟化”类型的优点(易于管理、更高的可用性),
并专门用于Oracle 数据库文件。ASM 提供了配置数据库的快捷方法,以达到最佳性能
和资源利用率。它通过Oracle 内核自动管理数据库文件和这些文件的放置,不再需要
第三方文件系统和卷管理器来管理Oracle 文件。ASM 免去了耗时的手动I/O 性能与调
整任务,大大节省了DBA 的时间。

ASM的镜像(mirroring)与条带化(striping):ASM 将文件分成1MB 大小的区(extent, AU),
并将所有文件的区平均分布到磁盘组的所有磁盘中。ASM 不使用数学函数跟踪每个区的
放置,而使用指针记录区的位置。这样,ASM 就可以在磁盘组配置变化时移动某个文
件的某些区,而不必按照公式并根据磁盘数来移动所有的区。对于需要低延迟的文件
(例如日志文件),ASM 提供了细粒度(128k) 分段,以便由多个磁盘并行分隔并处理较
大的I/O。ASM 在所有可用的资源中分布I/O 负载,在免除手动I/O 调节需要(通过分
散数据库文件来避免热点)的同时优化性能。
ASM的镜像比操作系统的磁盘镜像更为灵活,因为ASM可基于文件设置冗余级别,
也就是说在同一磁盘组中的两个文件可以一个是镜像的, 而另一个不做镜像。ASM镜
像发生在区级。

  ASM的动态存储配置:ASM使得在线调整存储配置成为可能,即它帮助DBA 管理
动态数据库环境,让DBA 能够在扩大或缩小数据库规模的情况下,无需关闭数据库
以调整存储配置。而在往磁盘组中增加磁盘或从磁盘组中删除磁盘后,ASM将自动
重新平衡――均衡地在磁盘组中的所有磁盘上重新分布文件数据。








三, ASM 磁盘冗余及故障处理


ASM的磁盘冗余策略可以分成三类:外部冗余、标准冗余和高度冗余,
其中外部冗余不需要failure 磁盘组, 标准和高度冗余必须要有failure磁盘组,

  比如说对于标准冗余(Normal Redundancy),ASM要求该磁盘组至少要拥有
两个failure磁盘组,即提供双倍镜像保护,对于同一份数据(ASM中镜像单位
不是磁盘,也不是块,而是一种AU的单位,该单位大小默认是1M)将有主从两
份镜像,并且ASM通过算法来自动确保主、从镜像不会存在于同一份failure磁
盘组,这样就保障了就算整个failure磁盘组都损坏,数据也不会丢失。至于高
度冗余(High Redundancy)就更安全了,它至少需要三个failure磁盘组,也就
是一份AU有一主多从的镜像,理论上将更加安全。

  如果磁盘发生损坏,那么损坏的磁盘默认自动offline并被drop掉,不过该
磁盘所在的磁盘组仍将保持MOUNT状态,如果该盘有镜像的话,那么应用不会有
影响,镜像盘将自动实现接管 (只要不是所有failure磁盘组都损坏掉),否则的话,
该磁盘组将自动DISMOUNT。 比如,某标准冗余的failure组有6个盘(对应6个裸设
备),假如说此时坏了一块盘,没关系,操作继续,坏了那块会被自动dropped,剩
下的5块盘仍然能够负担起正常的读写操作。

ASM 扩展性:
最多支持63个磁盘组;
最多支持10000个磁盘;
最大支持4pb/磁盘;
最大支持40 exabyte/ASM存储;
最大支持1百W个文件/磁盘组;
外部冗余时单个文件最大35tb,标准冗余时单个文件最大5.8tb,高冗余度时单个
文件最大3.9tb。



加载及卸载磁盘组

UNMOUNT磁盘组的话务必慎重操作,要确保UNMOUNT的磁盘组中保存的
文件对应的数据库当前未启动,而且该操作也会直接导致数据库SHUTDOWN。
只有mount的磁盘组才能被数据库使用兵执行add/drop操作, ASM中的磁盘组默
认会在ASM实例启动时自动加载 .

SQL> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;

GROUP_NUMBER NAME STATE TOTAL_MB FREE_MB
------------ ------------------------------ ----------- ---------- ----------

1 ASMDATA1 MOUNTED 20472 18667
2 ASMDATA2 MOUNTED 16378 14621

将ASMDATA2磁盘组UNMOUNT:
SQL> alter diskgroup ASMDATA2 dismount;
Diskgroup altered.

SQL> select group_number,name,state from v$asm_diskgroup;

GROUP_NUMBER NAME STATE
------------ ------------------------------ -----------
1 ASMDATA1 MOUNTED
0 ASMDATA2 DISMOUNTED

SQL> alter diskgroup ASMDATA2 mount; -- 再挂载.
Diskgroup altered.








四 , ASM 在Linux下的相关命令ORACLEASM , ASMCMD, ASMCA

1. ORACLEASM命令

安装asm lib后我们可以通过man 来查看相关命令:
[grid@rac01 tmp]$ man oracleasm

使用 ASMLib 创建 ASM Disks ,  语法如下:  
# /usr/sbin/oracleasm   createdisk   disk_name   device_partition_name    
其中 disk_name 是你为 ASM  Disk 选择的一个名字,名字只能包含数字字母及下划线,
比如OCR01  ,  DATA01  等.   device_partition_name  标示为 ASM 的系磁盘分区,如
/dev/sdb1 ,  /dev/sdc1  等  
如果你发现设置错误或需要 unmark这个磁盘,可以运行如下命令:  
# /usr/sbin/oracleasm    deletedisk   disk_name   

设置共享磁盘。  
# /usr/sbin/oracleasm   createdisk   OCR_VOTE01   /dev/sdb1   
# /usr/sbin/oracleasm   createdisk   ASM_DATA01   /dev/sdc1   

使用 listdisks  命令确认他们的可用性。 
[root@rac001 ~]# /usr/sbin/oracleasm listdisks
ASM_DATA01
ASM_DATA02
ASM_FRA
OCR_VOTE01

在所有其他节点上以 root 用户身份,使用 scandisks 命令扫描已经创建的 ASM
磁盘,也就是说,我们只需要在节点 1 上创建 ASM 磁盘,其他节点不需要。  
[root@rac002 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "OCR_VOTE01"
Instantiating disk "ASM_DATA01"
Instantiating disk "ASM_DATA02"
Instantiating disk "ASM_FRA"

最后在其他节点通过 listdisks  检查 ASM 磁盘的可用性。  
[root@rac002 ~]# /usr/sbin/oracleasm listdisks
ASM_DATA01
ASM_DATA02
ASM_FRA
OCR_VOTE01



2 . ASMCMD 命令

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@rac01 ~]$ asmcmd
ASMCMD>

如果 asm -p 进入的话, 就会带路径 (path)
[grid@rac01 ~]$ asmcmd -p
ASMCMD [+] > cd oradata
ASMCMD [+oradata] >

获取帮助 help [command] :
ASMCMD [+oradata] > help du
du [-H] [dir]
Display total space used for files located recursively under [dir],
similar to "du -s" under UNIX; default is the current directory. Two
values are returned, both in units of megabytes. The first value does
not take into account mirroring of the diskgroup while the second does.
For instance, if a file occupies 100 MB of space, then it actually
takes up 200 MB of space on a normal redundancy diskgroup and 300 MB
of space on a high redundancy diskgroup.
[dir] can also contain wildcards.
The -H flag suppresses the column headers from the output.
ASMCMD [+oradata] >




3 . ASMCA 命令

运行ASMCA创建磁盘组。

以grid用户登入开始ASMCA配置磁盘组,因为是图形界面,我们使用grid用户的
vnc session ( 如果是root的vnc进入到su 到grid会报错 ) .

[grid@rac001 bin]$ pwd 
/u01/grid/11.2.0/bin 
[grid@rac001 bin]$ ./asmca  
 
图形界面显示到Disk Groups 。我们可以看到先前配置的OCR_VOTE已经在列。点击
下面的create 创建datafile及flash recovery area的ASM磁盘组。

磁盘组名称ORADATA, 冗余部分选择External, 点击磁盘为ORCL:ASMDATA01,点击OK.
继续create
磁盘组名称ORAFLASH, 冗余部分选择External, 磁盘为ORCL:ASMDATA02,点击OK.
全部OK后点击QUIT退出。




4 . ASMLib 及其他常用命令

ORCL关键字说明:

Linux ASMLib 的发现字符串
ASMLib 使用发现字符串来确定 ASM 正在请求哪些磁盘。一般的 Linux ASMLib 使用
glob 字符串。字符串必须以 "ORCL:" 为前缀。磁盘通过名称来指定。可以通过发现字
符串 "ORCL:VOL1" 在 ASM 中,发现以名称 "VOL1" 创建的磁盘。类似地,可以用发
现字符串 "ORCL:VOL*" 来查询所有以字符串 "VOL" 开始的磁盘。

不能在发现字符串中用路径名称来发现磁盘。如果缺少前缀,那么一般的 Linux ASMLib
将完全忽略发现字符串,认为它适用于一个不同的 ASMLib。唯一的例外是空字符串 (""),
它被认为是一个全通配符。这与发现字符串 "ORCL:*" 完全等价。


其他常用命令 :

SQL>create diskgroup dg2 external redundancy disk 'ORCL:VOL3';

SQL>drop diskgroup dg2 including contents; 默认是可以删除empty的diskgroup , 如果磁盘组
不是空的, 不接including contents 会报错 . 指定 including contents 即删除磁盘组中所有文件,
即使不是为空 .

SQL>alter diskgroup dg1 add disk 'ORCL:VOL3';
Diskgroup altered.

SQL>alter diskgroup dg1 rebalance power 8 ;
Diskgroup altered.

SQL>alter diskgroup dg1 check all ; -- 检查ASM磁盘组内部consistency
Diskgroup altered.

SQL>alter diskgroup dg1 check all repair; -- 检查并通知ASM修复错误
Diskgroup altered.





5 . ASM与文件系统之间的迁移及文件传输/拷贝

A, 文件传输或拷贝

10g 下ASM下的文件和OS文件系统是不能互相拷贝的 。
11g 下从ASM到文件系统或文件系统到ASM 都很方便 。

ASMCMD> cp spfileracdb.ora /tmp
copying +oradata/racdb/spfileracdb.ora -> /tmp/spfileracdb.ora
[root@rac01 tmp]# ls -al spfileracdb.ora
-rw-r----- 1 grid oinstall 4096 Dec 4 06:05 spfileracdb.ora

10g 下如果需要实现文件拷贝有以下方式 :
具体参考 http://space.itpub.net/35489/viewspace-712638

(1). http://www.oracle.com/global/il/ ... ro_asm_access1.html
ASM Access Through FTP and HTML Using XDB Configuration
(2). rman
(3). dbms_file_transfer




B. 利用RMAN进行迁移 .
参考 : http://www.linuxidc.com/Linux/2011-05/36675.htm

   

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

转载于:http://blog.itpub.net/35489/viewspace-712913/

利用ASM功能实现零停机oracle RAC存储迁移 修改/etc/udev/rules.d/60-dm-permissions.rules,添加如下内容到最后面。solaris的ZFS的pool功能可以实现类似ASM的零停机迁移本地目录存储迁移,请参考如下。利用udev绑定盘符(是Oracleasm绑定如果用作文件系统使用请忽略下面的步骤)启用multipath配置后,会在/dev/mapper下生成多路径逻辑盘。均衡结束后将就的磁盘剔除磁盘组 (非必须等到均衡结束)注意alisa 和wwid号。新加四块盘磁盘的属性不同。新加四块盘是没有别名的。 阅读详情

相关推荐

Oracle 11g RAC集群日常运维与管理

01-RAC基本维护命令 查看环境:/etc/hosts #cat /etc/hosts [root@ouzy01 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 ::1 localhost localhost.localdomain localhost6 # Public 192...

qq_41141058的博客 3087

VMvare workstation创建Centos7.6虚拟机安装Oracle 11gR2 RAC 三节点(ASMlib管理asm磁盘)

VMvare workstation 创建Centos7.6虚拟机安装Oracle 11gR2 RAC

myneth的博客 1134

生产环境下Oracle RAC ASM磁盘在线扩容-不停机

-生产环境ASM磁盘组DATA存储空间不足,需要给磁盘组DATA加一块磁盘,避免后续表空间无法扩容导致的宕机事件。可以看到,/dev/asm-diskm、/dev/asm-diskn未添加到任何磁盘组。1、添加ASM磁盘(我的环境是超融合平台,可在线添加共享存储)检查ASM磁盘的扩容情况,可以看到,已经扩容200G成功了。--检查asm是否识别到未添加的磁盘。7、检查磁盘,确保各个节点可以识别到磁盘且一致。--监控磁盘组rebalance完成情况。--给磁盘组DATA添加磁盘。4、获取共享盘的uuid。

weixin_44277520的博客 4050

Oracle RAC中ASM的管理

export ORACLE_SID=+ASM create diskgroup DATA external redundancy disk ‘ORCL:VOL1’ sqlplus /nolog conn / as sysdba startup pfile=initasm+.ora 创建ASM初始化参数文件initasm+.ora INSTANCE_TYPE=ASM ASM_POWER_LIMIT=...

huangbaokang的博客 833

Oracle ASM工具asmcmd

Oracle ASM工具asmcmd

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2682

转 Oracle11g RAC下ASM 的管理与维护

原址如下: http://space.itpub.net/35489/viewspace-712913   Oracle11g RAC下ASM 的管理与维护   一,  基本维护  :   注意: 以下除OS之外的命令及过程基本都可以通过ASMCA中的ASM相关操作以及 Oracle Enterprise Mananger 来管理 . 1. 查看ASM磁盘及磁盘组 :

edwzhang的专栏 1万+

ShardingSphere-JDBC-若依框架集成(SpringBoot)

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架前后端版本、动态数据源,可自行切换,默认数据源为达梦8代理端,

编程小菜鸟的笔记 8168

Oracle 11g Rac Votedisk、OCR以及各种资源的管理

原文地址:https://blog.youkuaiyun.com/sunjiapeng/article/details/9531639 题:Oracle 11g Rac 维护相对与10g而言难度有些许的增加,命令也多了一些,下面对11g rac 的Votedisk、OCR以及各种资源维护时用到的一些命令进行总结,方便日后查看。   管理Votedisk文件 检查Votedisk状态 $ crsct...

cuiyan1982的专栏 606

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行

dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发

Done___的博客 4344

微信小程序 - 最新获取用户昵称 / 头像(wx.getUserProfile 接口被废弃后的代替方案)详细教程,2022 年之后的所有微信小程序,获取用户信息最新详细教程,附带示例源代码

微信小程序wx.getUserProfile接口废了用什么代替,微信小程序wx.getUserProfile不能用了怎么办,wx.getUserProfile失效有什么替代方案吗,微信新规定头像昵称填写最新教程,目前微信小程序最新获取用户头像昵称教程,微信小程序用户头像昵称获取规则调整公告,2022改版后的微信小程序如何获取用户头像和昵称信息,微信小程序官方废弃getUserProfile后如何实现获取用户信息,微信小程序wx.getUserProfile接口返回了默认头像昵称,微信小程序获取用户信息不

🏆 前端领域优质创作者 2万+

Oracle 11g RAC运维总结

1 术语解释 1.1 高可用(HA) 什么是高可用?顾名思义我们能轻松地理解是高度可用的意思,也说是说高可用(high availability)指的是运行时间能满足预计或期望的一个系统或组件,我们常听说的247365系统,这种系统追求一种不间断提供服务的目标,任何时候都不能停止服务,否则会给用户造成比较大的影响。在信息、通讯、互联网技术发展如此快的今天,越来越多的系统都希望成为一个高可用的系统,...

DoubleJing的博客 3274

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 589

Oracle 11g RAC安装运维总结

Oracle 11g RAC运维总结1 术语解释1.1 高可用(HA)1.2 负载均衡(LB)1.3 RAC集群1.4 CRS2 架构2.1 RAC环境组成2.1.1 硬件环境2.1.2 软件组成2.2 CRS组成2.3 单实例与RAC环境3.Oracle 11g RAC集群搭建3.1. 配置网络3.1.1网络划分3.1.2 划分用户和组3.1.3 目录划分3.2 创建组和用户3.2.1 创建组,根据前面的组划分创建3.2.2创建用户3.2.3更改用户密码3.2.4创建软件安装目录3.2.5设置用户的环境变

不古的博客 2937

智能硬件产品 App 全球发布 第 1 章:全球 App 发布战略设计

本章阐述智能硬件 App 全球发布战略,涵盖市场分析、竞争格局、用户画像及资源配置。通过制定可执行的全球化推广路径,整合地区法规合规、渠道分发策略与营销活动设计,助力团队快速进入主流商店并确立品牌影响力。同时构建可量化的 KPI 监控体系,指导项目进度追踪与效果复盘,确保产品迭代持续优化,降低运营总成本。

moton2017的博客 156

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

oracle rac关闭集群,转载:oracle RAC集群启动和关闭

http://www.cnblogs.com/yhfssp/p/8184761.htmloracle 11G RAC集群启动和关闭:1、停止数据库$srvctl stop database –d oradb2、停止集群服务关闭集群需要root运行#/u01/11.2.0/grid/bin/crsctl stop cluster -all --停止所有节点服务#/u01/11.2.0/grid/bi...

weixin_42502089的博客 951

【62】OpenCV C++实战篇——【项目实战】OpenCV C++ 精准定位“十字刻度尺”中心坐标,过滤图片中的干扰,精准获取十字交点坐标

本文针对工业相机拍摄的2000万像素图像中十字刻度尺的精确定位问题进行了研究。面对图像较暗、存在红黄干扰、记号笔涂抹及细节模糊等难点,提出了一种基于霍夫变换的解决方案。通过灰度化、反色、二值化预处理后,对比分析了多尺度霍夫直线(HoughLines)和渐进概率霍夫线段(HoughLinesP)两种方法的定位效果。实验结果表明,HoughLinesP由于具有最小线段长度和间隙约束,在直线贴合度和交点定位精度上表现更优,其返回的线段端点坐标也更便于后续处理。该研究为工业视觉中微小目标的精确定位提供了实用参考。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 975

oracle srvctl命令,oracle11gRAC之srvctl命令:

oracle11gRAC之srvctl命令:srvctl版本查询:[grid@dbserver1:/home/grid]$srvctl -Vsrvctl version: 11.2.0.1.0srvctl常用命令分类:*增加 oracle asm/database/listener 注册信息eg:srvctl add asm -l LISTENER -p +crs/dbserve-cluster/...

weixin_33193177的博客 652

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

oracle11gRAC之srvctl命令:

oracle11gRAC之srvctl命令:srvctl版本查询:[grid@dbserver1:/home/grid]$srvctl -Vsrvctl version: 11.2.0.1.0srvctl常用命令分类:*增加 o...

cuandiaodi1032的博客 626

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

oracle 软件运维 培训,Oracle+11g+RAC运维培训文档.docx

Oracle11gRAC运维培训文档文件编号:Oracle 11g RAC运维培训文档1.0起 草 部 门: 数据分析事业部管 理 部 门: 起 草 人: 王竹明审 核 人: 批 准 人: 发 布 日 期:2014 年 2 月 26 日修订页编号章节名称修订内容简述修订日期修订前版本号修订后版本号修订人批准人1全文创建2014-2-261.0王竹明目 录1术语解释51.1高可用(HA)...

weixin_33117401的博客 254

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

oracle 11g集群启停,ORACLE 11g RAC日常运行中一些基本启停等命令总结

RAC日常运行中一些基本启停命令总结设置cluster不随着操作系统自动启动[root@rac01 u01]# crsctl disable crsCRS-4621: Oracle High Availability Services autostart is disabled.设置cluster随着操作系统自动启动,默认是启动的[root@rac01 u01]# crsctl enable cr...

weixin_42131424的博客 785

oracle进程增加,Oracle11g新增加的后台进程

Oracle11g 新的后台进程的功能,这些后台进程的功能分别如下: DBRM:数据库资源管理进程, (The database resource manager process),负责设置资源计划和其他的资源管理的工作。 DIAG:数据库诊断进程, (The diagnosibility process) ,负责维护管理各种用于诊断的转储文件,并执行oradebug命令。 DIA0:另一个数据库...

weixin_31480911的博客 408

oracle和mysql的安装_Oracle安装与操作系统用户组

Oracle软件在安装维护过程中长要和操作用户组(OS user group)打交道,从早前的只有oracle用户和dba组发展到今天11gr2中的grid用户和asm组,Oracle管理的日新月异可见一斑。我们在单实例(single-instance)环境中常用的三个操作用户组,分别是:oinstall用户组oinstall 组是Oracle推荐创建的OS用户组之一,建议在系统第一次安装orac...

weixin_30326905的博客 257
上一篇: 《华为基本法》
下一篇: 分布式数据库查询中 DRIVING_SITE 的疑问
cuixie2370
博客等级 码龄10年 17粉丝 842原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值