Oracle 数据库实例教程
第一部分:基础概念 - 理解 Oracle 的核心
在开始任何操作之前,必须理解几个核心概念,这会让你事半功倍。

数据库 vs. 实例
这是最常见也最重要的一个概念,很多人会混淆它们。
- 数据库: 指的是存储在磁盘上的物理文件集合,这些文件包含了你的所有数据、索引、日志等,你可以把它想象成一个“数据仓库”或“图书馆”,里面存放着所有的书(数据)。
- 实例: 指的是 Oracle 数据库在内存中的一组后台进程和内存结构(SGA),它是用来管理数据库文件的“大脑”和“管家”,一个实例只能关联一个数据库,但一个数据库(通过 RAC 技术)可以被多个实例同时访问。
简单比喻:
- 数据库 = 一栋大楼(物理存在)
- 实例 = 大楼的物业管理公司(在运行,管理着大楼)
没有物业管理公司(实例)在运行,大楼(数据库)就是死的,你无法进去或使用,有了物业管理公司,你才能通过它来访问大楼里的资源。

关键组件
- SGA (System Global Area): 系统全局区,是实例共享的内存区域,它缓存了数据块、执行计划等信息,以提高性能,主要包括:
- Buffer Cache: 数据缓冲区,缓存从磁盘读取的数据块。
- Shared Pool: 共享池,缓存 SQL 语句的解析结果(执行计划)和字典信息。
- Redo Log Buffer: 重做日志缓冲区,记录所有对数据库的更改操作。
- PGA (Program Global Area): 程序全局区,是单个服务器进程专有的内存区域,用于存储会话信息、排序区等。
- 后台进程: Oracle 实例由多个后台进程组成,它们负责不同的任务,如:
- PMON (Process Monitor): 进程监控进程,负责清理失败的进程。
- SMON (System Monitor): 系统监控进程,负责实例恢复、清理临时段等。
- DBWn (Database Writer): 数据库写入进程,将缓冲区的脏数据写回磁盘。
- LGWR (Log Writer): 日志写入进程,将重做日志缓冲区的内容写入重做日志文件。
第二部分:安装与配置 - 搭建你的第一个 Oracle 环境
下载 Oracle Database
访问 Oracle 官网下载中心,选择适合你操作系统的版本,对于初学者,推荐使用 Oracle Database 19c XE (Express Edition),它是免费的,对硬件要求较低。
- 下载地址: Oracle Database 19c XE
安装步骤

以 Windows 为例(Linux/Unix 过程类似):
- 运行下载的安装包
setup.exe。 - 按照安装向导的提示进行操作,通常只需要选择安装路径和设置密码。
- 重要: 记住你设置的
SYS,SYSTEM,PDBADMIN等用户的密码。 - 安装完成后,会自动创建一个名为
XE的服务,并监听默认端口1521。
验证安装
- 服务检查: 打开 Windows 的“服务”,找到名为
OracleServiceXE的服务,确保其状态为“正在运行”。 - 监听器检查: 打开命令行,执行
lsnrctl status,应该能看到监听器正在监听端口 1521。 - 连接测试: 使用 SQL*Plus 或其他客户端工具(如 SQL Developer)尝试连接。
*第三部分:核心操作 - 使用 SQLPlus**
SQL*Plus 是 Oracle 自带的命令行工具,是学习和管理数据库最直接的方式。
连接到数据库
打开命令行(CMD),输入以下命令:
# 方式一:以普通用户连接(默认会连接到 CDB$ROOT 的 PDB) sqlplus / as sysdba # 方式二:以特定用户和密码连接(需要 @主机名:端口/服务名) sqlplus username/password@localhost:1521/XE
sysdba: 是一个特殊的权限,用于管理员登录。localhost:1521/XE:localhost是主机名,1521是端口,XE是 Oracle XE 的服务名。
基本 SQL 语句
a. DDL (数据定义语言) - 定义结构
-- 1. 创建表
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
hire_date DATE,
salary NUMBER(8, 2)
);
-- 2. 修改表 (增加一列)
ALTER TABLE employees ADD (
department_id NUMBER(4)
);
-- 3. 删除表
DROP TABLE employees;
b. DML (数据操作语言) - 操作数据
-- 1. 插入数据
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, salary)
VALUES (101, 'John', 'Doe', 'john.doe@example.com', TO_DATE('2025-01-15', 'YYYY-MM-DD'), 5000.00);
-- 插入多行
INSERT INTO employees VALUES (102, 'Jane', 'Smith', 'jane.smith@example.com', TO_DATE('2025-02-20', 'YYYY-MM-DD'), 6000.00, 10);
-- 2. 查询数据
SELECT * FROM employees;
-- 查询特定列
SELECT first_name, last_name, salary FROM employees WHERE salary > 5500;
-- 3. 更新数据
UPDATE employees SET salary = 5500.00 WHERE employee_id = 101;
-- 4. 删除数据
DELETE FROM employees WHERE employee_id = 101;
c. 事务控制
-- 提交事务,使更改永久生效 COMMIT; -- 回滚事务,撤销未提交的更改 ROLLBACK;
d. DCL (数据控制语言) - 控制权限
-- 授予权限 GRANT SELECT, INSERT ON employees TO scott; -- 撤销权限 REVOKE INSERT ON employees FROM scott;
第四部分:数据库对象 - 更强大的数据组织方式
除了表,Oracle 还有许多重要的数据库对象。
索引
索引就像一本书的目录,可以极大提高查询速度。
-- 在 last_name 列上创建索引 CREATE INDEX idx_employees_lastname ON employees(last_name);
视图
视图是一个虚拟表,其内容由查询定义,它简化了复杂查询,并可以隐藏数据细节。
-- 创建一个只显示员工姓名和邮箱的视图 CREATE VIEW v_employee_names AS SELECT first_name, last_name, email FROM employees; -- 使用视图 SELECT * FROM v_employee_names;
序列
序列用于生成唯一的数字,通常用作主键。
-- 创建一个序列 CREATE SEQUENCE seq_employee_id START WITH 1 INCREMENT BY 1 NOCACHE; -- 使用序列插入数据 INSERT INTO employees (employee_id, first_name, last_name) VALUES (seq_employee_id.NEXTVAL, 'Peter', 'Jones');
同义词
同义词是数据库对象的一个别名,可以简化访问。
-- 为 employees 表创建一个同义词 CREATE SYNONYM emp FOR employees; -- 使用同义词 SELECT * FROM emp;
第五部分:PL/SQL 编程 - Oracle 的过程化语言
PL/SQL 是 Oracle 对 SQL 的扩展,它增加了编程语言的结构(如变量、循环、条件判断)。
"Hello, World!" PL/SQL 程序
DECLARE -- 声明变量 v_message VARCHAR2(50) := 'Hello, World!'; BEGIN -- 执行部分 DBMS_OUTPUT.PUT_LINE(v_message); END; /
DECLARE: 声明变量(可选)。BEGIN: 开始执行代码。DBMS_OUTPUT.PUT_LINE: 输出信息到控制台。END;: 结束代码块。- 在 SQL*Plus 中,用 来执行 PL/SQL 块。
使用游标处理多行数据
游标用于遍历查询结果集。
DECLARE
v_emp_name employees.last_name%TYPE;
CURSOR c_employees IS
SELECT last_name FROM employees WHERE department_id = 10;
BEGIN
OPEN c_employees; -- 打开游标
LOOP
FETCH c_employees INTO v_emp_name; -- 从游标中获取一行数据
EXIT WHEN c_employees%NOTFOUND; -- 当没有更多数据时退出循环
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name);
END LOOP;
CLOSE c_employees; -- 关闭游标
END;
/
存储过程
存储过程是一组预编译的 SQL 和 PL/SQL 语句,存储在数据库中,可以被反复调用。
CREATE OR REPLACE PROCEDURE add_employee (
p_id IN NUMBER,
p_fname IN VARCHAR2,
p_lname IN VARCHAR2,
p_sal IN NUMBER
)
IS
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES (p_id, p_fname, p_lname, p_sal);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Employee ' || p_fname || ' added successfully.');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END add_employee;
/
调用存储过程:
EXEC add_employee(103, 'Mary', 'Williams', 6500);
第六部分:管理与维护
用户管理
-- 创建用户 CREATE USER myuser IDENTIFIED BY mypassword DEFAULT TABLESPACE USERS; -- 授予权限 GRANT CONNECT, RESOURCE TO myuser; -- 删除用户 DROP USER myuser CASCADE; -- CASCADE 会删除用户的所有对象
数据泵 导入/导出
expdp 和 impdp 是用于逻辑备份和恢复的强大工具。
- *导出 (在命令行执行,不是 SQLPlus 内)**
expdp system/password@XE DIRECTORY=dpump_dir DUMPFILE=exp.dmp SCHEMAS=myuser
- 导入 (在命令行执行)
impdp system/password@XE DIRECTORY=dpump_dir DUMPFILE=exp.dmp SCHEMAS=myuser
监控与性能
-
查看当前会话:
SELECT sid, serial#, username, status FROM v$session WHERE username IS NOT NULL;
-
查看 SQL 执行计划:
EXPLAIN PLAN FOR SELECT * FROM employees WHERE last_name = 'Smith'; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
第七部分:进阶与资源
- Oracle Multitenant (CDB/PDB): 从 Oracle 12c 开始,引入了可插拔数据库的概念,一个容器数据库 可以包含多个可插拔数据库,这是现代 Oracle 的标准架构,你需要理解
CDB$ROOT,PDB$SEED和用户创建的 PDB 之间的区别。 - SQL Developer: Oracle 提供的免费图形化工具,比 SQL*Plus 更易用,适合日常开发和管理工作。
- 官方文档: Oracle 的官方文档是最好的学习资源,内容权威且全面。
- Oracle Database Online Documentation: https://docs.oracle.com/en/database/oracle/oracle-database/
- 学习社区:
- Oracle Community: https://community.oracle.com/tech/database
- Stack Overflow: 搜索
oracle标签,可以找到大量实际问题的解决方案。
这份教程为你提供了一个从零开始学习 Oracle 数据库的路线图,学习数据库是一个循序渐进的过程:
- 打好基础: 深刻理解实例、数据库、SGA 等核心概念。
- 勤于动手: 多用 SQL*Plus 练习 SQL 和 PL/SQL,亲手创建和管理对象。
- 由简入繁: 从单表操作开始,逐步学习多表连接、子查询、复杂 PL/SQL 程序。
- 关注管理: 了解用户、权限、备份恢复等 DBA 日常工作。
- 善用资源: 官方文档和社区是你最宝贵的财富。
祝你学习顺利!
