SQL*Plus是Oracle数据库提供的一个交互式命令行工具,用于访问Oracle数据库并执行SQL、PL/SQL命令和SQL*Plus特有的命令。

一、SQL*Plus基本概念

SQL*Plus是Oracle数据库的标准命令行接口,具有以下特点:

  • 轻量级客户端工具

  • 支持所有Oracle数据库版本

  • 可以执行SQL、PL/SQL和SQL*Plus特有命令

  • 支持脚本执行和批处理

  • 提供格式化查询结果的功能

如果要使用SQL*Plus与数据库服务器进行交互,首先要登录到数据库服务器上,这时在SQL*Plus进程和数据库服务器之间将建立一条连接,它们以客户/服务器模式工作。

二、启动SQL*Plus

1. 基本启动方式

sqlplus 用户名/密码@数据库服务名

2. 连接方式示例

连接类型

命令示例

说明

本地连接

sqlplus scott/tiger

使用默认数据库

网络连接

sqlplus scott/tiger@orcl

使用服务名orcl

SYSDBA

sqlplus / as sysdba

操作系统认证

无连接启动

sqlplus /nolog

先启动后连接

SQL*Plus无论采用哪种方式登录,登录成功后都将出现SQL*Plus的提示符。SQL*Plus是一个基于字符界面的使用工具,在界面框中所有的命令操作都要使用手工输入执行,如果执行的命令行过长,可以输入回车键,在换行后继续输入执行命令,这时候在每行之前都将自动出现当前的行号。命令的最后需要输入分号才可以回车,这条执行命令会提交给数据库服务器执行。需要注意分号并不是SQL命令里的一份子,只是一条SQL命令执行结束的标志符罢了。例子:

xsuy>select empno,comm
2 from anf
3 where empno='20';

需要退出SQL*Plus命令行模式时,需要在提示符之后输入命令quit或者exit。如果你需要在不退出SQL*Plus的情况之下断开与数据库服务器的连接模式,输入DISCONNECT命令执行。如果你需要重新连接或者在已连接的情况下以另外用户的身份连接数据库服务器,可以使用CONNECT 用户名/密码@服务名 - 连接到数据库。如果你使用的用户身份是sys用户,需要使用"as sysdba"或者"as sysoper"参数。如果使用的是远程登录数据库服务器,还需要在用户名和口令之后输入需要访问数据库服务器的网络服务器名。例子:

CONNECT用户名/口令as sysdba

如果你在操作SQL*Plus命令行模式时,可以使用help或者?命令来获取帮助信息,你可以先获得帮助索引,例子:

sql>help index

命令执行结果为:

@COPY PAUSE SHUTDOWN
@@DEFINE PRINT SPOOL
/DEL PROMPT SQLPLUS
ACCEPT DESCRIBE QUIT START
APPEND DISCONNECT RECOVER STARTUP
……

在上述命令中都属于SQL*Plus,这些命令也只能在SQL*Plus中里执行,学习Oracle数据库的过程中,需要搞清楚哪些是SQL*Plus命令,哪些是SQL命令。可以通过help命令进一步获得每条命令的详细帮助信息。例子:

sql>HELP CONNECT
CONNECT
-------
Connects a given username to Oracle.
CONN[ECT][{logon|/}[AS{SYSOPER|SYSDBA}]]
WHERE logon has the following syntax:username[/password][@CONNECT_identifier]
In iSQL*Plus you must always include your username and password.

3. 修改SQL*Plus的配置信息

在SQL*Plus中其实有两种相关的设置信息参数,一种是SQL*Plus本身自带的设置信息,这类信息主要控制SQL*Plus的输出格式;另一种是数据库服务器的设置信息,这类信息主要来自实例的参数文件。显示SQL*Plus设置信息命令show,例子:显示当前登录用户的命令为

sql>show user
USER为"SCOTT"

如果你需要显示SQL*Plus的所有设置信息,你需要执行"show all"命令,例子:

sql>show all
appinfo为OFF并且已设置为"SQL*Plus"
arraysize 15
autocommit OFF
autoprint OFF
autorecovery OFF

SQL*Plus有许多可以配置的参数信息,在SQL*Plus命令中可以分类为:

1. 环境设置命令

命令

功能

示例

SET AUTOTRACE

执行计划跟踪

SET AUTOTRACE ON EXPLAIN

SET COLSEP

列分隔符

SET COLSEP '|'

SET ECHO

脚本回显

SET ECHO ON

SET FEEDBACK

行计数反馈

SET FEEDBACK 10

SET HEADING

列标题显示

SET HEADING OFF

SET LINESIZE

行宽度

SET LINESIZE 200

SET PAGESIZE

每页行数

SET PAGESIZE 0

SET SERVEROUTPUT

PL/SQL输出

SET SERVEROUTPUT ON SIZE UNLIMITED

SET SQLPROMPT

提示符

SET SQLPROMPT '_USER@_CONNECT_IDENTIFIER> '

SET TIMING

执行时间

SET TIMING ON

SET TIME

显示时间

SET TIME ON

SET AUTOCOMMIT ON|OFF       -- 设置自动提交
SET ECHO ON|OFF             -- 控制脚本回显
SET FEEDBACK ON|OFF         -- 显示返回行数
SET HEADING ON|OFF          -- 显示列标题
SET LINESIZE n              -- 设置行宽(1-32767)
SET PAGESIZE n              -- 设置每页行数
SET SERVEROUTPUT ON|OFF [SIZE n] -- 控制PL/SQL输出
SET TIMING ON|OFF           -- 显示执行时间
SET TIME ON|OFF             -- 显示当前时间

2. 编辑命令

-- 缓冲区操作
LIST        -- 列出缓冲区内容
LIST 3      -- 列出第3行
LIST 3 5    -- 列出3-5行
DEL 3       -- 删除第3行
INPUT       -- 添加新行
APPEND text -- 当前行追加文本
CLEAR BUFFER -- 清空缓冲区

-- 文件操作
SAVE report.sql     -- 保存缓冲区
GET report.sql      -- 加载文件到缓冲区
START report.sql    -- 执行脚本
@report.sql         -- 同上(简写)
EDIT report.sql     -- 编辑文件
SPOOL output.txt    -- 开始输出捕获
SPOOL OFF           -- 停止捕获

3. 文件操作命令

SAVE filename[.ext] [REPLACE|APPEND] -- 保存缓冲区到文件
GET filename[.ext] [LIST|NOLIST]     -- 加载文件到缓冲区
START filename[.ext] [arg1 arg2 ...] -- 执行脚本文件
@filename[.ext] [arg1 arg2 ...]      -- 同上(简写)
EDIT [filename[.ext]]                -- 调用外部编辑器
SPOOL filename[.ext] [APPEND|OFF|OUT] -- 输出重定向

4. 格式化命令

-- 列格式化
COLUMN empno FORMAT 99999 HEADING 'ID'
COLUMN ename FORMAT A20 HEADING 'Employee|Name'
COLUMN sal FORMAT $99,999.99 HEADING 'Salary'

-- 分组设置
BREAK ON deptno SKIP 1 ON REPORT
COMPUTE SUM OF sal ON deptno
COMPUTE SUM OF sal ON REPORT

-- 标题设置
TTITLE CENTER '部门工资报表' SKIP 2
BTITLE CENTER '页: ' FORMAT 999 SQL.PNO

5.变量高级用法

替代变量

-- 临时变量
SELECT &column_name FROM &table_name WHERE &condition;

-- 永久变量
DEFINE dept_no = 20
SELECT * FROM emp WHERE deptno = &dept_no;

-- 参数化脚本
ACCEPT min_sal NUMBER PROMPT '输入最低工资: '
SELECT * FROM emp WHERE sal > &min_sal;

绑定变量

-- 定义绑定变量
VARIABLE g_dname VARCHAR2(20)

-- PL/SQL中使用绑定变量
BEGIN
  SELECT dname INTO :g_dname 
  FROM dept 
  WHERE deptno = 10;
END;
/

-- 打印绑定变量
PRINT g_dname

-- SQL中使用绑定变量
SELECT * FROM emp 
WHERE deptno = (SELECT deptno FROM dept WHERE dname = :g_dname);

4.实例的启动与关闭

Oracle数据库实例是Oracle数据库系统的核心运行环境,是用户与数据库交互的桥梁。下面我将从多个维度全面介绍Oracle数据库实例的概念、组成和管理。

1. 实例与数据库的区别

对比项

实例(Instance)

数据库(Database)

定义

内存结构和后台进程的集合

物理文件的集合

存在形式

运行时存在,关机后消失

持久存储在磁盘上

组成

SGA + 后台进程

数据文件+控制文件+重做日志

关系

一个实例同一时间只能挂载一个数据库

一个数据库可被多个实例挂载(RAC)

实例是一组内存结构和后台进程的集合,内存结构(SGA)

内存结构.png

关键组件说明:

  • 共享池:存储SQL解析树和执行计划

  • 缓冲区缓存:缓存数据块,减少物理I/O

  • 重做日志缓冲区:临时存储重做记录

  • 大池:为RMAN、共享服务器等提供内存

  • Java池:支持Java程序运行

  • 流池:支持Oracle Streams功能

后台进程:

进程名

功能描述

重要性

PMON

进程监视器,清理失败进程

★★★★★

SMON

系统监视器,执行实例恢复

★★★★★

DBWn

数据库写入进程,写脏缓冲区

★★★★★

LGWR

日志写入进程,写重做日志

★★★★★

CKPT

检查点进程,更新控制文件

★★★★

ARCn

归档进程,归档重做日志

★★★★(归档模式)

MMON

管理监视进程,AWR相关

★★★★

MMAN

内存管理进程,自动内存管理

★★★

实例生命周期管理:

启动阶段Oracle服务器的命令为startup,这条命令只有SYS用户才可以执行。执行startup命令时,显示的信息为:

sql>startup
ORACLE例程已经启动。
Total System Global Area 409194496 bytes
Fixed Size 2176248 bytes
Variable Size 301992712 bytes
Database Buffers 96468992 bytes
Redo Buffers 8556544 bytes
数据库装载完毕。
数据库已经打开。
-- 分阶段启动实例
STARTUP NOMOUNT;      -- 启动实例(不挂载数据库)
ALTER DATABASE MOUNT; -- 挂载数据库
ALTER DATABASE OPEN;  -- 打开数据库

-- 常用启动选项
STARTUP FORCE;        -- 强制启动(异常关闭后)
STARTUP RESTRICT;     -- 受限模式启动
STARTUP PFILE='/path/init.ora'; -- 指定参数文件

关闭选项

SHUTDOWN NORMAL;    -- 等待所有会话断开(优雅关闭)
SHUTDOWN IMMEDIATE; -- 中断当前事务(推荐方式)
SHUTDOWN TRANSACTIONAL; -- 等待事务完成
SHUTDOWN ABORT;     -- 立即终止(类似kill -9)

状态转换

状态转换.png

Oracle实例的高效管理是数据库稳定运行的基础,理解实例的组成和工作原理对于解决数据库性能问题至关重要。