文章目录
正文
1. Oracle架构概述
Oracle数据库是全球最流行的企业级关系型数据库管理系统之一,其强大的功能和高度可扩展的架构使其成为众多大型企业的首选。让我们深入了解Oracle的系统架构!
1.1 Oracle的核心理念
- 高可用性和可靠性
- 可扩展性和性能优化
- 数据安全和完整性
- 企业级功能支持
- 跨平台兼容性
1.2 Oracle架构的演进
timeline
title Oracle版本演进
section 早期版本
1979 : Oracle V2 : 首个商业RDBMS
1983 : Oracle V3 : 支持事务处理
1984 : Oracle V4 : 读一致性
section 现代基础
1992 : Oracle7 : PL/SQL存储过程
1997 : Oracle8 : 对象关系特性
1999 : Oracle8i : 互联网计算
section 企业版本
2001 : Oracle9i : Real Application Clusters
2003 : Oracle10g : 网格计算
2007 : Oracle11g : 自动存储管理
section 云时代
2013 : Oracle12c : 多租户架构
2018 : Oracle18c : 自治数据库
2019 : Oracle19c : 长期支持版本
2021 : Oracle21c : 创新特性
1.3 Oracle架构的主要组件
Oracle数据库系统由两个主要部分组成:
2. Oracle实例(Instance)详解
2.1 什么是Oracle实例?
Oracle实例是运行Oracle数据库的内存结构和进程的集合。当我们启动Oracle数据库时,实际上是启动了一个Oracle实例,它会打开并访问数据库文件。
-- 查看当前实例信息
SELECT instance_name, status, database_status
FROM v$instance;
-- 查看实例启动时间
SELECT instance_name, startup_time
FROM v$instance;
2.2 系统全局区(SGA)
SGA是Oracle实例中最重要的内存结构,它是所有会话共享的内存区域。
2.2.1 SGA的主要组件
2.2.2 查看和配置SGA
-- 查看SGA组件大小
SELECT component, current_size/1024/1024 as "Size (MB)"
FROM v$sga_dynamic_components;
-- 查看SGA总大小
SELECT sum(value)/1024/1024 as "Total SGA (MB)"
FROM v$sga;
-- 动态调整SGA组件大小
ALTER SYSTEM SET sga_target = 2G SCOPE=BOTH;
ALTER SYSTEM SET db_cache_size = 500M SCOPE=BOTH;
2.3 程序全局区(PGA)
PGA是为每个服务器进程分配的私有内存区域,不同会话之间不共享。
2.3.1 PGA的主要组件
- 会话内存:存储会话变量和其他会话信息
- 私有SQL区:存储绑定变量信息和运行时缓冲区
- 排序区:用于ORDER BY和GROUP BY等操作
- 哈希连接区:用于哈希连接操作
- 位图合并区:用于位图索引操作
-- 查看PGA使用情况
SELECT name, value/1024/1024 as "Value (MB)"
FROM v$pgastat
WHERE name IN ('total PGA allocated', 'total PGA inuse', 'maximum PGA allocated');
-- 设置PGA大小
ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=BOTH;
2.4 后台进程
Oracle使用多种后台进程来维护和管理数据库实例。这些进程在后台静默运行,执行各种关键任务。
2.4.1 主要后台进程
2.4.2 查看后台进程
-- 查看当前运行的后台进程
SELECT pname, description
FROM v$bgprocess
WHERE paddr != hextoraw('00')
ORDER BY pname;
-- 查看后台进程的详细信息
SELECT p.pname, p.description, s.sid, s.serial#, s.program
FROM v$bgprocess p, v$session s
WHERE p.paddr = s.paddr
AND p.paddr != hextoraw('00');
2.5 服务器进程
服务器进程负责处理连接到Oracle实例的用户请求,每个用户会话通常对应一个服务器进程。
2.5.1 服务器进程的工作模式
2.5.2 配置服务器进程
-- 查看当前连接模式
SELECT name, value
FROM v$parameter
WHERE name = 'dispatchers';
-- 配置共享服务器
ALTER SYSTEM SET shared_servers = 10 SCOPE=BOTH;
ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(DISPATCHERS=5)' SCOPE=BOTH;
-- 查看当前会话信息
SELECT username, server, status, program
FROM v$session
WHERE type = 'USER';
3. Oracle数据库(Database)详解
3.1 物理存储结构
Oracle数据库的物理存储结构由多种文件组成,这些文件共同存储和管理数据。
3.1.1 主要物理文件
3.1.2 查看物理文件信息
-- 查看数据文件
SELECT file_name, tablespace_name, bytes/1024/1024 as "Size (MB)", status
FROM dba_data_files
ORDER BY tablespace_name;
-- 查看控制文件位置
SELECT name FROM v$controlfile;
-- 查看重做日志文件
SELECT group#, member, bytes/1024/1024 as "Size (MB)", status
FROM v$logfile lf, v$log l
WHERE lf.group# = l.group#;
3.2 逻辑存储结构
Oracle数据库的逻辑存储结构是建立在物理存储结构之上的,它提供了一个抽象层,使用户能够以逻辑方式组织和管理数据。
3.2.1 主要逻辑结构
3.2.2 表空间管理
-- 创建表空间
CREATE TABLESPACE users_data
DATAFILE '/u01/oradata/users01.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
-- 查看表空间信息
SELECT tablespace_name, status, contents, allocation_type, segment_space_management
FROM dba_tablespaces;
-- 查看表空间使用情况
SELECT df.tablespace_name,
ROUND(df.bytes/1024/1024,2) as "Size (MB)",
ROUND(NVL(f.bytes,0)/1024/1024,2) as "Free (MB)",
ROUND((df.bytes-NVL(f.bytes,0))/1024/1024,2) as "Used (MB)",
ROUND((NVL(f.bytes,0)/df.bytes)*100,2) as "Free %"
FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) df,
(SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) f
WHERE df.tablespace_name = f.tablespace_name(+)
ORDER BY df.tablespace_name;
3.3 数据字典
数据字典是Oracle数据库的核心组件,它包含了关于数据库结构和对象的元数据。
3.3.1 数据字典的组织
3.3.2 常用数据字典查询
-- 查询所有表
SELECT owner, table_name, tablespace_name, status
FROM dba_tables
WHERE owner = 'SCOTT'
ORDER BY table_name;
-- 查询表的列信息
SELECT column_name, data_type, data_length, nullable
FROM dba_tab_columns
WHERE owner = 'SCOTT' AND table_name = 'EMP'
ORDER BY column_id;
-- 查询索引信息
SELECT index_name, index_type, uniqueness, status
FROM dba_indexes
WHERE owner = 'SCOTT' AND table_name = 'EMP';
-- 查询约束信息
SELECT constraint_name, constraint_type, status, validated
FROM dba_constraints
WHERE owner = 'SCOTT' AND table_name = 'EMP';
4. Oracle内存管理
4.1 自动内存管理
Oracle提供了多种内存管理方式,从完全手动到完全自动。
4.1.1 内存管理模式
4.1.2 配置自动内存管理
-- 启用自动内存管理(AMM)
ALTER SYSTEM SET memory_max_target = 4G SCOPE=SPFILE;
ALTER SYSTEM SET memory_target = 4G SCOPE=SPFILE;
-- 需要重启数据库生效
-- 启用自动共享内存管理(ASMM)
ALTER SYSTEM SET sga_target = 3G SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=BOTH;
-- 查看内存参数设置
SELECT name, value, isdefault, ismodified
FROM v$parameter
WHERE name IN ('memory_target', 'memory_max_target', 'sga_target', 'pga_aggregate_target');
4.2 内存监控和调优
监控Oracle内存使用情况对于性能调优至关重要。
4.2.1 SGA监控
-- 查看SGA组件大小
SELECT component, current_size/1024/1024 as "Size (MB)", min_size/1024/1024 as "Min Size (MB)",
max_size/1024/1024 as "Max Size (MB)", user_specified_size/1024/1024 as "User Size (MB)"
FROM v$sga_dynamic_components
ORDER BY current_size DESC;
-- 查看缓冲区命中率
SELECT name, value
FROM v$sysstat
WHERE name IN ('db block gets', 'consistent gets', 'physical reads');
-- 计算缓冲区命中率
SELECT (1 - (phy.value / (cur.value + con.value))) * 100 as "Buffer Cache Hit Ratio"
FROM v$sysstat cur, v$sysstat con, v$sysstat phy
WHERE cur.name = 'db block gets'
AND con.name = 'consistent gets'
AND phy.name = 'physical reads';
4.2.2 PGA监控
-- 查看PGA使用统计
SELECT name, value/1024/1024 as "Value (MB)"
FROM v$pgastat;
-- 查看工作区使用情况
SELECT name, total_executions as "Total Execs",
optimal_executions as "Optimal Execs",
onepass_executions as "Onepass Execs",
multipasses_executions as "Multipass Execs"
FROM v$sql_workarea_histogram
WHERE total_executions != 0;
-- 查看PGA建议
SELECT * FROM v$pga_target_advice;
5. Oracle进程架构
5.1 连接架构
Oracle支持多种连接架构,以适应不同的应用场景和负载需求。
5.1.1 连接模型
5.1.2 监听器配置
Oracle监听器是客户端连接到数据库的关键组件。
# listener.ora示例配置
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = myhost.example.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl.example.com)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(SID_NAME = orcl)
)
)
5.1.3 管理监听器
# 启动监听器
lsnrctl start
# 停止监听器
lsnrctl stop
# 查看监听器状态
lsnrctl status
# 重新加载监听器配置
lsnrctl reload
5.2 多实例架构
Oracle提供了多种方式来实现高可用性和可扩展性,其中最重要的是Real Application Clusters (RAC)。
5.2.1 RAC架构
5.2.2 RAC特有的后台进程
- LMS (Global Cache Service Process): 管理全局缓存服务
- LMD (Global Enqueue Service Daemon): 管理全局锁
- LMON (Global Enqueue Service Monitor): 监控全局锁
- RMSn (RAC Management Server Process): 管理RAC资源
-- 查看RAC实例信息
SELECT inst_id, instance_name, host_name, status, startup_time
FROM gv$instance;
-- 查看服务分配
SELECT service_name, inst_id, count(*) as session_count
FROM gv$session
GROUP BY service_name, inst_id
ORDER BY service_name, inst_id;
6. Oracle存储管理
6.1 自动存储管理(ASM)
ASM是Oracle推荐的存储管理解决方案,它简化了数据库文件的管理,并提供了优秀的性能和可用性。
6.1.1 ASM架构
6.1.2 ASM管理命令
-- 连接到ASM实例
SQL> CONNECT / AS SYSASM
-- 查看ASM磁盘组
SQL> SELECT name, state, type, total_mb, free_mb
FROM v$asm_diskgroup;
-- 创建ASM磁盘组
SQL> CREATE DISKGROUP data_dg
NORMAL REDUNDANCY
DISK '/dev/sdc1', '/dev/sdd1', '/dev/sde1'
ATTRIBUTE 'au_size'='4M',
'compatible.asm'='19.0',
'compatible.rdbms'='19.0';
-- 添加磁盘到磁盘组
SQL> ALTER DISKGROUP data_dg ADD DISK '/dev/sdf1';
-- 删除磁盘组
SQL> DROP DISKGROUP data_dg INCLUDING CONTENTS;
6.2 表空间管理
表空间是Oracle数据库中最重要的逻辑存储单元,它将数据库对象映射到物理存储。
6.2.1 表空间类型
6.2.2 表空间管理命令
-- 创建永久表空间
CREATE TABLESPACE users_data
DATAFILE '/u01/oradata/orcl/users01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
-- 创建临时表空间
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/u01/oradata/orcl/temp01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 1G
EXTENT MANAGEMENT LOCAL;
-- 创建撤销表空间
CREATE UNDO TABLESPACE undo_data
DATAFILE '/u01/oradata/orcl/undo01.dbf' SIZE 200M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G
结语
感谢您的阅读!期待您的一键三连!欢迎指正!