成为MySQL DBA后,再看ORACLE数据库(一、安装与启动)

一、前言

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的开放。

我下载的是11G版本,整理了以下oracle 11g的安装步骤,比较顺利地完成了ORACLE的安装。

--关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

--关闭selinux
vi  /etc/selinux/config
disable
setenforce 0--安装依赖包
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文件其实兼具了参数文件和控制文件的功能。

posted @ 2024-05-27 22:10  海布里_MySQL  阅读(14)  评论(0编辑  收藏  举报