Oracle简介
Oracle数据库是甲骨文公司的一款关系数据库管理系统,广泛应用于金融、保险、银行等行业。
其特点包括高可用性、强大的性能、广泛的兼容性和安全性。
Oracle通过数据守护、实时应用集群和闪回技术等手段确保数据库系统在出现故障时仍能持续运行。
其查询优化器能根据查询条件和数据分布情况自动选择最优执行计划,提高查询性能。
Oracle 公司历史
- 创立初期(1977 - 1989):
- 1977 年,拉里・埃里森(Larry Ellison)、鲍勃・迈纳(Bob Miner)和埃德・奥茨(Ed Oates)共同创立了软件开发实验室(Software Development Laboratories,SDL)。
- 1979 年,SDL 发布了第一款商用关系型数据库管理系统(RDBMS)——Oracle V2。
- 1983 年,公司更名为 Oracle 公司,并发布了 Oracle V3,该版本引入了事务处理能力。
- 1986 年,Oracle 公司在纳斯达克上市,股票代码为 ORCL。同年发布了 Oracle V6,该版本在性能和可靠性方面有了显著提升。
- 成长与扩张期(1990 - 2004):
- 1992 年,Oracle 发布了 Oracle7,这是一个具有里程碑意义的版本,引入了许多新特性,如分布式数据库支持、存储过程、触发器等,使 Oracle 成为一个功能强大的企业级数据库管理系统。
- 1997 年,Oracle 发布了 Oracle8,该版本引入了对象关系特性,如对象类型、嵌套表、大对象(LOB)等,使 Oracle 能够更好地处理复杂的数据类型和应用场景。
- 2001 年,Oracle 发布了 Oracle9i,其中 “i” 代表 Internet,该版本针对互联网应用进行了优化,引入了许多新特性,如真正应用集群(RAC)、自动存储管理(ASM)、闪回技术等,提高了 Oracle 在高可用性、可扩展性和数据恢复方面的能力。
- 持续创新与多元化发展期(2005 年至今):
- 2005 年,Oracle 发布了 Oracle Database 10g,进一步增强了其在网格计算、自动化管理和安全性方面的能力。
- 2009 年,Oracle 以 74 亿美元收购了 Sun Microsystems,从而获得了 MySQL 数据库、Java 编程语言和 Solaris 操作系统等重要资产,进一步扩大了其在数据库和软件领域的影响力。
- 2013 年,Oracle 发布了 Oracle Database 12c,其中 “c” 代表云(Cloud),该版本引入了多租户架构(Multitenant Architecture),使企业能够在单个数据库实例中创建多个可插拔数据库(Pluggable Databases),从而实现资源共享和隔离,降低运营成本,提高云环境下的数据库管理效率。
- 此后,Oracle 持续发布数据库新版本,如 Oracle Database 18c、19c 等,不断引入新特性和功能,以满足企业日益增长的数据管理和业务需求。
Oracle 版本历史
- 功能特性差异:
- 早期版本如 Oracle V2 - V3 主要奠定了关系型数据库的基础功能,而从 Oracle7 开始引入了存储过程、触发器等高级数据库对象,极大地增强了数据库的编程能力。
- Oracle8 引入对象关系特性,与之前版本在数据类型和处理复杂数据结构的能力上有显著差异。
- 性能与可扩展性差异:
- Oracle9i 引入的真正应用集群(RAC)技术,使得数据库在多服务器环境下能够实现负载均衡和高可用性,这与之前版本在单服务器性能优化上有了质的飞跃,可扩展性大大增强。自动存储管理(ASM)技术也在存储管理方面提高了性能和可管理性。
- 管理与维护差异:
- Oracle Database 12c 的多租户架构,改变了传统的数据库管理模式。在多租户环境下,多个可插拔数据库共享一个数据库实例的资源,这不仅降低了硬件成本和管理复杂度,还在数据库的备份、恢复、升级等维护操作方面提供了更高的效率和灵活性,与之前版本每个数据库独立占用资源和进行管理维护的方式有很大不同。
- 强大的事务处理能力:
- Oracle 数据库支持完整的 ACID(原子性、一致性、隔离性、持久性)属性,能够确保在复杂的业务场景下,数据的完整性和一致性得到有效保障。
- 例如,在银行转账业务中,无论是从一个账户扣除金额,还是向另一个账户添加金额,这两个操作要么全部成功,要么全部失败,不会出现部分成功的情况,从而保证了资金的准确流转和账户余额的一致性。
- 高度可扩展性:
- 通过真正应用集群(RAC)技术,Oracle 数据库可以在多个服务器节点上运行,实现负载均衡和故障切换。这使得数据库能够轻松应对不断增长的业务需求和用户访问量。
- 例如,大型电商平台在促销活动期间,会面临海量的用户访问和交易请求。通过部署 Oracle RAC 集群,可以将这些请求均匀分配到各个服务器节点上进行处理,从而提高系统的整体性能和响应速度,确保用户能够顺利完成购物流程。同时,如果某个服务器节点出现故障,RAC 集群能够自动将其负载转移到其他正常节点上,保证数据库的持续可用性,不会因单点故障而导致业务中断。
oracle体系结构
一、oracle体系结构概述
oracle是一个广泛使用的关系型数据库管理系统(RDBMS)。
oracle数据库严格意义上来讲由两大部分组成:实例和数据库。
实例用于管理和控制数据库,而数据库为实例提供数据。
Oracle体系结构主要用来分析数据库的组成,工作过程与原理,以及数据在数据库中的组织与管理机制。
以下是Oracle数据库的逻辑架构图:
接下来就对oracle相关概念进行展开讲解。
二、实例(instance)
实例是oracle数据库的运行环境,由在服务器中分配的共享内存区域和一系列后台进程组成。实例负责管理数据库的内存和进程,以及处理用户的请求,每个oracle都有一个实例与之对应。启动Oracle数据库服务器实际上是在服务器的内存中创建一个Oracle实例,然后用这个实例来访问和控制磁盘中的数据文件。实例是暂时的,它会随着数据库的关闭而消失。
1、程序全局区PGA
当连接到数据库实例的用户进程请求数据库时,由Oracle服务器进程负责解析并执行。在启动服务器进程时,oracle会给这个进程分配一个内存区域,即程序全局区PGA(Program Global Area)。PGA存放服务器进程的数据和控制信息,是每个用户进程的私有内存区域,不能被其他进程共享。PGA主要有以下几个部分组成:
(1)会话区(Session Area):用于保存用户会话所具有的权限、角色、性能统计信息。
(2)排序区(Sort Area) :主要用于存放排序操作所产生的临时数据。
(3)游标区(Cursor Area):用于存放执行游标操作时所产生的数据。
(4)堆栈区(Stack Area):用于保存会话过程中的绑定变量、会话变量等信息。
2、系统全局区SGA
当启动一个实例时,Oracle会分配内存区域给这个实例,即系统全局区(System Global System)。SGA存放数据和数据库实例的控制信息,是一组共享的内存结构,多个用户可以同时连接到同一个实例,共享SGA的数据。SGA主要由以下几部分组成:
(1)数据库缓存区缓存(Database Buffer Cache)
数据库缓存区用于缓存用户当前或最近使用的数据,减少磁盘I/O操作,提高数据的访问速度。数据库缓存区是Oracle用来执行sql 的工作区域,在更新数据时,用户会话不会直接去更新磁盘上的数据。当用户向数据库发出请求时(如检索某一条数据),如果在高速数据缓冲区中存在请求的数据,则Oracle系统会直接从高速数据缓冲区中读取数据并返回给用户;否则,Oracle系统会打开数据文件读取请求的数据。当高速数据缓冲区被填满时,会自动挤掉一些不常被访问的数据块。
(2)重做日志缓存区(Redo Log Buffer)
日志缓存区用于存储事务的重做日志,以实现数据的恢复和保护。重做日志缓冲区用于存储对数据库进行修改操作时所产生的日志信息,这些日志信息在写入重做日志文件中之前,首先存储到重做日志缓冲区中,然后当检查点发生或重做日志缓冲区中的信息量到达一定峰值时,由日志写入(LGWR)进程将此缓冲区的内容写入重做日志文件中。
(3)共享池(shared pool)
共享池主要用于存储解析并执行过的 SQL语句和PL/SQL 代码、频繁访问的数据字典信息和系统参数等。主要包括几个共享池组件:
1)库高速缓存区:library cache,缓存用户最近执行的SQL的执行计划和分析代码
2)数据字典缓存:dictionary cache,缓存用户最近访问的数据库对象的结构信息
3)PL/SQL区:缓存存储过程、函数、触发器等数据库对象
注意:Oracle共享池的空间并非越大越好,因为系统的内存资源是有限的,而且操作系统本身也要消耗一定的内存空间。
(4)JAVA池
JAVA池主要用于支持在数据库中运行JAVA代码。
(5)大池(Large Pool)
大池是Oracle可选的内存结构,可以分担共享池的压力,在使用RMAN备份和并行查询时会用到大池。不是必须的内存结构。
(6)流池(Stream Pool)
Oracle流池用于在数据库与数据库之间进行信息共享。如果没有用到Oracle流,就不需要设置该池。
3、后台进程
后台进程是实例启动时自动创建的一系列进程,他们负责执行各种后台任务。
(1)进程监视器PMON(Process Monitor)
监视用户进程和后台进程,重启失败的进程;当有进程启动失败时,PMON会清除失败的用户进程,释放用户进程所用的资源。
(2)系统监视器SMON(System Monitor)
系统监控(SMON)进程是在数据库系统启动时执行回复工作的强制性进程。负责数据库的恢复和一致性检查,以及清理未完成的事务。
(3)数据库恢复进程RECO(recovery Monitor)
恢复(RECO)进程是在分布式数据库模式下使用的一个可选进程,用于数据不一致时的恢复工作。
(4)检查点进程CKPT(Checkpoint Process)
负责在数据库中创建检查点,当检查点事件发生时,CKPT会要求DBWR将某些“脏”数据块回写到数据文件中。当用户进程发出数据请求时,Oracle系统从数据文件中读取需要的数据并存储到高速数据缓冲区中,用户对数据的操作是在缓冲区中进行的。
(5)数据写入器DBWR(Database Writer)
数据写入(DBWR)进程的主要任务是将数据缓存区中的“脏”数据块回写到数据文件中。所谓的“脏”数据块是指高速数据缓冲区中被修改过的数据块,这些数据块的内容与数据文件的数据块内容不一致。中被写满后接着写入另外一组中。当LGWR进程将所有的
(6)日志写入器LGWR(Log Writer)
负责将日志缓存区中的数据写到磁盘。Oracle系统首先将用户所做的修改日志信息写入日志文件中,然后再将修改结果写入数据文件中。当LGWR进程写满一个日志文件组而转向写另外一组时,称之为日志切换。
(7)归档日志 ARCH(Archiver Process)
当各个日志文件组都被写满,在即将被覆盖之前,先由ARCH把即将被覆盖的日志文件中的日志信息读出,然后再把这些“读出的日志信息”写入归档日志文件中,以便进行数据库的备份和恢复。只有当Oracle数据库处于归档模式时,该进程才可能起到作用。
三、数据库
数据库是由基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等组成的物理文件集合。Oracle数据库存储结构可分为物理存储结构和逻辑存储结构。
物理存储结构
Oracle的物理结构其实就是我们在系统上看到的各种文件,最终目的就是存储和获取相关数据。这些存在硬盘上的文件组成了oracle数据库的物理结构,以下是组成物理结构的各种文件:
(1)参数文件(Parameter File)
参数文件包含了Oracle数据库的配置参数,如内存分配、并发连接数、日志文件大小等。它在数据库启动时被读取,用于初始化实例的各种参数。
(2)控制文件(Control File)
控制文件是数据库的元数据文件,它记录了数据库的结构信息、数据文件和日志文件的位置、数据库的日志序列号等。控制文件在数据库启动时被读取,用于恢复数据库的一致性。控制文件一旦受损,那实例会立马终止。控制文件所存储的路径由服务器参数文件SPFILEORCL.ORA的CONTROL_ FILES参数值来指定。每个数据库至少拥有一个控制文件,一个数据库可以同时拥有多个控制文件
(3)数据文件(Data File)
数据文件是用于保存用户应用程序数据和Oracle系统内部数据的文件,它们在操作系统中就是普通的文件,Oracle在创建表空间的同时会创建数据文件。它包含了表、索引和其他数据库对象的数据。数据文件在数据库创建时被分配,并在磁盘上存储数据块。
在读取数据时,Oracle系统首先从数据文件中读取数据,并将数据存储在内存的高速数据缓冲区中。如果用户要读取数据库中的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则需要从相应的数据文件中读取数据并存储在缓冲区中。
(4)重做日志文件(Redo Log File)
重做日志文件用于记录数据库中的所有修改操作,包括数据的插入、更新和删除。在数据库恢复时,可以从该日志文件中读取原始记录。对表或者整个表空间设定NOLOGGING属性,可使基于表或表空间中的DML操作(如创建表、删除视图、修改索引等)不生成日志信息,从而减少日志信息。
(5)归档日志文件(Archived Redo Log File)
归档日志文件是已经被归档的重做日志文件,在各个日志文件都被写满而即将被覆盖之前,先由归档(ARCH)进程将即将被覆盖的日志文件中的日志信息读出,然后将其写入归档日志文件中。它们用于数据库的备份和恢复。归档日志文件可以被保存在磁盘上,以提供长期的数据保护。所以在默认情况下,Oracle系统不采用归档模式运行。
(6)密码文件
一般的用户名和口令是存放在数据字典中,不会存放在这个文件中。在一些特殊场景下,比如实例还未启动,这时,我可能需要以管理员的身份登入系统去执行一些恢复或者启动操作,然而此时,数据字典由于实例还没启动是不存在的,这时就需要外部口令文件进行用户身份的验证。
逻辑存储结构
Oracle将其物理结构从逻辑存储结构中抽象出来,物理机构是系统管理员能看到的,逻辑结构则是用户所能感知到的。
Oracle的逻辑结构由表空间(tablespace)、段(segment)、区(extent)、块(block)组成。一个数据库在逻辑上被划分为若干个表空间,表空间由一个或多个段组成,一个段由若干个区组成,一个数据区由一个或多个块组成
每个表空间由同一磁盘上的一个或多个文件组成,一个数据文件只能属于一个表空间。
(1)表空间(tablespace)
Oracle使用表空间(tablespace)将相关的逻辑结构(如段、数据区等)组合在一起,表空间是数据库的最大逻辑划分区域,通常用来存放数据表、索引、回滚段(即segment)等数据对象,任何数据对象在创建时都必须被指定存储在某个表空间中。
(2)段(segment)
段(segment)是由一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象,Oracle也把这种占用空间的数据对象统一称为段。段有四种类型:数据段,索引段,回滚段,临时段。
(3)数据区(extent)
由一个或多个数据块组成,当一个段中的所有空间被使用完后,Oracle系统将自动为该段分配一个新的数据区,数据区是Oracle存储分配的最小单位。设置一张表或索引的存储参数包含设置它的数据区大小。
(4)数据块(block)
oracle数据库中最小的存储单位。Oracle数据存放在Oracle数据块中,而不是操作系统块中。Oracle的数据块一般为8K。数据块由块头、表目录、行目录、空余空间和行数据这5部分组成,数据块中可以存放表数据、索引数据和簇数据等。
Oracle 与 MySQL 的区别
1. 核心概念对比
概念 | MySQL | Oracle 19c |
---|---|---|
数据库实例 | 单实例,一个服务对应一个数据库 | 一个实例可管理多个数据库(多租户架构) |
用户与模式 | 用户与数据库分离 | 用户=模式(Schema),用户直接管理对象 |
权限管理 | 用户权限基于数据库/表 | 细粒度权限(系统权限、对象权限、角色) |
存储引擎 | InnoDB、MyISAM 等 | 单一存储架构(Oracle Storage) |
自增字段 | AUTO_INCREMENT |
使用序列(Sequence)+ 触发器实现 |
事务提交 | 默认自动提交 | 默认手动提交(需显式 COMMIT ) |
2. 快速上手步骤
2.1 安装与连接
-
安装工具:
- Oracle 19c 数据库软件(需官网下载,注意企业版与 Express 版的区别)。
- 客户端工具:SQL*Plus、SQL Developer(类似 MySQL Workbench)。
-
连接字符串:
-- MySQL
mysql -u root -p
-- Oracle
sqlplus username/password@hostname:port/service_name
2.2 MySQL的database
对应Oracle 19c的schema
- MySQL的
database
用于逻辑组织表、视图、存储过程等对象。用户通过权限控制访问不同数据库,例如:
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE my_table (...);
- Oracle的
schema
与用户(User)紧密关联,每个用户默认拥有一个同名模式(Schema)。用户创建的对象自动归属其模式,例如用户mydb_user
的模式为mydb_user
:
CREATE USER mydb_user IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO mydb_user;
-- 切换用户后创建表
CREATE TABLE my_table (...);
其他用户需通过模式名前缀访问:
SELECT * FROM mydb_user.my_table;
关键区别与映射方式
-
用户与模式的绑定
-
Oracle中用户与模式一一对应,而MySQL的用户独立于数据库,可跨库授权。
-
迁移时:每个MySQL的
database
需在Oracle中创建对应用户(及模式),例如将MySQL的mydb
映射为Oracle用户mydb_schema
。 -
权限管理
-
MySQL直接授权用户访问数据库:
GRANT ALL ON mydb.* TO 'user'@'host';
- Oracle需授权用户访问其他模式的对象:
GRANT SELECT ON mydb_schema.my_table TO another_user;
或使用同义词简化访问:
CREATE PUBLIC SYNONYM my_table FOR mydb_schema.my_table;
- 物理存储(表空间) Oracle通过表空间(Tablespace)管理物理存储,而MySQL的数据库不直接对应表空间。若需隔离存储,可为每个Oracle模式分配独立表空间:
CREATE USER mydb_user IDENTIFIED BY password DEFAULT TABLESPACE mydb_tablespace;
总结
-
MySQL的
database
→ Oracle的schema
(通过用户实现) -
操作示例
-- Oracle中创建对应MySQL database的schema
CREATE USER mydb_schema IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO mydb_schema;
ALTER USER mydb_schema QUOTA UNLIMITED ON users;
-- 后续操作在mydb_schema下创建表、视图等
通过这种映射,MySQL的多数据库架构可转换为Oracle的多用户/模式结构,同时保持逻辑隔离和权限控制。
2.3 基本 SQL 差异
- 数据类型:
MySQL | Oracle 19c |
---|---|
INT |
NUMBER(10) |
VARCHAR(255) |
VARCHAR2(255) |
DATETIME |
DATE 或 TIMESTAMP |
TEXT |
CLOB |
- 分页查询:
-- MySQL
SELECT * FROM table LIMIT 10 OFFSET 20;
-- Oracle
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM (
SELECT * FROM table ORDER BY id
) t WHERE ROWNUM <= 30
) WHERE rn > 20;
-- 或 Oracle 12c+ 的简化写法:
SELECT * FROM table OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
- 日期处理:
-- MySQL
SELECT NOW();
-- Oracle
SELECT SYSDATE FROM DUAL;
2.4 用户与权限管理
- 创建用户:
-- MySQL
CREATE USER 'user'@'host' IDENTIFIED BY 'password';
-- Oracle
CREATE USER oracle_user IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO oracle_user; -- 分配基础角色
- 授权表权限:
-- MySQL
GRANT SELECT ON db.table TO 'user'@'host';
-- Oracle
GRANT SELECT ON schema.table TO oracle_user;
3. Oracle 特有功能
3.1 序列(Sequence)
替代 MySQL 的 AUTO_INCREMENT
:
CREATE SEQUENCE seq_table_id
START WITH 1
INCREMENT BY 1
NOCACHE;
-- 插入数据时使用序列
INSERT INTO table (id, name) VALUES (seq_table_id.NEXTVAL, 'Alice');
3.2 PL/SQL 编程
Oracle 的存储过程语言(类似 MySQL 的存储过程,但更强大):
CREATE OR REPLACE PROCEDURE get_employee (p_id IN NUMBER, p_name OUT VARCHAR2) AS
BEGIN
SELECT name INTO p_name FROM employees WHERE id = p_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_name := 'Not Found';
END;
/
3.3 表空间管理
Oracle 使用表空间管理存储(类似 MySQL 的数据库目录):
-- 创建表空间
CREATE TABLESPACE my_tbs DATAFILE '/path/to/datafile.dbf' SIZE 100M;
-- 创建表时指定表空间
CREATE TABLE my_table (id NUMBER) TABLESPACE my_tbs;
4. 备份与恢复
- 逻辑备份:
# MySQL
mysqldump -u root -p dbname > backup.sql
# Oracle
expdp username/password DIRECTORY=DATA_PUMP_DIR DUMPFILE=backup.dmp
- 物理备份: Oracle 使用 RMAN(Recovery Manager)进行全量备份,类似 MySQL 的物理备份工具。
5. 常见问题
-
Oracle 区分大小写吗?
- 默认对象名(表、列)不区分,但字符串值区分。
- 使用双引号强制区分大小写:
SELECT * FROM "MyTable";
-
如何查看执行计划?
EXPLAIN PLAN FOR SELECT * FROM table;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
- 事务提交方式:
-- 手动提交
COMMIT;
-- 设置自动提交(类似 MySQL)
SET AUTOCOMMIT ON;
6. 学习资源推荐
- 官方文档:Oracle 19c Documentation
- 免费课程:Oracle Learning Library (OLL)
- 社区支持:Oracle Community、Stack Overflow