我需要镜像一些数据库并在它们上使用透明数据加密(TDE),因为我们的数据必须在“静止”时加密。
我在主体和镜像上都设置了 TDE。我在设置两个数据库的镜像时遇到的问题。由于我使用的是 TDE,我不知道通过 gui 设置镜像的方法,所以我不得不使用 t-sql 来完成工作。
下面是我在镜像服务器上使用的代码
--Restore the full backup to the mirrored mdf and ldf
OPEN MASTER KEY DECRYPTION BY PASSWORD = '1Password'
RESTORE DATABASE TDE
FROM disk = '\\SERVERNAME\SQL_Stuff\Backup\TDE_FULL.bak'
WITH NORECOVERY,
REPLACE,
MOVE 'TDE' TO 'E:\TDE.mdf',
REPLACE,
MOVE 'TDE_log' TO 'G:\TDE.ldf'
CLOSE MASTER KEY
GO
--Restore the log backup to the mirrored db
OPEN MASTER KEY DECRYPTION BY PASSWORD = '1Password'
RESTORE LOG TDE
FROM DISK = '\\SERVERNAME\SQL_Stuff\Backup\TDE_LOG.trn'
WITH NORECOVERY;
CLOSE MASTER KEY …Run Code Online (Sandbox Code Playgroud) 我必须为我的数据库运行相当多的长时间运行的查询(重建索引、更新大量数据)。是否有替代方法可以在 SQL Server Management Studio 中运行查询并每隔一小时左右检查一次?我想在完成后通过电子邮件或发送消息,但不知道最好的工具。
我必须使用索引视图来达到性能。正如我从这个比较表中看到的,标准版不支持索引视图。但是 BOL 说:
可以在任何版本的 SQL Server 中创建索引视图。在 SQL Server Enterprise 中,查询优化器会自动考虑索引视图。要在所有其他版本中使用索引视图,必须使用 NOEXPAND 表提示。
那么它会起作用吗(我说的是性能)
select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 标准版上以及它的工作原理
select * from dbo.OrderTotals
Run Code Online (Sandbox Code Playgroud)
在企业版上?
这是查看代码:
CREATE VIEW dbo.OrderTotals
WITH SCHEMABINDING
AS
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price * r.Quantity)
, XCount = COUNT_BIG(*)
from dbo.Order r
group by r.OrderId
CREATE UNIQUE CLUSTERED INDEX IXCU_OrderTotals ON OrderTotals (OrderId)
Run Code Online (Sandbox Code Playgroud) 我们正在将我们的数据库迁移到新模式,但想要验证数据是否已正确移动。
如果模式相同,传统的数据比较工具可以比较两个数据库的差异。在我们的例子中,表设计发生了变化,但旧模式中的所有数据都在新模式中,只是稍微移动了一下,我需要确保它是正确的。我们有数千万行,因此手动检查不是一种选择。
是否有任何工具可以帮助进行此类比较?
如果没有,是否有任何库/框架可以帮助启动自定义解决方案的开发?
如有必要,我很乐意使用特定于数据库的解决方案,在这种情况下用于 SQL Server 2008。
我的解决方案:我通过VIEW在旧数据库上创建一个与新数据库表具有相同字段的每个表来比较两个数据集。
然后,我使用此处描述的技术比较数据:在 SQL Server 中比较两个表的最短、最快和最简单的方法:UNION!
我在这次迁移中很幸运,因为整体表结构类似于旧数据库,字段从一个表移动到另一个表,删除或添加。在删除和添加的情况下,没有什么可比较的,对于已移动或聚合的字段,我会在视图中进行计算以提供正确的信息进行比较。
该UNION比较显示我只能用不同的行,所以只要数据是正确的,我得到一个空的结果集。
我有一个可容纳 100.000 名玩家的高分表,每天插入 2 次,每个玩家一条记录。在一天结束时,该表中索引的索引碎片为 99%。有没有办法通过调整设置来防止这种情况?
CREATE TABLE HighScore(
[id] [int] IDENTITY(1,1) NOT NULL,
[user] [int] NULL,
[player] [int] NULL,
[round] [tinyint] NULL,
[group] [int] NULL,
[rank] [int] NULL,
[delta] [int] NULL,
[roundpoints] [int] NULL,
[totalpoints] [int] NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [HighScore_RoundGroup_Nidx] ON .[HighScore]
(
[round] ASC,
[group] ASC
)WITH …Run Code Online (Sandbox Code Playgroud) MSDN 说实数的范围是 - 3.40E + 38 到 -1.18E - 38, 0 和 1.18E - 38 到 3.40E + 38。显然真正的下限要低得多。以下脚本使用 1.401298E-45 填充 REAL 列:
CREATE TABLE a
(
r1 REAL NULL ,
r2 REAL NULL ,
r3 REAL NULL
) ;
GO
INSERT INTO a
( r1, r2 )
VALUES ( 1.18E-37, 10 ) ;
GO
DECLARE @i INT ;
SET @i = 1 ;
WHILE @i < 20
BEGIN ;
UPDATE a
SET r1 = r1 / r2 ; …Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server sql-server-2008-r2 data-integrity
我刚刚开始了解 SQL Server 上的内存使用情况。在问题SQL Server 2008 R2“Ghost Memory”的答案中使用查询时?,我发现单个数据库占用了缓冲池中的大部分空间。进一步看,使用sys.allocation_units和sys.indexes,我确认这可能是由于大量使用数据库中的索引造成的。大多数索引都是聚集的。
另一位数据库开发人员认为我们在服务器上存在内存问题 - 由于没有可用内存,查询开始运行很长时间。
我的问题是 - 这些索引的使用以及它们在缓冲池中的存在是否会占用其他进程可用的内存?
我需要更新单个表中的 1 亿条记录,实际上,通过用简单的 ID 替换列的 varchar 值来规范化表。(我说的是“替换”,但实际上我是将 ID 写入另一列。)
我想要实现的是规范化数据集。尚未标准化的数据没有索引。我的想法是我不会在原始值上构建索引,而是等待,而是索引将在更新完成后用 tinyint 值替换 varchar 值的外键。
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
Run Code Online (Sandbox Code Playgroud)
背景
执行期间的资源
我怀疑一些事情,比如我需要原始数据的索引,即使我会在规范化更新后删除列 (AutoClassName)。我还想知道我是否应该一次循环一条记录而不是 JOIN,这在我开始时看起来很荒谬,但现在看来会更快。
我应该如何更快地更改剩余标准化更新(类似于此更新)的方法?
因此,托管我们的 SQL Server 的公司似乎在从生产服务器到备份服务器的复制方面遇到了一些麻烦……不过我相信有些表已经正确复制了。每天(下班后)进行复制。
有没有办法可以比较 2 个相同的表,1 个来自备份,1 个来自生产服务器,看看昨晚的复制是否有效?
我能找到的唯一方法是在两台服务器上运行以下查询并查看结果是否匹配,这“可能”意味着 2 个表包含相同的信息。
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM (
SELECT *
FROM table_to_compare
) t1
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,似乎该表确实复制成功,因为校验和值相同,但我不确定这种方法有多可靠。
有谁知道更好的方法来检查这个或者这是否是一个好方法?
我在 Windows Server 2008 计算机上运行 SQL Server 2008。
谢谢。
我希望能够预测 DELETE 是否会违反约束,而无需实际执行删除。
我有什么选择来做这件事?有没有一种简单的方法可以对 DELETE 进行“试运行”?
sql-server-2008 ×10
sql-server ×6
index ×1
mirroring ×1
performance ×1
query ×1
t-sql ×1
tools ×1
view ×1