ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Oracle DBA 转 OceanBase 第一步:忘掉多进程,理解单进程多线程架构

Oracle DBA 转 OceanBase 第一步:忘掉多进程,理解单进程多线程架构 “这次我们来看一个数据库架构认知更新的问题Oracle DBA 转 OceanBase首先要做的是把脑子里那套‘多进程’模型暂时放下。没错Oracle 里的 PMON、SMON、DBWn、LGWR 这些后台进程你背得再熟到了 OceanBase 里如果还按这个思路去观察、去排查、去优化第一步就会卡住。”这句话不是我夸张。从实际转型经验来看Oracle DBA 接触 OceanBase 后最强烈的感受往往是ps -ef 看不到熟悉的进程列表top 里只有一个 observer 进程连告警日志的名字都不叫 alert_SID.log。这不是 OceanBase 缺功能而是它的架构根本就不是“多进程”这条路线而是一条“单进程、多线程、共享内存”的技术路线。所以与其死记 OceanBase 的命令不如先把架构认知切换过来。这篇文章我会按如下顺序展开对比 Oracle 多进程架构和 OceanBase 单进程架构的核心差异说明为什么“忘掉多进程”是转型的第一步从连接、日志、存储、优化器、高可用、性能排查、工具链几个维度给出对照表最后给出一套 Oracle DBA 转 OceanBase 的落地学习路径。如果你是正在做 Oracle 运维、准备转 OceanBase或者刚接触 OceanBase 的 DBA这篇文章可以直接收藏。1. 核心差异速览在展开细节之前先给一张总体对比表。这张表覆盖了 Oracle DBA 最熟悉的几个维度同一行左右对照应该能让你快速定位自己的盲区。对比维度Oracle 传统架构OceanBase 架构进程模型多进程PMON、SMON、DBWn、LGWR、CKPT、ARCn单进程 observer内部多线程线程模型每个后台任务一个或多个专用进程一个进程内多个线程池按模块分工共享内存SGA共享池、Buffer Cache、Redo Log Buffer 等observer 进程内的共享内存结构BSEK/MemTable/Block Cache 等存储引擎B 树为主行存储LSM-Tree 架构MemTable SSTable高可用方案RAC Data Guard依赖多种后台进程协作Paxos 协议多副本同步日志流驱动租户概念无原生多租户一个实例一套数据字典多租户架构租户内部逻辑隔离兼容 MySQL 和 Oracle 两种模式实例与数据库实例 SGA 后台进程数据库 数据文件集合observer 进程即数据库服务实例概念弱化关注租户和资源单元日志Redo Log Archive LogLGWR 负责写日志Clog提交日志由日志线程负责多副本同步连接方式sqlplus、listener.ora tnsnames.oraobclient / mysql 客户端直连 observer 的 SQL 端口性能排查AWR、ASH、ADDM、等待事件、v$ viewsGV$OB_SQL_AUDIT、GV$OB_ACTIVE_SESSION_HISTORY、GV$OB_PLAN_CACHE备份恢复RMAN全量 归档增量物理备份 日志归档支持恢复到指定时间点这张表并不要求一条一条背真正要记住的是最后一行上面那一行架构模型不同整个运维和优化方法论都要跟着变。当你习惯用 ps -ef 找 DBWn 时OceanBase 根本不给你这个入口当你习惯用 alert log 定位错误时OceanBase 的 observer.log 同样能定位问题但关键字、日志轮转方式、线程对应关系完全不同。所以“忘掉多进程”不是情感上的忘而是操作习惯上的重置。2. 为什么“忘掉多进程”是转型第一课2.1 Oracle 多进程模型的思维惯性从接触 Oracle 的第一天起DBA 就会被灌输一套后台进程体系PMON负责进程监控和恢复SMON负责实例恢复和临时空间清理DBWn负责把脏块写入数据文件LGWR负责把 Redo Log Buffer 写入联机日志CKPT负责更新控制文件中的检查点信息ARCn负责归档日志复制。排查问题时Oracle DBA 的天然反应是先看实例是否存活再看后台进程是否有异常退出ps -ef | grep ora_然后看 alert log 里是否有 ORA-00600、ORA-01555 之类的错误最后通过 AWR 报告分析等待事件。这套思路在 Oracle 世界里非常可靠因为进程边界清晰每个后台任务都有明确职责谁出问题查谁。但转到 OceanBase 后这套排查链路立刻失效。2.2 OceanBase 单进程多线程模型OceanBase 的数据库服务由一个名为observer的进程承载。注意这不是“某个进程”而是“唯一进程”。在大多数部署形态下一台机器只启动一个 observer 进程它就是这台机器上的全部数据库服务。observer 内部按模块拆成了多个线程组比如SQL 执行相关线程事务提交相关线程日志同步相关线程ClogMemTable 转储/合并相关线程网络 I/O 线程定时任务线程。你可以理解成Oracle 用一个“部门”来处理一个任务OceanBase 用一个“人”跑来跑去切换上下文。线程和进程最大的区别是共享地址空间所以 observer 的诊断和调优思路就不是“杀进程、查进程、看进程”而是看 observer 进程是否健康看线程状态和后台任务是否有卡住看日志中是否有 WARN/ERROR 关键字看内部视图GV$OB_*中的指标变化。如果你还拿着“多进程”的思维去看 OceanBasetop 里只有一个 observer 进程你可能会以为数据库挂了或者以为它没在干活实际上它线程忙得不行。这就是为什么转 OceanBase 的第一课就是“忘掉多进程”。2.3 思维转变的三个核心点切到 OceanBase 后DBA 需要完成三个认知更新从“进程”到“线程”的观察方式不要再去 ps 里找进程而是用top -H看线程或者用 OceanBase 的运维命令看内部模块状态。从“后台进程”到“后台任务”的定位方式Oracle 出问题先查进程OceanBase 出问题先查日志和视图进程只有一个不好“单独处理”。从“SGA后台进程”到“内存线程池租户资源”的资源分配方式Oracle DBA 调 SGA 大小OceanBase DBA 调租户内存、CPU 配额和日志盘空间视角完全不同。如果你能把这三点想明白后面学 OceanBase 的一切命令都会顺很多。3. 架构认知迁移从 SGA进程 到 单进程内存与线程3.1 Oracle 实例组成回顾Oracle 的实例由两大部分组成SGA系统全局区和一组后台进程。SGA 里最核心的是Shared Pool缓存 SQL、执行计划、数据字典Buffer Cache缓存数据块Redo Log Buffer缓存 Redo 记录Large Pool、Java Pool、Streams Pool按功能划分的内存区域。后台进程负责把内存和磁盘衔接起来DBWn 负责刷脏LGWR 负责写日志。这种设计的好处是职责分离坏处是进程多了以后上下文切换开销大、调试复杂度高。3.2 OceanBase 的内存与线程组织OceanBase 的 observer 同样需要缓存、日志、SQL 处理等能力但组织方式不同。内存层面observer 内部分为多个内存区域MemTable新写入数据先进入内存中的 MemTable达到阈值后转储成 SSTableBlock Cache类似 Oracle 的 Buffer Cache缓存磁盘块Plan Cache类似 Oracle 的 Shared Pool 中的库缓存缓存执行计划其他系统级内存结构。线程层面observer 内部按功能模块划分线程池比如 SQL 线程、事务线程、Clog 线程、转储线程等。每个线程池处理一类任务这和 Oracle 的进程分工有相似之处但边界是“代码逻辑”而不是“操作系统进程”。所以你依然可以找到类似 DBWn 的“刷脏”逻辑只是它不叫 DBWn而是转储和合并机制你依然可以找到类似 LGWR 的日志写入逻辑只是它不叫 LGWR而是 Clog 写入线程。功能上有对应关系但实现和运维入口完全不同。3.3 存储引擎差异B 树 vs LSM-TreeOracle 传统存储引擎以 B 树为主数据更新直接修改数据块脏块由 DBWn 异步写盘。OceanBase 采用 LSM-Tree 架构写入先到 MemTable顺序写内存MemTable 达到内存阈值后转储成 SSTableSSTable 达到数量和版本阈值后会做合并major merge读取时按“MemTable SSTable”多层结构查找同时配合 Bloom Filter 加速判断。这个差异直接影响 DBA 的运维习惯Oracle 里你担心日志切换频繁、检查点滞后、脏块过多OceanBase 里你更关心 MemTable 内存阈值、转储频率、合并耗时、SSTable 数量。如果你把 Oracle 的“脏块太多”思路直接套过来看到 OceanBase 内存占用高就想去调低缓存可能会影响合并和写入性能。这也是架构认知迁移的核心价值。4. 运维操作对照从 Oracle 命令到 OceanBase 命令这部分对 Oracle DBA 最实用。我按日常运维高频操作做了一张对照表方便你从“Oracle 习惯”迁移到“OceanBase 习惯”。4.1 连接与实例管理操作OracleOceanBase启动数据库sqlplus / as sysdba 后 startup通过 observer 进程启动一般用 obd / systemd 或运维平台拉起停止数据库shutdown immediate / abort停止 observer 进程或在集群中通过运维命令 stop连接实例sqlplus scott/tigerORCLobclient -h127.0.0.1 -P2881 -urootsys -p -A查看版本select * from v$version;select version(); 或 show variables like version%;查看实例名select instance_name from v$instance;租户模式无传统“实例名”概念关注 cluster/tenant这里最大的坑是sqlplus和obclient虽然都是命令行客户端但内部连接协议不同。Oracle DBA 习惯在 sqlplus 里敲desc、set linesize这些在 obclient 里不完全适用。obclient 是基于 MySQL 协议扩展的很多交互方式更像 mysql 客户端。4.2 日志查看操作OracleOceanBase告警日志alert_ .logobserver.log一般在日志目录下按天轮转查看当前日志位置查看 diagnostic_dest 参数show variables like log_disk_size; 或根据部署目录查找错误日志关键字ORA-xxxxxERROR、WARN以及对应错误码如 OB-xxxxxxx集群级日志无rootservice 的日志多 observer 各自有日志目录Oracle DBA 习惯是“出问题先 tail alert log”OceanBase 里同样适用但要学会从 observer.log 里过滤关键字。日志量比 Oracle 告警日志大很多建议用 grep、awk 或日志平台做过滤。4.3 表空间与租户Oracle 逻辑对象是表空间、段、区、块DBA 要管理数据文件大小、自动扩展、归档目录。OceanBase 的核心逻辑对象是租户。租户是一个资源集合内部再分数据库、表等对象。DBA 要做的是创建租户时规划 CPU、内存、日志盘空间租户内再创建数据库和表调整租户资源用ALTER TENANT语法。这对 Oracle DBA 是一个比较大的认知变化。Oracle 里“表空间不够”可以加数据文件OceanBase 里“租户内存不够”要调整租户资源池或者说扩容。你不能用ALTER TABLESPACE ADD DATAFILE的思路去解决。4.4 备份恢复Oracle DBA 用 RMANrman target / BACKUP DATABASE PLUS ARCHIVELOG; RESTORE DATABASE; RECOVER DATABASE;OceanBase 的备份恢复支持物理备份和日志归档一般在 OCP 或命令行中操作核心步骤是配置备份目的端OSS、NFS 或对象存储发起全量备份或增量备份开启日志归档恢复时指定备份集和时间点。Oracle DBA 最容易忽略的一点是OceanBase 的备份和恢复需要考虑租户级别而不是“整个实例”级别。备份任务通常围绕租户展开恢复时也要指定目标租户。5. SQL 与开发习惯的迁移5.1 兼容模式带来的舒适区OceanBase 提供 MySQL 和 Oracle 两种兼容模式。你在 Oracle 模式下很多熟悉的语法可以继续用比如dual表ROWNUM或rownum N分页connect by ... start with的递归查询搜索词里有 connect by start withtrunc(sysdate)日期处理not exists反连接写法MERGE INTO合并写法。所以 Oracle DBA 刚切换到 OceanBase Oracle 模式时SQL 层面不会太痛苦。这也是很多人愿意转 OceanBase 的原因语法兼容能省掉大量改造工作。5.2 分页和递归查询要注意实现差异虽然语法兼容但仍需验证执行计划。比如Oracle 中connect by依赖层次查询OceanBase Oracle 模式支持该语法但底层实现和递归深度限制可能不同Oracle 中ROWNUM可以在排序场景下工作但 OceanBase 的执行计划优化逻辑不同复杂分页可能要走执行计划对比not exists在 Oracle 里经常被优化成反连接在 OceanBase 里的优化逻辑不一定完全一样需要看执行计划确认。建议 Oracle DBA 不要把“Oracle 里这样写没问题”当成“OceanBase 里一定没问题”。迁移前把核心 SQL 拿出来跑一遍对比执行计划和耗时这比任何规则都准。5.3 存储过程和 PL/SQL 兼容性Oracle 的存储过程很强大DBA 日常也会写大量 PL/SQL。OceanBase Oracle 模式支持存储过程、函数、包等但要注意PL/SQL 里的某些高级特性不一定完全兼容比如部分系统包、正则表达式细节、自定义类型行为批量任务里如果大量依赖存储过程迁移前要做一次语法兼容性评估OceanBase 更鼓励用标准 SQL 和事务逻辑解决问题而不是把大量业务逻辑塞进存储过程。如果项目里有上百个存储过程务必先做一个静态扫描把不兼容的语法点先列出来。6. 性能排查与故障处理对照Oracle DBA 熟悉的性能排查链路是看 load_profile看 top events看 SQL 排序看执行计划下钻等待事件。OceanBase 路径类似但视角不同。6.1 Oracle 维度AWR 报告一键生成系统报告ASH活动会话历史V$SQL / V$SQLAREASQL 性能指标等待事件比如 db file sequential read、log file sync 等。6.2 OceanBase 维度GV$OB_SQL_AUDIT查看 SQL 执行审计信息类似 V$SQLGV$OB_ACTIVE_SESSION_HISTORY查看活跃会话历史类似 ASHGV$OB_PLAN_CACHE查看执行计划缓存GV$OB_SYS_TIME_MODEL查看系统时间模型租户内视图information_schema和oceanbase库下的大量内部视图。排查慢 SQL 时一个常见做法是查询 SQL_AUDITSELECT tenant_id, svr_ip, svr_port, sql_id, elapsed_time, execute_time, queue_time, wait_time_ms, query_sql FROM GV$OB_SQL_AUDIT WHERE elapsed_time 1000000 ORDER BY elapsed_time DESC LIMIT 50;注意如果你从 Oracle 来这里不能写ORA-那套要用 MySQL/OceanBase 的语法习惯。比如LIMIT 50而不是ROWNUM 50或者你用了 Oracle 模式但也要确认该视图的字段名是 OceanBase 定义的不是 Oracle 的 V$SQL。6.3 等待事件思路转变Oracle 的等待事件非常成熟dba 可以通过 enq、buffer busy waits、log file sync 等很快定位问题。OceanBase 里也有类似概念比如观察 SQL audit 中的 queue_time排队等待时间、wait_time_ms其他等待时间等字段。但 OceanBase 集群模式下还要关注网络、副本同步、Clog 写入等分布式相关的指标。也就是说排查范围从“单机内部资源竞争”扩展到了“节点间通信和日志同步”这也是 Oracle DBA 容易忽略的地方。7. 环境准备与学习工具如果你打算上手实践不一定要先搭一套复杂集群。可以从单机学习环境开始。下面给出一套常见的学习准备清单。7.1 硬件与操作系统普通 x86 服务器或一台配置还行的 PC内存建议至少 8G 到 16GOceanBase 对内存管理比较重太小容易在合并时内存吃紧磁盘至少预留 50G 以上日志盘、数据盘最好分开操作系统推荐 CentOS 7、Ubuntu 20.04 或国产主流 Linux具体以官方支持列表为准。7.2 软件依赖建议装好 Java 环境用于 OBD、OCP 等工具部分组件依赖 JDK安装 OBClient 或 MySQL 客户端用于连接可选安装 ODPOceanBase Database ProxySharding 路由和协议代理用于统一访问入口安装 OBD 作为本地集群管理工具可以一键部署、启动、查看状态。7.3 使用 OBD 快速启动一个最小集群OBD 是 OceanBase 配套的部署工具适合本地学习。常见的命令模板如下实际命令以你安装的 OBD 版本为准# 初始化 OBD 环境示例具体命令看文档 obd cluster create mytest -c /path/to/your/config.yaml # 启动集群 obd cluster start mytest # 查看集群状态 obd cluster display mytest集群配置文件需要指定 observer 的 IP、数据目录、日志目录、内存大小等。这里不贴具体完整配置因为版本不同配置差异很大建议从官方示例开始改。7.4 通过 obclient 连接# 连接 sys 租户示例 obclient -h127.0.0.1 -P2881 -urootsys -p -A # 创建普通租户后连接业务租户 obclient -h127.0.0.1 -P2881 -uroottest_tenant -p -AOracle DBA 看到这个连接方式可能会想起 MySQL-u用户名租户名、-P端口、-A。确实OceanBase Shell 命令更接近 MySQL 生态而不是 SQL*Plus。7.5 常用开发工具热词里有 Datagrip 和 IDEA 连接 OceanBase 的搜索说明很多开发者和 DBA 已经把它当成日常开发工具。使用方式Datagrip新建数据源选择 MySQL 或 OceanBase 驱动填主机、端口、用户名、密码即可连接IDEA Database 工具同理通过 MySQL 驱动连接命令行obclient数据迁移工具OMS 或 DataX用于把 Oracle/MySQL 数据迁移到 OceanBase。Oracle DBA 不用重新学太多客户端工具把 Datagrip 配好就能开始玩。8. 常见问题与排查方法以下是我认为 Oracle DBA 转 OceanBase 时最容易遇到的几类问题。问题现象可能原因排查方式解决方案连接不上数据库端口错误、rs 状态异常、租户不存在检查监听端口、查看 observer 日志、查看集群状态确认地址端口检查集群状态创建或选择正确租户只有 observer 进程数据库看起来像“挂”了架构误解单进程多线程模型用 obd cluster display 看集群状态用 obclient 尝试连接执行 SQL不要用 ps 判断数据库存活性用状态命令查看视图时字段名和 Oracle 不同兼容模式不同、视图层级不同确认当前租户模式查对应 OceanBase 内部视图定义多使用 GV$OB_ 开头的视图暂时忘记 V$ 前缀SQL 在 Oracle 快在 OceanBase 慢统计信息不新、执行计划选择不同、SQL 写法不匹配查看 GV$OB_SQL_AUDIT抓执行计划更新统计信息改写 SQL加索引必要时绑定执行计划存储过程迁移报错PL/SQL 兼容性差异逐条编译定位不兼容语法做兼容性改造或该逻辑改用标准 SQL合并major merge期间性能波动LSM-Tree 合并特性看合并时间窗口、锁范围设置合并窗口错峰执行调大内存阈值备份恢复任务失败备份目的端权限不足、租户资源不足看备份任务日志检查归档和备份目的端配置调整备份策略日志量太大不知道从哪看observer.log 日志量大按关键字提取按时间过滤数据库使用日志采集和分析平台做日志轮转这张表不用背遇到问题再回来看。核心思路就是从进程视角切到线程/任务视角从单机资源视角切到集群多副本视角从 Oracle 私有视图切到 OceanBase 系统视图。9. Oracle DBA 转 OceanBase 的最佳实践9.1 先做认知切换再学命令不要一上来就背 OceanBase 语法。先把“多进程 vs 单进程多线程”的架构差异吃透知道日志在哪、视图在哪、租户怎么划分再上手敲命令会快很多。9.2 用最小环境养成操作手感本地装一个单机 OceanBase创建两三个租户分别用 MySQL 模式和 Oracle 模式连接跑一遍建表、插入、查询、备份恢复、性能排查。这个流程走完你对 OceanBase 的第一层陌生感就去掉了。9.3 从熟悉的 Oracle SQL 开始迁移把你手头最常用的 Oracle SQL 整理一波放到 OceanBase Oracle 模式里跑一遍分页 SQLconnect by 递归trunc(sysdate) 日期条件not exists 反连接merge into 合并看看哪些可以直接跑哪些要改。这个对比自己做过一遍比看十篇兼容性文档都实在。9.4 善用 OCP 和系统视图如果条件允许用 OCPOceanBase 管控平台看集群拓扑、租户资源、合并状态、慢 SQL效率很高。如果只用命令行重点掌握这几个视图GV$OB_SQL_AUDITSQL 审计和慢 SQL 排查GV$OB_SERVER_SCHEMA_INFO查看 schema 信息GV$OB_MEMSTORE查看租户内存使用GV$OB_SSTABLE查看 SSTable 数量GV$OB_UNITS查看资源单元分布。9.5 迁移项目先做兼容性评估如果是从真实 Oracle 库迁到 OceanBase不要直接搬存储过程、包、定时任务。先做一轮兼容性检查再制定分批迁移计划。数据迁移建议用官方工具或成熟的数据同步工具迁移后要在测试环境完整跑一遍核心业务链路。9.6 安全和合规边界数据库掌握着业务核心数据无论做测试还是生产迁移都要注意在授权环境内操作不随意把生产数据拷贝到个人测试环境涉及个人信息和敏感数据时先脱敏再测试备份恢复要验证可恢复性不要只做备份不演练对外分享案例和问题时隐藏真实库名、账号、业务数据细节。技术转型的前提是守住数据和系统安全底线这一点比学任何架构都重要。10. 总结与下一步Oracle DBA 转 OceanBase本质不是换一套命令而是换一套架构思维。Oracle 用多进程把任务拆给不同后台进程OceanBase 用单进程多线程统一调度Oracle 用 B 树加 Redo 做数据持久化OceanBase 用 LSM-Tree 加 Clog 做存储和同步Oracle 的排查链路从 V$ 和 AWR 开始OceanBase 的排查链路从 GV$OB_ 系列视图和 observer 日志开始。如果你正在转型照这个顺序推进先看架构文档理解 observer 单进程模型部署一个单机环境亲手创建租户连接 obclient把自己常用的 Oracle SQL 拿出来跑一遍做兼容性对比练习用 GV$OB_SQL_AUDIT 查慢 SQL模拟一次备份恢复验证你的恢复步骤再把一个真实小业务迁移到 OceanBase 测试环境跑全链路。不要一上来就追求“所有命令都会”先恢复“遇到问题知道去哪找答案”的能力。OceanBase 的文档、系统视图、日志体系都已经很完善你真正需要更新的是那套已经被 Oracle 训练了多年的排查习惯。这篇文章就写到这里。建议先别急着看很多 OceanBase 命令先跑一个单机环境亲手操作一遍你会比死记文档快很多。等你有了一定手感再回头看这篇文章的对照表会发现当初纠结的“多进程问题”其实只是架构切换的一个起点。
返回列表