指引网

当前位置: 主页 > 数据库 > SQLServer >

SQL Server 2008存储体系结构

来源:网络 作者:佚名 点击: 时间:2018-03-14 17:57
[摘要] Resource数据库 数据库系统对象有一个共同的来源,Resource数据库,这个数据库是所有系统对象的物理存储库,在SQL Server的正常操作期间是不可访问的。虽然系统对象在物理上都存储与Resouce数据
  Resource数据库   数据库系统对象有一个共同的来源,Resource数据库,这个数据库是所有系统对象的物理存储库,在SQL Server的正常操作期间是不可访问的。虽然系统对象在物理上都存储与Resouce数据库中,但是他们在逻辑上表示为每个数据库中的sys架构。正常的SQL Server时不允许访问Resource数据库,但是可以使用系统函数和全局变量检索数据库的有关信息。将所有系统对象持久化到Resource数据库中可以快速部署服务包及升级到SQL Server 2008.在安装服务包时,这个过程只是用新版本的Resource数据库替换原有版本,并且对运行的系统对象执行所需要的任何改动。这大大减少了升级SQL Server所需的时间。   sys架构可以包含被数据库管理员用来检索有关数据库中对象的信息的视图。一般来说,数据库管理员需要访问的大多数信息都可以通过使用系统函数和存储过程来获取,他们会返回系统对象的元数据,然而,有时候直接从系统对象中检索元数据更有帮助。sys架构中的视图就用于此目的。 物理存储类型  www.2cto.com       定长数据类型:bit;tinyint;smallint;int;bigint;decimal;numeric;smallmoney;money;real;float;smalldatetime;datetime;datetime2;datetimeoffset;date;time;char;nchar;binary;rowversion;uniqueidentifier   变长数据类型和大型对象数据类型:varchar;nvarchar;varbinary;varbinary;text;ntext;image;XML;sql——variant   CLR数据类型:bierarchyid;geometry;geography   行内数据:通过使用large value types out of row选项,数据库管理员可以指定将所有的varchar(MAX)、nvarchar(MAX)和varbinary(MAX)数据都视为大型对象数据,并存储在行外部的单独的代谢那个对象数据页上。可以将该选项设为ON或者OFF,如:sp_tableoption 'tablename', 'large value types out of row','ON'。   FILESTREAM数据:SQL Server 2008的一个增强功能是在数据库外部存储非结构化数据,如文本文档、图像和视频,但又链接至在其中定义列的行。通过将varbinary(MAX)二进制大型对象数据存储为文件系统上的文件,而不是存储在数据库数据文件中单独的大型对象数据页上,FILESTREAM集成了数据库引擎与NT文件系统。Transac-SQL语句可以插入、更新、查询和备份FILESTREAM数据。为了使用FILESTREAM,数据库需要一个指派为FILESTREAM存储区域的文件组:   USE Master GO ALTER DATABASE AdventureWorks2008 ADD FILEGROUP MyFilestreamGroup CONTAINS FILESTREAM GO  www.2cto.com   ALTER DATABASE AdventureWorks2008   ADD FILE (NAME=N'FileStreamData',FILENAME=N'D:\SQLData\FileStreamData') TO FILEGROUP MyFilestreamGroup GO     在想数据库添加了新文件组后,可以添加或修改表,以将表的二进制大型对象数据作为数据库引擎管理的对象存储到文件系统中: USER AdventureWorks2008 GO CREATE TABLE MyLargeData (DocumentIdentifier uniqueidentifier ROWGUIDCOL NOT NULL UNIQUE,DocumentFile VARBINARY(MAX) FILESTREAM NULL) GO     需要记住的是,启用FILESTREAM存储的表必须有一个非NULL的唯一ROUGUID列。要向已有的列添加FILESTREAM列,必须确保表有一个ROWGUID列,否则必须添加一个   其他数据类型:table;cursor SQL Server数据库文件   SQL Server将数据存储在数据文件中,将事务存储在事务日志文件中。通过一个逻辑数据库名称将他们集合到一起,这些文件就是数据库数据库可以有多个数据文件和多个事务日志文件。在首次创建数据库的时候,他会有一个默认扩展名为.mdf的主数据文件,数据库也可以有默认名为.ndf的辅助数据文件,这些数据文件可以组合到一个称为文件组的逻辑组中。还有一个默认扩展名为.ldf的食物日志文件,可以使用任何扩展名,但是不建议进行更改。 数据文件     数据库的主数据文件.mdf和任何辅助数据文件.ndf有着相同的结构。这两种文件用来存储数据,以及可让SQL Server有效的查找、读取、修改和添加数据到数据库的元数据。来自表和索引的所有数据以及描述数据的元数据都组织在成为区和页的存储对象中。   区:区是SQL Server的一种文件存储结构,大小为64KB,区由8个连续的8KB页组成。区分为两种,混合区和统一区。混合区包含来自多个对象的页,可以同时包含来自表A的数据页,表B的索引页和表C的数据页。因为一个区有8个页,所以8个不同的对象可以共享一个区。统一区包含8个同属于同一对象的连续页。挡在数据库操作期间检索数据或将数据写入磁盘时,区是数据检索的基本结构。  www.2cto.com     页:SQL Server 2008数据库的所有数据和元数据都存储在页中。和区不一样,也总是存储来自同一个对象的数据。这包括来自表的行、来自索引的行以及大型对象数据。每个页有一个96自己的表头,它含有页的信息,如页码、存储在页上的数据类型,页上的可用空间,以及拥有该页的对象。页可以分为数据页、索引页、文本/图像页、全局分配映射表和辅助全局分配映射表、页可用空间页、索引分配映射页、大容量更改映射表页、差异更改映射表页   事务日志   事务日志用来在一个特定的时间间隔内,维护发生在一个SQL Server数据库上的所有事务的物理记录。具体时间间隔取决于数据的恢复模式。默认的配置下,事务日志记录所有的数据库修改,并且除非是已经备份或者被数据库管理员显示阶段,这些记录是不会被删除的。事务日志是一个二进制文件。它不是一个可用的日志查看器或者记事本卡开并查看的传统日志文件,因此数据库管理员需要使用一些第三方产品来打开并查看事务日志的内容。   事务日志作为一个或多个物理文件在磁盘上进行维护,多数情况下,一个文件已经足够,因为在一个事务日志文件完全写满之前不会使用其他任何日志文件。在内部,物理事务日志文件分为多个虚拟日志,虚拟日志文件的数量和大小由SQL Server动态配置,因此不是手动可以更改的。当SQL Server配置事务日志的内部结构时,它会尽量把虚拟事务日志的数量控制到最少。如果日志配置为自动增长,应将增量设置得较大些,这样可避免会导致创建多个小虚拟日志的微量重复性增长。   事务   所有数据修改都在事务中发生并记录在事务日志中,事务是一个可控的完整数据操作单元,因此事务中的所有修改要么发生,要么都不发生。SQL Server有三种执行的事务方式:隐士事务、显示事务和自动提交事务。隐式事务和自动提交事务是互斥的。   自动提交事务:默认情况下,SQL Server链接使用自动提交事务,任何单独执行或批量执行的INSERT,UPDATE或DELTE语句都将被自动应用于数据库:   UPDATE CheckingAccount  SET Balance=Balance+500 WHERE AccountID='123456789-CK'   UPDATE SavingAccount SET Balance=Balance-500 WHERE AccountID='123456789-SV'     这个例子中的两个操作都是事务,在低通提交模式下,他们将彼此独立地应用到数据库。如果第一个成功,第二个失败,银行损失500元,没有办法回滚更改;同样,第一个失败,第二个成功,客户失去500,为了避免依赖性数据更改错误引起的数据问题,应使用事务。   隐士事务:结构化查询语言的ANSI标准规定除非有显式提交,否则不能更改数据。SQL Server通过一个名为IMPLICIT_TRANSACTIONS的连接来支持这项规定。当IMPLICIT_TRANSACTIONS设置为ON时,任何数据修改都将隐式开始一个事务,但不会关闭事务。该事务将保持开启状态,直至被显示提交或回滚,如:   www.2cto.com   SET IMPLICIT_TRANSACTIONS ON   BEGIN TRY       UPDATE CheckingAccount      SET Balance=Balance+500     WHERE AccountID='123456789-CK'       UPDATE SavingAccount     SET Balance=Balance-500     WHERE AccountID='123456789-SV'       COMMIT TRANSACTION END TRY   BEGIN CATCH       ROLLBACK TRANSACTION     RAISEERROR('Account Transfer Failed',14,1)   END CATCH     此例中,如果在修改数据时有任何错误发生,则将调用CATCH块来回滚事务。如果没有发生错误,则提交。   显式事务:显示事务需要用BEGIN TRANSACTION来开始事务,用显示的COMMIT TRANSACTION或者ROLLBACK TRANSACTION来关闭事务:   BEGIN TRY   www.2cto.com       BEGIN TRANSACTION       UPDATE CheckingAccount      SET Balance=Balance+500     WHERE AccountID='123456789-CK'       UPDATE SavingAccount     SET Balance=Balance-500     WHERE AccountID='123456789-SV'       COMMIT TRANSACTION END TRY   BEGIN CATCH       ROLLBACK TRANSACTION     RAISEERROR('Account Transfer Failed',14,1)   END CATCH   记录事务   直接对数据库中的数据文件进行修改是不可能的,当一个应用程序发送修改时,SQL Server会在缓冲区缓存中查找包含该数据的数据页,或者在插入的情况下,查找有足够空间容纳数据的页。如果该页不再缓存中,SQL Server会从磁盘读取页,然后将它放置在缓存中,并且在缓存中进行修改。同时,SQL Server把数据修改记录在磁盘的事务日志中。当页最初读入缓存时,他是一个干净的页,一旦事务修改了页,它就变脏了。   SQL Server会定期发出一个名为CHECKPOINT的事件,当这个事件发出时,缓存中的所有脏页都被写入到磁盘上的数据文件中。检查点的目的是为了减少存储在缓存中的页,最小化SQL Server从失败中恢复的时间:   www.2cto.com   BEGIN TRANSACTION 1 UPDATE... INSERT... UPDATE... COMMIT TRANSACTION 1   BEGIN TRANSACTION 2 INSERT... UPDATE...   ***CHECKPINT***   BEGIN TRANSACTION 3 DELETE... UPDATE... COMMIT TRANSACTION 3   BEGIN TRANSACTION 4 UPDATE... ***Server Power failure***     当SQL Server在电力故障重启时,它会读取事务日志查找最后一次发出的CHECKPOINT。从最后一个CHECKPOINT到日志开始的所有内容都已经安全写入磁盘。但是,CHECKPOINT之后的数据修改只记录在事务日志中。因为事务3成功提交,调用应用程序会被通知成功,并且希望看到所有提交的修改,因此,SQL Server会回滚整个事务3,将更改提交到磁盘。事务4也没有成功提交,也没有被写入磁盘,事务4的诗句修改将从事务日志中删除。 事务日志物理特征  www.2cto.com     事务日志是一种串行化的、顺序的、回绕的日志。当把数据修改写入日志时,他们会得到一个日志序列号LSN,由于事务日志记录越来越多,最终会被填满。如果已将事务日志设置为自动增长,那么SQL Server将分配额外的文件空间已容纳记录日志,直到达到事务日志的最大容量或者磁盘被填满。如果事务日志被填满,那么数据库将不会允许数据修改。   为了避免事务日志被填满,必须定期清理日志中的旧事务,首选的清除方式是备份事务日志。默认情况下,一旦事务日志成功备份,SQL Server会清楚事务日志的不活动部分,这个不活动的部分包括最早打开的LSN到最新的LSN。可以手动清除不活动的部分,但是不推荐,因为这样会删除上次数据库备份以来的所有数据修改记录。   因此,事务日志是一个回绕文件,一旦到达了物理日志的末尾,SQL Server将绕回并在物理日志的开头继续写当前逻辑日志。
------分隔线----------------------------