分类:
2008-06-25 21:43:20
佚名 -Oracle-
2007-3-7 —
下载该过程的支持文件。
通常在首次创建数据库的过程中安装/选择 Oracle 自动存储管理 (ASM),将它作为主
存储
选件。 这种情况下,将在该时刻创建 ASM 实例,并且
随后将由 ASM 管理所有的空间分配(包括 init.ora)
。 在本文的示例中,我们演示了一个更困难的情况,即将 ASM
功能实际添加到现有的非 ASM 数据库中。 学习该方法的过程中,您将轻松了解
上述的更常用的主流方法。
首先,我们将准备将由 ASM 管理的空间。 为简单起见,我们将 4 个磁盘划分为
等大的分区来模拟 4 个磁盘。
1. 使用 fdisk 将 /dev/sde 划分为 4 个分区:
以 root 的身份运行:
# fdisk /dev/sde
i. 命令: 键入“n”并按 ENTER。
ii.命令动作: 键入“p”并按 ENTER。
iii. 分区号: 键入“1”并按 ENTER。
iv. 起始柱面: 按 ENTER。
v. 结束柱面: +2000M。
重复以上步骤 3 次以上,每次分区号
递增 1。
vi. 要写分区表然后退出,请键入“write”
在实际的 RAC 配置中,其他所有节点将必须重新读取
分区表更改。 最简单的方法是重新启动这些节点;请询问
OS/供应商是否有破坏程度低一些的方法,通常情况下
rmmod后跟 insmod 可以达到目的。
卸载并重新加载 I/O 设备驱动程序。
2. 在 Linux 上,ASM 可以直接使用 ASMLib 管理原始设备或块设备
。 选择以下某个方法:
a. 无 ASMLib: 配置原始设备(这是由于不使用 ASMLib)
i. 以 root 的身份运行 vi 或 nedit:
REDHAT: /etc/sysconfig/rawdevicesdevices
SUSE: /etc/raw
按如下所示添加每个原始设备的条目:
Red Hat 语法:
/dev/raw/raw11 /dev/sde1
/dev/raw/raw12 /dev/sde2
/dev/raw/raw13 /dev/sde3
/dev/raw/raw14 /dev/sde4
SUSE 语法:
raw11:sde1
raw12:sde2
raw13:sde3
raw14:sde4
ii. 以 root 身份启动原始设备(确保它们在下次重新启动时启动)
:
RedHat:
# /etc/init.d/rawdevices restart
原始设备设置为在 Red Hat 上启动时自动启动。
验证:
# chkconfig --list rawdevices
SUSE:
# /etc/init.d/raw start
# chkconfig -s raw 35 (重新启动时自动启动)
如果 CRS 已经启动了两个原始设备,则“rawdevices restart”
这两个原始设备将显示错误,但这属于正常现象。 这只意味着 CRS
已经打开了这两个原始设备,因此无法更改它们。
iii. 以 root 的身份修复所有节点的权限:
# chown oracle:dba /dev/raw/raw1[1-4]
特意使用了技巧性的命令,要学习一些 Linux 方面的知识...
检查 raw11 到 raw14 的权限。
b. ASMLib: 配置以使用 ASMLib 访问设备
i. 从以下位置下载 ASMLib rpm 文件:
获取“用户空间库”、“驱动程序支持文件”、“内核的驱动程序”
ii. 以 root 的身份安装 ASMLib:
# rpm -Uhv oracleasmlib-1.0.0-1.i386.rpm \
oracleasm-2.4.21-EL-1.0.3-1.i686.rpm \
oracleasm-support-1.0.3-1.i386.rpm
使用适合您的内核和版本的 rpms。 以上
是双处理器 RHEL3 内核上的 Red Hat 的名称。
iii. 以 root 的身份配置 ASM 一次:
# /etc/init.d/oracleasm configure
回答提示,答案为 oracle、dba、y、y
iv. 定义在第 1 步中创建的 4 个磁盘,以 root 的身份运行:
# /etc/init.d/oracleasm createdisk DISK1 /dev/sde1
# /etc/init.d/oracleasm createdisk DISK2 /dev/sde2
# /etc/init.d/oracleasm createdisk DISK3 /dev/sde3
# /etc/init.d/oracleasm createdisk DISK4 /dev/sde4
3. 运行“dbca”以创建 ASM 实例。 通常情况下,该步骤将在
创建主数据库期间完成,方法是选择 ASM 作为主要
存储选项:
如果使用 RHEL-U1: 再次检查您是否拥有 LD_ASSUME_KERNEL=2.4.19
RHAS2.1,RHEL3-U2 与 SLES8/9 不需要此环境设置。
$ env | grep LD_ASSUME
i. 选择 RAC、Create Database、on raclinux1、Next、任何假数据库名,
单击“next”直到转到第 7 步(共 16 步)。
ii. 选择 Automatic Storage Management (ASM)、Next、oracle 作为
密码、Next、OK
iii. 让 DBCA 创建 ASM 实例
iv. 按“Create New”,输入磁盘组名称: MY_DG
如果使用 ASMLib: 将 Disk Discovery Path(右下方)更改为 ORCL:*
v. 无 ASMLib: 选择要添加的设备 /dev/raw/raw11 与 12
ASMLib: 选择要添加到使用正常冗余的 MY_DG 的 DISK1 和 DISK2
。
单击“OK”。 (创建 ASM 磁盘组......)
vi. 退出 DBCA! 确认取消。
4. 注意,ASM 实例已经关闭,要启动实例,请输入以下命令:
$ srvctl start asm -n raclinux1
$ srvctl status asm -n raclinux1
5. (可选)为了完全模拟 RAC,可以该节点上再创建并启动
ASM 实例。 通常,第二个 ASM 实例
将和第二个实例 O10G2 在在第二个节点运行。
要创建第二个 ASM 实例(不支持在一个节点上运行),请执行以下操作:
a. 编辑 /opt/oracle/DB10g/dbs/init+ASM1.ora 并添加以下两行:
+ASM2.instance_number=2
+ASM2.local_listener=LISTENER_+ASM2
b. 为第二个 ASM 实例创建到该文件的符号链接:
$ ln -s init+ASM1.ora init+ASM2.ora
c. 为第二个 ASM 实例创建口令文件:
$ orapwd file=orapw+ASM2 password=oracle
d. 修复 /opt/oracle/DB10g/network/admin/tnsnames.ora:
i. 在 LISTENER_+ASM1 中只包含一个监听器(端口 1521)
ii. 创建一个新的 LISTENER_+ASM2,包含第二个监听器 (1522)
e. 将第二个 ASM 实例添加到 CRS 并启动实例:
$ srvctl add asm -n raclinux1 -i +ASM2 -o /opt/oracle/DB10g/
$ srvctl start asm -n raclinux1 -i +ASM2
6. 由于我们并未创建一个位于 ASM 以外的新数据库,因此我们
必须执行以下配置步骤:
a. 将现有实例修改为依赖于新创建的 ASM 实例,
这样一来,如果 ASM 实例已关闭
而我们要尝试启动依赖于它的实例,CRS
将在尝试启动实例时自动启动 ASM
:
$ srvctl modify instance -d O10G -i O10G1 -s +ASM1
$ srvctl modify instance -d O10G -i O10G2 -s +ASM2
注意: 如果只创建了一个 ASM 实例,请将两个数据库实例
同时设置为依赖于 +ASM1。
b. 由于出现错误,EM 将不会发现新的 ASM 目标。
以下演示了如何将它手动添加到 targets.xml(摘自版本说明):
$ emctl stop dbconsole
$ cd $ORACLE_HOME/raclinux1.us.oracle.com_O10G1/sysman/emd/
<下载 asm xml 定义(位于中)并将其解压缩到此目录>
$ cp -p targets.xml targets.xml_before_ASM
$ emctl config agent addtarget `pwd`/targets-add-asm.xml
$ emctl start dbconsole
c.(可选)通过访问以下网站进行测试:
登录: sys/oracle as sysdba
单击主页面(左侧)中的“crs”目标(集群)链接,
然后点击顶部栏上的“Targets”,其中列出了所有目标,单击 ASM
目标。
将数据文件添加到 ASM(下面)后,ASM 链接也将显示:
单击任何实例 O10G1 或 O10G2(主页底部)
ASM 链接将位于左侧。
7. 使数据库可以侦测到 ASM 存储器上的可用磁盘组
:
$ ORACLE_SID=O10G1 sqlplus "/ as sysdba"
SQL> ALTER SYSTEM SET DB_CREATE_FILE_DEST='+MY_DG' scope=both;
如果不使用 spfile 文件,只需删除范围,然后将该参数
添加到 initO10G1.ora 文件(initO10G2.ora 应使用符号链接链接它)。
使更改在第二个节点上生效,重新连接并输入“ALTER
SYSTEM SET”命令或在更新 init.ora 后回弹 O10G2。
8. (可选)要使用 ASM 管理的存储器内部的空间:
只需输入(注意,未指定数据文件):
SQL> CREATE TABLESPACE ASM_TBS datafile size 10M;
9. (可选,推荐)在命令行模式下进行 ASM 再平衡演示,
(使用企业管理器的输出将更好),
不使用 ASMLib 情况下的输出:
i. 从 swingbench 中使用 oewizard,使用新添加的 ASM 存储器创建一个新模式
:
$ swingbench21g/bin/oewizard
将用户名、密码和表空间设置为“SOE_ASM”
数据文件名称为“+MY_DG”,它将使用 ASM 进行存储。
ii. 启动 Swingbench 并在 SOE_ASM 模式上运行 10 个用户。
这将加载/更新 MY_DG 磁盘组(SOE_ASM 表空间)中的数据
在此过程中监视 Swingbench 的事务/分钟。
iii. 监视 ASM 实例并操作磁盘组:
$ ORACLE_SID=+ASM1 sqlplus "/ as sysdba"
初始条件:
SQL> select state,header_status,substr(name,1,12) Name,free_mb,
substr(path,1,16) PATH from v$asm_disk;
STATE HEADER_STATU NAME FREE_MB PATH
-------- ------------ ------------ ---------- ----------------
NORMAL CANDIDATE 0 /dev/raw/raw14
NORMAL CANDIDATE 0 /dev/raw/raw13
NORMAL MEMBER MY_DG_0001 1812 /dev/raw/raw12
NORMAL MEMBER MY_DG_0000 1812 /dev/raw/raw11
SQL> select * from v$asm_operation; (no rows)
iv. 将两个新磁盘添加到现有磁盘组中:
没有 ASMLib:
SQL> alter diskgroup MY_DG add disk '/dev/raw/raw13'
SQL> alter diskgroup MY_DG add disk '/dev/raw/raw14'
ASMLib:
SQL> alter diskgroup MY_DG add disk 'ORCL:DISK3'
SQL> alter diskgroup MY_DG add disk 'ORCL:DISK4'
SQL> select state,header_status,substr(name,1,12) Name,free_mb,
substr(path,1,16) PATH from v$asm_disk;
STATE HEADER_STATU NAME FREE_MB PATH
-------- ------------ ------------ ---------- ----------------
NORMAL MEMBER MY_DG_0003 2445 /dev/raw/raw14
NORMAL MEMBER MY_DG_0002 1911 /dev/raw/raw13
NORMAL MEMBER MY_DG_0001 1812 /dev/raw/raw12
NORMAL MEMBER MY_DG_0000 1812 /dev/raw/raw11
SQL> select operation,state,power,actual,sofar,est_work,
est_minutes from v$asm_operation;
OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_MINUTES
----- ---- ---------- ---------- ---------- ---------- -----------
REBAL RUN 1 1 3 62 1
ASM 在添加新磁盘时重新平衡磁盘组。
v. 现在丢弃保存所有用户数据的初始磁盘;观察
ASM 将所有数据传输到新磁盘,从而使您可以
移除不需要的磁盘。 撤消操作立即完成,
传输数据操作在后台发生。
没有 ASMLib:
SQL> alter diskgroup MY_DG drop disk my_dg_0000;
SQL> alter diskgroup MY_DG drop disk my_dg_0001;
ASMLib:
SQL> alter diskgroup MY_DG drop disk DISK1;
SQL> alter diskgroup MY_DG drop disk DISK2;
SQL> select state,header_status,substr(name,1,12) Name,free_mb,
substr(path,1,16) PATH from v$asm_disk;
STATE HEADER_STATU NAME FREE_MB PATH
-------- ------------ ------------ ---------- ----------------
NORMAL MEMBER MY_DG_0003 2335 /dev/raw/raw14
NORMAL MEMBER MY_DG_0002 1827 /dev/raw/raw13
DROPPING MEMBER MY_DG_0001 1860 /dev/raw/raw12
DROPPING MEMBER MY_DG_0000 1867 /dev/raw/raw11
注意,raw11 和 raw12 标记为 DROPPING..
SQL> select operation,state,power,actual,sofar,est_work,
est_minutes from v$asm_operation;
OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_MINUTES
----- ---- ---------- ---------- ---------- ---------- -----------
REBAL RUN 1 1 7 233 0
以上是重新平衡操作,用于卸载已丢弃的磁盘中的数据
。
操作完成时,磁盘标记为 FORMER
成员,这意味着可以移除它们或重新用于空间。
SQL> select state,header_status,substr(name,1,12) Name,free_mb,
substr(path,1,16) PATH from v$asm_disk;
STATE HEADER_STATU NAME FREE_MB PATH
-------- ------------ ------------ ---------- ----------------
NORMAL FORMER 0 /dev/raw/raw11
NORMAL FORMER 0 /dev/raw/raw12
NORMAL MEMBER MY_DG_0003 2303 /dev/raw/raw14
NORMAL MEMBER MY_DG_0002 1769 /dev/raw/raw13
在本演示中,性能根本不受影响;
每分钟的事务数应保持不变。