导言
大家好,我是南橘,从接触java到现在也有差不多两年时间了,两年时间,从一名连java有几种数据结构都不懂超级小白,到现在懂了一点点的进阶小白,学到了不少的东西。知识越分享越值钱,我这段时间总结(包括从别的大佬那边学习,引用)了一些平常学习和面试中的重点(自我认为),希望给大家带来一些帮助
第一件事还是把思维导图贴给大家,因为用的是免费版,所以有水印,如果需要原始版本的话,可以加我的微信:
说到MySQL和Oracle之间的区别,大家第一个想到的肯定是MySQL是开源的项目,因为开源,所以免费。理所当然的,一些中小企业考虑数据库的时候MySQL肯定是首选。Oracle是Oracle公司推出的一款成熟的数据库产品是闭源同时也是收费的,但是Oracle官网是不限制下载的,一般的开发测试是没问题但是你如果来拿来商用而又不给Oracle付费的话,肯定是被Oracle强大的法务部门给狠刮一块肉(当然比任天堂和迪士尼还有些差距)。
不过现在两种产品都是一家的,也都有商业版,都要钱。当然,技术实现上还有线程的不同实现导致两者还是适合不同的环境的。
一、MySQL和Oracle在操作上的一些区别
1、主键
- MySQL 一般使用自动增长类型主键,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,MySQL将自动增长。
- Oracle没有自动增长类型,需要自增主键时一般使用的序列,插入记录时将 序列号的下一个值付给该字段即可。如果不需要使用自增主键,一般会选择使用全剧唯一的流水号作为Oracle数据库的主键。
2、分页查询
- MySQL一般使用limit关键字进行分页查询,有时候也可以利用自增主键加order by 命令加 limit进行分页查询
select * from table where id > ? order by id limit n;
- Oracle处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<?, 不能用ROWNUM>?,需要大于则要用到别名来进行处理
1.SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE)A
WHERE ROWNUM <= 4
)
WHERE RN >= 1;
2.SELECT * FROM(SELECT ROWNUM RN ,ID,NAME,PASSWORD FROM TABLE WHERE ROWNUM <= 4)TEMP
WHERE RN >= 1;
3、长字符串的处理
- Oracle在处理长字符串的时候有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串,则需要考虑字段用CLOB类型,方法借用Oracle里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长 度字段值都应该提出警告,返回上次操作。
4、空字符串的处理
- MySQL中定义了的非空字段也可以有空的内容。而Oracle里定义了非空字段就不容许有空的内容,如果Oracle中字段为NULL或空字符,需要把它改成一个空格的字符串。
5、模糊查询
MySQL和Oracle中都可以使用 like '%字符串%'进行模糊查询,但是在Oracle中,这样查询就无法使用索引进行查询,查询效率会降低。
MySQL中使用concat()函数拼接字符串
like concat('%',#columename#,'%')
Oracle中使用||连接符拼接字符串
like '%'||#columename#||'%'
6、存储过程
- 1、创建存储过程语句不同
- 2、创建函数语句不同
- 3、传入参数写法不同
- 4、包的声明方式不同
- 5、存储过程返回语句不一样
- 6、存储过程异常处理不一样
- 7、过程和函数的声明变量的位置不同
- 8、NO_DATA_FOUND异常处理
- 9、在存储过程中调用存储过程方式的不同
- 10、抛异常的方式不同
具体的因为内容太多,大家可以去MySQL与Oracle 差异比较之五存储过程&Function这位大神的文章里看一看
二、MySQL和Oracle的并发能力
1、并发性
并发性是oltp(On-Line Transaction Processing联机事务处理系统)数据库最重要的特性,并发涉及到资源的获取、共享与锁定。
MySQL以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么MySQL仍然使用表级锁。
Oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以Oracle对并发性的支持要好很多。
2、一致性
- MySQL支持四种隔离级别,可以实现各种级别的读一致性。
(1)read uncommitted 未提交读
所有事务都可以看到没有提交事务的数据。
(2)read committed 提交读
事务成功提交后才可以被查询到。
(3)repeatable 重复读
同一个事务多个实例读取数据时,可能将未提交的记录查询出来,而出现幻读。mysql默认级别
(4)Serializable可串行化
强制的进行排序,在每个读读数据行上添加共享锁。会导致大量超时现象和锁竞争。
- Oracle支持 READ COMMITTED 和SERIALIZABLE这两种事务隔离级别。
Oracle支持serializable的隔离级别,可以实现最高级别的读一致性。每个session提交后其他session才能看到提交的更改。Oracle通过在undo表空间中构造多版本数据块来实现读一致性。
每个session查询时,如果对应的数据块发生变化,Oracle会在undo表空间中为这个session构造它查询时的旧的数据块。
3、数据持久性
MySQL默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。
Oracle则保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。
三、MySQL和Oracle的备份与安全
1、备份
从大佬那边借来图片,这样方便理解
- 1、Oracle逻辑备份时不锁定数据,且备份的数据是一致的。
- 2、Oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的恢复。
- 3、Oracle冷备份主要步骤:
① 查看源库的数据文件、控制文件、redo日志文件的所在的位置
② 关闭数据库
③ 复制数据文件、控制文件和redo日志文件到指定位置
④ rename 数据文件(rename操作需要数据库状态在mount下进行)
⑤ 重建控制文件(重建控制文件操作需要在nomount状态下进行。)
⑥ 启动数据库
注意事项:
① 源端数据库一定要处于关闭状态
② 复制的数据文件、控制文件一定要全,不能缺失,否则,在启动数据库是会报错。redo日志文件可以不复制,因为在重建control文件时可以指定,但是最好也一起复制过来。
③ 复制完成后,要记得修改数据文件和控制文件的权限,否则,在rename操作时会报错。
④ 要掌握冷备份的原理,要不然,会在某个环节上浪费很多时间。
- 1、MySQL逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。
- 2、MySQL中的myisam的引擎,用MySQL自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。但此工具是收费的。
innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。
2、权限与安全
在Oracle中有一个用户的概念,用来登录到数据库,比如openlab用户。用户拥有一定的权限,可以创建表、视图等。用户名下的数据表,视图等对象的集合叫Schema。Oracle的权限与安全概念比较传统,安全性高于MySQL。
Oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等。
MySQL中对应于Oracle中用户的概念是database。登陆后要先建立database,才能建表。MySQL的用户与主机有关,很容易被仿冒。
MySQL的诊断调优方法较少,主要有慢查询日志。
结语
写这一篇文章的起因是技术选型的时候,公司里大佬说某种风控必须用到MySQL数据库(具体原因没听清),所以要在Oracle的技术上再搭建一个MySQL的集群,于是乎,我就在想,MySQL和Oracle的区别是什么呢?然后一边想一边学,就有了这篇文章文章本天成,妙手偶得之
同时需要思维导图的话,可以联系我,毕竟知识越分享越香!
转载:https://blog.csdn.net/ryc1995/article/details/106226445