| var $tag=''; var $tag_code='7b39277fe8bb853cbfdb49ef93ce2ac9'; var $r_quote_bligid='4cbd76e501000b38'; var $worldcup='0'; var $worldcupball='0'; | 分类: oracle_rac |
在集群中的两个 Oracle RAC 节点上执行以下任务!
您将使用 OCFS2 存储 Oracle 集群件软件需要共享的文件。在使用 OCFS2 时,集群中的两个 Oracle RAC 节点上的 UNIX 用户 oracle 的 UID 和 UNIX 组 dba 的 GID 必须相同。如果 UID 或 GID 不同,则 OCFS2 文件系统中的文件将显示为“unowned”,甚至可能由其他用户所拥有。对于本文而言,oracle UID 使用 175,dba GID 使用 115。
创建 Oracle 的组和用户
让我们继续此示例,创建 Unix dba 组和 oracle 用户帐户以及所有相关目录。
# mkdir -p /u01/app
# groupadd -g 115 dba
# groupadd -g 116 oinstall
# useradd -u 175 -g 115 -d /u01/app/oracle -s /bin/bash -c "Oracle Software Owner" -p oracle oracle
# chown -R oracle:dba /u01
# passwd oracle
# su - oracle
注:当您为每个 Oracle RAC 节点设置 Oracle 环境变量时,请确保为每个 RAC 节点分配唯一的 Oracle SID!对于此示例,我使用:
为 oracle 用户帐户创建登录脚本
在两个节点上都创建了“oracle”UNIX 用户 id 后,通过使用以下 .bash_profile 确保正确设置了环境:.................................... # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi alias ls="ls -FA" # User specific environment and startup programs export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORA_CRS_HOME=$ORACLE_BASE/product/crs export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin export JAVA_HOME=/usr/local/java # Each RAC node must have a unique ORACLE_SID.(i.e. orcl1, orcl2,...) export ORACLE_SID=orcl1 export PATH=.:$JAVA_HOME/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin export ORACLE_TERM=xterm export TNS_ADMIN=$ORACLE_HOME/network/admin export ORA_NLS10=$ORACLE_HOME/nls/data export LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib export CLASSPATH=$ORACLE_HOME/JRE export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib export THREADS_FLAG=native export TEMP=/tmp export TMPDIR=/tmp ....................................
最后,为将用于存储两个 Oracle 集群件共享文件的 OCFS2 文件系统创建挂载点。需要以“root”用户帐户运行这些命令:
$ su -
# mkdir -p /u02/oradata/orcl
# chown -R oracle:dba /u02
在集群中的两个 Oracle RAC 节点上执行以下配置过程!
每次引导算机时,都需要在集群中的两个 Oracle RAC 节点上定义本节讨论的内核参数。本节提供了设置 Oracle 必需的那些内核参数的详细信息。第 15 节(“用于所有 Oracle RAC 节点的所有启动命令”)中包含有关如何将这些命令置于启动脚本 (/etc/sysctl.conf) 中的说明。
概述
本节集中讨论了针对 Oracle10g RAC 安装配置两台 Oracle RAC Linux 服务器的步骤。这包括验证足够的交换空间、设置共享内存和信号、设置文件句柄的最大数量、设置 IP 本地端口范围、设置对 oracle 用户的 shell 限制、激活系统的所有内核参数,以及如何验证两个集群节点的日期和时间是否正确。
在本节中,您将注意到可以使用多种方法来配置(设置)这些参数。就本文而言,我将通过把所有命令置于 /etc/sysctl.conf 文件中使所有更改永久有效(通过重新引导)。
对交换空间的考虑因素
# cat /proc/meminfo | grep MemTotal
MemTotal:1033116 kB
# cat /proc/meminfo | grep SwapTotal
SwapTotal:2031608 kB
以 root 身份创建一个用作额外交换空间的文件,假设大小为 300MB:
# dd if=/dev/zero f=tempswap bs=1k count=300000
现在我们应该更改文件的权限:
# chmod 600 tempswap
最后我们将该“分区”格式化为交换分区,并将其添加到交换空间:
# mke2fs tempswap
# mkswap tempswap
# swapon tempswap
设置共享内存
共享内存通过将通用的结构和数据放在共享内存段中,使得进程可以对它们进行访问。这是现有最快的进程间通信 (IPC) 方式,主要是因为数据在进程之间传递时没有涉及内核操作。不需要在进程间复制数据。
Oracle 将共享内存用于它的共享全局区 (SGA),这是一个由所有的 Oracle 备份进程及前台进程共享的内存区域。为 SGA 分配足够的容量对于 Oracle 的性能非常重要,这是因为它负责保存数据库缓冲区高速缓存、共享 SQL、访问路径,等等。
要确定所有共享内存的限制,使用以下命令:
# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
SHMMAX 参数定义共享内存段的最大大小(以字节为单位)。Oracle SGA 由共享内存组成,且错误设置 SHMMAX 可能会限制 SGA 的大小。在设置 SHMMAX 时,切记 SGA 的大小应该适合于一个共享内存段。SHMMAX 设置不足可能会导致以下问题:
ORA-27123:unable to attach to shared memory segment您可以通过执行以下命令确定 SHMMAX 的值:
# cat /proc/sys/kernel/shmmaxSHMMAX 的默认值为 32MB。通常,这个值对于配置 Oracle SGA 而言太小了。我通常使用以下方法将 SHMMAX 参数设置为 2GB:
33554432
# sysctl -w kernel.shmmax=2147483648
# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
设置 SHMMNI
我们现在看一下 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096。
可以通过执行以下命令确定 SHMMNI 的值:
# cat /proc/sys/kernel/shmmniSHMMNI 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。
4096
设置 SHMALL
最后,我们来看 SHMALL 共享内存内核参数。该参数控制系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应至少为:
ceil(SHMMAX/PAGE_SIZE)SHMALL 的默认大小为 2097152,并可以使用以下命令进行查询:
# cat /proc/sys/kernel/shmallSHMALL 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。
2097152
(注:i386 平台上的 Red Hat Linux 中的页面大小为 4,096 字节。但您可以使用 bigpages,它支持更大内存页面的配置。)
设置信号
至此,您已经配置了共享内存设置,接下来将配置信号。对“信号”的最佳描述是,它是用于在共享资源(如共享内存)的进程(或进程中的线程)之间提供同步的计数器。UNIX System V 支持信号集,其中的每个信号都是一个计数信号。当应用程序请求信号时,它使用“集合”来完成此工作。
要确定所有信号限制,使用以下命令:
# ipcs -ls您还可以使用以下命令:
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
# cat /proc/sys/kernel/sem
250 32000 32 128
SEMMSL 内核参数用于控制每个信号集合的最大信号数。
Oracle 建议将 SEMMSL 设置为 init.ora 文件(适用于 Linux 系统上所有数据库)中的最大 PROCESS 实例参数设置再加上 10。此外,Oracle 建议将 SEMMSL 设置为不小于 100。
设置 SEMMNI
SEMMNI 内核参数用于控制整个 Linux 系统中信号集的最大数量。Oracle 建议将 SEMMNI 设置为不小于 100。
设置 SEMMNS
SEMMNS 内核参数用于控制整个 Linux 系统中的信号(而非信号集)的最大数量。
Oracle 建议将 SEMMNS 设置为系统上每个数据库的 PROCESSES 实例参数设置之和,加上最大的 PROCESSES 的两倍,最后为系统上的每个 Oracle 数据库加上 10。
使用以下计算式确定可以在 Linux 系统上分配的信号的最大数量。它将是以下两者中较小的一个值:
SEMMNS -or- (SEMMSL * SEMMNI)
设置 SEMOPM
SEMOPM 内核参数用于控制每个 semop 系统调用可以执行的信号操作数。
semop 系统调用(函数)能够使用一个 semop 系统调用完成多个信号的操作。一个信号集可以拥有每个信号集中最大数量的 SEMMSL,因此建议将 SEMOPM 设置为等于 SEMMSL。
Oracle 建议将 SEMOPM 设置为不小于 100。
设置信号内核参数
最后,我们来看如何使用一些方法来设置所有信号参数。在下文中,我想更改(增加)的唯一参数是 SEMOPM。所有其他的默认设置可以完全满足我们的示例安装。
# sysctl -w kernel.sem="250 32000 100 128"
# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
设置文件句柄
在配置我们的 Red Hat Linux 服务器时,确保文件句柄的最大数量足够大是非常关键的。文件句柄的设置表示您在 Linux 系统上可以打开的文件数。
使用以下命令来确定整个系统中文件句柄的最大数量:
# cat /proc/sys/fs/file-maxOracle 建议将整个系统的文件句柄值至少设置为 65536。
102563
# sysctl -w fs.file-max=65536
# echo "fs.file-max=65536" >> /etc/sysctl.conf
# cat /proc/sys/fs/file-nrfile-nr 文件显示了三个参数:分配的文件句柄总数、当前使用的文件句柄数以及可以分配的最大文件句柄数。
825 0 65536
(注:如果需要增大 /proc/sys/fs/file-max 中的值,请确保正确设置 ulimit。对于 2.4.20,通常将其设置为 unlimited。使用 ulimit 命令验证 ulimit 设置:
# ulimit
unlimited
设置 IP 本地端口范围
配置系统,使本地端口范围为 1024 至 65000。
使用以下命令确定 ip_local_port_range 的值:
# cat /proc/sys/net/ipv4/ip_local_port_rangeip_local_port_range 的默认值是从 32768 到 61000 的端口。Oracle 建议的本地端口范围是 1024 到 65000。
32768 61000
# sysctl -w net.ipv4.ip_local_port_range="1024 65000"
# echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf
为 Oracle 用户设置 Shell 限制
要改善 Linux 系统上的软件性能,Oracle 建议您提高 oracle 用户的 shell 限制:Shell 限制 |
limits.conf 中的条目 |
硬限制 |
最大打开文件描述符数 |
nofile |
65536 |
可用于单个用户的最大进程数 |
nproc |
16384 |
cat >> /etc/security/limits.conf <oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF
cat >> /etc/pam.d/login <为“oracle”UNIX 帐户更新默认的 shell 启动文件。session required /lib/security/pam_limits.so
EOF
cat >> /etc/profile <if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
EOF
cat >> /etc/csh.login <if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
endif
EOF
激活系统的所有内核参数
此时,我们已经包含了成功进行 Oracle 安装和配置所需的所有 Linux 内核参数。在以上每一部分中,我们对 Linux 系统进行了配置,将所有内核参数置于 /etc/sysctl.conf 文件中以将其保存在系统启动上。现在,我们可以重新启动以确保所有这些参数在内核中进行设置,或者,我们只需通过以 root 用户身份运行以下命令来“运行”/etc/sysctl.conf 文件。请在集群的每一个节点上执行该操作!# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_max = 262144
kernel.shmmax = 2147483648
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
在所有的集群节点上设置正确的日期和时间
在安装 Oracle 集群件、数据库以及随附 CD 期间,Oracle Universal Installer (OUI) 将首先安装运行该安装程序的本地节点(即 linux1)的软件。然后,将该软件以远程方式复制到集群中的其余节点(即 linux2)。在远程复制过程中,OUI 将在每个远程节点上执行 UNIX“tar”命令,以提取进行了存档和复制的文件。如果执行安装的节点上的日期和时间大于其要进行复制的节点上的日期和时间,那么 OUI 将在“tar”中引发一个错误,以指示其在试图提取带有时间戳的文件时失败。Error while copying directory /u01/app/oracle/product/crs with exclude file list 'null' to nodes 'linux2'. [PRKC-1002 :All the submitted commands did not execute successfully] --------------------------------------------- linux2: /bin/tar:./bin/lsnodes:time stamp 2006-09-13 09:21:34 is 735 s in the future /bin/tar:./bin/olsnodes:time stamp 2006-09-13 09:21:34 is 735 s in the future ...(more errors on this node)
# date -s "6/25/2007 23:00:00"设置 linux2 的日期和时间:
# date -s "6/25/2007 23:00:20"本文中所述的双节点 RAC 配置没有使用 Network Time Protocol 服务器。
在集群中的两个 Oracle RAC 节点上执行以下配置过程!
Oracle9i 第 1 版 (9.0.1) 和 Oracle9i 第 2 版 (9.2.0.1) 使用一个称为 watchdogd 的用户空间监视后台程序 监视集群的运行状况,并在出现故障时重新启动 RAC 节点。从 Oracle9i 第 2 版 (9.2.0.2) 开始(在 Oracle 10g 第 2 版中仍然存在),一个称为 hangcheck-timer 的 Linux 内核模块取代了监视后台程序,该模块更好地解决了可用性和可靠性问题。它将 hang-check 计时器加载到 Linux 内核中并检查系统是否挂起。它将设置一个计时器,并在特定的时间量之后检查该计时器。有一个用于检查挂起情况的可配置阈值,如果超过该阈值,计算机将重新引导。尽管 Oracle 集群件(集群管理器)操作不需要 hangcheck-timer 模块,但 Oracle 强烈建议使用它。
hangcheck-timer.ko 模块
hangcheck-timer 模块使用了一个基于内核的计时器,该计时器周期性地检查系统任务调度程序来捕获延迟,从而确定系统的运行状况。如果系统挂起或暂停,则计时器重置该节点。hangcheck-timer 模块使用时间戳计数器 (TSC) CPU 寄存器,该寄存器每接收到一个时钟信号就将计数加一。由于此寄存器由硬件自动更新,因此 TCS 提供了更精确的时间度量。
关于 hangcheck-timer 项目的更多信息可在此处找到。
安装 hangcheck-timer.ko 模块
hangcheck-timer 通常仅与 Oracle 一同提供,但是,现在从内核版本 2.4.9-e.12 起,该模块与 Red Hat Linux AS 包含在一起。hangcheck-timer 应当已包含在内。使用以下命令来确认您已经包含了该模块:
# find /lib/modules -name "hangcheck-timer.ko" /lib/modules/2.6.9-55.0.0.0.2.ELhugemem/kernel/drivers/char/hangcheck-timer.ko /lib/modules/2.6.9-55.0.0.0.2.ELsmp/kernel/drivers/char/hangcheck-timer.ko /lib/modules/2.6.9-55.0.0.0.2.EL/kernel/drivers/char/hangcheck-timer.ko在以上输出中,我们关注的是 /lib/modules/2.6.9-55.0.0.0.2.ELhugemem/kernel/drivers/char 目录中的 hangcheck 计时器对象 (hangcheck-timer.ko),因为这是我们运行的内核。
配置并加载 hangcheck-timer 模块
hangcheck-timer 模块有两个关键的参数:
system hang time > (hangcheck_tick + hangcheck_margin)配置 Hangcheck 内核模块参数
每次加载 hangcheck-timer 内核模块(手动加载或由 Oracle 加载)时,它都需要知道对我们刚刚讨论的两个参数(hangcheck-tick 和 hangcheck-margin) 所使用的值。这些值需要在每次重新引导 Linux 服务器后可用。为此,在 /etc/modprobe.conf 文件中创建一个具有正确值的条目,如下所示:
# su -每次加载 hangcheck-timer 内核模块时,它将使用由我在 /etc/modprobe.conf 文件中创建的条目定义的值。
# echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modprobe.conf
手动加载 Hangcheck 内核模块以进行测试
Oracle 负责在需要时加载 hangcheck-timer 内核模块。因此,不必在任何启动文件(如 /etc/rc.local)中执行 hangcheck-timer 内核模块的 modprobe 或 insmod。
我继续在 /etc/rc.local 文件中包含 hangcheck-timer 内核模块的 modprobe 完全只是出于个人习惯。有朝一日我将戒掉这个习惯,但请注意,启动过程中包含 hangcheck-timer 内核模块的 modprobe 并无害处。
为了使自己保持清醒并能够在夜晚安睡,我始终按如下所示在每次启动时配置 hangcheck-timer 内核的加载:
# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local
(注:您不必在每次重新引导后使用 modprobe 或 insmod 手动加载 hangcheck-timer 内核模块。Oracle 将在需要时自动加载 hangcheck-timer 模块。)
现在,为了测试 hangcheck-timer 内核模块以验证它是否选取我们在 /etc/modprobe.conf 文件中定义的正确参数,使用 modprobe 命令。尽管可以通过向其传递相应的参数(如 insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180)加载 hangcheck-timer 内核模块,但我们需要验证它是否选取了我们在 /etc/modprobe.conf 文件中设置的选项。
要手动加载 hangcheck-timer 内核模块并验证它是否使用在 /etc/modprobe.conf 文件中定义的正确值,运行以下命令:
# su - # modprobe hangcheck-timer # grep Hangcheck /var/log/messages | tail -2 Jun 25 18:18:31 linux1 kernel:Hangcheck:starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds). Jun 25 18:18:31 linux1 kernel:Hangcheck:Using monotonic_clock().
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9606200/viewspace-745642/ ,如需转载,请注明出处,否则将追究法律责任。