某程序员在阿里云部署了一套oracle 11g,老板说他们搞了好几天,监听一直启动不来,让我给看看。登上去一瞧,原来是主机名设置的问题(把阿里云的弹性ip直接写在/etc/hosts文件,而云主机的网卡地址一般是私有地址)。这个事情,我还专门发了一篇文章,地址为http://blog.51cto.com/sery/2084706 。修复完这个问题以后,觉得直接把数据库这样放在公网上很不妥当,同时又发现其它一些问题,比如磁盘空间规划不合理、混装java等。于是建议把此机作为测试环境,另购几台云主机,放入vpc网络,重新部署应用和数据库,把数据库与其它应用独立开来。猛戳此处视频


都怪我多事,只好亲自操刀,重新在云上给部署oracle了。本人从来不推荐在公有云部署oracle,主要原因有以下几点:

 1、云主机没有交换分区swap,了解好几家服务商,都是这样呢!

 2、云服务器的操作系统可定制性不灵活。在我的经验中,oracle 11g部署在centos5这样的操作系统上,不会有依赖问题,而在centos6 以上版本,一些依赖包在安装oracle过程中,校验就会出错。

 3、云主机性能问题。一般情况下,我们都会选很高配置的物理服务器来部署。

  

在公有云部署oracle,尽管别扭,但还得干活啊。虽然在安装过程中,有几个包不匹配(实际是版本高了),忽略掉这些校验,部署上去,运行好一段时间(大概1个多月),也没见看开发人员叫唤,时不时查告警日志,也未见异常,说明安装还是成功的。目前,个人手里没有线上的云服务器,这里就用虚拟环境,来还原一下整个部署过程,希望能对有需要的人有所帮助.


选购一台centos7的云主机,外加一个250G的云盘。云盘分两个区,一个用于交换分区,剩下的用作oracle的安装目录及数据存储。划分出来的数据分区,挂接到系统上。为了符合oracle的安装习惯,挂接点为/u01.

7HV3O{A`~J_`FJ)F3Y7H2OK.png


在正式执行oracle的安装脚本之前,有一系列的前置操做,由于本人经常做部署,为了省事,写了一个脚本,内容为:

[root@oradb190 ~]# more oracle_rep.bash 

#!/bin/bash

#writed by sery 2012-05-16


#########################################

#install depending packages             #

#########################################

yum install gcc* gcc-* gcc-c++-* glibc-devel-* glibc-headers-* compat-libstdc* libstdc* elfutils-libelf-devel* libaio-devel* sysstat* unixODBC-* pdksh-*


########################################

#add groups,user and create dir        #

########################################

/usr/sbin/groupadd -g 501 oinstall

/usr/sbin/groupadd -g 502 dba



useradd -u 1000 -g oinstall -G dba oracle


mkdir /u01/app/

mkdir -p /u01/app/oraInventory

mkdir -p /u01/app/oracle

chown -R oracle:oinstall /u01/app

chmod -R 775 /u01/app


##############################################

#modify  sysctl.conf                         #

##############################################

cat >> /etc/sysctl.conf <<done

fs.file-max = 6815744

kernel.shmall = 2097152

#kernel.shmmax = 536870912

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 = 1048576

fs.aio-max-nr = 1048576

done


sysctl -p


###############################################

#modify  /etc/security/limits.conf            #

###############################################

cat >> /etc/security/limits.conf << done

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

done


################################################

#modify /etc/pam.d/login                       #

################################################

echo "session    required     pam_limits.so">>/etc/pam.d/login


################################################

# setting user oracle env                      #

################################################

cat >> /home/oracle/.bash_profile <<done

export ORACLE_SID=zyzf1

export ORACLE_UNQNAME=zyzf1

export ORACLE_base=/u01/app/oracle

export ORACLE_HOME=/u01/app/oracle/product/11.2.0

export PATH=$ORACLE_HOME/bin:$PATH

done

授予该脚本执行权限,然后执行./oracle_rep.bash。执行完毕,挨个检查一下,看是否生成目录、是否创建了用户、是否修改了相关配置文件....


接下来,配置和启用vnc,以图形方式来远程安装oracle。物理服务器时代,我们还可能去机房,做在物理服务器前边,接上显示器。但用了云主机以后,这个路没有了哟,当然也算解放了,不用去机房接受噪音和辐射嘛!


云主机安装的centos可能没有默认安装vnc服务,需要把gnome桌面,vncserver给安装上去。centos7默认启动了防火墙,sshd也有些限制,为了减少干扰,统统把它们关闭掉。操作步骤如下(文字多点不要紧,反正也没人给稿费):

1、关闭防火墙

systemctl stop firewalld.service

systemctl disable firewalld.service

2、修改sshd配置文件/etc/ssh/sshd_config

..........省略若干.................................

PermitRootLogin yes

..............略...........................

ClientAliveInterval 900

ClientAliveCountMax 30

...............略.................

3、安装vncsevncser

yum groupinstall "X Window System"

yum install tigervnc-server -y

yum groupinstall "GNOME Desktop" "Graphical Administration Tools"

假如与桌面环境相关的包不安装完整,vnc客户端去连接以后,就可能是蓝屏,一个图标也没有,也无法进行任何操作。安装好vncserver以后,执行指令vncserver,输入密码。我一般用root启动,设置跟系统root一样的密码。我看有些人的文档,把vncserver做成一个常规服务,这没什么必要,安装完oracle以后,就再也不需要桌面环境嘛(如果用静默方式安装,这个也vnc也可以省掉了)。

blob.png

接下来,大部分的操作,我们就在vnc里边进行了。容易出问题的地方,应该在export DISPLAY这个地方,一定要核对自己vncserver启动时显示的那个带冒号后边的数字(有些人只会抄,直接复制网上的例子)。

blob.png

其实我们vnc客户端连接也是用ip:加这个数字。

blob.png

至于上传oracle安装包,解压和目录授权一类的,这里就略过。我一般是把oracle解压出来的目录,复制在/home/oracle目录,然后再给它来一下 chown -R oracle:oinstall /home/oracle ,这样切换成oracle帐号,执行安装就不用担心权限问题。oracle 11g的两个安装包,解压后,得到一个大的目录database,安装脚本runInstaller及其它所需的所有文件,都在里边。

[root@localhost ~]# su - oracle

Last login: Thu Apr 26 22:13:21 CST 2018 on pts/2


[oracle@localhost ~]$ ls -al database/

total 16

drwxr-xr-x.  8 oracle oinstall  128 Aug 21  2009 .

drwx------.  6 oracle oinstall  123 Apr 26 22:14 ..

drwxr-xr-x. 12 oracle oinstall  203 Aug 17  2009 doc

drwxr-xr-x.  4 oracle oinstall  223 Aug 15  2009 install

drwxrwxr-x.  2 oracle oinstall   61 Aug 15  2009 response

drwxr-xr-x.  2 oracle oinstall   34 Aug 15  2009 rpm

-rwxr-xr-x.  1 oracle oinstall 3226 Aug 15  2009 runInstaller

drwxrwxr-x.  2 oracle oinstall   29 Aug 15  2009 sshsetup

drwxr-xr-x. 14 oracle oinstall 4096 Aug 15  2009 stage

-rw-r--r--.  1 oracle oinstall 5402 Aug 18  2009 welcome.html


假定不做前置处理,我们在vnc客户端执行命令 su - oracle ;cd database ; ./runInstaller 会提示“

>>> Could not execute auto check for display colors using command /usr/bin/xdpyinfo. Check if the DISPLAY variable is set.    Failed <<<<

”。在root账户下,执行xhost + 及在oracle账户下执行 export DISPLAY=:1(注意,这里很容易出问题,很多网上文档,写的都是DISPLAY=:0.0; export DISPLAY) ,前边强调过了,一定要与vncserver启动时主机名加冒号后带的那个数字,vnc客户端连的那个ip后的数字也是同样的数字嘛!

blob.png

我在这里踩过坑,从网上复制过来,死活找不到原因呢!都设置对了,肯定会弹出安装界面。step 1 of 9 不选不填,直接按 “Next”。step 2 of 9 选第二个“install database soft only”(只安装数据库软件,数据库本身后边手动创建)。

blob.png

下一步选单实例数据库,.....后边接着选企业级数据库版本“Enterprise Edition”.到step 9 of 12 这里,安装校验会出现好几处不满足oracle安装要求的项目。我曾经试着按提示去修复(修改系统参数文件/etc/sysctl.conf、以yum方式安装所需要的依赖包--实际大部分包都存在了,只是版本比要求的高或者需要32位的版本),没什么效果,直接忽略掉。

blob.png

实践证明,这个决策是对的(centos 5.X安装一点也没问题)。因为这个oracle部署完成后,已经稳定运行了一个多月,开发人员没叫唤,查告警日志也没啥异常呢!参看网上其他人写的文档,也是统统忽略,嘿嘿!一路点下一步,到复制文件的时候,有点耗时,如果选的是sata盘,更是慢得要命了。当复制到84%的时候,出来一个报错,看不到内容,只有一点点框框,真是悲催。blob.png

鼠标怎么点、怎么拉,都看不见报错信息之真容。你藏起来,以为我找不到你哟,我看日志行不?我还是认识几个英语。

tail -100 /u01/app/oraInventory/logs/installActions2018-04-26_11-30-49PM.log

..........................略.....................

INFO: /usr/lib64/libstdc++.so.5: undefined reference to `memcpy@GLIBC_2.14'

INFO: collect2: error: ld returned 1 exit status

INFO: make: *** [ctxhx] Error 1

INFO: End output from spawned process.

INFO: ----------------------------------

INFO: Exception thrown from action: make

Exception Name: MakefileException

.........................略........................

查了资料,说是“glibc的版本过高所致”-当前系统的glibc版本为glibc-2.17-196.el7_4.2.x86_64,网上有这个错误的修正办法,我试了好几遍不修复,也没什么问题。如果诸位要修复这个问题,以关键词“INFO: /usr/lib64/libstdc++.so.5: undefined reference to”搜索即可得出方案。点右上角那个×,安装继续进行,片刻,有跳出来一个一模一样的报错框,也是一样的尿性(点不开,看不到信息),原因、查看是什么问题及解决办法同上(我是直接点×取消)。复制文件继续进行,大概进行到94%的时候,再跳出框,也是一条线(真是考验人的眼力啊)。

oracle安装.png

到执行两个脚本的时候,那个弹出框是可以用鼠标拉来的,总算松了口气。


blob.png

以root帐号按顺序执行完提示的那两个脚本,完成安装过程。接下来,必不可少的步骤是配置监听器和创建数据库。这两步是有顺序的,即必须先创建监听器,然后才能创建数据库。


1、创建监听器(主机名最好设置上):oracle环境变量如果设置正确的话(.bash_profile 文件有这么一行

export PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:$ORACLE_HOME/bin”),还是在vnc客户端图形界面下以oracle帐号执行netca命令,点几次鼠标就能顺利完成这个操作。为了检验监听器是否正确安装,可执行监听器命令行 lnsrctl  start启动监听器,由于oracle数据库没有创建,自然就不能注册监听器,因此输出信息就会有“The listener supports no services”。更可以进入oracle的安装目录,查看/u01/app/oracle/product/11.2.0/network/admin文件listener.ora是否存在,内容是否与启动监听器时的输出相符合。

[oracle@localhost ~]$ lsnrctl start


LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 27-APR-2018 01:34:01


Copyright (c) 1991, 2009, Oracle.  All rights reserved.


Starting /u01/app/oracle/product/11.2.0/bin/tnslsnr: please wait...


TNSLSNR for Linux: Version 11.2.0.1.0 - Production

System parameter file is /u01/app/oracle/product/11.2.0/network/admin/listener.ora

Log messages written to /u01/app/oracle/diag/tnslsnr/db217/listener/alert/log.xml

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db217)(PORT=1521)))


Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db217)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                27-APR-2018 01:34:01

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/app/oracle/product/11.2.0/network/admin/listener.ora

Listener Log File         /u01/app/oracle/diag/tnslsnr/db217/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db217)(PORT=1521)))

The listener supports no services

The command completed successfully

2、创建数据库:仍然是在vnc客户端图形界面,以oracle帐号执行dbca指令,弹出操作界面后,连续点几次鼠标,到 step 2 of 12 这个地方,选定制数据库“Custom database”,往下几步,到填写数据库名,一般情况下,dbca能自动读取oracle环境变量里面设置的值。

blob.png

再往后进行几步,到 step 7 of 12 的地方,把归档给选上(也可在创建完以后,从sqlplus进去开启)。

blob.png

连续点几次鼠标,点到“finish”时,就开始真正创建数据(数据文件、重做日志等),这个过程比安装oracle复制文件更慢一些,要耐心等待一下。执行完成后,可到数据目录,查看生成的文件:

[oracle@localhost zyzf1]$ pwd

/u01/app/oracle/oradata/zyzf1


[oracle@localhost zyzf1]$ ll

total 1705316

-rw-r----- 1 oracle oinstall   9748480 Apr 27 02:00 control01.ctl

-rw-r----- 1 oracle oinstall  52429312 Apr 27 02:00 redo01.log

-rw-r----- 1 oracle oinstall  52429312 Apr 27 02:00 redo02.log

-rw-r----- 1 oracle oinstall  52429312 Apr 27 01:59 redo03.log

-rw-r----- 1 oracle oinstall 629153792 Apr 27 02:00 sysaux01.dbf

-rw-r----- 1 oracle oinstall 734011392 Apr 27 02:00 system01.dbf

-rw-r----- 1 oracle oinstall  20979712 Apr 27 01:59 temp01.dbf

-rw-r----- 1 oracle oinstall 209723392 Apr 27 02:00 undotbs01.dbf

-rw-r----- 1 oracle oinstall   5251072 Apr 27 02:00 users01.dbf

同时,oracle实例也会自动启动,通过查看系统进程,即可验证。现在,我们在回过头去查看监听器的状态,看看与未创建数据库之前的差异:

[oracle@localhost zyzf1]$ lsnrctl status


LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 27-APR-2018 02:36:15


Copyright (c) 1991, 2009, Oracle.  All rights reserved.


Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db217)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                27-APR-2018 01:34:01

Uptime                    0 days 1 hr. 2 min. 13 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/app/oracle/product/11.2.0/network/admin/listener.ora

Listener Log File         /u01/app/oracle/diag/tnslsnr/db217/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db217)(PORT=1521)))

Services Summary...

Service "zyzf1" has 1 instance(s).

  Instance "zyzf1", status READY, has 1 handler(s) for this service...

Service "zyzf1XDB" has 1 instance(s).

  Instance "zyzf1", status READY, has 1 handler(s) for this service...

The command completed successfully

实例自动注册进来了(是监听器注册到实例,还是实例注册到监听器,这个有点昏,哪位大大神帮回答一下)。看进程及监听还不够,还需要从sqlplus登进去,执行“select count(*) from v$session;”看输出;关闭实例,再启动,以检验其正确性。


花了大把时间,仅仅是把oracle部署上去了,要交付使用,还有一些工作需要完成,包括修改密码过期时间、修改过小的默认表空间(system、sysaux、temp等)、创建大的redo日志文件、控制文件多路复用、创建单独的用户表空间等等。如果不把这些规范做好,开发人员极有可能直接就开始在system上创建数据表、应用程序直接使用system帐号连接数据库.....


默认密码过期时间是180天,把它改成不过期也无妨。

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;


Profile altered.


SQL>SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

PROFILE                        RESOURCE_NAME                    RESOURCE LIMIT

------------------------------ -------------------------------- -------- ----------------------------------------

DEFAULT                        PASSWORD_LIFE_TIME               PASSWORD UNLIMITED


系统相关表空间扩容(以system为例),直接看看几个表空间文件的状况。

[oracle@db217 zyzf1]$ pwd

u01/app/oracle/orada/ta/zyzf1


[oracle@db217 zyzf1]$ du -hs *

9.3M    control01.ctl

51M     redo01.log

51M     redo02.log

51M     redo03.log

601M    sysaux01.dbf

701M    system01.dbf

9.2M    temp01.dbf

851M    undotbs01.dbf

5.1M    users01.dbf

现在硬盘容量都以TB计算了,别舍不得把size搞大一点。

SQL> alter database datafile '/u01/app/oracle/oradata/zyzf1/system01.dbf' resize 10G;


oracle@db217 zyzf1#du -hs *

9.3M    control01.ctl

21G     qhwy201801.dbf

513M    redo004.log

513M    redo005.log

513M    redo006.log

51M     redo01.log

51M     redo02.log

51M     redo03.log

621M    sysaux01.dbf

11G     system01.dbf

16M     temp01.dbf

1.1G    undotbs01.dbf

42M     users01.dbf


创建大的redo日志文件,删除系统默认的小的redo,偷了一下懒,一个日志组只创建了一个成员。

SQL> alter database add logfile group 4(‘/u01/app/oracle/oradata/orcl/redo04.log’size 512M;


SQL> alter database add logfile group 5(‘/u01/app/oracle/oradata/orcl/redo05.log’size 512M;


SQL> alter database add logfile group 6(‘/u01/app/oracle/oradata/orcl/redo06.log’size 512M;



SQL>alter system switch logfile;

SQL>select GROUP#,THREAD#,BYTES,MEMBERS,STATUS from v$log;


GROUP#   THREAD#      BYTES    MEMBERS STATUS

---------- ---------- ---------- ---------- --------------------------------

1       1   52428800          1 INACTIVE

2       1   52428800          1 INACTIVE

3       1   52428800          1 CURRENT

4         1   536870912            1 INACTIVE

5         1   536870912            1 INACTIVE

6         1   536870912            1 CURRENT


SQL>  alter system switch logfile;

SQL> alter database drop logfile group 1;

连续切换,以便于干掉旧的小的联机重做日志文件。


控制文件多路复用:默认都可能在一个分区下边,至少要再创建一个,以防万一。

SQL> select inst_id,name from gv$controlfile;
   INST_ID                                              NAME
----------------------------------------------------------------------------------------------   
1  /u01/app/oracle/oradata/zyzf1/control01.ctl   
1  /u01/app/oracle/flash_recovery_area/zyzf1/control02.ctl
SQL> alter system setcontrol_files='/u01/app/oracle/oradata/zyzf1/control01.ctl','/u01/app/oracle/flash_recovery_area/zyzf1/control02.ctl','/home/oracle/control03.ctl'scope=spfile;
[oracle@db217 ~]$cp /u01/app/oracle/oradata/zyzf1/control01.ctl /home/oracle/control03.ctl
SQL> alter database mount;
Database altered.
SQL> alter database open;
Database altered.


 创建用户及其默认表空间。表空间大小固定,建议20G,用满了再新增一个20G的,这样方便管理,也相对安全一些。具体操作方法,不再描述。不过瘾可点此处。


下载安装前脚本,猛戳此处。