:Xmanager環(huán)境下安裝Oracle 11g與Tomcat 8全流程)
我有個老項目要部署一套業(yè)務系統(tǒng)環(huán)境是CentOS 7.6數(shù)據(jù)庫選的Oracle 11g中間件用的Tomcat 8客戶端機器是Windows。遠程操作我直接用了Xmanager全家桶里的Xshell和Xstart這套流程從頭到尾跑了三遍把踩過的坑都補齊了今天把這套全流程操作步驟整理出來。如果你也在折騰Linux服務器上裝Oracle 11g和Tomcat這篇東西應該能幫你少走很多彎路。先說下為什么要用Xmanager來做安裝操作。Oracle 11g的安裝程序是圖形界面雖然理論上可以用靜默模式裝但生產(chǎn)環(huán)境里你基本沒法保證每臺機器的參數(shù)都一樣跑圖形界面能看到實際校驗信息出問題了也方便現(xiàn)場排查。而CentOS 7服務器大多是無桌面環(huán)境或者遠程機房直接在服務器上操作圖形界面并不現(xiàn)實Xmanager恰好解決了這個問題它能把服務端的圖形界面重定向到你的Windows屏幕上。Xmanager全家桶里面我主要用兩個組件Xshell負責SSH命令行操作Xstart負責把圖形界面程序拉到本地顯示。這套組合比直接用VNC輕量不少不用在服務器上裝額外的桌面組件安全性也好一些畢竟走的是加密通道。1. 環(huán)境準備與初始配置1.1 服務器基礎(chǔ)環(huán)境檢查我拿到手的服務器是CentOS 7.6內(nèi)存16G四核CPU磁盤200G。Oracle 11g在CentOS 7上跑對資源要求不算特別苛刻但有幾個底線必須確認清楚。內(nèi)存方面至少2G以上推薦4G起步swap分區(qū)建議至少2G生產(chǎn)環(huán)境最好配到內(nèi)存的1.5倍。我見過有人用1G內(nèi)存裝Oracle 11g結(jié)果安裝界面卡得跟幻燈片一樣最后裝到一半直接OOM崩潰。磁盤看情況Oracle軟件本體加數(shù)據(jù)庫文件至少要留出30G空間再加上Tomcat和業(yè)務系統(tǒng)的部署包40G起步比較穩(wěn)妥。系統(tǒng)架構(gòu)必須是64位這個不用多解釋Oracle 11g對32位系統(tǒng)的支持早就不行了。操作系統(tǒng)版本最好選CentOS 7.6到7.9之間的版本太老的內(nèi)核跟Oracle 11g的兼容性有問題太新又可能觸發(fā)奇怪的庫沖突。還要檢查主機名和網(wǎng)絡(luò)配置。主機名別用帶下劃線的Oracle的安裝程序?qū)χ鳈C名要求比較嚴格下劃線這種字符可能導致監(jiān)聽器起不來。我在某臺測試機上就吃過這個虧主機名設(shè)成prod_db_01結(jié)果netca配置監(jiān)聽時直接報錯改回prod-db-01就正常了。1.2 Xmanager連接配置Xmanager連接服務器前我習慣先確認SSH端口通不通。CentOS 7默認開22端口用Xshell連接時填上IP和端口就能進。如果改了SSH端口記得在Xshell的會話屬性里同步修改。Xstart的配置相對復雜一些這是很多新手容易卡住的地方。Xstart通過SSH協(xié)議連到服務器后它會執(zhí)行你指定的命令并把圖形輸出重定向到本地顯示。具體配置方法是這樣的在Xmanager中新建一個Xstart會話協(xié)議選SSH主機填服務器IP用戶名填root認證方式選密碼或者密鑰都行。最關(guān)鍵的是命令這一欄要填入你要執(zhí)行的圖形程序。比如裝Oracle時命令填xhost 和 export DISPLAY:0.0 是不對的這些是本地顯示用的Xstart會自動處理DISPLAY變量。直接填你要運行的程序路徑即可比如/opt/oracle/database/runInstaller。如果只是想測試圖形界面是否通了可以先跑/usr/bin/xterm能彈出終端窗口就說明Xstart鏈路通暢。Xstart還有一個需要注意的地方就是命令執(zhí)行時要保持會話不退出。很多人配置完命令后程序啟動起來Xstart窗口就關(guān)掉了結(jié)果圖形界面跟著消失。實際上Xstart會持續(xù)維持這個會話讓圖形程序一直駐留在遠程服務器上本地窗口只是負責顯示關(guān)掉本地窗口程序不會中斷。1.3 系統(tǒng)初始化與依賴包安裝CentOS 7默認安裝比較精簡Oracle 11g需要的依賴包和庫文件有很多沒裝所以系統(tǒng)準備階段要先把這些補齊。我這里列一下我實際用到的包清單yum install -y binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33.i686 \ elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc glibc.i686 glibc-devel glibc-devel.i686 \ ksh libaio libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc libstdc.i686 \ libstdc-devel libXi libXi.i686 libXtst libXtst.i686 make sysstat unixODBC unixODBC-devel這里有個容易踩的坑compat-libstdc-33這個包在CentOS 7的默認yum源里其實沒有如果你用默認源直接裝會報找不到包。解決辦法是安裝EPEL源或者從CentOS 6的安裝光盤中提取這個rpm包手動裝。EPEL源裝起來很簡單yum install -y epel-release yum clean all yum makecache然后再執(zhí)行上面的依賴包安裝命令。有些老依賴包在當前yum源中找不到也沒關(guān)系我后來測試發(fā)現(xiàn)Oracle 11g的安裝程序在缺失某些兼容庫時不會直接中止但會在后續(xù)啟動監(jiān)聽器或者實例時暴露出問題。所以寧可一次裝齊也別等到裝完再折騰。另外還要確認libaio和libaio-devel這兩個包沒裝的話Oracle數(shù)據(jù)庫創(chuàng)建實例時會有rpm校驗警告雖然可以跳過但會導致后續(xù)調(diào)用某些API報錯。手動處理起來很麻煩所以還是老老實實裝好。2. Oracle 11g安裝前的系統(tǒng)調(diào)優(yōu)2.1 內(nèi)核參數(shù)調(diào)整Oracle官方文檔要求修改/etc/sysctl.conf文件來調(diào)整內(nèi)核參數(shù)。這里說的參數(shù)直接決定了Oracle數(shù)據(jù)庫能否正常啟動和分配足夠的內(nèi)存所以不能只盯著安裝步驟這步得確保數(shù)值和你實際機器配置匹配才行。我用的參數(shù)配置如下fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 2097152 kernel.shmmax 4294967295 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配置完成后執(zhí)行sysctl -p使其生效。如果你服務器物理內(nèi)存特別大比如32Gkernel.shmmax建議設(shè)成物理內(nèi)存的一半左右。這個參數(shù)控制的是共享內(nèi)存段的最大大小Oracle SGA在啟動時會嘗試申請一個或者多個共享內(nèi)存段如果shmmax太小Oracle只能創(chuàng)建多個共享內(nèi)存段來湊夠SGA大小性能會有明顯下降。還有一個參數(shù)容易忘記就是kernel.sem的四段含義。250是每個信號量集合的最大信號量數(shù)32000是系統(tǒng)范圍內(nèi)最大信號量數(shù)100是每個信號量集合的最大操作數(shù)128是系統(tǒng)范圍內(nèi)最大信號量集合數(shù)。Oracle安裝程序在環(huán)境檢查時會校驗這些值不達標會直接打紅叉。2.2 用戶與目錄規(guī)劃Oracle 11g不允許直接用root用戶安裝必須創(chuàng)建專屬用戶和用戶組。我按官方最佳實踐創(chuàng)建了oinstall組和dba組oracle用戶的主組設(shè)為oinstall附加組設(shè)為dba。這樣做的好處是后續(xù)備份、恢復、安裝補丁時權(quán)限管理清晰不容易出現(xiàn)DBA組權(quán)限不足的問題。創(chuàng)建命令如下groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle目錄結(jié)構(gòu)方面我習慣把Oracle的軟件安裝目錄和數(shù)據(jù)目錄分開。軟件目錄放在/u01/app/oracle數(shù)據(jù)目錄放在/u02/oradata或者直接用Oracle默認的/u01/app/oracle/oradata。如果你服務器上就一塊磁盤那放在一起問題不大但如果有獨立的數(shù)據(jù)盤強烈建議把數(shù)據(jù)目錄指到獨立磁盤上對IO性能和故障隔離都有好處。目錄權(quán)限記得要改成oracle用戶有權(quán)限訪問mkdir -p /u01/app/oracle mkdir -p /u02/oradata chown -R oracle:oinstall /u01 chown -R oracle:oinstall /u02 chmod -R 775 /u01 chmod -R 775 /u02這里有個細節(jié)目錄的屬主最好設(shè)置成oracle用戶不要用root。我試過一次用root創(chuàng)建目錄沒改屬主就直接裝Oracle等Oracle的安裝程序往里寫文件時才提示權(quán)限不足又回頭改權(quán)限白白浪費了十幾分鐘。2.3 安全級別與防火墻調(diào)整CentOS 7默認開了firewalld如果這個防火墻沒放行Oracle需要的端口即使Oracle本身裝好了遠程客戶端也連不上數(shù)據(jù)庫。Oracle 11g默認的監(jiān)聽端口是1521Tomcat默認端口是8080這兩個都要在防火墻里放行。操作命令firewall-cmd --zonepublic --add-port1521/tcp --permanent firewall-cmd --zonepublic --add-port8080/tcp --permanent firewall-cmd --reload如果嫌麻煩也可以直接把防火墻停掉生產(chǎn)環(huán)境建議還是用白名單方式放行特定IP訪問。另外還要注意SELinux的影響CentOS 7的SELinux默認是enforcing模式Oracle的安裝文檔里并沒有要求一定關(guān)閉SELinux但實際安裝過程中我發(fā)現(xiàn)SELinux會對Oracle的某些文件訪問權(quán)限做限制尤其是監(jiān)聽器啟動時綁定端口那一步。為了避免不必要的麻煩我統(tǒng)一把SELinux設(shè)成了permissive模式sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config setenforce 0注意setenforce 0只是臨時關(guān)閉當前內(nèi)核的SELinux重啟后還是會變成enforcing所以必須同步修改配置文件。3. Oracle 11g安裝全流程走通3.1 安裝介質(zhì)準備與解壓Oracle 11g的安裝包分兩個zip文件一個是linux.x64_11gR2_database_1of2.zip另一個是linux.x64_11gR2_database_2of2.zip。下載好之后傳到服務器的某個臨時目錄下比如/home/oracle/db_install。解壓必須用oracle用戶身份解壓否則解壓出來的文件屬主會變成root后面Oracle安裝程序會有文件權(quán)限校驗很可能會被卡住。解壓命令su - oracle mkdir -p /home/oracle/db_install cd /home/oracle/db_install unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip解壓完會在當前目錄下生成一個database目錄里面就是全套安裝程序。解壓時如果提示某個zip文件損壞大概率是傳輸過程中出了問題重新傳一遍就能解決不需要重新下載整個包。3.2 通過Xstart啟動圖形化安裝裝好系統(tǒng)依賴、配置好用戶和內(nèi)核參數(shù)之后重頭戲來了用Xstart啟動Oracle的安裝程序。打開Xmanager的Xstart工具填寫如下信息主機服務器IP地址協(xié)議SSH用戶名oracle認證密碼方式命令/home/oracle/db_install/database/runInstaller初次點擊執(zhí)行按鈕后Xstart會彈出一個日志窗口顯示SSH連接的建立過程和DISPLAY環(huán)境變量的設(shè)置情況。過幾秒鐘Windows桌面就會彈出Oracle Universal Installer的圖形界面看到這個界面就是成功了。這個環(huán)節(jié)有個最常見的坑就是點了Xstart后報錯提示無法打開DISPLAY或者連接不上X server。原因往往是服務器上的X11轉(zhuǎn)發(fā)依賴包沒裝。CentOS 7的SSHd配置文件里X11Forwarding默認是啟用的但如果沒有xorg-x11-xauth這個包轉(zhuǎn)發(fā)鏈路就會斷掉。解決方法是yum install -y xorg-x11-xauth裝完之后重新用Xstart執(zhí)行命令基本上就正常了。如果Xstart啟動圖形界面過程中彈出了java異常窗口這多半是因為CentOS 7自帶的OpenJDK版本跟Oracle安裝程序不兼容。解決思路是在啟動runInstaller之前先卸載系統(tǒng)自帶的OpenJDK或者設(shè)置JAVA_HOME指向Oracle安裝包自帶的JDK。Oracle 11g的安裝程序里其實自帶了jdk目錄不需要額外裝Java直接設(shè)置環(huán)境變量JAVA_HOME指向database目錄下的jdk即可。3.3 圖形界面中的安裝選項配置Oracle Universal Installer啟動后第一步是配置安全更新和接收郵件通知這里直接取消勾選即可。接下來會讓你選擇安裝類型我一般選創(chuàng)建和配置單實例數(shù)據(jù)庫這樣裝完后數(shù)據(jù)庫實例就直接創(chuàng)建好了省得再單獨運行DBCA建庫。高級安裝模式比典型安裝多幾個自定義步驟比如字符集、內(nèi)存分配、存儲路徑、ASM等選項。首次安裝建議走高級模式可以提前指定很多關(guān)鍵參數(shù)省得裝完后又要改配置。關(guān)鍵是字符集我選的是AL32UTF8這個字符集支持中文存儲和各種語言如果業(yè)務系統(tǒng)只跑中文用ZHS16GBK也行但我個人更推薦UTF8兼容性更好也方便后續(xù)數(shù)據(jù)遷移。內(nèi)存分配這里需要注意Oracle 11g的自動內(nèi)存管理AMM功能默認是開啟的如果你設(shè)置的SGA和PGA總和超過了實際物理內(nèi)存數(shù)據(jù)庫實例可能在啟動時直接失敗。我這里內(nèi)存16G給Oracle分配了SGA 4GPGA 2G這個比例夠用。如果你服務器內(nèi)存小SGA給2GPGA給1G也能跑。重要的是給操作系統(tǒng)留夠余量別把內(nèi)存全部分完。數(shù)據(jù)庫身份驗證那里設(shè)置的是SYS和SYSTEM用戶的密碼這個密碼要記好建議用大小寫字母加數(shù)字組成的強密碼。Oracle 11g對密碼復雜度默認有校驗太簡單的密碼比如oracle123這種可以直接過但類似123456這種純數(shù)字的會提示太弱無法通過。3.4 安裝過程中的組校驗與腳本執(zhí)行安裝過程中有個環(huán)節(jié)會卡住不少人就是在指定Oracle用戶屬組的時候安裝程序會自動檢測oinstall組和dba組是否存在并顯示綠色對勾或黃色警告。如果警告提示找不到dba組說明之前的groupadd沒有成功回頭執(zhí)行g(shù)roups oracle命令確認一下如果沒有dba附加組用usermod -G dba oracle補上。安裝進行到70%左右時會彈出一個窗口要求以root身份執(zhí)行兩個腳本一個是orainstRoot.sh另一個是root.sh。這一步很多人會疑惑到底要不要執(zhí)行答案是必須執(zhí)行而且要等腳本跑完才能點確定繼續(xù)。操作方式是另開一個Xshell窗口用root登錄服務器依次執(zhí)行/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shroot.sh執(zhí)行時會有交互提示問你是否把oracle用戶加到dba組直接填y回車就行。整個root.sh腳本執(zhí)行過程會創(chuàng)建一些系統(tǒng)級別的目錄和啟動腳本確保Oracle監(jiān)聽和數(shù)據(jù)庫隨系統(tǒng)自動啟動的腳本能正常運行。這里要特別說一下root.sh腳本的輸出信息綠色文本顯示的是腳本創(chuàng)建的關(guān)鍵目錄和文件紅色文本一般是警告或者錯誤。我遇到過root.sh執(zhí)行時報錯說不能寫/etc/oratab原因就是/etc目錄空間滿了清理掉一些無用的日志文件后重新執(zhí)行就好了。3.5 修改環(huán)境變量與驗證安裝結(jié)果Oracle安裝完最后一件事是配置oracle用戶的環(huán)境變量。編輯/home/oracle/.bash_profile文件加入以下內(nèi)容export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SIDorcl export PATH$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH$ORACLE_HOME/lib保存后執(zhí)行source .bash_profile使其生效。然后運行sqlplus / as sysdba進入SQL*Plus執(zhí)行select status from v$instance;看到OPEN狀態(tài)就說明數(shù)據(jù)庫實例正常起來了。監(jiān)聽器狀態(tài)可以通過lsnrctl status命令查看正常會顯示服務orcl已有1個實例處理程序。如果監(jiān)聽沒啟動用lsnrctl start手動拉起之后可以檢查1521端口是否出現(xiàn)在LISTEN狀態(tài)。4. Tomcat 8安裝與部署4.1 JDK環(huán)境配置Tomcat是Java應用服務器依賴JDK運行。Oracle 11g安裝過程會自帶一個JDK但這個JDK版本比較老不建議直接拿給Tomcat用。我這邊是單獨安裝了OpenJDK 1.8Tomcat 8.5對JDK版本要求是1.8及以上。安裝JDK的方式有很多種最簡單就是用yum裝yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel裝完后執(zhí)行java -version確認版本然后設(shè)置JAVA_HOME。一般OpenJDK裝完路徑在/usr/lib/jvm/java-1.8.0-openjdk把這個路徑寫進/etc/profile里export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk export PATH$PATH:$JAVA_HOME/bin export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarsource /etc/profile后執(zhí)行echo $JAVA_HOME驗證環(huán)境變量是否生效。這里有個容易出現(xiàn)的問題如果服務器上同時裝了多個Java版本要注意PATH的優(yōu)先級確保指向1.8這個版本。4.2 Tomcat解壓與目錄規(guī)劃Tomcat的安裝方式非常直接下載apache-tomcat-8.5.x.tar.gz包解壓到指定目錄就行。我習慣放在/opt/tomcat下面結(jié)構(gòu)清晰備份也方便。下載和安裝命令mkdir -p /opt/tomcat tar -zxvf apache-tomcat-8.5.100.tar.gz -C /opt/tomcat --strip-components1 chmod x /opt/tomcat/bin/*.sh這里用到--strip-components1參數(shù)意思是解壓時去掉包內(nèi)最頂層目錄名直接解壓到/opt/tomcat下。如果不加這個參數(shù)文件會被解壓到/opt/tomcat/apache-tomcat-8.5.100目錄下還要多一層目錄嵌套看起來很別扭。Tomcat目錄結(jié)構(gòu)里bin目錄存放啟動關(guān)閉腳本conf目錄存放配置文件webapps目錄是部署Web應用的位置。下面重點看幾個配置文件因為如果配置有問題項目部署上去跑不起來排查很浪費時間。4.3 Tomcat核心配置調(diào)整首先是conf/server.xml這是Tomcat的主配置文件。要關(guān)注三塊內(nèi)容。端口監(jiān)聽配置默認8080如果項目有特殊要求可以改成其他端口但要和防火墻放行規(guī)則保持一致。連接器參數(shù)主要調(diào)整maxThreads和minSpareThreads這兩個參數(shù)控制Tomcat的線程池大小。我沒改動線程池但要注意的是connectionTimeout別設(shè)置太短否則上傳大文件時容易被掐斷連接。然后是conf/catalina.sh的配置JAVA_OPTS環(huán)境變量在這里設(shè)置。內(nèi)存優(yōu)化的參數(shù)如下JAVA_OPTS-Xms512m -Xmx1024m -XX:MaxPermSize256m如果是JDK 1.8MaxPermSize參數(shù)已經(jīng)沒有意義了JVM用Metaspace代替了永久代所以可以去掉這個參數(shù)。推薦配置JAVA_OPTS-server -Xms512m -Xmx2048m -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m這里-Xms和-Xmx建議設(shè)成相同值可以避免JVM在運行過程中動態(tài)調(diào)整堆大小帶來的性能抖動。-XX:MetaspaceSize和MaxMetaspaceSize也是同理直接設(shè)成一致能減少Full GC頻率。最后是部署業(yè)務系統(tǒng)WAR包的方式。有兩種一種是直接把WAR包扔到webapps目錄下Tomcat啟動時自動解壓并部署另一種是在conf/Catalina/localhost目錄下創(chuàng)建XML配置文件通過docBase指定WAR包的絕對路徑。生產(chǎn)環(huán)境我推薦用第二種好處是部署路徑可以在外部靈活控制不用把業(yè)務包混在Tomcat默認目錄結(jié)構(gòu)里同時方便多個應用獨立管理。4.4 Tomcat開機自啟動配置為了讓Tomcat在服務器重啟后自動啟動我寫了一個systemd服務腳本。創(chuàng)建/usr/lib/systemd/system/tomcat.service文件內(nèi)容如下[Unit] DescriptionApache Tomcat Web Application Container Afternetwork.target [Service] Typeforking EnvironmentJAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk EnvironmentCATALINA_HOME/opt/tomcat EnvironmentCATALINA_BASE/opt/tomcat ExecStart/opt/tomcat/bin/startup.sh ExecStop/opt/tomcat/bin/shutdown.sh Userroot Grouproot Restartalways [Install] WantedBymulti-user.target保存后依次執(zhí)行以下命令設(shè)置開機自啟并立即驗證systemctl daemon-reload systemctl enable tomcat.service systemctl start tomcat.service systemctl status tomcat.service注意Typeforking這個配置很關(guān)鍵startup.sh腳本啟動Tomcat后會立即返回真正的Tomcat進程以子進程方式在后臺運行所以必須用Typeforking來告訴systemd這是forking類型服務否則systemd會認為啟動腳本執(zhí)行完就退出了不會持續(xù)追蹤Tomcat進程。上面Userroot是圖方便才設(shè)置成root生產(chǎn)環(huán)境建議單獨創(chuàng)建一個tomcat用戶來跑Tomcat進程這樣可以實現(xiàn)權(quán)限隔離即使Tomcat被攻破了攻擊者拿到的也只是tomcat用戶權(quán)限對系統(tǒng)整體危害會小很多。4.5 驗證Tomcat與業(yè)務系統(tǒng)聯(lián)調(diào)Tomcat部署完成后通過瀏覽器訪問http://服務器IP:8080看到Tomcat默認首頁就說明Tomcat本身跑起來了。如果頁面打不開排查順序是第一看systemctl status tomcat服務狀態(tài)是否active第二看8080端口有沒有LISTEN第三看防火墻放行了沒有最后看SELinux有沒有攔把SELinux設(shè)置成permissive模式可以排除這個因素的影響。業(yè)務系統(tǒng)WAR包部署后如果應用依賴Oracle數(shù)據(jù)庫需要把Oracle JDBC驅(qū)動包ojdbc6.jar放到Tomcat的lib目錄下。Tomcat 8.5對驅(qū)動包的管理有講究全局共享的驅(qū)動放在lib目錄單個應用獨享的驅(qū)動放在webapps/WEB-INF/lib目錄。如果驅(qū)動版本不對最常見的報錯是ClassNotFoundException或者SQLState異常解決辦法就是到Maven倉庫里下載對應版本的ojdbc6.jar替換。部署完WAR包后重啟Tomcatsystemctl restart tomcat.service觀察日志輸出tail -f /opt/tomcat/logs/catalina.out啟動日志中看到Deployment of web application archive has finished說明業(yè)務系統(tǒng)部署成功。再配合數(shù)據(jù)庫監(jiān)聽狀態(tài)確認整條鏈路就通了。5. 常見問題與排查技巧實錄5.1 Xstart無法顯示圖形界面Xstart連接服務器后報錯提示Cant connect to X11 window server這是最典型的圖形界面轉(zhuǎn)發(fā)問題。排查步驟是確認服務器上是否安裝了xorg-x11-xauth包沒有就裝上。確認SSH服務端的X11Forwarding設(shè)置為yes確認/etc/ssh/sshd_config配置中有X11UseLocalhost yes這個參數(shù)。真正處理這個坑時我發(fā)現(xiàn)還有個更隱蔽的問題就是Xstart的配置文件里指定了錯誤的SSH端口或者密鑰認證方式。如果服務器改了SSH端口Xstart里也要同步修改。還有如果服務器上配置了SSH key并且禁用了密碼登錄Xstart認證方式要改成Public Key并把本地私鑰路徑填進去。另一個少見但特別麻煩的問題是CentOS 7.5及以上版本默認的/etc/ssh/sshd_config里X11Forwarding被注釋掉了需要手動取消注釋并重啟sshd服務。重啟sshd前要注意會不會影響已有的SSH連接其實不會重啟sshd服務對已建立的連接沒有影響只對新的連接生效。5.2 Oracle安裝程序環(huán)境檢查不通過Oracle Universal Installer在正式安裝前會做環(huán)境預檢經(jīng)常見到某個檢查項是紅色的叉號。比如內(nèi)核參數(shù)中的kernel.sem不滿足要求、依賴包缺失、內(nèi)存大小不滿足最小限制等等。出現(xiàn)紅叉不要直接點忽略因為后續(xù)安裝或者運行時還會暴露問題。回顧我安裝過程中預檢不通過的情況大部分是缺少32位兼容庫比如glibc.i686和libaio.i686。Oracle 11g雖然是64位版本但它的某些組件會調(diào)用32位庫不裝好直接裝Oracle后面創(chuàng)建數(shù)據(jù)庫時容易報ORA-12547錯誤。等價交換的話如果你對依賴包沒底可以在預檢失敗后點Check Another然后查看對應的日志文件。日志文件通常放在/tmp目錄下文件名帶OraInstall前綴打開后可以看到具體的檢查結(jié)果和缺失項比官方界面彈窗提示的粒度細得多。5.3 Oracle監(jiān)聽器起不來Listener啟動失敗也是高發(fā)問題常見的情況是監(jiān)聽器已啟動但狀態(tài)顯示unknown或service not registered。最直接的原因是listener.ora文件配置錯誤監(jiān)聽的位置寫錯了端口或者主機IP。用netca重新配置監(jiān)聽是最省事的辦法命令行輸入netca根據(jù)圖形界面提示一步步操作就行。還有種情況是Oracle數(shù)據(jù)庫實例沒有注冊到監(jiān)聽器導致客戶端連接時報ORA-12514: TNS listener does not currently know of service requested in connect descriptor。解決辦法是檢查listener.ora里是否配置了靜態(tài)的SID信息或者在數(shù)據(jù)庫本地通過sqlplus執(zhí)行alter system register;手動注冊實例到監(jiān)聽器。動態(tài)注冊是Oracle 11g的默認機制實例啟動時會自動向監(jiān)聽器注冊但前提是實例的service_name和監(jiān)聽器的監(jiān)聽端口匹配。如果不匹配就要修改initSID.ora里的local_listener參數(shù)指定正確的監(jiān)聽器地址。5.4 端口沖突排查端口沖突這個坑在Tomcat啟動時特別常見。Tomcat默認8080端口如果服務器上已經(jīng)部署了其他Web服務比如Nginx、Apache或者另一個Tomcat實例端口就會被占用Tomcat啟動報Address already in use錯誤。排查命令很簡單ss -tlnp | grep 8080 netstat -tlnp | grep 8080找到占用端口的進程后要么把占用進程停掉要么修改Tomcat的server.xml端口配置換一個可用端口。提醒一下如果Tomcat作為自啟動服務端口修改后要確認配置文件里沒有其他地方寫死監(jiān)聽端口否則Tomcat會加載舊配置導致端口沖突問題復發(fā)。Oracle 1521端口也有類似問題如果服務器上裝了多個版本的Oracle或者監(jiān)聽器配置錯誤都會導致端口沖突。通過lsnrctl status查看監(jiān)聽的IP和端口確認沒有和其他服務重疊。5.5 中文顯示亂碼問題我遇到過一次Oracle數(shù)據(jù)庫中的數(shù)據(jù)是中文但通過Java應用查詢出來是問號的情況。原因是數(shù)據(jù)庫的字符集和JDBC連接字符串中的字符集不一致。解決辦法是把數(shù)據(jù)庫字符集改成AL32UTF8同時JDBC連接URL加上characterEncodingUTF-8參數(shù)。還有一個可能是Tomcat連接器配置里添加URIEncodingUTF-8。記住改數(shù)據(jù)庫字符集不是改一個參數(shù)就能完成的事情要修改數(shù)據(jù)庫的locale、nls_lang環(huán)境變量、以及數(shù)據(jù)庫的national character set。如果是在建庫之前就發(fā)現(xiàn)這個問題直接在建庫時選對字符集最省事建庫之后再改會牽扯數(shù)據(jù)遷移工作量翻倍。6. 運維踩坑經(jīng)驗總結(jié)裝完這套環(huán)境后我復盤了一遍整個流程有些心得值得單獨拎出來說。第一個經(jīng)驗是Oracle安裝目錄和數(shù)據(jù)目錄盡量獨立規(guī)劃不要什么都扔在根分區(qū)。我的服務器根分區(qū)50GOracle安裝加數(shù)據(jù)文件很快就占了一半后來日志一膨脹直接導致根分區(qū)滿了Oracle和Tomcat同時罷工。應急辦法是清理日志文件但要想根治還是得把Oracle數(shù)據(jù)目錄、歸檔日志目錄、Tomcat日志目錄都單獨掛載到獨立分區(qū)用df -h提前確認各分區(qū)容量留有足夠余量。第二個經(jīng)驗是Oracle的數(shù)據(jù)庫備份不能只依賴數(shù)據(jù)庫自身的物理備份需要結(jié)合邏輯備份。物理備份適合災難恢復邏輯備份適合數(shù)據(jù)遷移和誤操作恢復。我自己就是用RMAN做物理備份每周跑一次expdp邏輯導出雙保險機制。一旦數(shù)據(jù)庫崩潰RMAN恢復整庫萬一只是某個表被誤刪expdp的dmp文件恢復起來更靈活。第三個經(jīng)驗是Tomcat的日志輪轉(zhuǎn)必須配置好。默認情況下Tomcat的catalina.out日志是不滾動切割的時間一長能膨脹到幾十G服務器磁盤會被吃光。解決方案是用Linux自帶的logrotate工具配置/etc/logrotate.d/tomcat按天切割并壓縮保留最近30天日志就夠。這個配置特別重要我見過有生產(chǎn)服務器一個月沒看日志直接占用30G磁盤應用直接因為磁盤滿宕機。第四個經(jīng)驗是關(guān)于安全的尤其是生產(chǎn)環(huán)境千萬別為了方便直接關(guān)防火墻和將SELinux設(shè)成disabled。我建議防火墻按需放行端口SELinux設(shè)成permissive并仔細查看日志中的違規(guī)記錄手動放行Oracle和Tomcat需要的操作。這樣既不影響功能又保留了一層安全防線。第五個經(jīng)驗是快照備份。裝這套系統(tǒng)前我給服務器做了個快照后面所有踩坑操作都能一鍵回滾。如果別的環(huán)境沒法做快照至少把修改過的配置文件提前復制一份到/tmp/backup目錄下出了問題還能對照原始版本恢復。這套環(huán)境我前后折騰了三次才走通所有細節(jié)前面兩次就是沒有快照每次配置改亂了都只能從頭再來。第六個經(jīng)驗也是最重要的就是不要盲目復制別人給的參數(shù)值。服務器配置不同內(nèi)存、CPU、磁盤完全一樣才能直接用別人的配置。比如kernel.shmmax這個參數(shù)機器內(nèi)存是4G的話設(shè)成4294967295就太大了反而可能導致Oracle的共享內(nèi)存申請不到系統(tǒng)整體性能下降。根據(jù)實際硬件資源配參數(shù)才是正路。這套環(huán)境裝好之后業(yè)務系統(tǒng)在Tomcat里跑著數(shù)據(jù)落在Oracle里穩(wěn)定運行了一段時間沒有出過重啟問題。后續(xù)如果需要擴容無外乎加內(nèi)存、加磁盤、調(diào)Tomcat線程池、加Oracle SGA這些都是同樣的思路方法論已經(jīng)通了。