阿里云VPS安装oracle 12c踩坑记
服务器环境
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.
.....