我们可以在windows上建立ASM实例。oracle给我们提供了一个很贴心的工具,来实现在windows上安装asm,这个工具就是asmtool。该工具可以在安装介质的asmtool目录中找到,也可以在安装数据库软件后,在$ORACLE_HOME/bin下找到。下面,我们就用asmtool来在windows xp上安装asm实例。
安装的方式有两种,一种是利用windows自身的没有格式化过的磁盘(其实是磁盘分区),来作为asm disk;另一种是用asmtool在windows的已经格式化好的分区上(如D盘)建立asm disk。注意第二种的方式需要利用隐含参数来启动asm实例,因此不被oracle推荐,也不适合用在生产系统上。另外,第二种方式建立的asm实例,不能被dbca所识别,在图形化界面安装数据库时,无法识别出来asm实例的diskgroup,但是手工建库却没问题。下面,我们就来分别介绍两种方式的建立ASM实例。
方法一,用windows中尚未格式化的硬盘分区:
1. 如果你的硬盘已经完全占有,没有未格式化的分区,可以用Norton PartitionMagic来resize一下你的空闲较多的分区,新建一个unallocated的分区。然后,关闭PartitionMagic,我们在控制面板-管理工具-计算机管理-磁盘管理,那边进行分区的建立。在这里,我们虽然建立的分区,但是没有格式化。
类似的建立其他3G,3G,1G,1G,1G,1.64G的分区:
说明:4G用于做external redundancy,用于放一般的数据,3G+3G用于做normal redundancy,放比较重要数据,1G+1G+1G用于做high redundancy,用于放最重要的数据,最后的1.64G做external redundancy,存放flashback的文件。
上面的几个分区都是未格式化的,对于数据库来说,类似裸设备,可以添加到asm中,因此我们的这种方式不需要用隐含参数_asm_allow_only_raw_disks。
下面,我们就开始建立asm实例:
4.我们先list看看有哪些分区是能被asm使用,我们用asmtool -list这个命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
D:\oracle\product\10.2.0\db_1\database>asmtool -list NTFS \Device\Harddisk0\Partition1 29996M NTFS \Device\Harddisk0\Partition2 45005M NTFS \Device\Harddisk0\Partition3 215238M \Device\Harddisk0\Partition4 4097M \Device\Harddisk0\Partition5 3071M \Device\Harddisk0\Partition6 3071M \Device\Harddisk0\Partition7 1026M \Device\Harddisk0\Partition8 1026M \Device\Harddisk0\Partition9 1026M \Device\Harddisk0\Partition10 1683M D:\oracle\product\10.2.0\db_1\database> |
我们看到partition4~partition10都是可以用的。我们用asmtool -add加入asm的标签:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition4 ORCLDISKDATA0 D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition5 ORCLDISKDATA1 D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition6 ORCLDISKDATA2 D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition7 ORCLDISKDATA3 D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition8 ORCLDISKDATA4 D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition9 ORCLDISKDATA5 D:\oracle\product\10.2.0\db_1\database>asmtool -add \Device\Harddisk0\Partition10 ORCLDISKDATA6 D:\oracle\product\10.2.0\db_1\database> |
在list看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
D:\oracle\product\10.2.0\db_1\database>asmtool -list NTFS \Device\Harddisk0\Partition1 29996M NTFS \Device\Harddisk0\Partition2 45005M NTFS \Device\Harddisk0\Partition3 215238M ORCLDISKDATA0 \Device\Harddisk0\Partition4 4097M ORCLDISKDATA1 \Device\Harddisk0\Partition5 3071M ORCLDISKDATA2 \Device\Harddisk0\Partition6 3071M ORCLDISKDATA3 \Device\Harddisk0\Partition7 1026M ORCLDISKDATA4 \Device\Harddisk0\Partition8 1026M ORCLDISKDATA5 \Device\Harddisk0\Partition9 1026M ORCLDISKDATA6 \Device\Harddisk0\Partition10 1683M D:\oracle\product\10.2.0\db_1\database> |
另外,由于asm实例需要css服务,第一次使用的之前,我们需要建议css服务。在命令行运行:
1 |
localconfig add |
建立完成后我们可以检查一下是否运行正常,在命令行运行:
1 2 3 4 |
D:\oracle\product\10.2.0\db_1\database>crsctl check css CSS appears healthy D:\oracle\product\10.2.0\db_1\database> |
css appears healthy说明css运行正常。
5. 建立asm的instance:
我们可以用dbca来建立,也可以用命令行来建立,在这里,我们用命令行的建立作为例子:
5.1 在$ORACLE_HOME/database下新建asm的初始化文件INIT+ASM1.ora:
1 2 3 4 5 6 7 8 9 |
*.instance_type='ASM' *.asm_diskstring='D:\asmdisks\*' *.large_pool_size=12M *.db_unique_name='+ASM1' *.asm_power_limit=1 *.remote_login_passwordfile='SHARED' *.background_dump_dest='D:\oracle\admin\asm\bdump' *.core_dump_dest='D:\oracle\admin\asm\cdump' *.user_dump_dest='D:\oracle\admin\asm\udump' |
5.2 在$ORACLE_HOME/database下新建+ASM1的密码文件:
1 |
orapwd file=orapw+ASM2 password=oracle |
5.3 用oradim新建+ASM1的windows服务:
1 2 3 4 |
D:\oracle\product\10.2.0\db_1\database>oradim -new -asmsid +ASM1 -startmode auto Instance created. D:\oracle\product\10.2.0\db_1\database> |
5.4 启动+ASM1的实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
D:\oracle\product\10.2.0\db_1\database>sqlplus "/ as sysdba" SQL*Plus: Release 10.2.0.1.0 - Production on Sat Feb 12 00:17:24 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to an idle instance. SQL> startup ASM instance started Total System Global Area 83886080 bytes Fixed Size 1247420 bytes Variable Size 57472836 bytes ASM Cache 25165824 bytes ORA-15110: no diskgroups mounted SQL> |
6. 我们开始新建asm diskgroup,给oracle数据库使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
6.1 检查asm disk的状态是否为cache: SQL> select path,mount_status from v$asm_disk; PATH MOUNT_S ------------------------------ ------- D:\ASMDISKS\ASMDISK1 CLOSED D:\ASMDISKS\ASMDISK2 CLOSED D:\ASMDISKS\ASMDISK3 CLOSED D:\ASMDISKS\ASMDISK7 CLOSED D:\ASMDISKS\ASMDISK5 CLOSED D:\ASMDISKS\ASMDISK6 CLOSED D:\ASMDISKS\ASMDISK4 CLOSED 7 rows selected. |
6.2 新建disk group:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
SQL> create diskgroup dg_data_01 2 external redundancy 3 disk 'D:\ASMDISKS\ASMDISK1'; Diskgroup created. SQL> SQL> create diskgroup dg_data_02 2 normal redundancy 3 failgroup fg_dgdata02_01 disk 'D:\ASMDISKS\ASMDISK2' 4 failgroup fg_dgdata02_02 disk 'D:\ASMDISKS\ASMDISK3'; Diskgroup created. SQL> create diskgroup dg_data_03 2 high redundancy 3 failgroup fg_dgdata03_01 disk 'D:\ASMDISKS\ASMDISK4' 4 failgroup fg_dgdata03_02 disk 'D:\ASMDISKS\ASMDISK5' 5 failgroup fg_dgdata03_03 disk 'D:\ASMDISKS\ASMDISK6'; Diskgroup created. SQL> SQL> create diskgroup dg_flashback 2 external redundancy 3 disk 'D:\ASMDISKS\ASMDISK7'; Diskgroup created. SQL> |
6.3 检查asm disk的状态以及diskgroup的使用率:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
SQL> select path,mount_status from v$asm_disk order by disk_number; PATH MOUNT_S ------------------------------ ------- D:\ASMDISKS\ASMDISK1 CACHED D:\ASMDISKS\ASMDISK2 CACHED D:\ASMDISKS\ASMDISK4 CACHED D:\ASMDISKS\ASMDISK7 CACHED D:\ASMDISKS\ASMDISK5 CACHED D:\ASMDISKS\ASMDISK3 CACHED D:\ASMDISKS\ASMDISK6 CACHED 7 rows selected. SQL> SQL> select group_number,name,sector_size,block_size,allocation_unit_size,state,type,total_mb,free_mb from v$asm_diskgroup; GROUP_NUMBER NAME SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE TYPE TOTAL_MB FREE_MB ------------ ------------------------------ ----------- ---------- -------------------- ----------- ------ ---------- ---------- 1 DG_DATA_01 512 4096 1048576 MOUNTED EXTERN 4097 4047 2 DG_DATA_02 512 4096 1048576 MOUNTED NORMAL 6142 6040 3 DG_DATA_03 512 4096 1048576 MOUNTED HIGH 3078 2925 4 DG_FLASHBACK 512 4096 1048576 MOUNTED EXTERN 1683 1633 SQL> |
7. 把asm diskgroup加入到初始化文件中:
1 2 3 4 5 6 7 8 |
SQL> show parameter asm_disk NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ asm_diskgroups string DG_DATA_01, DG_DATA_02, DG_DAT A_03, DG_FLASHBACK asm_diskstring string D:\asmdisks\* SQL> |
因此在INIT+ASM1.ora中加入这行:
1 |
*.asm_diskgroups='DG_DATA_01', 'DG_DATA_02', 'DG_DATA_03', 'DG_FLASHBACK' |
然后shutdown asm实例,重新用pfile启动,再create spfile from pfile,最后从spfile启动。
这样,asm实例就建立完成了。
方法二,用windows中已经存在的分区,比如我们可以选择D盘。
1. 在已经格式化好的分区上新建asm disk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile1 2048 C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile2 1024 C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile3 1024 C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile4 200 C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile5 200 C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile6 200 C:\Documents and Settings\Administrator>asmtool -create d:\asmfiles\asmfile7 400 C:\Documents and Settings\Administrator> |
上述文件的规划也和方法一类似,只是大小变小了一点。2G用于做external redundancy放一般数据,1G+1G做normal redundancy,200M+200M+200M做high redundancy,最后的400M做external redundancy。
同时我们看到建立好这些文件之后,用asmtool -list是看不到的:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
D:\oracle\product\10.2.0\db_1\database>asmtool -list NTFS \Device\Harddisk0\Partition1 29996M NTFS \Device\Harddisk0\Partition2 45005M NTFS \Device\Harddisk0\Partition3 215238M ORCLDISKDATA0 \Device\Harddisk0\Partition4 4097M ORCLDISKDATA1 \Device\Harddisk0\Partition5 3071M ORCLDISKDATA2 \Device\Harddisk0\Partition6 3071M ORCLDISKDATA3 \Device\Harddisk0\Partition7 1026M ORCLDISKDATA4 \Device\Harddisk0\Partition8 1026M ORCLDISKDATA5 \Device\Harddisk0\Partition9 1026M ORCLDISKDATA6 \Device\Harddisk0\Partition10 1683M D:\oracle\product\10.2.0\db_1\database> |
这也可以解释为什么在后续的dbca中也看不到,因为在dbca中有一步骤是给asm disk的分区做标签,加前缀,也就是我们用命令asmtool -add做的,但是如果在asmtool -list都看不到,那还怎么做标签、加前缀呢。
不过我们可以不管这个,这个asm实例还是可以建立起来的。
2. 建立初始化文件和密码文件:
初始化文件INIT+ASM2.ora,注意这里多了一个隐含参数*._asm_allow_only_raw_disks=FALSE,这可以让asm在其disk文件为非裸设备的情况下启动:
1 2 3 4 5 6 7 8 9 10 |
*._asm_allow_only_raw_disks=FALSE *.instance_type='ASM' *.asm_diskstring='D:\asmfiles\*' *.large_pool_size=12M *.db_unique_name='+ASM2' *.asm_power_limit=1 *.remote_login_passwordfile='SHARED' *.background_dump_dest='D:\oracle\admin\asm\bdump' *.core_dump_dest='D:\oracle\admin\asm\cdump' *.user_dump_dest='D:\oracle\admin\asm\udump' |
新建密码文件:
1 2 3 |
D:\oracle\product\10.2.0\db_1\database>orapwd file=orapw+ASM2 password=oracle D:\oracle\product\10.2.0\db_1\database> |
3. 后续的操作就比较类似了,新建+ASM2的windows 服务,启动该实例,新建diskgroup:
1 2 3 4 5 6 |
D:\oracle\product\10.2.0\db_1\database>oradim -new -asmsid +ASM2 -startmode auto Instance created. D:\oracle\product\10.2.0\db_1\database>set ORACLE_SID=+ASM2 D:\oracle\product\10.2.0\db_1\database> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
D:\oracle\product\10.2.0\db_1\database>set ORACLE_SID=+ASM2 D:\oracle\product\10.2.0\db_1\database>sqlplus "/ as sysdba" SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 2月 13 12:36:40 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options SQL> set line 1000 SQL> set pages 1000 SQL> col path for a30 SQL> select path,mount_status from v$asm_disk order by disk_number; PATH MOUNT_STATUS ------------------------------ -------------- D:\ASMFILES\ASMFILE1 CLOSED D:\ASMFILES\ASMFILE2 CLOSED D:\ASMFILES\ASMFILE3 CLOSED D:\ASMFILES\ASMFILE4 CLOSED D:\ASMFILES\ASMFILE5 CLOSED D:\ASMFILES\ASMFILE6 CLOSED D:\ASMFILES\ASMFILE7 CLOSED 已选择7行。 SQL> select group_number,name,sector_size,block_size,allocation_unit_size,state,type,total_mb,free_mb from v$asm_diskgroup; 未选定行 SQL> select instance_name from v$instance; INSTANCE_NAME -------------------------------- +asm2 SQL> create diskgroup dg_fs_data_01 2 external redundancy 3 disk 'D:\ASMFILES\ASMFILE1'; 磁盘组已创建。 SQL> create diskgroup dg_fs_data_02 2 normal redundancy 3 failgroup fg_dgfsdata02_01 disk 'D:\ASMFILES\ASMFILE2' 4 failgroup fg_dgfsdata02_02 disk 'D:\ASMFILES\ASMFILE3'; 磁盘组已创建。 SQL> create diskgroup dg_fs_data_03 2 high redundancy 3 failgroup fg_dgfsdata03_01 disk 'D:\ASMFILES\ASMFILE4' 4 failgroup fg_dgfsdata03_02 disk 'D:\ASMFILES\ASMFILE5' 5 failgroup fg_dgfsdata03_03 disk 'D:\ASMFILES\ASMFILE6'; 磁盘组已创建。 SQL> SQL> create diskgroup dg_fs_flashback 2 external redundancy 3 disk 'D:\ASMFILES\ASMFILE7'; Diskgroup created. SQL> SQL> SQL> |
注意如果我们建立的diskgroup name和之前的,另一个实例的diskgroup同名,就会报错:
1 2 3 4 5 6 7 8 |
SQL> create diskgroup dg_flashback 2 external redundancy 3 disk 'D:\ASMFILES\ASMFILE7'; create diskgroup dg_flashback * ERROR at line 1: ORA-15018: diskgroup cannot be created ORA-15003: diskgroup "DG_FLASHBACK" already mounted in another lock name space |
虽然二者属于不同实例,但是一旦实例启动,disk被cache起来,diskgroup状态变成mount,这个时候的disk和diskgroup name就会被锁定。
4. 修改pfile,增加asm_diskgroups,然后从spfile启动。
至此,方法二也建立好了asm实例。
后续,我们就可以用这2个asm实例来作为存储,存放数据文件了。我们就简单的来建立一个数据库:
1. 建立bdump,cdump,udump对应的目录。
2. 建立密码文件和初始化文件,注意初始化文件中的db_create_file_dest:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
db_create_file_dest='+DG_FS_DATA_01' nls_language="SIMPLIFIED CHINESE" nls_territory="CHINA" sga_target=167772160 job_queue_processes=10 dispatchers="(PROTOCOL=TCP) (SERVICE=oralocalXDB)" compatible=10.2.0.1.0 audit_file_dest=D:\oracle\admin\oralocal\adump remote_login_passwordfile=EXCLUSIVE log_archive_format=oralocal_%S_%R_%T.arc pga_aggregate_target=16777216 db_domain="" db_name=oralocal control_files=("+DG_FS_DATA_02\cfile\oralocal\control01.ctl", "+DG_FS_DATA_02\cfile\oralocal\control02.ctl", "+DG_FS_DATA_02\cfile\oralocal\control03.ctl") db_recovery_file_dest=+DG_FS_FLASHBACK db_recovery_file_dest_size=350m open_cursors=300 undo_management=AUTO undo_tablespace=UNDOTBS1 background_dump_dest=D:\oracle\admin\oralocal\bdump core_dump_dest=D:\oracle\admin\oralocal\cdump user_dump_dest=D:\oracle\admin\oralocal\udump processes=150 db_block_size=8192 db_file_multiblock_read_count=16 |
3. 启动到nmount状态后,create database:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
SQL> startup nomount pfile='?/database/initoralocal.ora' ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1247876 bytes Variable Size 67110268 bytes Database Buffers 92274688 bytes Redo Buffers 7139328 bytes SQL> SQL> SQL> SQL> CREATE DATABASE "oralocal" 2 MAXINSTANCES 8 3 MAXLOGHISTORY 1 4 MAXLOGFILES 192 5 MAXLOGMEMBERS 3 6 MAXDATAFILES 100 7 DATAFILE SIZE 500M 8 EXTENT MANAGEMENT LOCAL 9 SYSAUX DATAFILE SIZE 300M 10 SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 20M 11 SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE SIZE 200M 12 CHARACTER SET ZHS16GBK 13 NATIONAL CHARACTER SET AL16UTF16 14 LOGFILE GROUP 1 SIZE 51200K, 15 GROUP 2 SIZE 51200K, 16 GROUP 3 SIZE 51200K; Database created. SQL> |
我们看到相关的文件已经用OMF管理:
1 2 3 4 5 6 7 8 |
SQL> select name from v$datafile; NAME ------------------------------------------------------------------- +DG_FS_DATA_01/oralocal/datafile/system.258.743030629 +DG_FS_DATA_01/oralocal/datafile/undotbs1.264.743030639 +DG_FS_DATA_01/oralocal/datafile/sysaux.260.743030643 +DG_FS_DATA_01/oralocal/datafile/users.265.743030697 |
最后@?/rdbms/admin/catalog和@?/rdbms/admin/catproc即完成数据库的创建。
那么,如果我在数据库的初始化文件中写上了db_create_file_dest=’+DG_FS_DATA_01’,那么我是否还能用到另一个asm实例的存储呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SQL> create tablespace test_02 datafile '+DG_DATA_01/oralocal/dfile/tbs_test_02.dbf' size 10m; create tablespace test_02 datafile '+DG_DATA_01/oralocal/dfile/tbs_test_02.dbf' size 10m * ERROR at line 1: ORA-01119: error in creating database file '+DG_DATA_01/oralocal/dfile/tbs_test_02.dbf' ORA-17502: ksfdcre:4 Failed to create file +DG_DATA_01/oralocal/dfile/tbs_test_02.dbf ORA-15001: diskgroup "DG_DATA_01" does not exist or is not mounted ORA-15001: diskgroup "DG_DATA_01" does not exist or is not mounted SQL> |
看来一个asm实例只能被一个数据库使用。
呵呵,看来一个数据库实例不能跨asm实例,用不同的diskgroup,一个数据库实例只能用一个asm实例。
3条评论
图文攻略,支持
看来一个asm实例只能被一个数据库使用。
这最后一句是什么意思?正常情况下一个ASM实例是可以被多个数据库实例使用的。
re kamus:我的意思是,一个数据库实例,尝试跨2个asm实例用,当添加数据文件到另一个asm实例上的diskgroup的时候,做报错。