首页 > 代码库 > Oracle和mysql的区别
Oracle和mysql的区别
一、数据库的主要类型
数据库类型主要可分为:网状数据库、关系数据库、树状数据库、面向对象数据库。在商业中最主要的是关系型数据库,例如:Oracle、DB2、Sybase、My SQL Server、Informax、Redis、MySQL等。
Oracle和mysql的区别
Oralce是大型数据而mysql是中小型关系型数据库。Oralce占市场的40%而mysql占市场的20%。
一、并发性
Oracle支持大并发量和访问量,是oltp最好的工具
并发性是oltp数据库的最重要的特性,但并发涉及到资源的获取、共享与锁定。
mysql安装后占152M而orcale占3G多,在使用和操作的时候占用机器资源性能特别多。
mysql:以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新比表中的数据。虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
Oracle:使用行级锁,对资源锁定的粒度小很多,知识锁定sql需要的资源,并且加锁实在数据库中数据行上,不依赖索引,所以oracle对并发性的支持要好很多。
二、一致性
oracle:oracle支持serializable的隔离级别,可以实现最高级别的读写一致性,每个 session提交后其他session才能看到提交的更改。Oracle通过在undo表空间中构造版多本数据库来实现读写一致性,每个session查询时,如果对应的数据块发生变化,oracle会在undo表空间中为欸这个session构造它查询时的旧的数据块。
mysql:mysql没有类似oracle的构造多版本的数据块的机制,支持read commietd的隔离级别。一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。
session更新数据时,要加上排它锁,其他session无法访问数据。
三、事务
oracle:事务便是是使数据库从一种状态换成位另一种状态,这不同于文件系统,它是数据所特用的。
它的特性主要分为四个
原子性:语句级原子性,过程级原子性,事务级原子性。
一致性:状态一致,同一事务中不会有两种状态
隔离性:事务键是互相分离互不影响(也有可能有自治事物)
持久性:事务提交了,那么状态就是用过就的
分布式事务:在oralce中会在一个事务中控制多个数据库来保证数据库中的数据的完整性,主要通过dblink。
自治事务:是独立于务的一个子事务,它的提交与回滚不影响主事务的操作。
自治事务提供了一种用PL/SQL控制事务的新方法,可以用于:
1、顶层匿名块
2、本地,独立或打包的函数和过程
3、对象类型的方法
4、数据库触发器
mysql:事务的实现就是基于数据的引擎,不同的储存引擎对事务的支持程度不一样。mysql中支持事务的存储引擎有innoDB和NDB。innoDB是mysql默认的存储引擎,默认的隔离界别是RR,并且在RR的隔离级别下更近一步,通过多版本并发控制,解决不可重复都的问题,加上间隙锁(并发控制)解决 幻读问题,因此innoDB的RR隔离界别其实实现了串行化级别的效果,而且保留了比较好的并发性能。
事务的隔离性是通过锁实现,而事务的原子性、一致性和持久性则是通过事务的日志实现。事务就是redo和undo
分布式事务:分布式事务的实现方式有很多,既可以采用innoDB提供的原生的事务支持,也可以采用消息队列来实现分布式事务的最终一致性。
模型分三块:应用程序,资源管理器,事物管理器
应用程序定义了事务的边界,指定需要做哪些事务;
资源管理器提供了访问事务的方法,通畅一个数据库就是一个资源管理器;
事务管理器协调 参与了全局事务中的各个事务。
分布式事务采用了两段式提交的方式,第以阶段所有的事务节点开始准备,告诉事务管理器ready。第二阶段事务管理器告诉每个节点是commit还是rollback。如果有一个节点失败,就要全局的节点全部是rollback,从此保障事务的原子性。
原子性:一个事务的执行视为一个不可分割的最小单元,事务里面的操作,要么全部成功执行,要么全部失败回滚,不可以执行其中的一部分。
一致性:一个事务的执行 不应该破坏数据的完整性。
隔离性:通常来说,事务之间的行为不应该互相影响,然而实际情况中,事务相互影响的程度收到了隔离级别的影响 。
持久性:事务提交后,需要将提交的事务持久化到磁盘,即使系统崩溃,提交的数据也不应该丢失。
事务的四种隔离级别:
1.READ UNCOMMITTED(未提交读)。在RU的隔离级别下,事务A对数据做的修改,即使没有提交,对于事务B来说也是可见的,这种问题叫脏读。这是隔离程度较低的一种隔离级别,在实际运用中会引起很多问题,因此一般不常用。
2.READ COMMITTED(提交读)。在RC的隔离级别下,不会出现脏读的问题。事务A对数据做的修改,提交之后会对事务B可见,举例,事务B开启时读到数据1,接下来事务A开启,把这个数据改成2,提交,B再次读取这个数据,会读到最新的数据2。在RC的隔离级别下,会出现不可重复读的问题。这个隔离级别是许多数据库的默认隔离级别。
3.REPEATABLE READ(可重复读)。在RR的隔离级别下,不会出现不可重复读的问题。事务A对数据做的修改,提交之后,对于先于事务A开启的事务是不可见的。举例,事务B开启时读到数据1,接下来事务A开启,把这个数据改成2,提交,B再次读取这个数据,仍然只能读到1。在RR的隔离级别下,会出现幻读的问题。幻读的意思是,当某个事务在读取某个范围内的值的时候,另外一个事务在这个范围内插入了新记录,那么之前的事务再次读取这个范围的值,会读取到新插入的数据。Mysql默认的隔离级别是RR,然而mysql的innoDB引擎间隙锁成功解决了幻读的问题。
4.SERIALIZABLE(可串行化)。可串行化是最高的隔离级别。这种隔离级别强制要求所有事物串行执行,在这种隔离级别下,读取的每行数据都加锁,会导致大量的锁征用问题,性能最差。
mysql在innodb存储的 引擎的行级锁的情况才支持事务。
四、数据持久化
oracle
保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机的日志文件中,保持到了磁盘上。如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。
mysql
默认提交sql语句,但如果更新过程中出现db或主机重启的问题也许会丢失数据。
五、提交方式
oracle默认不自动提交,需要用户手动提交。
mysql默认是自动提交的。
六、逻辑备份
oracle逻辑备份时不锁定数据,且备份的数据是一致的。
mysql逻辑备份时要锁定数据,才能保证备份数据是一致的,影响业务正常的dml使用。
七、热备份
oracle有成熟的热备份工具rman,热备时,不影响用户使用数据库,即使备份数据库不一致,也可以恢复时通过归档日志,和联机重做体制进一致恢复。
mysql:myisam的引擎,用myslq自带的myslqhostcopy热备时i,需要给表加读锁,影响dml操作。
innodb的引擎,它会备份innodb的表和索引,但是不会备份,frm文件用ibbackup备份文件时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库,但此工具是收费的。
innobackup是结合ibbackup使用的一个脚本,他会协助对,frm文件的备份
八、sql语句的扩展性和灵活性
mysql对sql语句有很多非常实用的方便扩展,比如limit功能,insert可以一次插入多行数据,select某些数据管理可以不加from
oracle在这方面感觉更加稳重传统一些。
九、复制
oracle:既有推或拉式的传统数据的复制,也有datagurad的双机或多 机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理叫复杂。
mysql:复制服务器的配置简单,但主库问题时,从库有可能丢失一定的数据,且需要手工切换到从数据库
十、性能诊断
oracle有各种成熟的性能诊断调优工具,能实现很多自动的分析,诊断功能,比如awr,addm、sqltrace、tkproof等。
myslq的诊断调优方法较少,主要有慢查询日志。
十一、权限与安全
mysql的用户与主机有关,没有什么意义,另外更容易被仿冒者主机及ip有可乘之机。
oracle的权限与安全概念比较传统,中规中矩。
十二、分区表的分区索引
oracle的分区表和分区索引功能很成熟,可以提高用户的访问db的体验。
mysql的分区表还不太成熟稳定。
十三、管理工具
oracle有很多成熟的命令行,图形界面、web管理工具、还有很多第三方的管理工具、管理极其方便高效。
mysql管理工具较少 ,在linux下的管理工具的安装有时要安装 额外的包,有一定的复杂性。
本文出自 “凌宇的技术博客” 博客,谢绝转载!
Oracle和mysql的区别