一、前言
ORACLE作為世界上最牛逼的關係型資料庫,也是我從事資料庫行業入門學習的資料庫,記得當時學習ORACLE資料庫時就深感其複雜性,對很多概念一知半解、似懂非懂,當ORACLE管理員期間也遇到過不少問題,不過好在有ORACLE原廠工程師駐場,基本上問題都能解決。後來因為領導的安排和工作的變動,我開始搞MySQL和一些信創資料庫,對於MySQL資料庫,從儲存引擎到主從複製,我也通讀了業界有名的幾本書,常年混跡於MySQL的論壇,給官方提過bug,研究過原始碼,發過文章,也在工作中解決了不少問題,可以說對於MySQL自認為比較擅長和拿手。但是目前國內的各大行業,尤其是金融行業的核心繫統,幾乎還是執行在ORACLE資料庫上,掌握ORACLE資料庫對以後的信創改造工作是十分重要的。因此,我重新拿起了ORACLE資料庫的書籍,當年學習ORACLE的筆記,對ORACLE進行復習與實操,一是為了讓以後的信創改造工作更順利,二是對比MySQL,感悟ORACLE的不同與牛逼之處。
二、ORACE的安裝
ORACLE資料庫的安裝肯定比MySQL資料庫複雜得多,MySQL資料庫的安裝在官方文件上可以簡化到只用幾行命令就可以完成。在ORACLE官網上可以對ORACLE各個版本的資料庫進行下載與學習使用,網址是:https://edelivery.oracle.com/ 。這也體現了ORACLE的開放,據說國內很多公司其實都是在使用盜版的ORACLE。
我下載的是11G版本,參考了墨天輪上面一個oracle 11g的資料庫安裝步驟,比較順利地完成了ORACLE的安裝。
--確保伺服器可以yum安裝包 yum -y install unzip --關閉防火牆 systemctl stop firewalld systemctl disable firewalld --關閉selinux vi /etc/selinux/config disable setenforce 0 --檢視swap是否存在(需要有swap) free -m --在/etc/hosts中新增主機名如下,前面為ip,後面為主機名稱。 10.4.7.100 oracle --安裝依賴包 yum install -y gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils-libelf-devel-static ksh libaio libaio-develnumactl-devel sysstat unixODBC unixODBC-devel pcre-devel --確認安裝無誤 rpm -qa gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils-libelf-devel-static ksh libaio libaio-develnumactl-devel sysstat unixODBC unixODBC-devel pcre-devel --確認安裝完包之後 groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle AxTemp##2022 --修改核心引數 vi /etc/sysctl.conf 增加以下內容其中kernel.shmmax = 1073741824為本機實體記憶體(2G)的一半,單位為byte fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 1073741824 4294967296 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 --修改完之後立即執行修改: sysctl -p --修改使用者的限制檔案/etc/security/limits.conf新增如下內容 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 --修改/etc/pam.d/login檔案:新增如下內容 session required /lib64/security/pam_limits.so session required pam_limits.so --修改/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 ---執行生效 source /etc/profile --建立目錄 mkdir -p /u01/oracle/product/11.2.0 mkdir /u01/oracle/oradata mkdir /u01/inventory mkdir /u01/oracle/fast_recovery_area chown -R oracle:oinstall /u01/oracle chmod -R 775 /u01/oracle chown -R oracle:oinstall /u01/inventory chmod -R 775 /u01/inventory --上傳1of7 2of7的linux oracle安裝包到/opt/oracle下 chown -R oracle:oinstall /opt/oracle chmod 755 -R /opt/oracle su - oracle cd /opt/oracle unzip p13390677_112040_Linux-x86-64_1of7.zip && unzip p13390677_112040_Linux-x86-64_2of7.zip --編輯oracle環境變數 vi ~/.bash_profile ORACLE_BASE=/u01/oracle ORACLE_HOME=$ORACLE_BASE/product/11.2.0 ORACLE_SID=orcl PATH=$PATH:$ORACLE_HOME/bin export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH --修改靜默檔案 vi /opt/oracle/database/response/db_install.rsp 需要設定的選項如下: oracle.install.option=INSTALL_DB_SWONLY ORACLE_HOSTNAME=oracle UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/inventory SELECTED_LANGUAGES=en,zh_CN ORACLE_HOME=/u01/oracle/product/11.2.0 ORACLE_BASE=/u01/oracle oracle.install.db.InstallEdition=EE oracle.install.db.DBA_GROUP=dba oracle.install.db.OPER_GROUP=dba DECLINE_SECURITY_UPDATES=true ---安裝資料庫軟體 cd /opt/oracle/database ./runInstaller -silent -responseFile /opt/oracle/database/response/db_install.rsp -ignorePrereq --重要:用root執行下面兩個指令碼 As a root user, execute the following script(s): 1. /u01/inventory/orainstRoot.sh 2. /u01/oracle/product/11.2.0/root.sh Successfully Setup Software. --靜默方式安裝監聽 netca /silent /responseFile /opt/oracle/database/response/netca.rsp --建立資料庫 vi /opt/oracle/database/response/dbca.rsp 修改如下內容 GDBNAME= "orcl" SID ="orcl" SYSPASSWORD= "Oracle_123" SYSTEMPASSWORD= "Oracle_123" SYSMANPASSWORD= "Oracle_123" DBSNMPPASSWORD= "Oracle_123" DATAFILEDESTINATION=/u01/oracle/oradata RECOVERYAREADESTINATION=/u01/oracle/fast_recovery_area CHARACTERSET= "ZHS16GBK" TOTALMEMORY= "6550" ----TOTALMEMORY ="1638" 為1638MB,實體記憶體2G*80%。 dbca -silent -responseFile /opt/oracle/database/response/dbca.rsp
從以上安裝步驟可以看出,主要步驟有:作業系統配置初始化、目錄建立、環境變數配置、安裝資料庫軟體、安裝監聽、建立資料庫。首先需要按照oracle官方的建議值配置OS核心引數和使用者資源限制引數,此外,和MySQL安裝最大的區別在於多了安裝資料庫軟體和安裝監聽這兩個動作,MySQL官方提供了二進位制包解壓即安裝,而ORACLE則需要呼叫靜默安裝指令碼安裝。ORACLE在建立資料庫這一步等同於MySQL的初始化資料庫,透過dbca完成這一步,也就生成了對應的資料檔案和日誌檔案。而透過編輯dbca.rsp檔案,可以定義資料檔案目錄、字符集、例項名、sys密碼等資料庫配置,在mysql中這些主要是透過my.cnf檔案實現的。
三、ORACLE的啟動
完成ORACLE的安裝後,就可以透過sqlplus連線資料庫,可以看到連線的是一個idle instance,意思就是閒置未啟動的例項。這時候就需要透過startup命令來啟動例項。
雖然啟動資料庫的命令非常簡單,但是啟動的三步驟卻是需要理解的,這也是我當年學習oracle初期印象最深的地方。在啟動的第一步驟,Oracle首先尋找引數檔案(pfile/spfile),然後根據引數檔案中的設定(如記憶體分配等設定),建立例項(INSTANCE),分配記憶體,啟動後臺程序。這時候資料庫就到了nomount的狀態,這也是啟動例項的過程。觀察ORACLE的告警日誌,可以非常清晰的看到這一過程。從日誌中可以看出,ORACLE讀取的引數檔案是spfile<ORACLE_SID>.ora,這也是ORACLE預設首選的引數檔案。這裡有一點要說一下,ORACLE_SID就是Oracle System Identifier的縮寫,ORACLE_SID以環境變數的形式出現,當Oracle例項啟動時,在作業系統上fork的程序就依據ORACLE_SID這個環境變數來建立,這就是SID的作用。而ORACLE例項後臺程序的名稱就是透過ORACLE_SID確定的。此外,在Oracle內部有個instance_name,用於標識資料庫例項的名稱,這個名稱就是預設就是ORACLE_SID。除了instance_name,對於Oracle資料庫更為重要的一個引數是DB_NAME,DB_NAME代表了例項即將掛接的資料庫名稱,關係到具體的物理檔案。一個例項可以mount並開啟任何資料庫,但是同一時間一個例項只能開啟一個資料庫。一個資料庫可以被一個或多個例項所mount並開啟,比如在RAC環境下。
ORACLE啟動的第二步,就是從nomount狀態啟動到mount狀態,在這一步中ORACLE從引數檔案中獲得控制檔案的位置資訊,然後找到控制檔案,並且根據控制檔案中記錄的資料檔案位置進行資料檔案的存在性判斷。從引數檔案中可以看出,控制檔案一個放在資料區,一個放在閃回區,這兩個控制檔案的內容是完全一樣的,這就是Oracle對控制檔案的映象安全保護。
在alert日誌中,可以看到透過命令alter database mount對資料庫完成了mount操作。
ORACLE啟動的第三步,就是從mount狀態到open狀態,控制檔案中記錄了資料庫中資料檔案、日誌檔案的位置資訊,檢查點資訊等重要資訊,在資料庫的Open階段,Oracle根據控制檔案中記錄的這些資訊找到這些檔案,然後進行檢查點及完整性檢查,如果不存在問題就可以正常開啟資料庫。在alert日誌中,可以看到,透過alter database open命令進行資料庫開啟的操作,首先是讀取redo log進行崩潰恢復操作,在日誌中可以看到所前滾到的scn號。然後smon程序將undo表空間線上,並進行事務的回滾。在啟動日誌中記錄了資料庫的字符集:Database Characterset is ZHS16GBK,在每次資料庫的啟動過程中,Oracle都需要判斷控制檔案中記錄的字符集和資料庫中的字符集是否相符,如果相符,則記錄如上一行日誌;如果不相符合,則以資料庫中的字符集為準更新控制檔案中的字符集記錄。