换数据库不是从零开始——关系数据库的共同点综述
很多人怕换数据库,觉得要从头学。其实主流关系数据库——Oracle、MySQL、PostgreSQL、SQL Server、达梦、GBase——底层逻辑高度相似。会一个,学另一个不是从零开始,是换个方言。以下是我用过多款数据库后总结的共同点。
1. SQL大致相同
都支持SQL标准。SELECT ... FROM ... WHERE ... GROUP BY ... ORDER BY ...,哪家都一样。JOIN、子查询、UNION、INSERT/UPDATE/DELETE,语法基本通用。
差异在函数。比如字符串截取:
-- OracleSUBSTR(name,1,3)-- MySQLSUBSTRING(name,1,3)-- SQL ServerSUBSTRING(name,1,3)逻辑一样,名字略有不同。查一下文档就行。
Oracle个性的东西确实多点——DECODE、NVL、(+)外连接语法、ROWNUM、DUAL表。但这些都有等价写法,DECODE→CASE WHEN,NVL→COALESCE,(+)→LEFT JOIN,ROWNUM→LIMIT或ROW_NUMBER()。换库的时候改一改,不是重写。
2. 启动关闭逻辑都差不多
都是启动实例(分配内存、启动后台进程)→ 加载控制文件(mount)→ 打开数据文件(open)。关闭都是先停接受新请求 → 做checkpoint → 关闭文件。
命令不同而已:
| 操作 | Oracle | MySQL | SQL Server |
|---|---|---|---|
| 启动 | startup | mysqld/systemctl start mysql | systemctl start mssql-server |
| 关闭 | shutdown immediate | mysqladmin shutdown | systemctl stop mssql-server |
| 强制关闭 | shutdown abort | kill -9 | kill |
做的事情一模一样,命令名字不同。
3. 都有内存共享区域
Oracle叫SGA(System Global Area),MySQL叫Buffer Pool,PostgreSQL叫Shared Buffers。名称不同,干的事一样:把磁盘上的数据块缓存到内存里,减少物理IO。
淘汰算法也差不多——都是LRU(最近最少使用)或其变体。Oracle用改良LRU,MySQL用改良LRU,PostgreSQL用时钟扫描(本质也是近似LRU)。核心思想相同:热数据留在内存,冷数据腾出空间。
调整思路也类似:内存给多了性能好但成本高,给少了频繁读盘。都是根据业务量和服务器资源找平衡点。
4. 都支持锁,颗粒度不同
行锁、表锁、意向锁,各家都有。差异在默认行为和颗粒度:
- Oracle:默认行级锁,
SELECT不加锁,UPDATE锁行。没有锁升级机制(不会从行锁升成表锁)。 - MySQL(InnoDB):默认行级锁,和Oracle类似。但
LOCK TABLES可以显式加表锁。 - SQL Server:有锁升级机制,行锁积累到一定程度自动升成表锁。
换库的时候,理解锁的基本原理(共享锁、排他锁、死锁检测),换个数据库看一下它的锁行为就行。排查锁争用的思路也是一样的——看谁锁了什么、等了多久。
5. 都有在线日志
Oracle叫Redo Log,MySQL叫Binlog + Redo Log,PostgreSQL叫WAL(Write Ahead Log),SQL Server叫Transaction Log。
干的事都一样:先把要改的东西写日志,再改数据。这样崩溃了可以靠日志恢复。这就是WAL原则——Write Ahead Logging,所有关系数据库都遵守。
日志满了怎么办?Oracle用redo log group轮转切换+归档,MySQL用binlog轮转,PostgreSQL用WAL段文件轮转。做法大同小异。
6. 都有备份恢复机制
| 能力 | 各家都有 |
|---|---|
| 全量备份 | 冷备(停库拷文件)或热备(在线备份) |
| 增量备份 | 只备份变化的数据 |
| 时间点恢复 | 利用日志回放到指定时间 |
| 逻辑导出 | 导出SQL脚本或数据文件(Oracle的expdp、MySQL的mysqldump、PG的pg_dump) |
Oracle有RMAN,MySQL有mysqldump+xtrabackup,PostgreSQL有pg_basebackup+pg_dump。工具不同,概念一样:全量+增量+日志恢复。
换库不需要重新学备份原理,只需要学新工具的命令。
7. 关联查询都要注意字段类型
所有数据库做JOIN时,如果两边字段类型不一致(比如一边VARCHAR,一边CHAR,或者一边NUMBER,一边VARCHAR2),都可能出问题:索引失效、隐式转换、结果不对。
差异在于容忍度。Oracle在这方面容忍度高一些——VARCHAR2(10)和CHAR(10)做关联,Oracle通常能自动处理。MySQL严格一些,类型不完全匹配可能导致索引不走。PostgreSQL更严格,有些隐式转换直接报错。
这个问题最容易出在不同人、不同时间设计的表。一个人设计一套表,字段类型通常是一致的。但A去年设计了用户表,user_id是VARCHAR(20);B今年设计了订单表,user_id写成了VARCHAR(50);C从老系统迁过来一张表,user_id是NUMBER。等到做关联查询的时候,类型不一致的问题就冒出来了。
这不是技术能力问题,是协作问题。不管用哪个数据库,关联字段类型保持一致。这是一条通用规则,不需要记哪家宽容哪家严格。最好在建表规范里写死:同一语义的字段,类型和长度必须统一。
8. 所以换库不是从零开始
把这七点串起来:
| 共同点 | 换库时怎么做 |
|---|---|
| SQL标准 | 改函数名、改个别语法,不是重写 |
| 启动关闭 | 换个命令,逻辑一样 |
| 内存缓存 | 调参思路一样,找平衡点 |
| 锁机制 | 原理一样,看新库的颗粒度和默认行为 |
| 在线日志 | 都是WAL,名字不同 |
| 备份恢复 | 概念一样,换工具 |
| 字段类型 | 通用规则:关联字段类型保持一致 |
最重要的是思维可以平移。你在一个数据库上踩过的坑——锁争用、日志满了、缓冲池不够、隐式转换导致索引失效——换个数据库,同样的问题,同样的排查思路。名词不同,内核相同。
所以下次有人说"我们项目要从Oracle换成MySQL",或者"要从MySQL换成达梦",不要慌。你已有的数据库知识,大部分可以直接用。差的只是API和命令,查文档几天就补上了。
真正难的不是换数据库,是换思维方式——从"只会用某个数据库的命令"变成"理解数据库的通用原理"。到了这一步,换什么库都不怕。