服务器环境

CentOS7 分配资源:CPU:2颗,内存:16GB,数据盘空间:500GB ,挂载到 /data目录

Oracle12C企业版64位

注意,阿里云的服务器中装oracle想让外网能访问,要监听内网IP,然后安全组中开放相应的端口

一、以root身份安装依赖包

 -y  binutils compat-libcap1 compat-libstdc++- compat-libstdc++-*.i686 elfutils-libelf-devel  -c++ glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh libgcc*.i686 libgcc libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.i686 libaio libaio*.i686 libaio-devel libaio-devel*.i686  sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686 libXp

二、创建用户和用户组

groupadd oinstall  
groupadd dba  
useradd -g oinstall -G dba oracle  
echo "123456" | passwd --stdin oracle #oracle用户的登录密码,后续登录要用,记着。

三、创建安装目录

mkdir -p /data/orcl/app/oracle/product/12.1.0/db_1  
chown -R oracle:oinstall /data/orcl/app  
chmod -R 775 /data/orcl/app

四、修改内核参数vim /etc/sysctl.conf,添加:

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 4194304
kernel.shmmax = 4294967296
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586

执行

sysctl -p #让上面的配置生效

注意kernel.shmmax和kernel.shmall,这个需要根据自己的服务器内存修改。

一般64位系统,kernel.shmmax设置的比sga_max_size大即可。

如何查询sga_max_size呢?

举例说明:

export ORACLE_SID=orcllog
sqlplus / as sysdba
#SQL> startup
SQL> show parameter sga;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga	     boolean	 FALSE
lock_sga			     boolean	 FALSE
pre_page_sga			     boolean	 TRUE
sga_max_size			     big integer 4768M
sga_min_size			     big integer 0
sga_target			     big integer 4768M
unified_audit_sga_queue_size	     integer	 1048576

能够看出来我的sga_max_size是4768M, 太大了,我一共才16G内存,启动三个数据库就不够用了,所以我要先修改一下。

SQL> alter system set MEMORY_TARGET=2048m scope=spfile ;

System altered.

SQL> alter system set sga_max_size=1024m scope=spfile;

System altered.

SQL> alter system set sga_target=1024m scope=spfile;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size		    8801008 bytes
Variable Size		  373294352 bytes
Database Buffers	  683671552 bytes
Redo Buffers		    7974912 bytes
Database mounted.
Database opened.

修改成了1G大小,所以我的kernel.shmmax只要设置成4G左右就够了!

一般来说,1-4G 的物理内存,可以直接设置shmmax 为最大物理内存即可,那

么SGA 肯定在一个共享内存段中,32Bit Linux 系统物理内存大于4G 的设置为4G 即可 。

总之,一般设置shmmax >=SGA (32Bit 系统是否支持到1.7G 以上SGA 需要注意) 。

如果是64Bit 的Linux 操作系统,shmmax 设置为大于SGA_MAX_SIZE 即可。

kernel.shmall 参数是控制共享内存页数 。Linux 共享内存页大小为4KB, 共享内
存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,那么需
要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304 (页),也就是64Bit 系统下
16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求(几乎是原来设置2097152
的两倍)。这时可以将shmmax 参数调整到 16G 了,同时可以修改SGA_MAX_SIZE 和
SGA_TARGET 为 12G(您想设置的SGA 最大大小,当然也可以是2G~14G 等,还要协调PGA
参数及OS 等其他内存使用,不能设置太满,比如16G)。

五、改文件限制:vim /etc/security/limits.conf,添加:

oracle soft nproc 2047  
oracle hard nproc 16384  
oracle soft nofile 1024  
oracle hard nofile 65536  
oracle soft stack 10240

以及vim /etc/pam.d/login,添加:

session required pam_limits.so

修改ulimit:vim /etc/profile,添加:

if [ $USER = "oracle" ]; then  
    if [ $SHELL = "/bin/ksh" ]; then  
        ulimit -p 16384  
        ulimit -n 65536a  
    else  
        ulimit -u 16384 -n 65536  
    fi  
fi

修改环境变量。vim ~oracle/.bash_profile,添加:

ORACLE_BASE=/data/orcl/app/oracle  
ORACLE_HOME=$ORACLE_BASE/product/12.1.0/db_1  
ORACLE_SID=orcl  
export ORACLE_BASE ORACLE_HOME ORACLE_SID  
PATH=$ORACLE_HOME/bin:$PATH  
export PATH

六、用yum remove openjdk 把系统自带的openjdk卸载,再安装sun jdk:rpm -ivh jdk-8u101-linux-x64.rpm。(openjdk环境安装oracle GUI会报class not found的错)。然后$>java -version检查一下安装是否成功。上述工作完成后,建议重启系统。

七、添加桌面环境

yum groupinstall -y "X Window System"
yum groupinstall -y "GNOME Desktop"
yum install tigervnc-server
yum install xterm

下载xmanager, 安装完成后配置xstart

启动xstart,点击运行

在xstart中弹出的命令行工具中,以oracle用户登录,开始安装:

# su - oracle  
$ cd /data/orcl/app/oracle  
$ unzip linuxamd64_12102_database_se2_1of2.zip  
$ unzip linuxamd64_12102_database_se2_2of2.zip  
$ export LANG="en_US"  
$ cd /data/orcl/app/oracle/database  
$ ./runInstaller

等待安装完成。。。

安装完后成创建多个数据库,分别为 orcl_test1、orcl_test2、orcl_test3

编辑文件

vim /data/orcl/app/oracle/product/12.1.0/db_1/network/admin/listener.ora

内容如下:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
)
TEST1LIS =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1522))
    )
  )

TEST2LIS =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1523))
    )
  )

TEST3LIS =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1524))
    )
  )

编辑文件

vim /data/orcl/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora

内容如下:

ORCLTEST2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1523))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcltest2)
    )
  )



ORCLTEST3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1524))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcltest3)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ORCLTEST1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcltest1)
    )
  )

分别启动数据然,然后修改sga_max_size,小内存的一定要改,要不然启动数据库时会占满内存。

上面两个文件的HOST 要设置成hostname,也就是服务器的hostname

可以用下面的命令获取:

# hostname
如,输出 abcd

启动或者建库时出现如下错误:

ORA-27102: out of memory Linux-x86_64 Error: 28: No space left on device

要注意修改kernel.shmall

这个值的计算方法:http://www.nazmulhuda.info/ora-27102-out-of-memory-linux-x86_64-error-28-no-space-left-on-device

创建数据库时,如果出现:

ORA-27125: unable to create shared memory segment

请按下面的方法操作

cd $ORACLE_HOME/bin
mv oracle oracle.bin
cat >oracle <<“EOF”
#!/bin/bash
export DISABLE_HUGETLBFS=1
exec $ORACLE_HOME/bin/oracle.bin $@
EOF
chmod +x oracle

应该就可以了,如果再创建新的数据库,又出现了上面的问题,那可能真的是你的swap空间太小了,调整他的大小

第一步:关闭SWAP

sudo swapoff -a

第二步:把当前的SWAP文件增大

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

bs指的是Block Size,就是每一块的大小。这里的例子是1M,意思就是count的数字,是以1M为单位的。

counter是告诉程序,新的swapfile要多少个block。这里是1024,就是说,新的swap文件是1G大小。

第三步:把增大后的文件变为swap文件。

sudo mkswap /swapfile

第四步:重新打开swap

sudo swapon /swapfile

第五步:让swap在启动的时候,自动生效。打开/etc/fstab文件

sudo vim /etc/fstab

第六步:再nano里,加上以下命令。然后保存。

/swapfile swap swap defaults 0 0

完成

运行命令startup时,出现如下错误!

SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/data/orcl/app/oracle/product/12.1.0/db_1/dbs/initorcltest1.ora'
SQL> exit

说明你的initorcltest1.ora不存在,或者oracle这个用户没有读写的权限。。。

可以这样

su - oracle
cd /data/orcl/app/oracle/admin/orcltest1/pfile
cp init.ora.512201817930 /data/orcl/app/oracle/product/12.1.0/db_1/dbs/initorcltest1.ora

一定要记住用oracle这个用户来操作。

运行命令startup时,出现如下错误!

SQL> startup 
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 2616M
ORA-01078: failure in processing system parameters

这是由于, 我上面的三个命令

alter system set MEMORY_TARGET=2048m scope=spfile;
alter system set sga_max_size=1024m scope=spfile;
alter system set sga_target=1024m scope=spfile;

memory_target = sag_target+sga_max_size 大一点

由于我在调整sga时,没有设置memory_target的大小,所以出现在上面的错误,

因此,运行上面两条命令之前应该先执行

alter system set MEMORY_TARGET=3048m scope=spfile;

出现如下错误:

SQL> alter system set MEMORY_TARGET=3048m scope=spfile;
alter system set MEMORY_TARGET=3048m scope=spfile
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE is in use

解决办法:

SQL> create spfile from pfile;

File created.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area 4999610368 bytes
Fixed Size		    8845856 bytes
Variable Size		  994051552 bytes
Database Buffers	 3988783104 bytes
Redo Buffers		    7929856 bytes
Database mounted.
Database opened.
SQL> alter system set MEMORY_TARGET=3048m scope=spfile;

System altered.
.....