Oracle体系结构
一、需求理解
基于Oracle 19c第2章"Oracle体系结构"的核心内容(涵盖逻辑/物理存储结构、服务器结构、数据字典等),整理一份包含Oracle安装过程、体系结构相关核心语法知识点及使用方法的教程,每个知识点配套带详细注释的案例代码,并补充综合性实操案例,确保内容具体、全面且可落地。
二、核心知识点及实操指南
前置:Oracle 19c 安装(Linux静默安装,快速落地)
1.1 安装前置配置(Root用户)
bash
# 1. 安装依赖包
yum install -y binutils gcc gcc-c++ libaio-devel sysstat ksh compat-libcap1 libnsl.x86_64
# 2. 创建用户和组
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle
passwd oracle # 设置密码(如oracle123)
# 3. 创建安装目录并授权
mkdir -p /u01/app/oracle/product/19c/dbhome_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01
# 4. 配置内核参数(修改/etc/sysctl.conf)
cat >> /etc/sysctl.conf << EOF
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.ip_local_port_range = 9000 65500
EOF
sysctl -p # 生效内核参数
# 5. 配置资源限制(修改/etc/security/limits.conf)
cat >> /etc/security/limits.conf << EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
EOF
1.2 静默安装(Oracle用户)
bash
su - oracle
# 1. 解压安装包(假设安装包在/home/oracle目录)
unzip LINUX.X64_193000_db_home.zip -d /u01/app/oracle/product/19c/dbhome_1/
# 2. 编写响应文件
cat > /u01/app/oracle/product/19c/dbhome_1/response/db_install.rsp << EOF
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOSTNAME=localhost
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oinstall
DECLINE_SECURITY_UPDATES=true
EOF
# 3. 执行安装
cd /u01/app/oracle/product/19c/dbhome_1/
./runInstaller -silent -responseFile /u01/app/oracle/product/19c/dbhome_1/response/db_install.rsp -ignorePrereq
# 4. 执行Root脚本(安装完成后提示)
# 切换到Root用户执行:
# /u01/app/oraInventory/orainstRoot.sh
# /u01/app/oracle/product/19c/dbhome_1/root.sh
# 5. 配置环境变量
cat >> ~/.bash_profile << EOF
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/19c/dbhome_1
export ORACLE_SID=orcl
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$LD_LIBRARY_PATH
EOF
source ~/.bash_profile
知识点1:逻辑存储结构(表空间/段/区/数据块)
1.1 核心概念
- 数据块(Block):Oracle最小I/O单位(默认8KB),是数据存储的最小单元;
- 数据区(Extent):连续的数据块集合,是分配给段的最小存储单位;
- 段(Segment):表、索引、回滚等对象占用的存储空间(由多个区组成);
- 表空间(Tablespace):逻辑存储容器,对应物理数据文件,一个表空间可包含多个段。
1.2 核心语法及案例(表空间管理)
sql
-- 登录SQL*Plus(SYSDBA权限)
CONNECT / AS SYSDBA;
-- ==================== 1. 创建表空间(关联物理数据文件) ====================
-- 创建永久表空间(用于存储业务数据),指定数据块大小、区管理方式
CREATE TABLESPACE TS_BUSINESS
DATAFILE '/u01/app/oracle/oradata/orcl/ts_business01.dbf' -- 物理数据文件路径
SIZE 100M -- 初始大小100MB
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED -- 自动扩展,每次50MB,无上限
BLOCKSIZE 8K -- 数据块大小(默认8K,需与数据库块一致)
EXTENT MANAGEMENT LOCAL AUTOALLOCATE; -- 本地区管理(推荐),自动分配区
-- 注释:
-- EXTENT MANAGEMENT LOCAL:本地区管理(替代字典管理,性能更高)
-- AUTOALLOCATE:Oracle自动分配区大小(适合大多数场景)
-- 若为固定区大小,可替换为:UNIFORM SIZE 1M
-- ==================== 2. 创建表并指定表空间(段落地) ====================
CREATE TABLE EMPLOYEE (
EMP_ID NUMBER(6) PRIMARY KEY,
EMP_NAME VARCHAR2(50) NOT NULL,
SALARY NUMBER(8,2)
) TABLESPACE TS_BUSINESS; -- 指定表存储在TS_BUSINESS表空间(段属于该表空间)
-- ==================== 3. 表空间扩容 ====================
-- 方式1:新增数据文件
ALTER TABLESPACE TS_BUSINESS
ADD DATAFILE '/u01/app/oracle/oradata/orcl/ts_business02.dbf'
SIZE 50M AUTOEXTEND ON NEXT 20M MAXSIZE 200M;
-- 方式2:扩展现有数据文件
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/ts_business01.dbf'
RESIZE 200M;
-- ==================== 4. 查询表空间信息(数据字典) ====================
-- 查询所有表空间及状态
SELECT TABLESPACE_NAME, STATUS, CONTENTS
FROM DBA_TABLESPACES
WHERE TABLESPACE_NAME = 'TS_BUSINESS';
-- 查询表空间对应的数据文件
SELECT FILE_NAME, BYTES/1024/1024 AS SIZE_MB, AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'TS_BUSINESS';
-- ==================== 5. 删除表空间(含数据文件) ====================
DROP TABLESPACE TS_BUSINESS
INCLUDING CONTENTS AND DATAFILES; -- 同时删除内容和物理数据文件
知识点2:物理存储结构(数据文件/控制文件/日志文件)
2.1 核心概念
- 数据文件:存储表、索引等实际数据(对应表空间);
- 控制文件:存储数据库元数据(表空间、数据文件、日志文件位置等),至关重要;
- 日志文件(重做日志):记录数据库修改操作,用于恢复,分联机重做日志、归档日志;
- 参数文件(SPFILE):存储数据库参数(如内存大小、实例名),二进制格式,动态生效。
2.2 核心语法及案例
sql
CONNECT / AS SYSDBA;
-- ==================== 1. 管理数据文件 ====================
-- 查看所有数据文件
SELECT FILE_NAME, TABLESPACE_NAME, STATUS
FROM DBA_DATA_FILES;
-- 离线/在线数据文件(维护用)
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/ts_business01.dbf' OFFLINE;
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/ts_business01.dbf' ONLINE;
-- ==================== 2. 管理控制文件 ====================
-- 查看控制文件位置
SHOW PARAMETER CONTROL_FILES;
-- 新增控制文件(需先关闭数据库,复制物理文件,再修改参数)
-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;
-- 2. 复制控制文件到新路径(操作系统层面,oracle用户)
-- cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control02.ctl
-- 3. 修改参数文件
ALTER SYSTEM SET CONTROL_FILES = '/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl' SCOPE=SPFILE;
-- 4. 启动数据库
STARTUP;
-- ==================== 3. 管理重做日志文件 ====================
-- 查看重做日志组及成员
SELECT GROUP#, MEMBER, STATUS
FROM V$LOGFILE;
-- 查看重做日志状态
SELECT GROUP#, STATUS, ARCHIVED
FROM V$LOG;
-- 创建重做日志组
ALTER DATABASE ADD LOGFILE GROUP 4 (
'/u01/app/oracle/oradata/orcl/redo04.log'
) SIZE 50M;
-- 切换重做日志(手动触发日志切换)
ALTER SYSTEM SWITCH LOGFILE;
-- 删除重做日志组(需确保组未被使用)
ALTER DATABASE DROP LOGFILE GROUP 4;
-- 删除物理文件(操作系统层面)
-- rm /u01/app/oracle/oradata/orcl/redo04.log
-- ==================== 4. 管理服务器参数文件(SPFILE) ====================
-- 查看SPFILE位置
SHOW PARAMETER SPFILE;
-- 动态修改参数(立即生效,重启后保留)
ALTER SYSTEM SET SGA_MAX_SIZE = 2G SCOPE=BOTH; -- SCOPE=BOTH:内存+SPFILE
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 512M SCOPE=SPFILE; -- 仅修改SPFILE,重启生效
-- 从SPFILE创建文本参数文件(PFILE)
CREATE PFILE FROM SPFILE;
-- 从PFILE创建SPFILE
CREATE SPFILE FROM PFILE = '/u01/app/oracle/product/19c/dbhome_1/dbs/initorcl.ora';
知识点3:Oracle服务器结构(SGA/PGA/进程/数据字典)
3.1 核心概念
- SGA(系统全局区):共享内存区域,包含数据库缓冲区、共享池、重做日志缓冲区等;
- PGA(程序全局区):私有内存区域,每个会话/进程独占,用于排序、哈希连接等;
- 后台进程:DBWn(写数据文件)、LGWR(写重做日志)、CKPT(检查点)、SMON(系统监控)、PMON(进程监控)等;
- 数据字典:Oracle内置表/视图,存储数据库元数据(如DBA_TABLES、V$INSTANCE)。
3.2 核心语法及案例
sql
CONNECT / AS SYSDBA;
-- ==================== 1. 查看SGA/PGA配置 ====================
-- 查看SGA各组件大小
SELECT COMPONENT, CURRENT_SIZE/1024/1024 AS SIZE_MB
FROM V$SGA_DYNAMIC_COMPONENTS;
-- 查看PGA使用情况
SELECT ROUND(PGA_USED_MEM/1024/1024,2) AS USED_MB,
ROUND(PGA_ALLOCATED_MEM/1024/1024,2) AS ALLOCATED_MB
FROM V$PGASTAT
WHERE CATEGORY = 'total';
-- 修改SGA大小(需重启生效)
ALTER SYSTEM SET SGA_TARGET = 1G SCOPE=SPFILE;
-- ==================== 2. 查看后台进程 ====================
-- 查看所有后台进程
SELECT NAME, DESCRIPTION
FROM V$BGPROCESS
WHERE PADDR != '00';
-- 查看进程状态(操作系统层面,oracle用户)
-- ps -ef | grep ora_ | grep -v grep
-- ==================== 3. 数据字典查询(核心) ====================
-- 1. 查看用户表信息
SELECT TABLE_NAME, TABLESPACE_NAME, NUM_ROWS
FROM DBA_TABLES
WHERE OWNER = 'SYS' AND TABLE_NAME = 'EMPLOYEE';
-- 2. 查看用户权限
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'SYSTEM';
-- 3. 查看实例状态
SELECT INSTANCE_NAME, STATUS, VERSION
FROM V$INSTANCE;
-- 4. 查看数据库版本
SELECT * FROM V$VERSION;
-- 5. 查看警告日志位置(跟踪文件/警告文件)
SELECT VALUE
FROM V$DIAG_INFO
WHERE NAME = 'Diag Trace'; -- 跟踪文件目录
SELECT VALUE
FROM V$DIAG_INFO
WHERE NAME = 'Alert Log'; -- 警告日志路径
三、综合性案例:Oracle体系结构全流程实操
案例目标
整合"表空间管理+物理文件配置+内存调整+数据字典查询",搭建一个规范的业务表存储环境,并监控服务器结构状态。
完整实操代码
sql
-- ==================== 阶段1:创建表空间(逻辑+物理存储) ====================
CONNECT / AS SYSDBA;
-- 1. 创建业务表空间(指定数据文件、自动扩展)
CREATE TABLESPACE TS_SALES
DATAFILE '/u01/app/oracle/oradata/orcl/ts_sales01.dbf'
SIZE 200M AUTOEXTEND ON NEXT 50M MAXSIZE 500M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M; -- 固定区大小2MB
-- 2. 创建索引表空间(单独存储索引,提升性能)
CREATE TABLESPACE TS_SALES_IDX
DATAFILE '/u01/app/oracle/oradata/orcl/ts_sales_idx01.dbf'
SIZE 100M AUTOEXTEND ON NEXT 20M MAXSIZE 300M;
-- ==================== 阶段2:创建业务表和索引(段落地) ====================
-- 1. 创建销售表,指定表空间
CREATE TABLE SALES (
SALE_ID NUMBER(10) PRIMARY KEY,
PROD_NAME VARCHAR2(100) NOT NULL,
SALE_DATE DATE DEFAULT SYSDATE,
AMOUNT NUMBER(10,2)
) TABLESPACE TS_SALES;
-- 2. 创建索引,指定索引表空间
CREATE INDEX IDX_SALES_DATE ON SALES(SALE_DATE)
TABLESPACE TS_SALES_IDX;
-- ==================== 阶段3:调整内存参数(SGA/PGA) ====================
-- 1. 查看当前内存配置
SHOW PARAMETER SGA_TARGET;
SHOW PARAMETER PGA_AGGREGATE_TARGET;
-- 2. 动态调整SGA和PGA(生产环境需根据服务器配置调整)
ALTER SYSTEM SET SGA_TARGET = 1536M SCOPE=BOTH; -- 1.5G
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 768M SCOPE=BOTH; -- 768M
-- ==================== 阶段4:监控存储和进程状态(数据字典) ====================
-- 1. 查看表空间使用情况
SELECT
t.TABLESPACE_NAME,
ROUND(d.TOTAL_SIZE/1024/1024,2) AS TOTAL_MB,
ROUND((d.TOTAL_SIZE - f.FREE_SIZE)/1024/1024,2) AS USED_MB,
ROUND(f.FREE_SIZE/1024/1024,2) AS FREE_MB,
ROUND((d.TOTAL_SIZE - f.FREE_SIZE)/d.TOTAL_SIZE * 100,2) AS USED_RATE
FROM (
SELECT TABLESPACE_NAME, SUM(BYTES) AS TOTAL_SIZE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME
) d
JOIN (
SELECT TABLESPACE_NAME, SUM(BYTES) AS FREE_SIZE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME
) f ON d.TABLESPACE_NAME = f.TABLESPACE_NAME
WHERE d.TABLESPACE_NAME IN ('TS_SALES', 'TS_SALES_IDX');
-- 2. 查看后台进程状态
SELECT NAME, PID, STATUS
FROM V$PROCESS p
JOIN V$BGPROCESS b ON p.ADDR = b.PADDR
WHERE b.NAME IS NOT NULL;
-- 3. 查看重做日志状态
SELECT GROUP#, STATUS, BYTES/1024/1024 AS SIZE_MB
FROM V$LOG;
-- ==================== 阶段5:维护操作(表空间扩容+日志切换) ====================
-- 1. 给销售表空间新增数据文件
ALTER TABLESPACE TS_SALES
ADD DATAFILE '/u01/app/oracle/oradata/orcl/ts_sales02.dbf'
SIZE 100M AUTOEXTEND ON NEXT 30M MAXSIZE UNLIMITED;
-- 2. 手动切换重做日志
ALTER SYSTEM SWITCH LOGFILE;
-- 3. 查看警告日志(确认无异常)
SELECT MESSAGE_TEXT
FROM V$DIAG_ALERT_EXT
WHERE ORIGINATING_TIMESTAMP > SYSDATE - 1/24 -- 近1小时
AND SEVERITY >= 'WARNING';
四、总结
- 存储结构核心:逻辑存储(表空间→段→区→数据块)是Oracle数据组织的核心,表空间需关联物理数据文件,推荐使用本地区管理;
- 物理文件管理:控制文件需多副本备份,重做日志建议分组且大小适中,参数文件(SPFILE)支持动态修改参数;
- 服务器结构监控 :通过数据字典(V S G A D Y N A M I C C O M P O N E N T S 、 V SGA_DYNAMIC_COMPONENTS、V SGADYNAMICCOMPONENTS、VBGPROCESS等)可监控SGA/PGA、进程状态,是运维的核心手段;
- 安装关键:Linux下Oracle 19c静默安装需先配置依赖、内核参数和用户,响应文件需指定ORACLE_BASE/ORACLE_HOME等核心路径。