一、准備工作
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.bak mkdir yum.repos.d wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum 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 oinstall
groupadd dba
groupadd asmadmin
groupadd asmdba
useradd -g oinstall -G dba,asmdba oracle -d /home/oracle
13.添加完成后,查看oracle用戶
id oracle
14.初始化oracle用戶的密碼
passwd oracle
說明:密碼需輸入兩次,提示密碼強度若不用管,兩次一致后會提示設置成功
15.配置hostname(本機IP映射)
vim /etc/hosts 192.168.154.154 centos-oracle
16.測試hostname
ping -c 3 centos-oracle
17.優化OS內核參數,kernel.shmmax 參數設置為物理內存的一半
vim /etc/sysctl.conf fs.aio-max-nr=1048576 fs.file-max=6815744 kernel.shmall=2097152 kernel.shmmni=4096 kernel.shmmax = 1073741824 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
18.使參數生效
sysctl -p
19.限制oracle用戶的shell權限
vim /etc/security/limits.conf
oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536
vim /etc/pam.d/login
session required /lib64/security/pam_limits.so
session required pam_limits.so
vim /etc/profile
if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi
20.創建oracle安裝目錄
mkdir -p /db/app/oracle/product/11.2.0 mkdir /db/app/oracle/oradata mkdir /db/app/oracle/inventory mkdir /db/app/oracle/fast_recovery_area chown -R oracle:oinstall /db/app/oracle chmod -R 775 /db/app/oracle
21.配置oracle用戶環境變量
su - oracle
vim .bash_profile
umask 022 export ORACLE_HOSTNAME=centos-oracle export ORACLE_BASE=/db/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/ export ORACLE_SID=ORCL export PATH=.:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/jdk/bin:$PATH export 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 /db unzip 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_SWONLY DECLINE_SECURITY_UPDATES=true UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/db/app/oracle/inventory SELECTED_LANGUAGES=en,zh_CN ORACLE_HOSTNAME=centos-oracle ORACLE_HOME=/db/app/oracle/product/11.2.0 ORACLE_BASE=/db/app/oracle oracle.install.db.InstallEdition=EE oracle.install.db.isCustomInstall=true oracle.install.db.DBA_GROUP=dba oracle.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 /swapfile chmod 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.sh sh /db/app/oracle/product/11.2.0/root.sh
4.配置靜默監聽
su - oracle netca /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/oradata RECOVERYAREADESTINATION=/db/app/oracle/fast_recovery_area CHARACTERSET = "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 - oracle
sqlplus / as sysdba select 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 --permanent firewall-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_HOME vi /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/functions LOCKFILE=/var/lock/subsys/oracle ORACLE_HOME=/db/app/oracle/product/11.2.0 ORACLE_USER=oracle case "$1" in 'start') if [ -f $LOCKFILE ]; then echo $0 already running. exit 1 fi echo -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 ]; then echo $0 already stopping. exit 1 fi echo -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 ]; then echo $0 started. else echo $0 stopped. fi ;; *) echo "Usage: $0 [start|stop|status]" exit 1 esac exit 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/S61oracle ln -s /etc/rc.d/init.d/oracle /etc/rc3.d/S61oracle ln -s /etc/rc.d/init.d/oracle /etc/rc4.d/S61oracle ln -s /etc/rc.d/init.d/oracle /etc/rc0.d/K61oracle ln -s /etc/rc.d/init.d/oracle /etc/rc6.d/K61oracle chkconfig --level 234 oracle on chkconfig --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/.oracle mkdir /tmp/.oracle chown -R oracle:oinstall /var/tmp/.oracle /tmp/.oracle chmod -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 immediate startup 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/dbs ls 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 --------
key semid owner perms nsems
再查詢共享內存段也ok了!
ipcs -m
(5)如果是Oracle進程沒有關閉,
kill -9 <PID>
(6)執行上面5個步驟即可成功解決該錯誤!