sqlserver快照读,sql server快照
SQLServer怎么读
很多数据库的专家就读
成都创新互联公司网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了网站建设、成都做网站,成都网站设计,广告投放,成都做网站选成都创新互联公司,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。
C扩儿
/'si:kul/
本人一直念“西口”,“C扣”
也有些人念“色扣”
但是请不要三个字母念:S—Q—L,这样是错的,会被业内人笑的。
SQLServer
[sikəu
'sə:və]
mssql数据库占用CPU过高?
CPU占用过高诊断思路
mpstat -P ALL 1,查看cpu使用情况,主要消耗在sys即os系统调用上
perf top,cpu主要消耗在_spin_lock
生成perf report查看详细情况
CPU主要消耗在mutex争用上,说明有锁热点。
采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上。
Pstack提供更详细的API调用栈
Innodb在读取数据记录时的API路径为
row_search_for_mysql --》row_vers_build_for_consistent_read --》mem_heap_create_block_func --》mem_area_alloc --》malloc --》 _L_unlock_10151 --》__lll_unlock_wait_private
row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free。
而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存。
Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点。
当多条 SQL 并发执行时,会最终触发os层面的spinlock,导致上述情形。
解决方案
将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用。
修改my.cnf,添加如下参数并重启
[mysqld_safe]malloc-lib=tcmalloc
上周五早上7点执行的操作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形。
以下是修改前后cpu使用率对比
SQLServer快照功能以及其查询如何操作
SQLServer数据库的快照只能通过SQL语句创建,以msdb数据库为例进行说明:
1、执行以下代码,看看MSDB数据库有多少数据文件
EXEC SP_HELPDB msdb
2、为每一个数据文件创建快照,代码如下:
create database snap_MSDBData_1811221202
ON ( NAME = MSDBData, FILENAME= 'D:\userdata\temp\Snap_MSDBData.snap')
AS SNAPSHOT OF MSDB
3、在“数据库快照”那里就可以看到刚刚创建snap_MSDBData_1811221202这个快照了,对比一下快照和原库,内容是一样的
4、数据库快照其实也是一个数据库,可以在上面执行任何SQL语句,我们执行一个查询语句看看效果
SELECT * FROM [MSDB].[dbo].[MSdbms]
SELECT * FROM [snap_MSDBData_1811221202].[dbo].[MSdbms]
查询结果是完全一样的。
(如有帮助,请采纳,谢谢)
如何利用SQL Server数据库快照形成报表
在SQL Server 2005中,它的另外一个强大的新特点是数据库快照。数据库快照是一个数据库的只读副本,它是数据库所有数据的映射,由快照被执行的时间点来决定它的内容。
这些数据库快照在报表方面是非常有价值,因为在快照数据库中或者在原数据库中,对于任何查询而言没有锁就将被执行。快照也可以使用在灾难恢复中,因为你可以将现有的数据恢复到现有的快照中,或者还可以在有害数据操作声明的事件中存储个别必要的表和数据。
数据库快照是如何工作的?
可以使用典型的数据库命令CREATE DATABASE语句来生成一个数据库快照,在声明中有一个源数据库快照的附加说明。当快照被建立时,同时生成一个稀疏文件。这个文件(只能使用在NTFS卷中)在初始化的时候并没有磁盘空间分配给它——尽管你可能在WINDOWS资源管理器中看到了文件的大小,它会看上去与原始的源数据库文件的大小相同。对磁盘来说其实这个文件的大小接近于零。
数据库快照在初始化时读的数据文件是来自于源数据库的。当源数据库的数据发生变化时,数据引擎就会将原始数据从源数据库拷贝到快照数据库中。这个技术确保快照数据库只反映快照被执行时数据的状态。当SELECT命令被用来发布反对数据库快照时,不管数据页的读取是否被定位在源数据库数据文件中还是在快照数据库数据文件中都是没有锁被发布的。因为在只读数据库快照中是没有锁被发布,数据库快照对于报表解决方案是一个重要的解决方案。
一个快照的实例
现在,让我们来看看数据库快照在SQL Server 2005中是如何工作的。为此,首先我需要一个源数据库作为快照的来源。下面的脚本将创建一个源数据库:
以下为引用的内容:
USE master
GO
IF EXISTS(SELECT name from sysdatabases where [name] = 'SourceDatabase')
DROP DATABASE SourceDatabase
GO
CREATE DATABASE SourceDatabaseON PRIMARY
(
NAME = SourceDatabase_Data,
FILENAME = 'C:SQLServerSourceDatabase_Data.mdf'
) LOG ON
(
NAME = SourceDatabase_Log,
FILENAME = 'C:SQLServerSourceDatabase_Log.ldf'
)
GO
注意这里产品区域的大小。我定义它的大小为CHAR(150)来强调数据文件的增长级数,这样在我接下来的实例中将更容易解释清楚快照是如何工作的。
现在既然我已经有了一个源数据库,现在我装载一些数据来扩展数据文件的大小位。如此,使用列表1中的脚本来创建销售历史表。
以下为引用的内容:
USE SourceDatabase
GO
IF OBJECT_ID('SalesHistory')0 DROP TABLE SalesHistory
GO
CREATE TABLE SalesHistory
( SaleID INT IDENTITY(1,1),
Product CHAR(150), SaleDate DATETIME,
SalePrice MONEY
)
DECLARE @i INT
SET @i = 1
WHILE (@i =10000)
BEGIN INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('Computer', DATEADD(mm, @i, '3/11/1919'),
DATEPART(ms, GETDATE()) + (@i + 57) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('BigScreen', DATEADD(mm, @i, '3/11/1927'),
DATEPART(ms, GETDATE()) + (@i + 13) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice)
VALUES ('PoolTable', DATEADD(mm, @i, '3/11/1908'),
DATEPART(ms, GETDATE()) + (@i + 29) )
SET @i = @i + 1
END
GO
sqlserver快照复制报错,错误号:mssql_repl20052
1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称 2、查询SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id Where (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties')) 3、在Sql查询分析器,还有一个简单的查询方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'" 执行完之后,就可以看到数据库中所有用户表的信息 4、查询总存储过程数:select count(*) 总存储过程数 from sysobjects where xtype='p' 附:xtype类型D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束L = 日志FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程S = 系统表TF = 表函数
TR = 触发器U = 用户表UQ = UNIQUE 约束(类型是 K)V = 视图X = 扩展存储过程 另:在sqlserver中取得某个数据库中所有表名的sql语句 select sysobjects.name from sysobjects.xtype ='U';SELECT name
WHERE (xtype = 'U') 在数据库的sysobjects表里有这个数据库全部表的信息, xtype值为'U'的就是表名 注意:一般通过上述方法获得全部用户表示都会有一个dtproperties表,SQLSERVER 默认它也是用户表,想要从用户表中排出,需要加上限定条件 status0,即:select * from sysobjects where xtype='U' and status0
sqlserver with snapshot 有什么作用
数据库快照为你现有的数据库创建了一个数据库的壳,然后无论何时当数据页被修改的时候,改变也同时被写入稀疏文件(sparse file)当中。当人们获取数据的时候,数据中没有变化的部分是从原始数据库中得到的,而改变的部分则是从稀疏文件中获得。
稀疏文件和数据库快照
当数据库快照被创建的时候,第一次的创建是十分迅速的。因为实际上只是创建了一个用来记录被修改文件的壳。随着时间的推移,文件不断的被修改,这些修改页都将被写进稀疏文件。你的主数据库中修改的文件越多,就有越多的文件被写入稀疏文件。因此,有越来越多的磁盘空间被用来保存你的主数据库和快照的数据库,也增加了你服务器的磁盘输入输出的次数。
稀疏文件被写入大小为64KB的分组块当中。每一个分组块增量能包含8个大小为8KB的数据页。所以,每次在你的主数据库中有任何的数据改变,都会先把数据页拷贝到稀疏文件当中,然后再将主数据库中文件的变化写入稀疏文件。一旦数据页被写入稀疏文件,他们就不再需要被写出来。因为页面的全部内容被保护起来,让其处于当快照建立时的状态。
为了实现优化磁盘并消除磁盘冲突,在主数据库以外的独立的驱动器和阵列中创建稀疏文件是一个明知之举。原因有二:
其一,当快照被建立的时候,没有数据被写入稀疏文件。从快照进行的所有的数据访问实际上都是在主数据库文件当中的。随着时间的推移,你会通过在不同的阵列和磁盘上从主文件数据库读取未被修改过的文件和从稀疏文件读取修改过的数据的方法来减少输入输出的负担。
其二,根据你数据库数据的易变动性和数据变化的数量,你可以通过将在主数据库的读取工作和稀疏文件的写入工作分离来减少输入输出的瓶颈大小。
使用数据库快照
在这里你一定要记住的事情就是,你的查询请求访问的依然是你的主数据库。当初始的快照被建立的时候,其实仅建立了一个空的壳子。所有的数据请求都是在主数据库文件中被完成的。随着时间的流逝和文件不断地被修改,就有一些数据请求从初始的数据库文件中分离出来指向了稀疏文件。所以,尽管看上去它是一个独立的数据库,那些根本的数据仍然是源于主数据库。
鉴于此,你需要确定不要试图去进行你日常活动范围以外的查询。这样说吧,你创建了一个快照,接着你进行了读写的操作,并对每个人做了记录。当那些记录被执行查询操作时,他们仍然继续影响着主数据库。所以你要保证任何新的活动都不会影响主数据的活动。
另外,你需要记住到底有哪些数据是被写入稀疏文件里的,而不是认为所有可能的数据都被写进了稀疏文件。基本上,当快照被创立时,主数据库的大小就是快照稀疏文件的潜在大小。如果稀疏文件中的数据量已经达到甚至超过数据库的一半时,也许再创造一个数据库的完整拷贝来取代现有的快照是一个更好的主意。
综上所述,我认为,数据库快照是一个非常新的功能。我也希望在SQL Server2005的所有版本,而不仅仅在企业版和开发版中可以应用这个功能。有一个没有讨论的地方就是我们没有讨论有关对数据库镜像使用快照。其实,无论是镜像还是原数据库,快照都给了你最好的方法。因为镜像是离线的,你并不能访问那些数据,所以说无论是镜像还是原数据库,它都给了你最好的方法。花一些时间去理解快照是如何应用于你的环境中的,并且确认你监视着维护快照的影响以及通过快照进行的数据存储。
当前文章:sqlserver快照读,sql server快照
分享链接:http://cdiso.cn/article/dsdjioe.html