如何快速启动/关闭 Oracle 11?

max*_*zig 9 oracle oracle-11g-r2 shutdown startup centos

我想知道正确启动/关闭 Oracle DB 守护程序(Oracle 11.2,安装在测试机器上)的最快方法是什么。

对于使用 OCI/Pro*C API 的 C/C++ 程序,我需要它。

我想要这个是因为我已经习惯了 PostgreSQL 的启动速度,而且因为守护进程在一个虚拟机中运行,该虚拟机仅为测试用例启动(按需)。

目前我像这样编写脚本 - 启动:

sqlplus /nolog <<EOF
connect / as sysdba
startup
quit
EOF
lsnrctl start
emctl start dbconsole
Run Code Online (Sandbox Code Playgroud)

并关机:

emctl stop dbconsole
lsnrctl stop
sqlplus /nolog <<EOF
connect / as sysdba
shutdown
quit
EOF
Run Code Online (Sandbox Code Playgroud)

这有效 - 程序按预期工作 - 但此过程非常缓慢。

Oracle DB 在 CentOS 6.3 上运行,它是免费(如啤酒一样)可用的“标准版”。

max*_*zig 8

您可以使用Oracle 安装附带的dbstart/dbshut脚本。它们可在$ORACLE_HOME/bin.

全新安装后,您必须编辑/etc/oratab文件:

# cat /etc/oratab
# format: $ORACLE_SID:$ORACLE_HOME:N|Y
my_sid:/home/juser/app/juser/product/11.2.0/dbhome_1:N
# sed -i 's/:N$/:Y/' /etc/oratab
# grep my_sid /etc/oratab
my_sid:/home/juser/app/juser/product/11.2.0/dbhome_1:Y
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这样的脚本:

$ whoami
juser
$ dbstart $ORACLE_HOME
$ # execute DB jobs ...
$ dbshut $ORACLE_HOME
Run Code Online (Sandbox Code Playgroud)

dbstart 提供 Pro*C/OCI 程序所需的所有内容。

使用dbstart/dbshut是对问题中提到的自定义方法的改进:

method                time    called tools
?????????????????????????????????????????????????????
dbstart              5.7 s    lsnrctl, sqlplus
dbshut               5.7 s    lsnrctl, sqlplus
custom startup      27.9 s    lsnrctl, sqlplus, emctl
custom shutdown     31.0 s    lsnrctl, sqlplus, emctl
Run Code Online (Sandbox Code Playgroud)

(Core i7/2.8GHz 系统上的时间,慢速旋转硬盘。)

dbstart/dbshut 如何工作

一个dbstart $ORACLE_HOME$调用基本上等同于:

$ lsnrctl start
$ echo -e 'connect / as sysdba\nstartup\nquit'| sqlplus /nolog
Run Code Online (Sandbox Code Playgroud)

而 adbshut $ORACLE_HOME$基本上等价于:

$ lsnrctl stop
$ echo -e 'connect / as sysdba\nshutdown\nquit'| sqlplus /nolog
Run Code Online (Sandbox Code Playgroud)

(您可以通过 验证是否一切都已关闭ps aux | grep 'tnsl\|ora'

请注意,命令的顺序很重要。这意味着在lsnrctl startsqlplus-startup 命令之后执行时,Pro*C/OCI 程序仍然会抱怨 TNS 侦听器不可用。

这正是问题中命令序列的问题 -emctl start只是解决了错误的顺序,因为它修复了 TNS 侦听器设置部分。

另请注意,执行 Pro*C/OCI 程序不需要 EMCTL 服务。