安装Oracle10g
在RHEL3 上安装Oracle10g 已经是非常简单的操作了,只要系统内核参数设置正确,几乎不会碰到任何问题。
从以下连接可以得到在RHEL3 上安装Oracle10g 的详细步骤,本文不再赘述。
http://www.puschitz.com/InstallingOracle10g.shtml
在安装Oracle10g 的时候,我们选择不创建数据库,只安装软件的方式,在软件安装结束以后再通过dbca 来创建ASM 实例和数据库。
创建ASM实例
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/<sid>,本文中ASM 实例的SID 是+ASM。最好不要修改这个实例名,否则在下一步用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 错误是正常的。
如果启动实例的时候碰到如下报错:
ORA-29701: unable to connect to Cluster Manager
那么请检查/etc/inittab 文件,看看是否有下面这行
h1:35:respawn:/etc/init.d/init.cssd run >/dev/null 2>&1 </dev/null
如果没有请添加,如果被注释了请取消注释。
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;
NAMESTATE
---------- ----------------------
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数据库
用dbca 创建数据库,一直到选择数据类型的画面以前都跟创建普通数据库没有区别。
下面是dbca 创建数据库的第6 步画面,普通的数据库我们通常选择File System,而ASM
类型的数据库我们则要选择“Automatic Storage Management”。
下一步,oracle 将自动检查出已经加载的Diskgroup,在这个界面我们可以通过Create New 按钮创建新的Diskgroup,也可以通过Add Disks 按钮向当前的磁盘组中添加额外的磁盘,当然这些磁盘必须是先用oracleasm createdisk 过的(在第4 章节的创建ASM磁盘部分有所叙述)。
在数据文件的位置管理设定界面,通常应该使用OMF,由oracle 自己管理数据文件的命名,
这样才算是进一步解放了DBA 对于物理存储方面的繁琐工作。
继续往下的步骤,跟创建普通数据库已经没有什么区别了。不再赘述。
启动ASM数据库的步骤
由于启动ASM 数据库必须要先启动ASM 实例,所以基本上启动步骤如下。
1. 以oracle 用户进入操作系统
2. $ export ORACLE_SID=+ASM
3. SQL> sqlplus / as sysdba
4. SQL> startup
5. SQL> exit
6. $ export ORACLE_SID=<your_real_db_sid>
7. SQL> sqlplus / as sysdba
8. SQL> startup
ASM数据库的简单测试
测试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 OPERATIONSTATE EST_WORK SOFAR
EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 416 0 0
0
SQL> /
GROUP_NUMBER OPERATIONSTATE EST_WORK SOFAR
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 OPERATIONSTATE EST_WORK SOFAR
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
----------- --------------------------------------------------------------
0 VOL4
1 VOL2
0 VOL1
2 VOL3
4 VOL5
5 VOL6
数据库实例:
SQL> SELECT disk_number, label FROM V$asm_disk;
DISK_NUMBER LABEL
----------- -------------------------------
0