成為MySQL DBA後,再看ORACLE資料庫(一、安裝與啟動)

海布里_MySQL發表於2024-05-27

一、前言

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都需要判斷控制檔案中記錄的字符集和資料庫中的字符集是否相符,如果相符,則記錄如上一行日誌;如果不相符合,則以資料庫中的字符集為準更新控制檔案中的字符集記錄。

四、ORACLE的關閉

ORACLE的關閉,實際上就是啟動的逆過程,當使用shutdown命令進行關閉時,資料庫也就經歷了close、dismount、shutdown三個步驟。ORACLE的shutdown一共有四種方式。第一種shutdown normal,也就是shutdown的預設選項,使用這種方式關閉資料庫需要等待當前所有使用者連線退出,所以在實際中很少使用。第二種shutdown immediate,使用這個命令時,當前正在被Oracle處理的事務立即中斷,未提交的事務將全部回滾,系統不等待連線到資料庫的使用者退出,強制斷開所有的連線使用者,然後執行檢查點,將已提交的變更資料全部寫回資料檔案,最後關閉資料庫。shutdown immediate是最常用的正常關閉資料庫的命令,在下次啟動時不需要進行例項恢復。第三種shutdown transactional,這也是一種安全的關閉方式,和shutdown immediate不同的時,它會等待事務執行完成而不是將未提交的事務回滾。第四種shutdown abort,資料庫會立即終止所有使用者連線、中斷所有事務、立即關閉資料庫,下次啟動時資料庫需要進行crash recovery,當資料庫hang住無法正常關閉時,可以使用這種方式強制關閉資料庫。shutdown abort放在MySQL中就是kill -9 `pidof mysqld`。

五、總結

ORACLE啟動的三個步驟是ORACLE的基礎,熟悉每個步驟背後具體在幹什麼,對於排查問題是非常有幫助的。而在MySQL中,資料庫啟動具體沒有分這幾個步驟,但其實MySQL啟動的也需要啟動例項、啟動程序、找到資料檔案、開啟資料檔案等,這在原理上和ORACLE是相通的,只是MySQL在設計上簡化了這些步驟,使用者無需關注具體啟動的階段,有問題主要看日誌,而mysql的my.cnf檔案其實兼具了引數檔案和控制檔案的功能。

相關文章