青年数据库学习互助会

使用DeepSeek解答数据库笔试题

点击上方蓝字,关注我们

Image

想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。

加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。

Image

同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。

如果你有想了解的知识点希望我们发文可以后台私信。

最近联合几个 Oracle ACE技术专家 开通了一个付费微信群,都是具有10多年金融、医疗、制造业10年以上的一线专家,坑位费399/人,无限期,目前群内近155人。加群后会有一些福利(分享各类技术文档,干货资源,问题解答等等),更有特邀嘉宾会定期在群内直播,解读AWR,快问快答等!有问题我们尽量都解答,毕竟399不能都解决所有问题。有兴趣联系微:ywu0613

内部知识库正在筹建中,不止有oracle!

图片

正文开始

使用DeepSeek解答一下数据库的笔试题,今天的内容主要围绕Oracle数据库的核心操作、问题解决、性能优化以及数据迁移等方面展开,旨在为大家提供一份全面、实用的数据库管理指南。

Image

Oracle集群/单机的启动与停止操作步骤

集群启动:

  1. 启动CRS服务:crsctl start crs
  2. 启动数据库实例:srvctl start database -d <db_name>
  3. 检查状态:crsctl stat res -t

单机启动:

  1. 启动监听:lsnrctl start
  2. 启动数据库:sqlplus / as sysdba → startup
  3. 停止数据库:shutdown immediate

数据库实例故障分析与HANG处理

分析思路:

  1. 检查告警日志(alert.log)
  2. 查看HANG分析工具(Hanganalyze、Systemstate)
  3. 分析等待事件(v$session_wait)
  4. 检查锁争用(v$locked_object)

HANG处理:

  • 执行Hanganalyze:oradebug hanganalyze 3
  • 生成系统状态转储:oradebug dump systemstate 266
  • 终止阻塞会话(谨慎操作)

监听日志日常维护注意事项

  1. 定期清理:避免日志过大(手动或脚本轮转)。
  2. 监控日志内容:排查连接失败、TNS错误。
  3. 日志路径检查:确保磁盘空间充足。
  4. 安全权限:仅允许DBA访问监听日志文件。

Oracle数据块Block结构

数据块由块头(元数据)、表目录(对象信息)、行目录(行位置)、行数据(实际存储)、空闲空间组成。块头包含SCN和事务槽,用于并发控制。


DBWR进程的工作方式与触发机制

工作方式:
DBWR将脏块从Buffer Cache写入数据文件,采用批量写入机制。

触发条件:

  1. 检查点触发(CKPT)
  2. Buffer Cache空间不足
  3. 超时机制(每3秒)
  4. 表空间热备份模式(begin backup)

Latch争用与Library Cache Lock处理

Latch争用原因:
高频短时资源竞争(如共享池、Buffer Cache访问)。

Library Cache Lock处理:

  • 原因:对象DDL操作或硬解析冲突。
  • 解决方法:
  1. 定位阻塞会话:v$session与v$lock
  2. 终止阻塞进程或优化SQL减少硬解析。

B-Tree与B+Tree区别及数据库选择

B-Tree:

  • 所有节点存储数据,适合随机查询。
  • Oracle使用B-Tree索引(支持行级锁,事务友好)。

B+Tree:

  • 数据仅存于叶子节点,叶子链表连接,适合范围查询。
  • MySQL选择B+Tree(InnoDB引擎,范围扫描高效,减少磁盘I/O)。

二叉树:

  • 每个节点最多两子节点,易倾斜,不适用于数据库索引。

事务特性与隔离级别

ACID特性:原子性、一致性、隔离性、持久性。

隔离级别:

  • Oracle默认:READ COMMITTED(通过Undo实现)
  • MySQL默认:REPEATABLE READ(通过MVCC)

问题区别:

  • 脏读:读到未提交数据。
  • 不可重复读:同一事务多次读取结果不同。
  • 幻读:范围查询出现新行。

实现差异:
Oracle使用Undo段+多版本控制,MySQL通过Undo日志+Read View实现MVCC。


Commit与Rollback实现原理

  • Commit:

  1. 将Redo Log Buffer写入磁盘(LGWR)
  2. 释放锁,标记事务为已提交(SCN更新)
  • Rollback:

    1. 使用Undo段前镜像恢复数据
    2. 释放锁,清理事务槽

    Oracle死锁分类与解决

    死锁类型:

    • 行级死锁:会话互相等待对方持有的行锁。
    • ITL死锁:事务槽(ITL)争用。

    解决方法:

    1. 自动检测:Oracle自动终止其中一个会话。
    2. 手动处理:通过v$session和v$lock定位后终止会话。

    Oracle与MySQL锁机制对比

    Oracle:

    • 行级锁+多版本控制,无锁读(默认READ COMMITTED)。

    MySQL:

    • 行级锁(InnoDB)+表级锁(MyISAM),通过意向锁管理。

    悲观锁:
    显式加锁(如SELECT ... FOR UPDATE),假设高并发冲突。

    乐观锁:
    通过版本号或时间戳控制(应用层实现)。


    UNDO作用与CR块构造

    UNDO作用:

    • 事务回滚
    • 提供一致性读(前镜像)
    • 实现多版本控制(MVCC)

    前镜像:
    事务修改前的数据副本,存储在Undo段中。

    CR块构造:
    通过Undo段重建一致性读块,确保查询看到事务开始时的数据状态。


    UNDO表空间损坏处理

    数据库可启动:

    1. 新建Undo表空间:CREATE UNDO TABLESPACE ...
    2. 切换默认Undo:ALTER SYSTEM SET UNDO_TABLESPACE=...
    3. 删除损坏的Undo表空间。

    数据库不可启动:

    1. 启动到mount状态
    2. 通过隐含参数跳过Undo校验:_OFFLINE_ROLLBACK_SEGMENTS
    3. 重建Undo表空间。

    ORA-01555快照过旧处理

    原因:
    查询执行时间过长,所需Undo信息被覆盖。

    解决:

    1. 优化长事务,减少查询时间。
    2. 增大Undo表空间或调整UNDO_RETENTION。
    3. 使用闪回查询(Flashback Query)。

    表空间100%处理方案

    1. 紧急扩容:

      ALTERDATABASEDATAFILE'file_path'RESIZE10G;
    2. 清理无用对象:
      归档旧数据,删除临时表。

    3. 启用自动扩展:

      ALTERDATABASEDATAFILE'file_path'AUTOEXTENDONNEXT1G;
    4. 监控与预防:
      部署表空间使用率告警,定期维护。


    数据库启动阶段与Redo/Undo作用

    启动阶段:

    1. NOMOUNT:读取参数文件,启动实例。
    2. MOUNT:打开控制文件。
    3. OPEN:检查数据文件一致性,应用Redo前滚,利用Undo回滚未提交事务。

    Redo作用:恢复已提交但未写入数据文件的事务。
    Undo作用:回滚未提交事务,确保数据一致性。


    字符集迁移方案(GBK→UTF8)

    1. 检查兼容性:
      NLS_CHARACTERSET是否支持目标字符集。

    2. 导出数据:
      使用expdp或数据泵导出。

    3. 转换字符集:

      ALTERDATABASECHARACTERSET INTERNAL_USE UTF8;
    4. 导入数据:
      使用impdp导入并验证数据完整性。


    Commit数据持久化机制

    • Commit后数据是否写入数据文件:
      不一定,但Redo日志已持久化(LGWR写入)。

    • 未Commit的数据:
      可能通过DBWR写入数据文件,但事务未提交前可回滚。

    • Commit后数据丢失:
      除非Redo日志损坏且未归档,否则不会丢失。


    Redo Log Buffer与LGWR机制

    Redo Log Buffer:
    循环缓存区,存储事务修改的Redo条目。

    LGWR触发条件:

    1. 事务提交时
    2. Redo Buffer满1/3
    3. 每隔3秒
    4. DBWR写入前(确保先记日志)

    DBWR与CKPT协作

    DBWR:
    负责将脏块写入数据文件,批量写入以减少I/O。

    CKPT:
    触发DBWR写入,更新控制文件和数据文件头部的检查点信息(SCN)。


    重做日志性能问题处理

    1. 日志文件组不足:增加日志组,调整大小。
    2. I/O瓶颈:分离日志文件到独立磁盘。
    3. 频繁日志切换:增大日志文件大小。

    Resetlogs与NoResetlogs区别

    • Resetlogs:
      重置日志序列号,强制打开数据库(不完全恢复后必须使用)。

    • NoResetlogs:
      保留原有日志序列号(仅用于完全恢复)。


    数据库安全漏洞处理

    1. 定期应用PSU补丁。
    2. 禁用默认账户,限制权限。
    3. 启用审计,加密敏感数据。
    4. 部署防火墙与入侵检测系统。

    深入研究Oracle的方向

    • 内核机制:Buffer Cache、Latch原理
    • 高可用架构:RAC、Data Guard
    • 性能优化:SQL调优、AWR分析
    • 备份恢复:RMAN、闪回技术

    数据库坏块处理

    坏块分类:

    • 物理坏块(磁盘损坏)
    • 逻辑坏块(校验和错误)

    场景1(数据库运行中):

    1. 使用RMAN检测坏块:

      BACKUPVALIDATECHECKLOGICALDATABASE;
    2. 恢复数据:

      BLOCKRECOVER DATAFILE 5 BLOCK 20;

    场景2(数据库宕机):

    1. 启动到mount状态。
    2. 使用RMAN恢复损坏文件。
    3. 若无法恢复,通过备份重建数据文件。

    数据库异机恢复演练

    物理恢复:

    1. 使用RMAN备份集恢复到异机。
    2. 恢复控制文件、数据文件、日志文件。

    逻辑恢复:

    1. 使用expdp导出源库数据。
    2. 在目标库创建表空间和用户。
    3. 使用impdp导入数据。

    数据迁移方案

    同平台迁移:

    • RMAN:
      DUPLICATE DATABASE直接克隆。
    • 数据泵:
      导出/导入元数据与数据。

    跨平台迁移:

    • 传输表空间:
      转换字节序(RMAN CONVERT)。
    • 逻辑导出:
      使用数据泵导出为跨平台格式。

    单机迁移到RAC方案

    1. 环境准备:
      部署共享存储(ASM)、安装Grid组件。
    2. 数据迁移:
      使用RMAN备份恢复或数据泵导出导入。
    3. 配置RAC:
      添加实例,配置负载均衡与故障转移。

    ASM误建文件到文件系统处理

    1. 创建ASM磁盘组(若未存在)。

    2. 将文件移动到ASM路径:

      ALTERDATABASEMOVEDATAFILE'fs_path'TO'+DATA';
    3. 更新控制文件记录。


    SQL性能优化步骤

    1. AWR分析:定位高负载SQL。

    2. 执行计划调优:使用DBMS_XPLAN。

    3. 索引优化:添加缺失索引或重建索引。

    4. 统计信息更新:

      EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','TABLE');
    5. 调整自动任务窗口:

      EXEC DBMS_AUTO_TASK_ADMIN.DISABLE(...);

    索引类型对比(B-Tree vs 位图)

    B-Tree索引:

    • 适合高基数列(唯一值多),OLTP场景。
    • 1000W表查询:等值查询快,支持范围扫描。

    位图索引:

    • 适合低基数列(重复值多),OLAP场景。
    • 1000W表查询:多列组合查询高效,但DML性能差。

    函数索引:

    • 对列应用函数后的结果建立索引,优化特定条件查询。
    老铁们,感觉靠谱吗?欢迎评论区留言。
    END

    往期文章回顾

    MOP社区新闻

    青学会MOP技术社区成立了!

    青学会专家顾问团成员介绍

    金仓专栏

    告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)

    KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)

    KingbaseES数据脱敏-青学会&金仓专栏(3)

    KingbaseES后台服务管理-青学会&金仓专栏(4)

    电科金仓KES日常运维命令集锦-青学会&金仓专栏(5)

    DBA实战小技巧

    推荐一款超实用的openGauss数据库安装工具!

    实战:记一次RAC故障排查
    DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
    DBA实战运维小技巧存储篇(一)根目录满了如何处理
    DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储

    MOP社区投稿-内核开发

    浅谈 PostgreSQL GUC 模块原理

    简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理

    简单讨论 PostgreSQL C语言拓展函数返回数据表的方式

    简单分析 pg_config 程序的作用与原理
    Redis 日志机制简介(一):SlowLog
    Redis 日志机制简介(二):AOF 日志
    Redis 日志机制简介(三):RDB 日志
    pg_cron插件使用介绍
    Redis 的指令表实现机制简介
    pg几款源码工具介绍
    Redis 事务功能简介

    MOP顾问说

    MOP顾问说:MOP 三种主流数据库常用 SQL(一)

    MOP顾问说: 服务器内存

    MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘