钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>
一、准备工作
1.准备CentOS 7 系统环境
由于是使用静默模式(silent)安装的,无需使用图形化界面,我选择了最小安装的服务器版的CentOS 7。安装完成后,只有命令行界面。
2.下载 Oracle 11g
(1)Oracle官方网站:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html我的机器安装的是CentOS7 64位系统,因此下载的Oracle版本也是64位的
特别注意:11.2.0.2.0 zlinux64版本的Oracle是安装在IBM服务器的,CentOS 7是无法安装的。
(2)下载完成后,有两个压缩文件
linux.x64_11gR2_database_1of2.zip和 linux.x64_11gR2_database_2of2.zip
3.通过Xftp将压缩文件上传到 /db/
4.安装依赖包,安装依赖包之前,个人建议将yum源修改为aliyun源,下载速度快些,执行如下命令即可:cd /etc
mv yum.repos.d yum.repos.d.bakmkdir yum.repos.dwget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecache
若提示:
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 失败:未知的名称或服务。
则执行:echo \'nameserver 8.8.8.8\'>>/etc/resolv.conf
5.修改成功后,安装如下依赖包:
yum -y install binutils \\compat-libstdc++-33 \\elfutils-libelf \\elfutils-libelf-devel \\expat \\gcc \\gcc-c++ \\glibc \\glibc-common \\glibc-devel \\glibc-headers \\libaio \\libaio-devel \\libgcc \\libstdc++ \\libstdc++-devel \\make \\pdksh \\sysstat \\unixODBC \\unixODBC-devel
6.安装完成后显示如下界面
7.使用如下命令检查依赖是否安装完整
rpm -q \\binutils \\compat-libstdc++-33 \\elfutils-libelf \\elfutils-libelf-devel \\expat \\gcc \\gcc-c++ \\glibc \\glibc-common \\glibc-devel \\glibc-headers \\libaio \\libaio-devel \\libgcc \\libstdc++ \\libstdc++-devel \\make \\pdksh \\sysstat \\unixODBC \\unixODBC-devel | grep \"not installed\"
8.发现 pdksh 没有安装
9.执行 yum -y install pdksh,发现CentOS 7 没有相关安装包可用
10.通过wget命令直接下载pdksh的rpm包,我下载到了/tmp/
wget -O /tmp/pdksh-5.2.14-37.el5_8.1.x86_64.rpm http://vault.centos.org/5.11/os/x86_64/CentOS/pdksh-5.2.14-37.el5_8.1.x86_64.rpm
下载完成后,进入 /tmp/
cd /tmp/rpm -ivh pdksh-5.2.14-37.el5_8.1.x86_64.rpm
11.再次检查依赖包是否安装完整
rpm -q \\binutils \\compat-libstdc++-33 \\elfutils-libelf \\elfutils-libelf-devel \\expat \\gcc \\gcc-c++ \\glibc \\glibc-common \\glibc-devel \\glibc-headers \\libaio \\libaio-devel \\libgcc \\libstdc++ \\libstdc++-devel \\make \\pdksh \\sysstat \\unixODBC \\unixODBC-devel | grep \"not installed\"
到此依赖包安装完整
12.添加oracle用户组和用户
groupadd oinstallgroupadd dbagroupadd asmadmingroupadd asmdbauseradd -g oinstall -G dba,asmdba oracle -d /home/oracle
13.添加完成后,查看oracle用户
id oracle
14.初始化oracle用户的密码
passwd oracle
说明:密码需输入两次,提示密码强度若不用管,两次一致后会提示设置成功
15.配置hostname(本机IP映射)
vim /etc/hosts192.168.154.154 centos-oracle
16.测试hostname
ping -c 3 centos-oracle
17.优化OS内核参数,kernel.shmmax 参数设置为物理内存的一半
vim /etc/sysctl.conffs.aio-max-nr=1048576fs.file-max=6815744kernel.shmall=2097152kernel.shmmni=4096kernel.shmmax = 1073741824kernel.sem=250 32000 100 128net.ipv4.ip_local_port_range=9000 65500net.core.rmem_default=262144net.core.rmem_max=4194304net.core.wmem_default=262144net.core.wmem_max=1048586
18.使参数生效
sysctl -p
19.限制oracle用户的shell权限
vim /etc/security/limits.conf
oracle soft nproc 2047oracle hard nproc 16384oracle soft nofile 1024oracle hard nofile 65536
vim /etc/pam.d/login
session required /lib64/security/pam_limits.sosession required pam_limits.so
vim /etc/profile
if [ $USER = \"oracle\" ]; thenif [ $SHELL = \"/bin/ksh\" ]; thenulimit -p 16384ulimit -n 65536elseulimit -u 16384 -n 65536fifi
20.创建oracle安装目录
mkdir -p /db/app/oracle/product/11.2.0mkdir /db/app/oracle/oradatamkdir /db/app/oracle/inventorymkdir /db/app/oracle/fast_recovery_areachown -R oracle:oinstall /db/app/oraclechmod -R 775 /db/app/oracle
21.配置oracle用户环境变量
su - oracle
vim .bash_profile
umask 022export ORACLE_HOSTNAME=centos-oracleexport ORACLE_BASE=/db/app/oracleexport ORACLE_HOME=$ORACLE_BASE/product/11.2.0/export ORACLE_SID=ORCLexport PATH=.:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/jdk/bin:$PATHexport LC_ALL=\"en_US\"export LANG=\"en_US\"export NLS_LANG=\"AMERICAN_AMERICA.ZHS16GBK\"export NLS_DATE_FORMAT=\"YYYY-MM-DD HH24:MI:SS\"
22.以上配置完成后,个人建议重启下系统
reboot
23.解压oracle压缩文件到 /db
cd /db/unzip linux.x64_11gR2_database_1of2.zip -d /dbunzip linux.x64_11gR2_database_2of2.zip -d /db
24.解压完成后
mkdir /db/etc/cp /db/database/response/* /db/etc/
vim /db/etc/db_install.rsp
oracle.install.option=INSTALL_DB_SWONLYDECLINE_SECURITY_UPDATES=trueUNIX_GROUP_NAME=oinstallINVENTORY_LOCATION=/db/app/oracle/inventorySELECTED_LANGUAGES=en,zh_CNORACLE_HOSTNAME=centos-oracleORACLE_HOME=/db/app/oracle/product/11.2.0ORACLE_BASE=/db/app/oracleoracle.install.db.InstallEdition=EEoracle.install.db.isCustomInstall=trueoracle.install.db.DBA_GROUP=dbaoracle.install.db.OPER_GROUP=dba
二、开始安装
1.切换到oracle用户
su - oracle
# 先cd到/db/database/目录然后执行
./runInstaller -silent -ignorePrereq -responseFile /db/etc/db_install.rsp
报错:centos 安装oracle 报Checking swap space: 0 MB available, 150 MB required. Failed <<<<【备注:若无此错误请忽略,我在华为云服务器挂载磁盘且安装位置设置为/mnt目录,此情景下安装oracle 11g时发送这样的错误,一般情况不会出现此错误】
解决办法:
(1)检查 Swap 空间在设置 Swap 文件之前,有必要先检查一下系统里有没有既存的 Swap 文件。运行以下命令:
swapon -s
如果返回的信息概要是空的,则表示 Swap 文件不存在。
(2)检查文件系统在设置 Swap 文件之前,同样有必要检查一下文件系统,看看是否有足够的硬盘空间来设置 Swap 。运行以下命令:
df -hal
(3)创建并允许 Swap 文件下面使用 dd 命令来创建 Swap 文件。检查返回的信息,还剩余足够的硬盘空间即可。
dd if=/dev/zero of=/swapfile bs=1024 count=512k
参数解读:if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >bs=bytes:同时设置读入/输出的块大小为bytes个字节count=blocks:仅拷贝blocks个块,块大小等于bs指定的字节数。
(4)格式化并激活 Swap 文件上面已经创建好 Swap 文件,还需要格式化后才能使用。运行命令:
mkswap /swapfile
激活 Swap ,运行命令:
swapon /swapfile
(5)以上步骤做完,再次运行命令:
swapon -s
(6)你会发现返回的信息概要:
Filename Type Size Used Priority
/swapfile file 524284 0 -1
(7)如果要机器重启的时候自动挂载 Swap ,那么还需要修改 fstab 配置。用 vim 打开 /etc/fstab 文件,在其最后添加如下一行:
vim /etc/fstab/swapfile swap swap defaults 0 0
(8)最后,赋予 Swap 文件适当的权限:
chown root:root /swapfilechmod 0600 /swapfile
若无错误继续往下,若解决完以上错误继续执行一下命令:
./runInstaller -silent -ignorePrereq -responseFile /db/etc/db_install.rsp
2.安装期间可以使用tail命令监看oracle的安装日志
tail -f /db/app/oracle/inventory/logs/installActions2019-09-03_19-48-29PM.log
安装完成,提示Successfully Setup Software.
3.根据提示完成配置
su root
sh
/db/app/oracle/inventory/orainstRoot.shsh /db/app/oracle/product/11.2.0/root.sh
4.配置静默监听
su - oraclenetca /silent /responsefile /db/etc/netca.rsp
注意:若失败可能是由于系统setlinux未设置为disable,设置好后需要重启系统
5.查看监听端口
netstat -tnulp | grep 1521
6.静默创建数据库 TOTALMEMORY 设置为总内存的80%
切换为root用户
su root
vi
/db/etc/dbca.rsp //打开文件后可通过搜索将“=”右边参数值补齐
GDBNAME = \"orcl\"SID = \"orcl\"SYSPASSWORD = \"oracle\"SYSTEMPASSWORD = \"oracle\"SYSMANPASSWORD = \"oracle\"DBSNMPPASSWORD = \"oracle\"DATAFILEDESTINATION =/db/app/oracle/oradataRECOVERYAREADESTINATION=/db/app/oracle/fast_recovery_areaCHARACTERSET = \"AL32UTF8\"TOTALMEMORY = \"1638\"
7.执行静默建库(切换为oracle用户)
su - oracle
dbca -silent -responseFile /db/etc/dbca.rsp
8.查看oracle实例进程
ps -ef | grep ora_ | grep -v grep
9.查看监听状态
lsnrctl status
10.切换为oracle用户,登录sqlplus,查看实例状态
su - oraclesqlplus / as sysdbaselect status from v$instance;
注意:此处会报错
解决办法:输入命令startup
startup
若依旧有问题,则ls命令查看/db/app/oracle/admin/orcl/pfile/下有没有init.ora.*****类似的文件,拷贝覆盖报错的文件
cp /db/app/oracle/admin/orcl/pfile/init.ora.8420191849 /db/app/oracle/product/11.2.0/dbs/initORCL.ora
再次startup即可成功
再次查询即可正常显示
(1)查看数据库编码
select userenv(\'language\') from dual;
(2)查看数据库版本信息
select * from v$version;
(3)激活scott用户
alter user scott account unlock; //若遇到su - oracle用户下无法解锁该用户,请用远程连接工具通过system用户进行解锁,这里不影响alter user scott identified by tiger; //若遇到su - oracle用户下无法修改密码,请用远程连接工具通过system用户进行修改,这里不影响select username from all_users;
11.Navicat远程连接Oracle
(1)开放1521端口
firewall-cmd --zone=public --add-port=1521/tcp --permanentfirewall-cmd --reload
(2)官方网站http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
下载 instantclient-basic,解压压缩文件
(3)下载Navicat:http://pan.baidu.com/s/1c2GP9U4
① 打开Navicat,工具→选项
② 打开OCI界面,在右侧OCI library一栏中选择instantclient-basic解压目录下的oci.dll,然后点击确定。
该文件可以不用本地安装oracle即可远程连接,若本地安装过oracle也可使用本地dll文件,如我本地的为:D:\\software\\workSoft\\databaseSoft\\OracleSoft\\product\\11.2.0\\dbhome_1\\bin\\oci.dll
③ 重启Navicat,点击连接,选中Oracle
④ IP为Oracle服务器的IP地址,服务名为Oracle的实例名,可忽略大小写
select instance_name from v$instance;
⑤ 用户名使用刚激活的scott,密码为tiger,填完以上信息后点击连接测试
到此Navicat远程连接Oracle数据库成功
12.设置Oracle开机启动
#可能出现的问题oracle ORA-12547: TNS:lost contact,故此处提前设置好权限cd /db/app/oracle/product/11.2.0/bin/chmod 6751 oracle
vi /db/app/oracle/product/11.2.0/bin/dbstart
# 查找并设置值ORACLE_HOME_LISTNER=$ORACLE_HOMEvi /db/app/oracle/product/11.2.0/bin/dbshut
# 查找并设置值ORACLE_HOME_LISTNER=$ORACLE_HOME vi /etc/oratab
# 默认为N,将N改为Y orcl:/db/app/oracle/product/11.2.0:Y
vi /etc/rc.d/init.d/oracle //默认没有该文件
(1)注意:默认没有该文件,复制以下内容到打开的白板界面
#! /bin/bash# oracle: Start/Stop Oracle Database 11g R2## chkconfig: 345 90 10# description: The Oracle Database is an Object-Relational Database Management System.## processname: oracle. /etc/rc.d/init.d/functionsLOCKFILE=/var/lock/subsys/oracleORACLE_HOME=/db/app/oracle/product/11.2.0ORACLE_USER=oraclecase \"$1\" in\'start\')if [ -f $LOCKFILE ]; thenecho $0 already running.exit 1fiecho -n $\"Starting Oracle Database:\"su - $ORACLE_USER -c \"$ORACLE_HOME/bin/lsnrctl start\"su - $ORACLE_USER -c \"$ORACLE_HOME/bin/dbstart $ORACLE_HOME\"su - $ORACLE_USER -c \"$ORACLE_HOME/bin/emctl start dbconsole\"touch $LOCKFILE;;\'stop\')if [ ! -f $LOCKFILE ]; thenecho $0 already stopping.exit 1fiecho -n $\"Stopping Oracle Database:\"su - $ORACLE_USER -c \"$ORACLE_HOME/bin/lsnrctl stop\"su - $ORACLE_USER -c \"$ORACLE_HOME/bin/dbshut\"su - $ORACLE_USER -c \"$ORACLE_HOME/bin/emctl stop dbconsole\"rm -f $LOCKFILE;;\'restart\')$0 stop$0 start;;\'status\')if [ -f $LOCKFILE ]; thenecho $0 started.elseecho $0 stopped.fi;;*)echo \"Usage: $0 [start|stop|status]\"exit 1esacexit 0
(2)授权
chmod 750 /etc/rc.d/init.d/oracle
(3)检查一下脚本能否正确执行
cd /etc/rc.d/init.d./oracle start./oracle stop
(4)加入自动启动行列,执行如下命令:
ln -s /etc/rc.d/init.d/oracle /etc/rc2.d/S61oracleln -s /etc/rc.d/init.d/oracle /etc/rc3.d/S61oracleln -s /etc/rc.d/init.d/oracle /etc/rc4.d/S61oracleln -s /etc/rc.d/init.d/oracle /etc/rc0.d/K61oracleln -s /etc/rc.d/init.d/oracle /etc/rc6.d/K61oraclechkconfig --level 234 oracle onchkconfig --add oracle
注意:最后一行命令需要oracle服务状态停止时执行有效(./oracle stop)
重启后即可正常连接
三、重启若出现 no listener情况,且startup无效
Solution:
1. Check if you have correct ORACLE_HOME, ORACLE_SID and PATH environments.
2. Check if /tmp/.oracle and /var/tmp/.oracle directories exists.
3. Check permissions for those directories for current user who is trying to start listener.
mkdir /var/tmp/.oraclemkdir /tmp/.oraclechown -R oracle:oinstall /var/tmp/.oracle /tmp/.oraclechmod -R 01777 /var/tmp/.oracle /tmp/.oracle
4. Run the listener, problem solved:
lsnrctl start
5. If you still cant start listener grant 777 permissions to oracle on /tmp directory.
chmod -R 777 /tmp /var/tmp
6. ***重要:***若提示root用户都无权限在/var/tmp 和 /tmp下创建.oracle,则使用chattr命令移除/var/tmp 和 /tmp 目录的i属性,重新创建即可
chattr -i /var/tmp //去除i属性
四、执行lsnrctl start后若出现以下情况
解决方法:
在/db/app/oracle/product/11.2.0/network/admin/listener.ora里面添加一行
SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = orcl)(SID_NAME = orcl)))
注:里面的orcl根据你安装的数据库实例名确定,我用此法解决了这个报错。
五、后续问题解决
1.意外断电或意外中断服务器导致oracle不能正常连接问题及解决:
问题1:ORA-01081: cannot start already-running ORACLE – shut it down first
解决1:
shutdown immediatestartup mount
问题2:ORA-01102: cannot mount database in EXCLUSIVE mode(重点解决)
2.分析原因:
2.1在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;
2.2说明Oracle被异常关闭时,有资源没有被释放,一般有以下几种可能,
2.2.1Oracle的共享内存段或信号量没有被释放;
2.2.2Oracle的后台进程(如SMON、PMON、DBWn等)没有被关闭;
2.2.3用于锁内存的文件lk<sid>和sgadef<sid>.dbf文件没有被删除。
3.具体解决办法:
(1)查$ORACLE_HOME/dbs目录:
cd $ORACLE_HOME/dbsls lk*lkORCL
果然,lk<sid>文件没有被删除。将它删除掉
rm lk*
(2)再次启动startup mount时又遇到下面的错误,不过别担心,继续后面的操作就搞定
(3)查看共享内存段
ipcs -map
根据ID号清除共享内存段
ipcrm –m 1409040
我这里操作是没有成功的,不过执行了下面的操作就ok了!
(4)查看信号量
ipcs -s
清除oracle的信号量
ipcrm -s 360448
再次查询确认
ipcs -s
—— Semaphore Arrays ——–
keysemidownerpermsnsems
再查询共享内存段也ok了!
ipcs -m
(5)如果是Oracle进程没有关闭,
kill -9 <PID>
(6)执行上面5个步骤即可成功解决该错误!