技术对比三
数据守护
数据库的数据保护,不论Oracle还是SQLSERVER还是MySQL,都有三重含义
第一重是Crash后重新起来,要确保数据不丢失
第二重是数据库告诉应用事务写入成功了,这个事务就得持久化,如果没有告诉应用结果,则还可以丢失;
第三重是主机失败切换时(主从切换),如何表现得和没有切换时的情况一样。
每种数据库都有不同的数据守护技术(数据保护技术)
而每种数据库的数据保护技术都是大同小异的
达梦数据库的数据守护技术
连接服务名里的双IP配置类似于SQLSERVER的连接字符串里指定镜像伙伴,当发生故障转移的时候,自动将程序的连接重定向
到备机
SQLSERVER里面使用镜像技术时,C#的连接字符串,Partner=myMirrorServerAddress指定备机地址,故障发生的时候.NET Data Provider
自动重定向连接到备机
Database mirroring --数据库镜像 连接字符串 C# Data Source=myServerAddress;Failover Partner=myMirrorServerAddress; Initial Catalog=myDataBase;Integrated Security=True;
SQLSERVER里的镜像技术原理,下面摘抄自《SQLSERVER2012实施与管理实战指南》
数据库镜像的基本概念讲得差不多了。那么主体数据库和镜像数据库是如何同步数据的呢?
SQL数据库中任何的数据变化都会先记录到事务日志中,然后才会真正更新数据页面。
而事务日志是先保存在该数据库的日志缓存(log buffer)里,然后将缓冲中的日志固化到磁盘上LDF文件中。
在数据库镜像中,主体服务器在将主体数据库的日志从日志缓存固化到磁盘的同时,
还会使用另一个线程来将日志块(log block)发送到镜像服务器的端点。
当镜像服务器通过端点接收到日志块后,他先将日志块放到镜像数据库的日志缓存里,然后将缓存里的日志固化到磁盘上。
一旦日志块被固化后,镜像服务器会根据日志来对镜像数据库执行“重做(redo)”,最终更新数据页面。
当镜像服务器重做日志时,镜像数据库实际就是在执行日志的前滚操作。
如果重做失败,则镜像服务器通过将数据库至于suspended状态来暂停会话。
DBA必须找到问题的原因并解决问题才能继续会话。
当主体服务器截断或收缩数据库事务日志时,镜像服务器也将在日志的同一点收缩日志。
可以看到,数据库镜像其实就是通过发送日志来保持伙伴之间的同步。
从SQL2008开始,日志块在被主体服务器发送网络之前会做压缩处理。
这麽做的目的是为了提升日志发送和接收的效率,降低日志块传输对网络链路和网络设备所带来的负载。
对应那些异常繁忙的生产系统,这项功能不但降低了由于网络不胜负荷的镜像会话异常中断,
也降低由于网络延迟导致的数据库镜像性能问题,可谓一举两得。
达梦数据库的数据守护技术实际上是对应于SQLSERVER 的Always On技术和镜像技术
SQLSERVER 的Always On技术和镜像技术都是高可用技术,由于每种数据库对一些名词概念都采用自己的叫法
例如SQLSERVER里叫高可用,而MYSQL和ORACLE叫可用性,达梦里面叫数据守护,叫法不同,实际上都是指同一样东西
因为叫法的不同导致有一些ORACLE专家以为SQLSERVER没有可用性的方案和产品
ORACLE:RAC集群、Data guard
MYSQL:MYSQL CLUSTER
SQLSERVER:Always On、镜像
有一些架构是share-disk,而有一些架构是share-nothing的,具体在这里不展开来讲了
有兴趣的朋友可以看一下宋沄剑写的《数据库集群技术漫谈》
技术对比四
数据库复制
数据库复制不算是数据守护的技术,所以不归到数据守护里面
在SQLSERVER里,有发布数据库、分发数据库、订阅数据库之分
而达梦里面主服务器就是发布库,复制服务器就是分发库,从服务器就是订阅库
达梦数据库的复制结构跟SQLSERVER差不多
技术对比五
上面都说了相同点,现在说一下不同点,但是由于篇幅限制,我这里只说达梦的数据库数据页面的结构是怎样的
达梦数据库的页面有不同的大小,有4K、8K、16K、32K,实际上达梦数据库将数据页面叫数据块
跟ORACLE一样也是叫数据块
达梦数据库在配置文件里设置数据块的大小,重启数据库服务之后,达梦就会读取配置文件新的配置信息(有点类似MYSQL)
在新建表的时候就会根据配置文件来创建数据块
而表的数据类型的长度根据当前数据块的大小的不同而不同
而在SQLSERVER里面,是不能设置数据页面的大小的,每个数据页面的大小都是8K
重头戏:COUNT(*)统计结果行数
大家注意下划线部分!!
SQLSERVER跟达梦是一样的
USE [sss] CREATE TABLE counttb(id INT NULL) INSERT INTO [dbo].[counttb] ( [id] ) SELECT 1 UNION ALL SELECT NULL SELECT COUNT(1),COUNT(*),COUNT(id) FROM [dbo].[counttb]
本人之前也写过一篇,至于哪个观点正确留给大家去思考了
《SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?》
总结
虽然大部分原理一样,但是语法跟数据库的结构还是有一些出入
所以当DBA从一种数据库转型到另一种数据库的时候还是需要一段时间的学习
例如从SQLSERVER转到MYSQL 或者ORACLE转到SQLSERVER
本文通过技术对比,可以使大家对达梦数据库的技术含量有一个度,虽然没有实际使用过,最起码了解一下我们国家的自主知识产权的产品还是不错的
实际上,达梦数据库的基本功能:序列、全文索引、策略、表分区。。
这些该有的功能都有了,大家可以看一下文档,比较一下与ORACLE、SQLSERVER、MYSQL的区别
基本上这些数据库有的功能达梦都有
希望达梦这支国家队能够越来越强大的,在数据库方面使国家能够早日摆脱外国的数据库大佬们的制约
如有不对的地方,欢迎大家拍砖o(∩_∩)o