本文主要介绍基于HammerDB测试的oracle的安装及环境配置,以被测机(System Under Test, SUT)的操作为主,末尾会简单介绍下控制端。
关于HammerDB这个数据库性能测试工具可以参考这里:数据库压力测试工具HammerDB
操作系统:Redhat 7.3 x86_64
硬盘:2块NVME SSD
Oracle版本 12.1
首先建立几个文件夹
[root@hammer-server~]# mkdir /u01
[root@hammer-server~]# mkdir /u01/app # oracle安装目录
[root@hammer-server~]# mkdir /u01/software # oracle安装包放置目录
Oracle官网下载oracle安装包,注意这里跟操作系统保持一致,也是选64位的 oracle官网下载链接
将oracle安装包放到/u01/software下
[root@hammer-server~]# ls /u01/software/
linuxamd64_12102_database_1of2.zip linuxamd64_12102_database_2of2.zip linuxamd64_12102_grid_1of2.zip linuxamd64_12102_grid_2of2.zip
解压后生成database和grid两个文件夹,先装grid 再装database。如果是直接使用文件系统而不打算使用ASM(Automatic Storage Management)进行管理硬盘,可以跳过grid安装这一步。
[root@hammer-server~]# ls /u01/software/
database grid
分别创建oracle用户和grid用户,oracle用户用来装oracle database软件,grid用户用来安装oracle grid软件。
[root@hammer-server~]# groupadd dba # 先新建dba用户组
[root@hammer-server~]# useradd oracle -g dba # 建立oracle用户并归属于dba用户组
[root@hammer-server~]# useradd grid -g dba # 建立oracle用户并归属于dba用户组
[root@hammer-server~]# passwd oracle # 创建用户密码
[root@hammer-server~]# passwd grid
分别修改oracle用户和grid用户下的环境变量
[oracle@hammer-server ~]$ vi .bash_profile
添加以下内容
app_name=oracle
app_version=12.1.0.2
export ORACLE_BASE=/u01/app/$app_name
export ORACLE_HOME=$ORACLE_BASE/product/$app_version/db_1
export ORACLE_SID=hammer #可以任意设置,但注意这个必须是后面建立数据库时的数据库实例名称
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin:$ORACLE_HOME/OPatch
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/jdk/lib:$ORACLE_HOME/jdk/jre/lib:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
[grid@hammer-server ~]$ vi .bash_profile
添加以下内容
app_name=grid
app_version=12.1.0.2
export ORACLE_BASE=/u01/app/$app_name
export ORACLE_HOME=$ORACLE_BASE/product/$app_version/$app_name
export ORACLE_SID=+ASM
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin:$ORACLE_HOME/OPatch
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/jdk/lib:$ORACLE_HOME/jdk/jre/lib:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
[root@hammer-server ~]# vi /etc/sysctl.conf # 在文件结尾添加下一行
vm.nr_hugepages=180000 # (2M each, total 360000M~360G)
这里主要要注意oracle的使用需要打开hugepage,每个hugepage有2M,这里页数的设置取决于oracle参数所定义出的SGA (System Global Area)大小,hugepage的总容量大小需要大于SGA大小,稍微大于就好,太大则会浪费内存空间。
Note:注意大页的大小一定要小于系统总内存的大小,否则会导致无法正常使用系统并且重启机器时无法进入操作系统。
[root@hammer-server ~]# sysctl –p # 使之生效
[root@hammer-server ~]# cat /proc/meminfo # 查看内存使用情况
HugePages_Total: 180000
[root@hammer-server ~]# vi /etc/security/limits.conf # 在文件结尾添加如下内容
grid hard nofile 65536 # 增大grid用户最大文件打开数
grid soft nofile 65536
oracle soft nofile 65536 # 增大oracle用户最大文件打开数
oracle hard nofile 65536
[oracle@hammer-server ~]$ ulimit –a # 查看是否生效,注意需要重新打开一个会话用oracle/grid用户登录才会生效
open files (-n) 65536
考虑到性能方面的需求,oracle的测试需要至少两个硬盘,一个存放测试数据(data),一个存放oracle的重做日志(redo log)。
如果硬盘以前使用过有数据,需要先将硬盘格式化。
如果要使用oracle中的ASM (Automatic Storage Management)去管理硬盘,需要先对硬盘进行分区,然后用linux中的udev工具去管理。
硬盘的分区可以用fdisk或者parted 工具。下面以parted为例,给nvme0n1盘建立一个分区。
[root@hammer-server ~]# parted /dev/nvme0n1
(parted) help # 查看帮助
(parted) print # 查看硬盘分区情况
Model: Unknown (unknown)
Disk /dev/nvme0n1: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
(parted) mklabel gpt # 定义分区表格式
(parted) mkpart primary 2048s 100% # 建立分区,百分数代表新分区占硬盘总容量的百分比
(parted) align-check opt 1 # 对齐检查
1 aligned
(parted) print # 分区成功,查看
Model: Unknown (unknown)
Disk /dev/nvme0n1: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2000GB 2000GB primary
这里以Intel的PCIe SSD P3700为例,不同的硬盘这里使用的命令会有差异。
在/etc/udev/rules.d目录下新建一个.rules规则文件,可自己命名,但要以数字开头。
[root@hammer-server ~]# vi /etc/udev/rules.d/99-oracleasm.rules 添加如下内容
KERNEL=="nvme0n1p1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SNVMe_INTEL_SSDPEDMD02PHFT5364000B2P0EGN", SYMLINK+="oracle/DATA", OWNER="oracle", GROUP="dba", MODE="0660"
KERNEL=="nvme1n1p1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="SNVMe_INTEL_SSDPEDMD02CVFT4415008A2P0EGN", SYMLINK+="oracle/REDO", OWNER="oracle", GROUP="dba", MODE="0660"
其中RESULT==双引号里的内容需要分别替换成运行PROGRAM里命令的结果,即如下命令:
[root@hammer-server ~]# usr/lib/udev/scsi_id -g -u -d /dev/nvme0n1
SNVMe_INTEL_SSDPEDMD02PHFT5364000B2P0EGN
[root@hammer-server ~]# usr/lib/udev/scsi_id -g -u -d /dev/nvme1n1
SNVMe_INTEL_SSDPEDMD02CVFT4415008A2P0EGN
[root@hammer-server ~]# udevadm test /block/nvme0n1/nvme0n1p1 # 测试
[root@hammer-server ~]# udevadm test /block/nvme1n1/nvme1n1p1
[root@hammer-server ~]# ls /dev/oracle/ -l # 查看该目录下是否有data和redo两个链接文件
total 0
lrwxrwxrwx 1 root root 12 Feb 14 02:34 DATA -> ../nvme0n1p1
lrwxrwxrwx 1 root root 12 Feb 14 02:38 REDO -> ../nvme1n1p1
[root@hammer-server ~]# ls /dev/nvme*n1p1 –al # 查看所属用户是否变为oracle用户
brw-rw---- 1 oracle dba 259, 2 Feb 14 06:07 /dev/nvme0n1p1
brw-rw---- 1 oracle dba 259, 4 Feb 14 06:07 /dev/nvme1n1p1
安装grid是为了使用ASM去建立DATA和REDO的disk group磁盘组,更有效率的管理磁盘。
[root@hammer-server ~]# mkdir /u01/app/grid # 新建grid文件夹
[root@hammer-server ~]# chown –R grid:dba /u01 # 改变 /u01文件夹下的所属用户(注意是dba用户组的grid用户)
以grid用户重新登录
[grid@hammer-server ~]$ cd /u01/software/grid
[grid@hammer-server grid]$ ./runInstaller # 运行安装程序,弹出安装窗口
grid的安装需要先至少有一个磁盘组disk group,这里选择change directory path为刚才生成的/dev/oracle,之后会显示出data和redo两个硬盘
选择硬盘data,注意选择’External’即没有冗余,提高数据写入效率(安全性低,仅用于测试,平常使用不推荐)
这里显示的路径就是环境变量里ORACLE_BASE和ORACLE_HOME的路径
oracle安装预检查系统是否配置好以及依赖包是否安装。如果提示缺失package用yum安装一下就可以了,然后‘check again’
如果最后仍然提示系统缺少swap size,那么可以‘ignore all’,性能测试中是用不到swap size的。
接下来安装install就可以了,直到出现如下提示对话框,以root用户运行这两条命令之后在点击ok继续安装。
安装成功
grid安装好了之后grid用户就可使用ASM命令了
[grid@hammer-server ~]$ asmcmd
ASMCMD> ls # 查看磁盘组
DATA/ # DATA磁盘组已建立
ASMCMD> quit
这里还需要建立REDO磁盘组
[grid@hammer-server ~]$ asmca # 启动ASM助手(图形界面)管理或添加磁盘组
点击create,和建DATA一样选择‘External’然后‘OK’
现在再查看磁盘组,能看到DATA和REDO两个了
[grid@hammer-server ~]$ asmcmd
ASMCMD> ls # 查看磁盘组
DATA/
REDO/ # REDO磁盘组已建立
oracle的安装和前面grid的安装类似
[root@hammer-server ~]# mkdir /u01/app/oracle # 新建oracle文件夹
[root@hammer-server ~]# chown oracle:dba /u01/app/oracle # 改变新的文件夹下的所属用户(注意是dba用户组的oracle用户)
以oracle用户重新登录
[oracle@hammer-server ~]$ cd /u01/software/database
[oracle@hammer-server database]$ ./runInstaller # 运行安装程序
仅安装数据库软件
下一步显示的路径就是oracle用户下环境变量里ORACLE_BASE和ORACLE_HOME的路径
继续ignore swap size,下一步安装,和grid安装一样,弹出窗口提示以root用户运行命令后再‘OK’继续安装。
安装成功之后使用dbca 数据库配置助手在oracle中建立数据库
[oracle@hammer-server ~]$ dbca
输入Global database name数据库实例名,需要和oracle用户的环境变量中ORACLE_SID一致,数据库文件位置选择在DATA上,设置密码
成功建立数据库后先不要关闭窗口,选择’password management’设置数据库中年SYS和SYSTEM用户的密码,这个密码会在HammerDB‘Build schema’的时候用到。
数据库建立之后可以使用sqlplus命令
[oracle@hammer-server ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 29 05:06:25 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options
SQL> create pfile='/home/oracle/install.pfile' from spfile;
生成此刻数据库建立时的启动参数到install.pfile中。
数据库实例的启动需要一个参数文件,比如刚才生成的install.pfile,但这只是规定的最基本的一些参数。如果追求性能上的优化,需要根据自己的需要新建一个pfile文件作为我们自己定义的oracle启动参数文件,它是进行数据库设计和性能调优的重要文件。
如果自己定义了一个pfile文件(这里hammer.pfile为例),这里需要注意,每一次数据库建立后的control file名称都是不同的,所以需要把install.pfile文件中的CONTROL FILE的值替换到hammer.pfile的CONTROL FILE项中,这样才可以成功用hammer.pfile启动数据库实例。
hammer.pfile中的CONTROL FILE修改了之后,使用hammer.pfile参数文件重启数据库
SQL> shutdown immediate; # 先关闭数据库实例
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile='hammer.pfile'; # 使用自定义的hammer.pfile参数文件启动数据库
ORACLE instance started.
Total System Global Area 3.4843E+11 bytes
Fixed Size 7669992 bytes
Variable Size 2.5192E+10 bytes
Database Buffers 3.2212E+11 bytes
Redo Buffers 1107365888 bytes
ORACLE instance startup.
Database mounted.
新建tpc.sql文件,用于建立tpc和tpcctab表空间,根据自己需要选择增加多少个datafile。
drop tablespace tpc including contents and datafiles;
create tablespace tpc datafile '+DATA' size 31g extent management local segment space management auto;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
alter tablespace tpc add datafile '+DATA' size 31g;
drop tablespace tpcctab including contents and datafiles;
create tablespace tpcctab datafile '+DATA' size 31g blocksize 16k extent management local segment space management auto;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
alter tablespace tpcctab add datafile '+DATA' size 31g;
exit;
SQL> @tpc.sql; # 建立tpc和tpcctab表空间
增加undo表空间容量
添加几个数据文件datafile到现有的undo表空间,可以根据需要添加多个数据文件
SQL> alter tablespace undotbs1 add datafile '+DATA' size 31g;
SQL> alter tablespace undotbs1 add datafile '+DATA' size 31g;
在建立数据库时会有3个redo logfile group重做日志文件组自动建立到DATA磁盘组,需要将它从DATA移到REDO磁盘组,做这个之前需要了解以下事情:
数据库系统中至少要有2个redo logfile group循环使用,当一个用满了之后会做一个checkpoint。
只有当group 的状态为inactive时,才可以删除它,如果必须删除current 的group 需要先 alter system switch logfile;
因此我们需要在REDO上面新建2个新的redo logfile group然后再把原先DATA上的drop掉
SQL>select * from v$log # 列出数据库中的redo logfile group
SQL>select* from v$logfile # 列出数据库中的redo logfile group的位置
SQL>alter database add logfile group 4 '+REDO' size 300g blocksize 4096;
SQL>alter database add logfile group 5 '+REDO' size 300g blocksize 4096;
SQL>select *from v$log; # 查看是否建立成功
SQL>alter system switch logfile; # 切换current的logfile
SQL>alter system checkpoint; # 将要删除的logfile状态变为inactive
SQL>alter database drop logfile group 1;
SQL>alter database drop logfile group 2;
SQL>alter database drop logfile group 3;
同样新建dba用户组下的oracle用户
[root@hammer-server~]# groupadd dba
[root@hammer-server~]# useradd oracle -g dba
配置oracle用户环境变量
[oracle@hammer-client ~]$ vi .bash_profile 添加
export ORACLE_HOME=/home/oracle/app/oracle/product/12.1.0/client_1
export PATH=$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=/home/oracle/HammerDB-2.23/lib:$LD_LIBRARY_PATH
解压oracle客户端安装包到某文件夹下
[oracle@hammer-client ~]$ cd oracle-client
[oracle@hammer-client oracle-client]$ ./runInstaller # 运行安装程序
选择Runtime
HammerDB的安装可以参考上一篇文章:数据库压力测试工具HammerDB
安装成功后打开HammerDB可能会遇到如下报错:
[oracle@localhost HammerDB-2.23]$ ./hammerdb.tcl
wish8.6: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
原因是缺少某包
[root@localhost ~]# yum search libXss
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
========================================================= N/S matched: libXss ==========================================================
libXScrnSaver.i686 : X.Org X11 libXss runtime library
libXScrnSaver.x86_64 : X.Org X11 libXss runtime library
Name and summary matches only, use "search all" for everything.
[root@localhost ~]# yum install libXScrnSaver.x86_64