Oracle10g里,用户能在数据库级别直接管理磁盘。
目前没有环境测试,就摘抄kamus的一份step by step文章,留着供下次察看。
[@more@]· Disk Addition -- No downtime is required, file extents are redistributed automatically
· Stripe Width -- Striping can be fine grained as in Redo Log Files and coarse for datafiles
· Buffering --The ASM filesystem is not buffered, making it direct I/O capable by design.
· Kernelized Asynch I/O -- There is no special setup necessary to enable kernelized asynchronous I/O
· Mirroring -- Software mirroring can be set up easily, if hardware mirroring is not available
1. 创建初始化文件
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ vi init+ASM.ora
创建asm 实例的初始化脚本,脚本内容如下所示:
# ******Below is init script for asm instance******
*.asm_diskstring='ORCL:VOL*'
*.background_dump_dest='/oracle/admin/+ASM/bdump'
*.core_dump_dest='/oracle/admin/+ASM/cdump'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.user_dump_dest='/oracle/admin/+ASM/udump'
# ******Above is init script for asm instance******
说明:
1. dump 目录指向$ORACLE_BASE/
不要修改这个实例名,否则在下一步用dbca 创建数据库的时候,dbca 将找不到可用的磁
盘组,我想这应该是dbca 的一个bug,手工创建ASM 类型的数据库就应该没有这个限制
了。
2. asm_diskstring 用于实例启动的时候检查可用的ASM 磁盘,由于我们前面创建ASM
磁盘的名称是VOL1 到VOL4,所以我们此处使用*通配符,前面的’ORCL:’不可以省略,
否则ASM 实例将无法检查到磁盘。
2. 创建密码文件
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ orapwd file=orapw+ASM password=dba
3. 创建目录结构
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ mkdir –p $ORALCE_BASE/admin/+ASM/udump
$ mkdir –p $ORALCE_BASE/admin/+ASM/bdump
$ mkdir –p $ORALCE_BASE/admin/+ASM/cdump
4. 启动实例
$ export ORACLE_SID=+ASM
$ sqlplus / as sysdba
SQL> startup
ASM instance started
Total System Global Area 100663296 bytes
Fixed Size 777616 bytes
Variable Size 99885680 bytes
Database Buffers 0 bytes
Redo Buffers 0 bytes
ORA-15110: no diskgroups mounted
因为我们是首次启动asm 实例,还没有创建diskgroup,所以显示15110 错误是正常的。
5. 创建spfile,重新启动
SQL> create spfile from pfile;
SQL> shutdown immediate;
SQL> startup;
6. 创建diskgroup
SQL> create diskgroup dgroup1 normal redundancy
2 failgroup fgroup1 disk 'ORCL:VOL1','ORCL:VOL2'
3 failgroup fgroup2 disk 'ORCL:VOL3','ORCL:VOL4';
Diskgroup created.
SQL> col name for a10
SQL> select name,state from v$asm_diskgroup;
---------- ----------------------
DGROUP1 MOUNTED
如果上述命令返回的state 是DISMOUNTED,那么我们需要手工将挂载diskgroup
SQL> ALTER DISKGROUP dgroup1 MOUNT;
Diskgroup altered.
此时检查数据库初始化参数,发现asm_diskgroups 参数值已经自动设置为DGROUP1,
这表明在下次启动asm 实例的时候,这个diskgroup 会被自动挂载。
SQL> col name for a10
SQL> col type for a10
SQL> col value for a20
SQL> show parameter asm_diskgroups
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
asm_diskgroups string DGROUP1
如果要卸载diskgroup,使用下面的命令:
ALTER DISKGROUP ALL DISMOUNT;
由于启动ASM 数据库必须要先启动ASM 实例,所以基本上启动步骤如下。
1. 以oracle 用户进入操作系统
2. $ export ORACLE_SID=+ASM
3. SQL> sqlplus / as sysdba
4. SQL> startup
5. SQL> exit
6. $ export ORACLE_SID=
7. SQL> sqlplus / as sysdba
8. SQL> startup
测试ASM 数据库的automatic rebalance 功能
添加两个虚拟硬盘,分别是sdf 和sdg,大小500M
启动系统,启动ASM 实例,启动数据库实例
创建ASM 磁盘
#/etc/init.d/oracleasm createdisk VOL5 /dev/sdf
#/etc/init.d/oracleasm createdisk VOL6 /dev/sdg
登入ASM 实例检查v$asm_disk 视图,发现这两个新加的硬盘已经找到了
将硬盘添加到磁盘组中
SQL> ALTER DISKGROUP DGROUP1 ADD FAILGROUP FGROUP1 DISK
'ORCL:VOL5' FAILGROUP FGROUP2 DISK 'ORCL:VOL6';
Diskgroup altered.
检查数据库的auto rebalance 工作进度,数据库正在将原来分布在两个磁盘上的数据平均
分配到三个磁盘上
SQL> SELECT group_number, operation, state, est_work, sofar, est_rate,
est_minutes FROM v$asm_operation;
GROUP_NUMBER
EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 416 0 0
0
SQL> /
GROUP_NUMBER
EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 275 39 148
1
SQL> /
以上表示数据重新分配的工作已经成功完成
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------------------------ -------------------- ----------
DGROUP1 1048576 5120
现在磁盘组空间总共是5120M
登入数据库实例
创建一个自己的表空间,创建一个用户,创建一个表
SQL> create tablespace ts_test datafile '+DGROUP1' size 200M;
Tablespace created.
SQL> create user kamus identified by pass default tablespace ts_test;
User created.
SQL> grant dba to kamus;
Grant succeeded.
SQL> conn kamus/pass
Connected.
SQL> create table t_test as select * from dba_objects;
Table created.
SQL> select count(*) from t_test;
COUNT(*)
----------
10319
登入ASM 实例,将磁盘从磁盘组中删除
SQL> alter diskgroup dgroup1 drop disk VOL4;
Diskgroup altered.
SQL> SELECT group_number, operation, state, est_work, sofar, est_rate,
est_minutes FROM v$asm_operation;
GROUP_NUMBER
EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 566 46 151
3
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------------------------ -------------------- ----------
DGROUP1 1048576 4096
Executed in 0.13 seconds
SQL> select label,failgroup from v$asm_disk;
LABEL FAILGROUP
------------------------------- ------------------------------
VOL1 FGROUP1
VOL2 FGROUP1
VOL3 FGROUP2
VOL5 FGROUP1
VOL6 FGROUP2
可以看到磁盘组的总容量已经减少了,磁盘数目也减少了
有些文档上说删除了磁盘之后要执行:ALTER DISKGROUP REBALANCE
但是发现不需要手动执行,整个REBALANCE 的工作确实是自动的,当删除磁盘以后,数
据库自动开始作REBALANCE 了
为了两个FAILGROUP 的大小相同,再删除一个磁盘
SQL> alter diskgroup dgroup1 drop disk VOL2;
Diskgroup altered.
我们可以从下面的SQL 知道在ASM 实例中可以查询到所有可以用的磁盘,而在数据库实
例中只可以查询到让自己使用的磁盘
ASM 实例:
SQL> SELECT disk_number, label FROM V$asm_disk;
DISK_NUMBER LABEL
----------- --------------------------------------------------------------
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/207/viewspace-778809/ ,如需转载,请注明出处,否则将追究法律责任。