首页 > 数据库 >mysql、oracle、sqlserver的区别

mysql、oracle、sqlserver的区别

时间:2025-01-13 18:28:58浏览次数:3  
标签:事务 版本号 数据库 mysql sqlserver MySQL oracle 数据 备份

一、保存数据的持久性:

        MySQL:是在数据库更新或者重启,则会丢失数据。        

        Oracle:把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复。        
        SqlServer:2014之后,也拥有了完全持久和延迟持久特性。

二、提交方式:

          MySQL:默认是自动提交(变量autocommit为ON)。        

          Oracle:默认不自动提交,需要用户手动提交(commit)。        

          SqlServer:默认是自动提交,用户可手动停止(KILL)。

三、对事务的支持:

        MySQL:在innodb存储引擎的行级锁的情况下才可支持事务。

        Oracle:完全支持事务。        

        SqlServer:在非自动提交时才可支持事务。

      

 四、对并发性的支持: 

        MySQL:以表级锁(行级锁依赖于表索引)为主,如果一个session的加锁时间过长,会让其他session无法更新此表中的数据,即“悲观并发控制”。
        Oracle:使用行级锁,对资源锁定的粒度要小很多,并且不依赖索引,对并发性的支持要好很多,即“乐观并发控制”。
        SqlServer:在表、表的分页、索引键以及单独的数据行上支配共享锁排它锁、以及更新锁,简单地说:读取时用共享锁,修改时用排它锁,更新锁则是共享锁和排他锁的一种混合

五、复制备份:

        MySQL:复制服务器配置简单,但主库出问题时,从库有丢失一定数据的可能。
        Oracle:既有推或拉式的传统数据复制,也有dataguard双机或多机容灾机制,还有成熟的热备工具rman,主库出现问题时,可以自动切换备库到主库,但配置管理较复杂。
        SqlServer:仅复制备份是独立于常规SQL Server备份序列的SQL Server备份。通常进行备份会更改数据库并影响其后备份的还原方式。仅用于在不影响数据库总体备份和还原过程的情况下,为特殊目的而进行的备份。

六、逻辑备份:

        MySQL:逻辑备份时要锁定数据,才能保证备份的数据是一致的,会影响正常业务。
        Oracle:逻辑备份时不锁定数据,且备份的数据是一致。
        SqlServer:逻辑备份时要锁定数据,才能保证备份的数据是一致的,会影响正常业务。

七、性能诊断:
        MySQL:诊断调优方法较少,主要有慢查询日志
        Oracle:有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等。
        SqlServer:性能检测工具有sql server profiler,性能调优工具有数据库引擎优化顾问

八、权限与安全:
        MySQL:用户与主机有关,更容易被仿冒主机及ip,意义不大。
        Oracle:用户和root用户权限彼此分离,权限与安全概念比较传统,表现一般。
        SqlServer:本机可用windows验证登录,远程则用SqlServer验证登录(即sa登录)。

 

九、相关服务:
        MySQL:是轻量型数据库,并且免费开源,没有服务恢复数据。
        Oracle:是重量型数据库,收费。
        SqlServer:是重量型数据库,收费(与Java有合作),也有支持供应商。

总结:

        

MySQL优点(支持5000万条记录的数据仓库;适应于所有的平台;开源软件,版本更新较快;性能很出色​​​​​​​,因为它包含一个缺省桌面格式MyISAM。MyISAM 数据库与磁盘非常地兼容而不占用过多的CPU和内存)体积小、速度快、总体拥有成本低,开放源码,搭配“L(Linux)A(Apache)M(MySQL)P(PHP/Perl/Python)“或“LN(Nginx)MP”就可以建立起一个稳定、免费的网站系统,适合中小型网站。MySQL数据库被广泛地应用在Internet上的中小型网站中。MySQL数据库体积小、速度快、总体拥有成本低、开放源码。

MySQL缺点:缺乏一些存储程序的功能,不支持陌生的关键字,采用缺省的端口IP(也是优点),容易被黑客侵入。MyISAM(MySQL的默认存储引擎,另一个是innoDB)并不支持事务处理。

Oracle优点使用方便、功能强大,可靠性好、安全性好、可移植性好、适应高吞吐量,适用于各类大、中、小、微机环境。ORACLE数据库适用于业务逻辑较复杂、数据量大的较大型项目开发。

Oracle缺点:对硬件要求很高;价格比较昂贵;管理维护麻烦;操作比较复杂,需要技术含量高。

SqlServer优点图形化用户界面,丰富的编程接口工具,与Windows NT完全集成,支持分布式的分区视图,适用于Win的Web技术的开发。SQL Server数据库的功能比较全面、效率高,适用于中型企业或单位的数据库平台。扩展性强:当系统要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展;可维护性强:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作;安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中,更好地保护了数据库的安全性;易用性:对应用来说完全透明,集群暴露出来的就是一个IP;

SqlServer缺点只能在Windows系统下运行;不能够按照Web服务器的处理能力分配负载;负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。

拓展:

数据库引擎的选择:

MYISAM支持3中存储方式:静态型,动态型,压缩型。

                优点:占用的空间小,存储的速度快。

                缺点:不支持事务和并发。

innoDB:

                优点:提供事务的支持,回滚,崩溃恢复能力,多版本事务并发控制。

                缺点:读写效率较差,占用的数据库空间较大。

如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择

Memory:内存中对数据创建表,数据全部存储在内存

                优点:读写速度非常快,对数据的安全性要求比较低的时候可以选择memory

                缺点:生命周期短

如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。

如果只有insert和select操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive,存历史数据,图书馆的资料等

数据库引擎的对比:
        ISAMISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理也不能够容错;如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
        MyISAMMyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据

        InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

        MEMORY: MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。MEMORY默认使用哈希索引速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。

ACID概述:

事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性,通常称为事务的ACID属性。

1、原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。(Undo Log实现)  

2、一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态(Redo Log实现)

3、隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。

4、持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。(binlog实现)
 

并发事务带来的问题:

相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多用户的并发操作,但与此同时,会带来一下问题:

 - 脏读
   一个事务正在对一条记录做修改,在这个事务并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”
   
 - 不可重复读

        一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了!这种现象叫做“不可重复读”。


 - 幻读

         一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

注意:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

上述出现的问题都是数据库读一致性的问题,可以通过事务的隔离机制来进行保证。

数据库的事务隔离越严格,并发副作用就越小,但付出的代价也就越大,因为事务隔离本质上就是使事务在一定程度上串行化,需要根据具体的业务需求来决定使用哪种隔离级别。

InnoDB是如何在RR条件下解决幻读的
InnoDB在RR条件下解决幻读有两种手段:mvcc(多版本控制)+ 范围锁
1. MVCC
对于快照读来说,幻读的解决是依赖mvcc解决

每次开启事务后都会递增创建一个版本号(version),之后的增删查改都是基于这个版本号进行操作的

SELECT (version)
读取创建版本小于或等于当前事务版本号,并且删除版本为空或大于当前事务版本号的记录。这样可以保证在读取之前记录是存在的。version >= createVersion and version < deleteVersion

INSERT (createVersion)
将当前事务的版本号保存至行的创建版本号。 createVersion = version

UPDATE (createVersion)
新插入一行,并以当前事务的版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号。 新行createVersion = version,旧行deleteVersion = version

DELETE (deleteVersion)
将当前事务的版本号保存至行的删除版本号。 deleteVersion = version

2. 间隙锁
对于当前读则依赖于间隙锁解决

mysql的间隙锁是基于索引的,对于唯一索引innode会把间隙锁降级为行锁,非唯一索引的话就需要用到间隙锁(也叫范围锁)。

标签:事务,版本号,数据库,mysql,sqlserver,MySQL,oracle,数据,备份
From: https://blog.csdn.net/2401_83691559/article/details/145118675

相关文章

  • MySQL中的四种表联结
    目录1、联结、关系表(1)关系表(2)为什么使用联结2、如何创建联结(1)笛卡尔积(叉联结)--用逗号分隔(2)where子句的重要性(3)内联结--INNERJOIN (4)联结多个表3、使用表别名(对比列别名)4、自联结、自然联结、外联结(1)自联结:self-join(2)自然联结:naturaljoin(3)外联结:leftjoin、righ......
  • Oracle SQL每日一问之ORA-01723:zero-length columns are not allowed
    我:CREATETABLETABLE_1PARALLEL8ASSELECT/*+parallel(8)*/t1.emp_no,NULLemp_nameFROMtemp1t1;[AI机器人bot:]在你的SQL语句中,错误"zero-lengthcolumnsarenotallowed"可能是由于在创建表时没有为`NULLclct_flag`指定数据类型。即使在`CREATETAB......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......
  • JAVA开源毕业设计 共享汽车管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T125,文末自助获取源码\color{red}{T125,文末自助获取源码}......
  • JAVA开源毕业设计 计算机课程管理平台 Vue.JS+SpringBoot+MySQL
    本文项目编号T126,文末自助获取源码\color{red}{T126,文末自助获取源码}......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......