当前位置:首页 > 问答 > 正文

说说Oracle启动那些事儿,别光看理论,实际操作才真管用

某Oracle老DBA的实战笔记)

直接上干货吧,理论书上一大堆,咱就聊聊真动手时那点事儿,你打开电脑,连上服务器,准备启动Oracle数据库,第一步可不是急着敲那个startup命令。

第一关:找准你的“家”在哪儿(设置环境变量)

这步要是错了,后面全白搭,就像回家得先认对门牌号一样,你得告诉操作系统,你要玩的是哪个Oracle。(来源:多次踩坑后的教训)

  1. 先看看当前用户是谁whoami 或者 id 看一眼,别用root用户瞎搞,通常都是用oracle这个软件安装用户。
  2. 设置关键环境变量:最主要的就是ORACLE_SID(数据库实例名)和ORACLE_HOME(Oracle软件的安装目录),比如你的库叫orcl,家目录在/u01/app/oracle/product/19.0.0/dbhome_1,那就得这么设:
    export ORACLE_SID=orcl
    export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
    export PATH=$ORACLE_HOME/bin:$PATH

    通常老手都会有个现成的脚本,比如叫oraenv,直接. oraenv然后输入SID就行,省事儿,这一步没做对,你后面执行sqlplus / as sysdba,它可能连的是另一个实例,或者直接报错。

第二关:开门前先听听动静(检查监听和进程)

门锁对了,还得听听屋里有没有动静,是不是已经有人在了。(来源:某次误启动导致冲突的惨痛经历)

  1. 看看数据库是不是已经起来了:别傻乎乎地重复启动,最简单粗暴的就是用ps -ef | grep pmon命令,PMON是Oracle的一个核心后台进程,只要它在,说明实例很可能已经跑着了,你会看到一行像ora_pmon_orcl这样的进程,如果看到了,就别再startup了,否则会报错。
  2. 确认监听器在不在:监听器好比是数据库的“前台”,负责接待外面的客户端连接,数据库起来了,但监听没开,外面的人也连不进来,检查命令是lsnrctl status,如果看到一堆信息说“监听器支持的服务……”里面有你的orcl,那就OK,如果没起来,得先lsnrctl start把监听启动起来。

第三关:进屋开灯,一步步来(启动数据库的三种模式)

终于到sqlplus / as sysdba连进去,准备startup了,但这启动可不是一步到位的,分三步走,像进屋先开廊灯,再开客厅灯,最后开大灯。(来源:Oracle官方文档的实践化理解)

  1. startup nomount(拉电闸): 这个阶段,Oracle只做一件事:读取参数文件(pfilespfile),根据参数文件里的设置,分配内存(SGA)并启动那些必要的后台进程(PMON、SMON等),这时候数据库本身还没被触碰,就像工厂通了电,但生产线还没开动。

    • 什么时候用? 通常是在创建新数据库、重建控制文件这种极端操作的时候,平时维护很少单独停在这步。
  2. alter database mount;(打开总开关): 在nomount基础上,执行这个命令,这时候Oracle会去找到并打开控制文件,控制文件是数据库的“大脑”,记录了数据文件、日志文件等关键信息的位置和状态,数据库现在能“看到”自己的整体结构了,但用户还是不能访问,因为数据文件还没打开。

    • 什么时候用? 很多恢复操作必须在这个模式下做,对数据文件进行恢复,或者重命名数据文件,这时候你可以操作数据库的结构,但不能动里面的数据。
  3. alter database open;(全线开工): 最后一步,Oracle根据控制文件的指引,去打开所有联机的数据文件和重做日志文件,如果这些文件都没问题,数据库就完全打开了,所有用户都可以正常连接和使用。

    • 常见坑点:如果这时候某个数据文件损坏或者丢失了,open命令就会报错,停在这里,你就得进行恢复操作了。

第四关:碰上启动不了的幺蛾子怎么办(实战故障排查)

书上的启动一帆风顺,现实中却总幺蛾子不断。(来源:N次深夜救火的经验总结)

  • startup报错,说找不到参数文件。

    • 咋回事:最常见的就是spfile丢了或者放的地方不对,Oracle默认会按一定顺序找(先是spfile,找不到再找pfile)。
    • 怎么办:手动指定一个存在的参数文件启动:startup pfile='/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initorcl.ora',如果连pfile都没了,那就有点麻烦,可能得从备份重建,或者根据记忆手写一个最简单的先启动起来。
  • alter database open时,报某个数据文件需要恢复。

    • 咋回事:通常是数据库非正常关闭(比如服务器断电)后,有些数据还没写到磁盘上,需要靠重做日志来恢复。
    • 怎么办:别慌,大多数情况下,Oracle自己能搞定,你先尝试一下自动恢复:recover automatic database;,系统可能会自动应用日志,完事儿后你再alter database open;一般就成功了,如果自动恢复不行,它会提示你需要哪个归档日志,你再手动指定路径。
  • shutdown immediate关不掉,卡住了。

    • 咋回事:可能有会话(用户连接)死不退出,或者有事务没提交。
    • 怎么办:别直接断电!可以尝试更强制的方式:shutdown abort,这相当于强制断电,下次启动时,数据库肯定会需要进行恢复(由SMON进程自动完成),所以启动时会比平时慢一点,可能会看到类似“正在执行介质恢复……”的提示,等它自己完成就行。abort是杀手锏,别常用,但关键时刻能保命。

启动Oracle这事儿,理论是骨架,操作才是血肉,多动手练几次,尤其是故意制造点故障(在测试环境!),再想办法解决,比看十本书都管用,遇到问题别怕,一步步看报错信息,十有八九都能找到线索。

说说Oracle启动那些事儿,别光看理论,实际操作才真管用