标签: sql-server

无法镜像数据库 SQL Server 2012

尝试使用以下命令镜像数据库时

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

消息 1475,级别 16,状态 105,第 1 行
数据库“test0916aj8CJ”可能包含尚未备份的批量记录更改。在主体数据库或主数据库上进行日志备份。然后在镜像数据库上还原此备份以启用数据库镜像,或在每个辅助数据库上还原此备份以使其能够加入可用性组。

这可以在不支持数据库的情况下完成吗?或者我应该备份然后丢弃备份。它用于新创建的数据库,因此此时我不需要备份。

我尝试了以下...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = N’NUL’
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = N’test-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO
Run Code Online (Sandbox Code Playgroud)

但上述方法也不起作用。

谢谢

sql-server t-sql alter-database

11
推荐指数
2
解决办法
4705
查看次数

在非常繁忙的表上创建索引

我们有一张桌子,insert\select每次都有很多(比如每秒有 100 台机器插入\更新)。

在不能被锁定的表上创建索引的最佳方法是什么?

如果我创建索引,我确定它会锁定请求,而我做不到。

这是一个有 100 万行+的大表。

index sql-server sql-server-2008-r2

11
推荐指数
1
解决办法
1455
查看次数

用 XQuery 替换 SQL Server 中强类型 xml 元素的值

给定一个在 XML 模式集合中定义的元素,如下所示:

<xsd:element name="xid">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="32" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

您将如何使用 XQuery 更新元素?

该元素位于架构集合的ns命名空间中。我一直在尝试更新以下查询的元素:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793" cast as element(ns{http://www.anon.com}:xid,#anonymous) ?') 
 where id = 11793
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

消息 9301,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:在此版本的服务器中,“cast as”不可用。请使用“演员为?” 句法。

如果我完全删除演员表并使用此查询:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793"') 
 where id = 11793
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

消息 2247,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:该值的类型为“xs:string”,它不是预期类型“<anonymous>”的子类型。

如果我发出这个查询: …

xml sql-server sql-server-2008-r2 xquery

11
推荐指数
1
解决办法
1934
查看次数

SQL Server 中的“截断登录检查点”选项

说来话长,但我们的长期顾问(前雇员)在几年前(2006 年左右)编写了一个自定义脚本来与 Tivoli Storage Manager 交互,它似乎正在检查名为truncate log on checkpoint. 他们声称它阻止脚本在 SQL 2012 实例上运行和执行备份。

我觉得这完全是废话,因为我找不到任何这样的选项,sp_configure而且备份在任何地方都可以工作,只有一个实例。但是,我想移除地雷,如果是这样的话,并移除其他过时的元素。我确实让他们与供应商核实,但我对他们所说的任何事情都没有高度的信心。

我所做的研究几乎没有得到更多的回报,它可能是 SQL 2000 或 Sybase 选项的一个选项。另一种说法是,当恢复模型是SIMPLE并且没有显式选项打开或关闭它时,它在更高版本(2008 及更高版本)上被隐式调用/使用。

由于TRUNCATE LOG如今事务日志的工作方式,该命令已过时,因此我认为此时甚至无法查询该选项。

由于我没有任何 SQL Server 2000 实例,我希望有人能回忆起这个,或者可以在他们周围的一个实例上检查它。我已经告诉他们,我没有什么可以推荐的。我也希望有人可以确认这已经过时了。

sql-server transaction sql-server-2012 checkpoint log

11
推荐指数
1
解决办法
9764
查看次数

基数估计不佳会使 INSERT 不符合最少日志记录吗?

为什么第二个INSERT语句比第一个语句慢 5 倍?

从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,数据加载性能指南中的文档指出两个插入都应该能够被最低限度地记录。因此,如果最小日志记录是关键性能差异,为什么第二个查询不符合最小日志记录?可以做些什么来改善这种情况?


查询 #1:使用 INSERT...WITH (TABLOCK) 插入 5MM 行

考虑以下查询,该查询将 5MM 行插入到堆中。此查询在 中执行1 second并生成64MB由 报告的事务日志数据sys.dm_tran_database_transactions

CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL)
GO
INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n)
SELECT n
-- Any table/view/sub-query that correctly estimates that it will generate 5MM rows
FROM dbo.fiveMillionNumbers
-- Provides greater consistency on my laptop, where other processes are running
OPTION (MAXDOP 1)
GO
Run Code Online (Sandbox Code Playgroud)


查询 #2:插入相同的数据,但 SQL 低估了行数

现在考虑这个非常相似的查询,它对完全相同的数据进行操作,但碰巧从SELECT基数估计太低的表(或在我的实际生产案例中具有许多连接的复杂语句)中提取。此查询在事务日志数据中执行 …

performance sql-server insert transaction-log sql-server-2014

11
推荐指数
2
解决办法
353
查看次数

修改 XML:将属性转换为元素

我有一XML列包含具有类似结构的数据:

<Root>
    <Elements>
        <Element Code="1" Value="aaa"></Element>
        <Element Code="2" Value="bbb"></Element>
        <Element Code="3" Value="ccc"></Element>
    </Elements>
</Root>
Run Code Online (Sandbox Code Playgroud)

如何使用 SQL Server 修改数据以将每个Value属性更改为元素?

<Root>
    <Elements>
        <Element Code="1">
            <Value>aaa</Value>
        </Element>
        <Element Code="2">
            <Value>bbb</Value>
        </Element>
        <Element Code="3">
            <Value>ccc</Value>
        </Element>
    </Elements>
</Root>
Run Code Online (Sandbox Code Playgroud)

更新:

我的 XML 看起来更像这样:

<Root attr1="val1" attr2="val2">
    <Elements>
        <Element Code="1" Value="aaa" ExtraData="extra" />
        <Element Code="2" Value="bbb" ExtraData="extra" />
        <Element Code="3" Value="ccc" ExtraData="extra" />
        <Element Code="4" Value="" ExtraData="extra" />
        <Element Code="5" ExtraData="extra" />
    </Elements>
    <ExtraData>
       <!-- Some XML is here -->
    </ExtraData>
</Root> …
Run Code Online (Sandbox Code Playgroud)

xml sql-server xquery

11
推荐指数
2
解决办法
3290
查看次数

无论我尝试什么,都无法让 SQLCMD 工作

无论我做什么,我都无法让 SQLCMD 工作。我正在尝试运行一个大小为 200mb+ 的脚本,并且无法从 sql server 应用程序运行,因此我需要通过 SQLCMD 执行此操作,但是每当我尝试登录或运行脚本时,它都会立即关闭。

我已经通过 msdn 关注了 sqlcmd 实用程序。

我试图通过可信命令 SQLCMD -EI get 来打开它:

Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Named Pipes Provider: Could not open a connection to SQL Server [2]. .
Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login timeout expired.
Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012

11
推荐指数
1
解决办法
3万
查看次数

为什么 SQL Server 有 900 字节的索引大小限制

为什么我们不能创建大小大于 900 字节的索引?这个问题是在一场没有人回答的演讲中提出的。

我可以想到这个方法来回答这个问题。

页面大小为 8K,可用 8060 900 字节 * 8 = 7200 字节(900*9 = 8100),因此页面中最多只能容纳 8 条记录。如果该索引是非聚集索引,则还需要存储聚集索引键,该索引键可以再次为 900 字节长,即对于单个记录所需的内存为(900 + 900 字节),即每页可以存储 4 条记录。

如果页面中只能存储 4 条记录,与性能提升相比,IO 操作开销将无效,因此索引大小限制为 900 字节。

index sql-server clustered-index

11
推荐指数
1
解决办法
9825
查看次数

sys.dm_exec_sessions 中的“读取”列实际上表示什么?

这似乎是一个非常基本的问题,而且确实应该如此。然而,作为科学方法的粉丝,我喜欢创建一个假设,然后测试它是否正确。在这种情况下,我试图更好地理解 的输出sys.dm_exec_sessions,更具体地说,是单列“读取”。

SQL Server 联机丛书相当干巴巴地将其指定为:

在此会话期间,由此会话中的请求执行的读取数。不可为空。

人们可能会认为这将表示自会话开始以来为满足此会话发出的请求而从磁盘读取的页数。这是我想我要检验的假设。

logical_reads同一个表中的列定义为:

已对会话执行的逻辑读取数。不可为空。

根据使用 SQL Server 的经验,我相信该列反映了从磁盘内存中读取的页数。换句话说,页面的总数曾经由会话,无论这些页面驻留阅读。具有提供类似信息的两个单独列的区别或价值主张似乎是可以理解从磁盘读取的页面 ( reads) 与从缓冲区缓存 ( logical_reads)读取的特定会话的页面的比率。

在我的测试设备上,我创建了一个新数据库,创建了一个包含已知数据页数的单个表,然后在新会话中读取该表。然后我sys.dm_exec_sessions查看了readslogical_reads专栏对会议的看法。在这一点上,我对结果感到困惑。也许这里有人可以为我解释一下。

试验台:

USE master;
IF EXISTS (SELECT 1
    FROM sys.databases d 
    WHERE d.name = 'TestReads')
BEGIN
    ALTER DATABASE TestReads SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE TestReads;
END
GO
CREATE DATABASE TestReads;
GO
ALTER DATABASE TestReads SET RECOVERY SIMPLE;
BACKUP DATABASE …
Run Code Online (Sandbox Code Playgroud)

sql-server dmv sql-server-2012

11
推荐指数
1
解决办法
1239
查看次数

将旧数据设为只读

在我目前正在处理的数据库项目中,要求在某个时间点将“旧”数据更改为只读。这在 SQL Server 中可能吗?

我无法更改表权限,因为只读权限应仅适用于早于某个阈值的数据,即用户仍应能够添加和编辑在此时间点之后添加的数据。

sql-server

11
推荐指数
1
解决办法
378
查看次数