在还原 SQL Server 数据库方面,有人有任何提示和技巧吗?
我最近将 .bak 从一台服务器/实例恢复到另一台,在两台服务器/实例上都使用 SQL Server 2005,并且遇到了以下问题(到目前为止):
所有身份插入值都重置为其原始值(在我的情况下为 1)。直到我找到以下命令来遍历所有表并将其重新设定为当前值 + 1 之前,我感到很痛苦:
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED)'
Run Code Online (Sandbox Code Playgroud)
权限不见了。数据库级帐户当然过来了(连同他们的角色分配),但是每个角色的大部分数据库权限都消失了……这意味着每个表、视图和存储过程都缺少读取、插入、删除、执行等权限. 我写了一些像下面这样的脚本来纠正,但仍然很痛苦。
select 'GRANT SELECT ON ' + TABLE_NAME + ' TO rolename' from Information_schema.tables
Run Code Online (Sandbox Code Playgroud)
如果恢复到新实例,显然不存在实例级别的权限……但这有点痛苦,因为如果该帐户已存在于数据库级别,您似乎无法重新创建实例级别的帐户。这里最好的方法是什么?就我而言,我删除了数据库帐户,创建了实例,然后使用上述脚本授予了权限。
一般来说,我只是对一些最佳实践感到好奇,当涉及到恢复 SQL Server 数据库......和/或以某种方式避免我遇到的问题的提示时。我只是想为尽可能无错误的恢复铺平道路。
故事:每周一次,我们运行一个特殊的维护计划,其中涉及重新索引 2 个关键表,它们之间有大约 600 万条记录。我们使用 SQL Server 2005 标准版。
问题:在此重新索引期间(大约 15 分钟的操作),我们无法将数据插入表中,并且我们的客户端没有数据。
有人告诉我,SQL Server 2008 Enterprise 有一个“在线重新索引”,它在较低版本的 SQL Server 中不存在,可以解决我们的问题。
但是,我刚刚在我们的维护计划选项(SQL 2005 标准)中找到了以下选项:

我的问题:这是否执行与 2008 Enterprise 相同的“在线重新索引”?启用此选项的影响(性能方面)是什么?我是否几乎被不必要地吸引购买了 2008 Enterprise 许可证?
我的一个存储过程的执行时间很长(平均大约 4 到 7 分钟)。我想让它运行得更快。
我正在查看执行计划,有两件事占了大部分成本。第一个代表成本的 68%,其中一个主表的“聚集索引扫描”用于报告。该表有两列的主键和 2.000.000 条记录。
第二个最苛刻的任务代表了“合并连接”(左外连接)成本的 26% 。这是我上面提到的通过外键连接到上表中两列主键之一的表。
我检查了这些表的索引物理统计和索引状况良好。
我该怎么做才能提高此存储过程的性能?我需要在这些表上创建新索引吗?将set transaction isolation level read uncommitted声明有助于提高性能?
当我插入具有聚集索引视图的表时,估计的执行计划似乎并行执行表插入和视图的聚集索引插入操作。
下面是一个有点人为的例子。
/*
DROP INDEX [IX__AView] ON [dbo].[_AView]
DROP VIEW _AView
DROP TABLE _A
*/
CREATE TABLE _A (Name VARCHAR(10) NOT NULL)
GO
CREATE VIEW _AView WITH SCHEMABINDING AS
SELECT Name FROM [dbo]._A
GO
CREATE UNIQUE CLUSTERED INDEX [IX__AView] ON [dbo].[_AView] ([Name] ASC)
GO
/*
--run the estimated execution on this
INSERT INTO _A (Name) values ('cheese')
*/
Run Code Online (Sandbox Code Playgroud)

有没有办法找出谁在 SQL Server 2005 中删除了数据库以及删除它的时间/日期?
我希望使用完整、差异和日志传送来优化我们的 SQL 备份。目前,我只在晚上执行一次完整备份。这个过程需要很长时间,以至于它在工作日的大部分时间里都在运行。由于我们希望使用备用服务器进行报告,因此这并不理想。
我想提高我们的备份速度,但同时让事情变得更可靠一些。使用上述 3 种方法实现此目的的最佳方法是什么?每周一次完整备份,每天一次差异备份,每 15-30 分钟发送一次日志?
我应该在这里考虑什么?(对不起,这有点含糊,只是想获得一些输入)
我正在使用 SQL Server 2005
我有几个不同的实例(SQL 2000、2005),它们的索引放在一个单独的文件组中。我是否需要确保备份该组,还是会通过恢复数据库来重建它?
简而言之,我们有几个数据库在两个故障转移实例之间同步。主要包含映射到数据库中用户的登录名,并且一切都很正常。但是,我没有意识到服务器登录不会在故障转移实例之间同步,因此当故障转移到备份时,没有人可以登录。关键是虽然我可以在备份上创建登录,但我不能t 将登录作为用户映射到数据库,因为具有该名称的数据库用户已经存在,并且登录不会使用现有用户,因此登录仍然失败,因为登录没有连接到数据库的权限。
我认为我必须做的是修改备份的主数据库中的登录名,使其与主数据库的登录名具有相同的 GUID,并在备份端手动创建登录名和用户之间的链接,从而“欺骗”备份实例认为在主服务器上创建的用户也是它自己的映射登录名。然而,我不知道我将如何去做这件事,而且我们在这个问题上遇到了足够多的麻烦,而我却没有为此烦恼。
帮助?
create table t
(
id int,
id1 int
)
create index Example_Index
On t(id,id1)
create index Example1_Index
On t(id1,id)
Run Code Online (Sandbox Code Playgroud)
insert into t(id, id1)values(1, 100)
insert into t(id, id1)values(1, 101)
insert into t(id, id1)values(2, 103)
insert into t(id, id1)values(1, 104)
insert into t(id, id1)values(3, 105)
insert into t(id, id1)values(1, 106)
insert into t(id, id1)values(2, 107)
insert into t(id, id1)values(3, 108)
Run Code Online (Sandbox Code Playgroud)
SQL查询- select * from t Where id = 107 -用途Example_Index
SQL查询- select * from t Where …
performance index sql-server-2005 sql-server-2008 sql-server query-performance
我有一张桌子叫 STUDENT
+-----------+-----------+-----------+---------------+
| StudentID | FirstName | LastName | EnrollmenDate |
+-----------+-----------+-----------+---------------+
| 1 | x | x | x |
| 2 | x | x | x |
| 3 | x | x | x |
+-----------+-----------+-----------+---------------+
Run Code Online (Sandbox Code Playgroud)
写一个查询,拉出最后注册的学生?
a) 按 EnrollmentDate Desc 从 STUDENTorder 中选择前 1 *
或者
b) select * from STUDENT where EnrollmentDate = (select Max(EnrollmentDate) from STUDENT)
面试的时候一般会问这个问题。一位候选人回答 b) 我期待 a)。哪个更好查询?
performance sql-server-2005 sql-server query query-performance
sql-server-2005 ×10
sql-server ×7
index ×3
performance ×3
backup ×2
failover ×1
log-shipping ×1
query ×1
restore ×1
security ×1