某程序员在阿里云部署了一套oracle 11g,老板说他们搞了好几天,监听一直启动不来,让我给看看。登上去一瞧,原来是主机名设置的问题(把阿里云的弹性ip直接写在/etc/hosts文件,而云主机的网卡地址通常是私有地址)。这个事情,我还专门发了一篇文章,地址为https://blog.51cto.com/sery/2084706 。修复完这个问题之后,以为直接把数据库这样放在公网上很不稳当,同时又发现其它一些问题,好比磁盘空间规划不合理、混装java等。因而建议把此机做为测试环境,另购几台云主机,放入vpc网络,从新部署应用和数据库,把数据库与其它应用独立开来。猛戳此处视频html
都怪我多事,只好亲自操刀,从新在云上给部署oracle了。本人历来不推荐在公有云部署oracle,主要缘由有如下几点:java
一、云主机没有交换分区swap,了解好几家服务商,都是这样呢!c++
二、云服务器的操做系统可定制性不灵活。在个人经验中,oracle 11g部署在centos5这样的操做系统上,不会有依赖问题,而在centos6 以上版本,一些依赖包在安装oracle过程当中,校验就会出错。程序员
三、云主机性能问题。通常状况下,咱们都会选很高配置的物理服务器来部署。sql
在公有云部署oracle,尽管别扭,但还得干活啊。虽然在安装过程当中,有几个包不匹配(实际是版本高了),忽略掉这些校验,部署上去,运行好一段时间(大概1个多月),也没见看开发人员叫唤,时不时查告警日志,也未见异常,说明安装仍是成功的。目前,我的手里没有线上的云服务器,这里就用虚拟环境,来还原一下整个部署过程,但愿能对有须要的人有所帮助.数据库
选购一台centos7的云主机,外加一个250G的云盘。云盘分两个区,一个用于交换分区,剩下的用做oracle的安装目录及数据存储。划分出来的数据分区,挂接到系统上。为了符合oracle的安装习惯,挂接点为/u01.centos
在正式执行oracle的安装脚本以前,有一系列的前置操作,因为本人常常作部署,为了省事,写了一个脚本,内容为:
安全
[root@oradb190 ~]# more oracle_rep.bash #!/bin/bashbash #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也有些限制,为了减小干扰,通通把它们关闭掉。操做步骤以下(文字多点没关系,反正也没人给稿费):
一、关闭防火墙
systemctl stop firewalld.service systemctl disable firewalld.service |
二、修改sshd配置文件/etc/ssh/sshd_config
..........省略若干................................. PermitRootLogin yes ..............略........................... ClientAliveInterval 900 ClientAliveCountMax 30 ...............略................. |
三、安装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也能够省掉了)。
接下来,大部分的操做,咱们就在vnc里边进行了。容易出问题的地方,应该在export DISPLAY这个地方,必定要核对本身vncserver启动时显示的那个带冒号后边的数字(有些人只会抄,直接复制网上的例子)。
其实咱们vnc客户端链接也是用ip:加这个数字。
至于上传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后的数字也是一样的数字嘛!
我在这里踩过坑,从网上复制过来,死活找不到缘由呢!都设置对了,确定会弹出安装界面。step 1 of 9 不选不填,直接按 “Next”。step 2 of 9 选第二个“install database soft only”(只安装数据库软件,数据库自己后边手动建立)。
下一步选单实例数据库,.....后边接着选企业级数据库版本“Enterprise Edition”.到step 9 of 12 这里,安装校验会出现好几处不知足oracle安装要求的项目。我曾经试着按提示去修复(修改系统参数文件/etc/sysctl.conf、以yum方式安装所须要的依赖包--实际大部分包都存在了,只是版本比要求的高或者须要32位的版本),没什么效果,直接忽略掉。
实践证实,这个决策是对的(centos 5.X安装一点也没问题)。由于这个oracle部署完成后,已经稳定运行了一个多月,开发人员没叫唤,查告警日志也没啥异常呢!参看网上其余人写的文档,也是通通忽略,嘿嘿!一路点下一步,到复制文件的时候,有点耗时,若是选的是sata盘,更是慢得要命了。当复制到84%的时候,出来一个报错,看不到内容,只有一点点框框,真是悲催。
鼠标怎么点、怎么拉,都看不见报错信息之真容。你藏起来,觉得我找不到你哟,我看日志行不?我仍是认识几个英语。
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%的时候,再跳出框,也是一条线(真是考验人的眼力啊)。
到执行两个脚本的时候,那个弹出框是能够用鼠标拉来的,总算松了口气。
以root账号按顺序执行完提示的那两个脚本,完成安装过程。接下来,必不可少的步骤是配置监听器和建立数据库。这两步是有顺序的,即必须先建立监听器,而后才能建立数据库。
一、建立监听器(主机名最好设置上):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 |
二、建立数据库:仍然是在vnc客户端图形界面,以oracle账号执行dbca指令,弹出操做界面后,连续点几回鼠标,到 step 2 of 12 这个地方,选定制数据库“Custom database”,往下几步,到填写数据库名,通常状况下,dbca能自动读取oracle环境变量里面设置的值。
再日后进行几步,到 step 7 of 12 的地方,把归档给选上(也可在建立完之后,从sqlplus进去开启)。
连续点几回鼠标,点到“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的,这样方便管理,也相对安全一些。具体操做方法,再也不描述。不过瘾可点此处。