我们可以在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这个命令:
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的标签:
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看看:
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服务。在命令行运行:
建立完成后我们可以检查一下是否运行正常,在命令行运行:
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:
*.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的密码文件:
5.3 用oradim新建+ASM1的windows服务:
Instance created.
D:\oracle\product\10.2.0\db_1\database>
5.4 启动+ASM1的实例:
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数据库使用:
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:
2 external redundancy
3 disk ' D: \A SMDISKS \A SMDISK1 ' ;
Diskgroup created .
SQL >
SQL > create diskgroup dg_data_02
2 normal redundancy
3 failgroup fg_dgdata02_01 disk ' D: \A SMDISKS \A SMDISK2 '
4 failgroup fg_dgdata02_02 disk ' D: \A SMDISKS \A SMDISK3 ' ;
Diskgroup created .
SQL > create diskgroup dg_data_03
2 high redundancy
3 failgroup fg_dgdata03_01 disk ' D: \A SMDISKS \A SMDISK4 '
4 failgroup fg_dgdata03_02 disk ' D: \A SMDISKS \A SMDISK5 '
5 failgroup fg_dgdata03_03 disk ' D: \A SMDISKS \A SMDISK6 ' ;
Diskgroup created .
SQL >
SQL > create diskgroup dg_flashback
2 external redundancy
3 disk ' D: \A SMDISKS \A SMDISK7 ' ;
Diskgroup created .
SQL >
6.3 检查asm disk的状态以及diskgroup的使用率:
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加入到初始化文件中:
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中加入这行:
然后shutdown asm实例,重新用pfile启动,再create spfile from pfile,最后从spfile启动。
这样,asm实例就建立完成了。
方法二,用windows中已经存在的分区,比如我们可以选择D盘。
1. 在已经格式化好的分区上新建asm disk:
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是看不到的:
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文件为非裸设备的情况下启动:
*.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'
新建密码文件:
D:\oracle\product\10.2.0\db_1\database>
3. 后续的操作就比较类似了,新建+ASM2的windows 服务,启动该实例,新建diskgroup:
Instance created.
D:\oracle\product\10.2.0\db_1\database>set ORACLE_SID=+ASM2
D:\oracle\product\10.2.0\db_1\database>
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 10 g 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: \A SMFILES \A SMFILE1 ' ;
磁盘组已创建。
SQL > create diskgroup dg_fs_data_02
2 normal redundancy
3 failgroup fg_dgfsdata02_01 disk ' D: \A SMFILES \A SMFILE2 '
4 failgroup fg_dgfsdata02_02 disk ' D: \A SMFILES \A SMFILE3 ' ;
磁盘组已创建。
SQL > create diskgroup dg_fs_data_03
2 high redundancy
3 failgroup fg_dgfsdata03_01 disk ' D: \A SMFILES \A SMFILE4 '
4 failgroup fg_dgfsdata03_02 disk ' D: \A SMFILES \A SMFILE5 '
5 failgroup fg_dgfsdata03_03 disk ' D: \A SMFILES \A SMFILE6 ' ;
磁盘组已创建。
SQL >
SQL > create diskgroup dg_fs_flashback
2 external redundancy
3 disk ' D: \A SMFILES \A SMFILE7 ' ;
Diskgroup created .
SQL >
SQL >
SQL >
注意如果我们建立的diskgroup name和之前的,另一个实例的diskgroup同名,就会报错:
2 external redundancy
3 disk ' D: \A SMFILES \A SMFILE7 ' ;
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:
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:
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 500 M
8 EXTENT MANAGEMENT LOCAL
9 SYSAUX DATAFILE SIZE 300 M
10 SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 20 M
11 SMALLFILE UNDO TABLESPACE " UNDOTBS1 " DATAFILE SIZE 200 M
12 CHARACTER SET ZHS16GBK
13 NATIONAL CHARACTER SET AL16UTF16
14 LOGFILE GROUP 1 SIZE 51200 K ,
15 GROUP 2 SIZE 51200 K ,
16 GROUP 3 SIZE 51200 K ;
Database created .
SQL >
我们看到相关的文件已经用OMF管理:
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实例的存储呢?
create tablespace test_02 datafile ' +DG_DATA_01/oralocal/dfile/tbs_test_02.dbf ' size 10 m
*
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实例只能被一个数据库使用。