日期:2014-05-17  浏览次数:20592 次

插入、修改数据时,数据库是必须写入磁盘才返回成功,还是延迟写入,先返回成功!
标题:插入、修改数据时,数据库是必须写入磁盘才返回成功,还是延迟写入,先返回成功!
比如:插入100W条数据,如果是全部写入磁盘才返回成功,会不会比较慢?如果是延迟写入,在检测语法规则之后就返回成功,万一这时断电或者宕机了,那么数据应该没写入磁盘吧。

大侠们发表一下意见吧!!!

------解决方案--------------------
SQLServer内存数据写入磁盘的方法比较
    众所周知,SQLServer增删改数据最先都是在内存中进行的,这可以大大加快数据操作的速度;当内存中的数据被修改了,而磁盘中的数据

还没有被修改时,就产生了所谓的”脏页“,SQLServer是如何同步内存和磁盘的数据的呢?以下三种方法就是为同步内存和磁盘数据而产生的。

 

LazyWrite(惰性写入器):
   作用:
   1.管理SQLServer空闲内存:
    a. 定期检查空闲缓冲列表的大小,当这个值过低的时候,它会扫描整个数据缓存,将一段时间没有使用的页面老化(通过LRU算法),释放内存空间;
    b. 如果找到一段时间没有被使用的脏页,它会将其写入磁盘,然后将这个页面的内存空间标记为空闲空间;
   
   2.协调Windows与SQLServer内存:
    a. 监视服务器内存,如果Windows物理内存很少,它会从空闲缓冲列表中释放内存给Windows;
    b. 在SQLServer负载很重时,它还会在分配给SQLServer的内存没有达到最大服务器内存阀值时,增加空闲缓冲列表的大小,以适应负载的需要。


CheckPoint:
   作用:检查点是检查点进程创建的一个时间点,在这个时间点,SQLServer可以确认所有提交的事物所做的修改都已经写入磁盘,它是一个标记,
         这个标记是数据库恢复的起始点,大约每分钟运行一次,这样在启动数据库时,确保数据库在一分钟内就能完成恢复操作;但是如果在这段
         时间内写入日志的数据不到10MB,SQLServer就不会自动发起检查点。

         跟踪标记(trace flag)3502在错误日志中记录检查点的开始和结束位置。

    与LazyWrite比较,CheckPoint不会从缓存中移出脏页,CheckPoint进程的工作只是保证脏页被写入磁盘,并且在页头将缓存中的这个页面标记为
    干净的页面。
  
EagerWrite:
    通常在BCP、SELECT INTO, WRITETEXT,UPDATETEXT,BULK INSERT等操作时发生,为了加快这些操作的速度,EagerWrite会管理数据页

的创建和分配,这些操作不会等待所有的页面创建完成后才将内存中的数据写入到页面中,而是以更高的优先级边创建边将缓存中的数据写入页面中,

以保证缓冲池有足够的空间来完成这些操作。

------解决方案--------------------
写到log buffer就算成功了
------解决方案--------------------
绝大部分情况下不会,因为sqlserver先写日志,记录上面的情况,恢复数据库时,会把未提交事务回滚,已提交事务就写入mdf里面,
------解决方案--------------------
不过的确会有出现致命错误的可能
------解决方案--------------------
引用:
那么这个写入日志操作应该是写入磁盘吧,只有保证写入磁盘成功了,才不担心会宕机和断电,下次可以通过读取日志来回滚和前滚。

那么有100W条记录插入,那么这100W条记录写入日志会不会太大了?


日志确实会增长很大,甚至比数据库文件增长还快。

一般情况下,系统有一个定时的操作,叫checkpoint,就是按时把内存中修改过的数据,刷新到磁盘文件中,当然,这些修改不一定都是已经提交的,也有没提交的,这就是需要回滚的原因。

在sql server中有一个参数,我的显示为0,单位是分钟,说明是系统自动判断系统的负荷,来进行数据的刷新:

select *
from sys.configurations
where name ='recovery interval (min)'

------解决方案--------------------
引用:
大侠,是不是必须等待日志写入磁盘才返回成功,如果只把日志写入内存还是不可靠吧?


说的很对。

如果日志只是在内存中,那么一断电,就没有了。但是数据还是一致的,也就是就算这个时候,有一部数据被checkpoint刷到了磁盘上,但由于那个日志只是在内存,没有写到硬盘上,所以这个时候,这些没有提交的数据修改,会被自动回滚的。所以最终,数据还会一致的,要么全部写入,要不什么都不写
------解决方案--------------------
引用:
哦原来这样,如果插入100W条记录,那么也要等到100W条日志全部写入到磁盘之后,才返回成功吗?
你说的是写到mdf还是ldf?