侧边栏壁纸
  • 累计撰写 16 篇文章
  • 累计创建 1 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Oracle 数据库生产环境运维指南(持续更新)

Oracle 数据库生产环境运维指南(持续更新)

前言

Oracle 是什么?

想象一下:一家大型超市需要管理海量的商品信息(库存、销售记录、会员数据)。需要一个"超级仓库管理系统",能存放下数据、支持快速查询、保证数据安全。

Oracle 就是这样的"超级仓库管理系统"! 它是全球最强大的关系型数据库,被无数企业用于存储核心业务数据。

Oracle Database 是甲骨文公司的旗舰产品,在企业级数据库市场占据统治地位。作为运维工程师,我们的职责是:让数据库稳如磐石、快如闪电、数据不丢

本文档会告诉你:

  • Oracle 数据库核心概念
  • 如何安装和配置 Oracle
  • 日常运维常用命令
  • 性能监控和优化
  • 备份恢复策略
  • 生产环境最佳实践

目录

  1. 核心概念详解
  2. Oracle 安装
  3. 数据库连接与管理
  4. 表空间管理
  5. 用户与权限管理
  6. 日常运维命令
  7. 性能监控与优化
  8. 备份与恢复
  9. 常见问题排查

核心概念详解

1. Oracle 数据库架构

Oracle 架构是什么?

想象一下:一家大型餐厅有前台(接收顾客)、厨房(准备食物)、仓库(存储食材)。Oracle 数据库也是这样工作的:

  • 前台 = 客户端连接
  • 厨房 = 数据库实例(处理查询)
  • 仓库 = 数据文件(存储数据)
┌─────────────────────────────────────────────────────────────┐
│                    Oracle 数据库架构                          │
│                                                              │
│  ┌─────────────┐                                           │
│  │   客户端    │                                           │
│  │  (用户进程) │                                           │
│  └──────┬──────┘                                           │
│         │                                                   │
│         │ SQL 请求                                           │
│         ▼                                                   │
│  ┌─────────────────────────────────────────┐               │
│  │           Oracle 实例 (Instance)          │               │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐│               │
│  │  │  PMON   │  │  SMON   │  │  CKPT   ││               │
│  │  │ (进程监控)│  │(系统监控)│  │(检查点) ││               │
│  │  └─────────┘  └─────────┘  └─────────┘│               │
│  │  ┌─────────┐  ┌─────────┐              │               │
│  │  │  DBWn   │  │  LGWR   │              │               │
│  │  │(数据库写入)│  │(日志写入)│              │               │
│  │  └─────────┘  └─────────┘              │               │
│  └─────────────────────────────────────────┘               │
│         │                                                   │
│         ▼                                                   │
│  ┌─────────────────────────────────────────┐               │
│  │              数据文件 (Data Files)        │               │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐│               │
│  │  │ System  │  │   User  │  │   Temp  ││               │
│  │  │ Tablespace│  │ Tablespace│ │ Tablespace││               │
│  │  └─────────┘  └─────────┘  └─────────┘│               │
│  └─────────────────────────────────────────┘               │
└─────────────────────────────────────────────────────────────┘

核心组件说明:

组件 通俗解释
Instance(实例) 数据库的"运行环境",包括内存和进程
SGA(系统全局区) 实例的内存区域,类似"工作台"
PGA(程序全局区) 每个进程的私有内存区域
Data File 实际存储数据的文件,类似"仓库"
Tablespace(表空间) 逻辑存储单元,类似"仓库分区"
Control File 记录数据库结构的"档案"
Redo Log 记录所有操作的"日志本"

2. 关键概念速查

概念 通俗解释 类比
Database 物理存储的整体 仓库建筑
Instance 内存+进程组成的运行环境 仓库运作系统
Tablespace 逻辑存储容器 仓库的楼层/区域
Data File 表空间的物理文件 仓库里的货架
Segment 占用空间的对象(表、索引) 货架上的货物
Extent 连续的数据块分配单元 一箱货物
Block 最小的 I/O 单位 货物上的标签

3. Oracle 版本选择

版本 说明 适用场景
Oracle Enterprise Edition 完整功能,商业授权 大型企业核心系统
Oracle Standard Edition 常用功能,价格较低 中小企业
Oracle Express (XE) 免费版,资源受限 学习、开发
Oracle Database 21c 最新版本,支持 JSON 新项目

Oracle 安装

Docker 方式安装(推荐测试)

# 👀 拉取 Oracle XE 镜像
docker pull container-registry.oracle.com/database/express:latest

# 👀 启动 Oracle XE
docker run -d \
  --name oracle-xe \
  -p 1521:1521 \
  -p 5500:5500 \
  -e ORACLE_PASSWORD=oracle123 \
  -e INIT_SGA_SIZE=2 \
  -e INIT_PGA_SIZE=1 \
  -v /data/oracle:/opt/oracle/oradata \
  container-registry.oracle.com/database/express:latest

# 👀 等待数据库就绪(约10-15分钟)
docker logs -f oracle-xe

# 👀 看到以下内容表示就绪
# ORACLE DATABASE IS READY TO USE!

静默安装(生产环境)

# 👀 解压安装包
unzip -q linuxamd64_12102_database_se2_*.zip -d /opt/

# 👀 创建响应文件
cat > /opt/database/response/xe.rsp << 'EOF'
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v12.2.0
SELECTED_LANGUAGES=en
ORACLE_HOSTNAME=oracle-server
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
ORACLE_BASE=/opt/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=false
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oinstall
oracle.install.db.BACKUP_ORACLE_HOME=false
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.root用户在执行配置脚本后是否被锁定(当前用法不推荐使用SYS/SYSTEM用户):false
SECURITY_MODEL=Native
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDbName=XE
oracle.install.db.config.starterdb.SID=XE
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryLimit=2048
EOF

# 👀 开始安装
cd /opt/database
./runInstaller -silent -responseFile /opt/database/response/xe.rsp -showProgress

数据库连接与管理

连接方式

# 👀 1. SQL*Plus 连接(命令行)
sqlplus / as sysdba

# 👀 2. 带用户名密码连接
sqlplus system/oracle123@localhost:1521/XE

# 👀 3. 使用 EZCONNECT
sqlplus system/oracle123@localhost:1521/XEPDB1

# 👀 4. 使用 TNS 别名
sqlplus system/oracle123@ORCL

连接参数说明

参数 说明 示例
用户名 连接账号 system, sys
密码 账号密码 oracle123
主机 服务器地址 localhost, 192.168.1.10
端口 Oracle 监听端口 1521(默认)
服务名 数据库服务名称 XE, ORCL

基本查询

-- 👀 查询 Oracle 版本
SELECT * FROM v$version;

-- 输出示例:
-- BANNER
-- Oracle Database 21c Enterprise Edition
-- Oracle Database 19c Enterprise Edition

-- 👀 查询当前用户
SELECT user FROM dual;

-- 👀 查询所有表空间
SELECT tablespace_name, status, contents
FROM dba_tablespaces;

-- 👀 查询数据库基本信息
SELECT name, created, log_mode, open_mode
FROM v$database;

表空间管理

什么是表空间?

表空间是什么?

想象一下:一个大仓库被分成多个区域(ABC区),每个区域放不同类型的货物。Oracle 的表空间就像这个"区域划分",把数据分类存储。

表空间类型:

类型 用途 特点
SYSTEM 存储系统数据字典 自动创建,不能删除
SYSAUX 辅助表空间 存储工具和可选组件
UNDO 存储回滚数据 用于事务回滚和读一致性
TEMP 存储临时数据 排序和哈希操作时使用
USERS 用户数据表空间 存储用户创建的表

查看表空间

-- 👀 查看所有表空间
SELECT 
    tablespace_name,
    initial_extent,
    next_extent,
    status,
    contents
FROM dba_tablespaces;

-- 👀 查看表空间使用情况
SELECT 
    a.tablespace_name,
    ROUND(a.total_space / 1024 / 1024, 2) AS "Total(MB)",
    ROUND(b.free_space / 1024 / 1024, 2) AS "Free(MB)",
    ROUND((a.total_space - b.free_space) / 1024 / 1024, 2) AS "Used(MB)",
    ROUND((a.total_space - b.free_space) / a.total_space * 100, 2) AS "Used(%)"
FROM (
    SELECT tablespace_name, SUM(bytes) AS total_space
    FROM dba_data_files
    GROUP BY tablespace_name
) a,
(
    SELECT tablespace_name, SUM(bytes) AS free_space
    FROM dba_free_space
    GROUP BY tablespace_name
) b
WHERE a.tablespace_name = b.tablespace_name;

创建表空间

-- 👀 创建小型表空间(自动扩展)
CREATE TABLESPACE app_data
    DATAFILE '/opt/oracle/oradata/XE/app_data01.dbf' SIZE 100M
    AUTOEXTEND ON NEXT 10M MAXSIZE 10G
    EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT AUTO;

-- 👀 创建大文件表空间
CREATE BIGFILE TABLESPACE app_data_big
    DATAFILE '/opt/oracle/oradata/XE/app_data_big01.dbf' SIZE 100G
    AUTOEXTEND ON;

-- 👀 创建临时表空间
CREATE TEMPORARY TABLESPACE temp_data
    TEMPFILE '/opt/oracle/oradata/XE/temp01.dbf' SIZE 10G
    AUTOEXTEND ON NEXT 100M MAXSIZE 50G;

修改表空间

-- 👀 添加数据文件
ALTER TABLESPACE app_data
    ADD DATAFILE '/opt/oracle/oradata/XE/app_data02.dbf' SIZE 100M
    AUTOEXTEND ON NEXT 10M MAXSIZE 10G;

-- 👀 修改数据文件大小
ALTER DATABASE DATAFILE '/opt/oracle/oradata/XE/app_data01.dbf'
    RESIZE 200M;

-- 👀 设置表空间为只读
ALTER TABLESPACE app_data READ ONLY;

-- 👀 设置表空间为读写
ALTER TABLESPACE app_data READ WRITE;

-- 👀 删除表空间
DROP TABLESPACE app_data INCLUDING CONTENTS AND DATAFILES;

用户与权限管理

创建用户

-- 👀 创建用户并指定默认表空间
CREATE USER appuser IDENTIFIED BY "AppUser123"
    DEFAULT TABLESPACE app_data
    TEMPORARY TABLESPACE temp_data
    QUOTA UNLIMITED ON app_data;

-- 👀 查看用户信息
SELECT username, created, default_tablespace, profile
FROM dba_users
WHERE username = 'APPUSER';

权限管理

-- 👀 授予基本权限
GRANT CONNECT, RESOURCE TO appuser;

-- 👀 授予 DBA 权限(谨慎使用)
GRANT DBA TO appuser;

-- 👀 授予特定表的操作权限
GRANT SELECT, INSERT, UPDATE, DELETE ON scott.emp TO appuser;

-- 👀 授予系统权限
GRANT CREATE VIEW TO appuser;
GRANT CREATE PROCEDURE TO appuser;
GRANT CREATE ANY TABLE TO appuser;

-- 👀 撤销权限
REVOKE DBA FROM appuser;
REVOKE DELETE ON scott.emp FROM appuser;

角色管理

-- 👀 创建角色
CREATE ROLE app_developer;

-- 👀 授予角色权限
GRANT CREATE VIEW TO app_developer;
GRANT CREATE PROCEDURE TO app_developer;
GRANT CREATE TABLE TO app_developer;

-- 👀 授予角色给用户
GRANT app_developer TO appuser;

-- 👀 查看用户角色
SELECT granted_role, admin_option
FROM dba_role_privs
WHERE grantee = 'APPUSER';

日常运维命令

启动和关闭数据库

# 👀 启动数据库(SQL*Plus)
sqlplus / as sysdba << 'EOF'
STARTUP;
EOF

# 👀 关闭数据库
sqlplus / as sysdba << 'EOF'
SHUTDOWN IMMEDIATE;
EOF

# 👀 启动监听器
lsnrctl start

# 👀 停止监听器
lsnrctl stop

# 👀 查看监听器状态
lsnrctl status

常用管理命令

-- 👀 切换用户
CONNECT system/oracle123

-- 👀 查看当前连接会话
SELECT sid, serial#, username, status, program
FROM v$session
WHERE username IS NOT NULL;

-- 👀 杀死会话
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

-- 👀 查看锁信息
SELECT 
    l.session_id,
    s.serial#,
    l.locked_mode,
    l.oracle_username,
    l.os_user_name,
    o.object_name,
    o.object_type
FROM v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid;

-- 👀 解锁用户
ALTER USER scott ACCOUNT UNLOCK;

归档管理

-- 👀 查询归档日志
SELECT 
    thread#,
    sequence#,
    first_time,
    next_time,
    archived,
    status
FROM v$archived_log
WHERE archived = 'YES'
ORDER BY first_time DESC;

-- 👀 手动切换归档日志
ALTER SYSTEM SWITCH LOGFILE;

-- 👀 启用归档模式
ALTER DATABASE ARCHIVELOG;

-- 👀 查看归档模式
SELECT log_mode FROM v$database;

性能监控与优化

监控指标

-- 👀 查看 SGA 信息
SHOW SGA;

-- 👀 查看 PGA 信息
SHOW PARAMETER PGA;

-- 👀 查看缓冲池命中率
SELECT 
    name,
    value,
    100 - (value / (consistent_gets + db_block_gets) * 100) AS hit_ratio
FROM v$sysstat
WHERE name IN ('db block gets', 'consistent gets');

-- 👀 查看库缓存命中率
SELECT 
    namespace,
    gets,
    gethitratio * 100 AS hit_ratio
FROM v$librarycache
WHERE namespace IN ('SQL AREA', 'TABLE/PROCEDURE', 'BODY');

SQL 性能分析

-- 👀 查看最耗资源的 SQL
SELECT 
    sql_id,
    executions,
    ROUND(elapsed_time / 1000000, 2) AS elapsed_sec,
    ROUND(cpu_time / 1000000, 2) AS cpu_sec,
    ROUND(buffer_gets / executions, 2) AS buffer_gets_per_exec,
    SUBSTR(sql_text, 1, 100) AS sql_text
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;

-- 👀 查看执行计划
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- 👀 收集统计信息
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(
        ownname => 'SCOTT',
        tabname => 'EMPLOYEES',
        estimate_percent => 10,
        method_opt => 'FOR ALL COLUMNS SIZE AUTO'
    );
END;
/

等待事件分析

-- 👀 查看当前等待事件
SELECT 
    event,
    state,
    seconds_in_wait,
    p1, p2, p3
FROM v$session_wait
WHERE sid = (SELECT sid FROM v$mystat WHERE ROWNUM = 1);

-- 👀 查看系统等待事件统计
SELECT 
    event,
    total_waits,
    time_waited,
    ROUND(time_waited / 100, 2) AS time_waited_sec,
    average_wait
FROM v$system_event
WHERE event NOT LIKE 'rdb%'
ORDER BY time_waited DESC
FETCH FIRST 10 ROWS ONLY;

-- 👀 查看 buffer busy waits
SELECT 
    file#,
    block#,
    type,
    class,
    count
FROM v$waitstat
WHERE count > 0
ORDER BY count DESC;

备份与恢复

物理备份

# 👀 冷备份(关闭数据库)
sqlplus / as sysdba << 'EOF'
SHUTDOWN IMMEDIATE;
EOF

# 👀 备份数据文件
cp /opt/oracle/oradata/XE/*.dbf /backup/

# 👀 备份控制文件
ALTER DATABASE BACKUP CONTROLFILE TO '/backup/controlfile.bak';

# 👀 备份重做日志
cp /opt/oracle/oradata/XE/redo*.log /backup/

# 👀 重启数据库
sqlplus / as sysdba << 'EOF'
STARTUP;
EOF

RMAN 备份

-- 👀 连接到 RMAN
rman target /

-- 👀 备份整个数据库
BACKUP DATABASE;

-- 👀 备份表空间
BACKUP TABLESPACE app_data;

-- 👀 备份归档日志
BACKUP ARCHIVELOG ALL;

-- 👀 压缩备份
BACKUP AS COMPRESSED BACKUPSET DATABASE;

-- 👀 增量备份
BACKUP INCREMENTAL LEVEL 0 DATABASE;
BACKUP INCREMENTAL LEVEL 1 DATABASE;

恢复操作

# 👀 恢复整个数据库
rman target /
RESTORE DATABASE;
RECOVER DATABASE;

# 👀 恢复表空间
RESTORE TABLESPACE app_data;
RECOVER TABLESPACE app_data;

# 👀 基于时间点的恢复
RUN {
    SET UNTIL TIME "TO_DATE('2024-01-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
    RESTORE DATABASE;
    RECOVER DATABASE;
}

Data Pump 导出导入

# 👀 导出整个用户
expdp system/oracle123@XE DIRECTORY=data_pump_dir DUMPFILE=scott.dmp SCHEMAS=scott

# 👀 导出特定表
expdp system/oracle123@XE DIRECTORY=data_pump_dir DUMPFILE=emp.dmp TABLES=scott.emp

# 👀 导入到数据库
impdp system/oracle123@XE DIRECTORY=data_pump_dir DUMPFILE=scott.dmp SCHEMAS=scott

# 👀 导入并重映射表空间
impdp system/oracle123@XE DIRECTORY=data_pump_dir DUMPFILE=scott.dmp REMAP_TABLESPACE=users:app_data

常见问题排查

问题 1:连接被拒绝

现象: ORA-12541: TNS:no listener

排查:

# 👀 1. 检查监听器状态
lsnrctl status

# 👀 2. 检查端口是否监听
netstat -an | grep 1521

# 👀 3. 检查防火墙
sudo firewall-cmd --list-ports
sudo iptables -L -n | grep 1521

解决方案:

# 👀 启动监听器
lsnrctl start

# 👀 如果监听器配置有问题,修改 listener.ora
# 位置:$ORACLE_HOME/network/admin/listener.ora

问题 2:表空间满

现象: ORA-1653: unable to extend table

排查:

-- 👀 查看表空间使用情况
SELECT 
    tablespace_name,
    ROUND((used_space * 8192) / 1024 / 1024 / 1024, 2) AS "Used(GB)",
    ROUND((tablespace_size * 8192) / 1024 / 1024 / 1024, 2) AS "Total(GB)",
    ROUND(used_percent, 2) AS "Used(%)"
FROM dba_tablespace_usage_metrics;

解决方案:

-- 👀 方案1:添加数据文件
ALTER TABLESPACE app_data
    ADD DATAFILE '/opt/oracle/oradata/XE/app_data03.dbf' SIZE 1G
    AUTOEXTEND ON;

-- 👀 方案2:修改现有文件为自动扩展
ALTER DATABASE DATAFILE '/opt/oracle/oradata/XE/app_data01.dbf'
    AUTOEXTEND ON NEXT 100M MAXSIZE 20G;

-- 👀 方案3:收缩数据(删除无用数据)
TRUNCATE TABLE big_table;
DELETE FROM large_table WHERE created_date < SYSDATE - 365;

问题 3:Undo 表空间不足

现象: ORA-30036: unable to extend segment in undo tablespace

解决方案:

-- 👀 添加 Undo 表空间数据文件
ALTER TABLESPACE UNDOTBS1
    ADD DATAFILE '/opt/oracle/oradata/XE/undo02.dbf' SIZE 1G
    AUTOEXTEND ON;

-- 👀 或者扩大现有文件
ALTER DATABASE DATAFILE '/opt/oracle/oradata/XE/undo01.dbf' RESIZE 2G;

-- 👀 修改 Undo 保留时间
ALTER SYSTEM SET undo_retention = 3600 SCOPE = BOTH;

问题 4:性能缓慢

现象: 查询执行时间突然变长

排查:

-- 👀 查看当前等待事件
SELECT event, sql_id, seconds_in_wait
FROM v$session_wait
WHERE wait_class != 'Idle';

-- 👀 查看锁等待
SELECT * FROM v$lock WHERE type IN ('TX', 'TM');

-- 👀 查看消耗最多的 SQL
SELECT * FROM (
    SELECT sql_id, elapsed_time, executions,
           ROUND(elapsed_time/executions/1000000, 2) AS avg_sec
    FROM v$sql
    WHERE executions > 0
    ORDER BY elapsed_time DESC
) WHERE ROWNUM <= 10;

解决方案:

-- 👀 收集表统计信息
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(
        ownname => 'SCOTT',
        tabname => 'EMPLOYEES',
        cascade => TRUE
    );
END;
/

-- 👀 重建索引
ALTER INDEX emp_name_idx REBUILD;

-- 👀 清理共享池
ALTER SYSTEM FLUSH SHARED_POOL;

总结

核心要点

要点 关键操作
连接管理 SQL*Plus, 监听器状态
表空间 创建、扩展、监控使用率
用户权限 创建用户、授予角色
性能监控 命中率、等待事件、慢SQL
备份恢复 RMAN, Data Pump

黄金法则

  1. 监控表空间使用率 - 超过 80% 就要预警
  2. 定期收集统计信息 - 保证执行计划准确
  3. 做好备份 - 定期测试恢复流程
  4. 监控等待事件 - 及时发现性能问题
  5. 管理会话和锁 - 防止长时间阻塞

持续更新中… 如有问题或建议,欢迎交流讨论!

0

评论区