我在 SQL Server 2000 上遇到了三个旧数据库,我需要将其迁移到 2012 年。我相信标准方法是恢复到 2005 年或 2008 年的实例,更新、重新导出并最终恢复到 2012 年。
很好,除了我们没有 2005 或 2008 实例可用。
是否有任何可能值得尝试的变通方法或其他方法?
作为参考,数据库只包含 15-20 个表和几个视图,它们看起来非常简单,备份大小只有 100-200MB。
sql-server migration sql-server-2000 restore sql-server-2012
为什么没有全扫描(在 SQL 2008 R2 和 2012 上)?
测试数据:
DROP TABLE dbo.TestTable
GO
CREATE TABLE dbo.TestTable
(
TestTableID INT IDENTITY PRIMARY KEY,
VeryRandomText VarChar(50),
VeryRandomText2 VarChar(50)
)
Go
Set NoCount ON
Declare @i int
Set @i = 0
While @i < 10000
Begin
Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2)
Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50)));
Set @i = @i + 1;
End
Go
CREATE Index IX_VeryRandomText On dbo.TestTable
(
VeryRandomText
)
Go
Run Code Online (Sandbox Code Playgroud)
执行查询时:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad …Run Code Online (Sandbox Code Playgroud) performance sql-server sql-server-2008-r2 sql-server-2012 query-performance
表Client字段上有一个聚集索引LastName。
当我简单地从表中转储所有记录时,它们会按字母顺序出现,除非(nolock)在相关查询中使用了提示。该提示会更改记录的顺序。应该是?。我很肯定没有其他会话有更改该表的开放事务(至少sp_who2没有向我显示任何内容)。
如何解释顺序上的差异?
从评论中提取的其他信息:
没有顺序。非聚集索引是否应该强制执行顺序?
即使使用指定聚集索引的索引提示,查询仍然返回不同的顺序。他们应该吗?我想知道为什么nolock在没有明显改变计划的情况下更改返回记录的顺序。
我对它们做了一个 WinDiff - 除了 [the] (nolock)[query hint]之外相同。
说来话长,但我们的长期顾问(前雇员)在几年前(2006 年左右)编写了一个自定义脚本来与 Tivoli Storage Manager 交互,它似乎正在检查名为truncate log on checkpoint. 他们声称它阻止脚本在 SQL 2012 实例上运行和执行备份。
我觉得这完全是废话,因为我找不到任何这样的选项,sp_configure而且备份在任何地方都可以工作,只有一个实例。但是,我想移除地雷,如果是这样的话,并移除其他过时的元素。我确实让他们与供应商核实,但我对他们所说的任何事情都没有高度的信心。
我所做的研究几乎没有得到更多的回报,它可能是 SQL 2000 或 Sybase 选项的一个选项。另一种说法是,当恢复模型是SIMPLE并且没有显式选项打开或关闭它时,它在更高版本(2008 及更高版本)上被隐式调用/使用。
由于TRUNCATE LOG如今事务日志的工作方式,该命令已过时,因此我认为此时甚至无法查询该选项。
由于我没有任何 SQL Server 2000 实例,我希望有人能回忆起这个,或者可以在他们周围的一个实例上检查它。我已经告诉他们,我没有什么可以推荐的。我也希望有人可以确认这已经过时了。
无论我做什么,我都无法让 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) 这似乎是一个非常基本的问题,而且确实应该如此。然而,作为科学方法的粉丝,我喜欢创建一个假设,然后测试它是否正确。在这种情况下,我试图更好地理解 的输出sys.dm_exec_sessions,更具体地说,是单列“读取”。
SQL Server 联机丛书相当干巴巴地将其指定为:
在此会话期间,由此会话中的请求执行的读取数。不可为空。
人们可能会认为这将表示自会话开始以来为满足此会话发出的请求而从磁盘读取的页数。这是我想我要检验的假设。
logical_reads同一个表中的列定义为:
已对会话执行的逻辑读取数。不可为空。
根据使用 SQL Server 的经验,我相信该列反映了从磁盘和内存中读取的页数。换句话说,页面的总数曾经由会话,无论这些页面驻留阅读。具有提供类似信息的两个单独列的区别或价值主张似乎是可以理解从磁盘读取的页面 ( reads) 与从缓冲区缓存 ( logical_reads)读取的特定会话的页面的比率。
在我的测试设备上,我创建了一个新数据库,创建了一个包含已知数据页数的单个表,然后在新会话中读取该表。然后我sys.dm_exec_sessions查看了reads和logical_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 代理作业,它运行一个 Robocopy 脚本来将所有文件从一个文件夹移动到另一个文件夹。
有一个非常基本的时间表。
然而它还没有运行。我不是说成功运行,也不是说完全运行。是否有任何原因可能是这种情况?
有关其他信息,我还将编写该作业的脚本。
USE [msdb]
GO
/****** Object: Job [MoveMantisFilesToArchive] Script Date: 12/23/2015 10:21:52 AM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 12/23/2015 10:21:52 AM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = …Run Code Online (Sandbox Code Playgroud) 假设我找到了一个 SQL Server,但我不知道哪些应用程序连接到它。也许我找到了一个应用程序,但我不确定它是否是唯一一个使用它的应用程序。
有没有找到所有不同连接的好方法?
我从备份中恢复了一个数据库。数据库使用复制发布到不同的服务器。假设数据库还原会破坏复制,我尝试删除复制并重新创建它(我们有一个脚本可以从头开始重新创建它)。我不确定我到底做了什么,但现在它处于完全混乱的状态,我无法修复它。
首先,我尝试取消订阅(在发布服务器上):
EXEC sp_dropsubscription @publication = 'PublicationName', @article = N'all', @subscriber = 'SubscriberServerName'
Run Code Online (Sandbox Code Playgroud)
这似乎有效。SELECT * FROM syssubscriptions显示没有结果。查看订阅服务器,SSMS > {SubscriberServer} > Replication > Local Subscriptions - 订阅不在那里。
然后我尝试删除该出版物。SSMS > {Server} > 复制 > 本地发布 > {PublicationName} > 删除。这给出了以下错误消息:
Could not delete publication 'PublicationName'.
Could not drop article. A subscription exists on it.
Changed database context to 'DatabaseName'. (Microsoft SQL Server, Error: 14046)
Run Code Online (Sandbox Code Playgroud)
好的,所以我尝试删除这些文章:
EXEC sp_droparticle @publication = 'PublicationName', @article = N'all'
Run Code Online (Sandbox Code Playgroud)
并收到此错误:
Invalidated the existing snapshot of the publication. …Run Code Online (Sandbox Code Playgroud) replication sql-server sql-server-2012 troubleshooting transactional-replication
我只是想知道如果您在数据库中开始事务并忘记提交或回滚它会发生什么。服务器会宕机吗?假设您将其放置了 3 天。
也有使用它的用户假设其他用户不知道有一个未关闭的事务(假设用户只是在数据库中插入数据)。这一行动的后果是什么?
sql-server-2012 ×10
sql-server ×8
transaction ×2
checkpoint ×1
connections ×1
dmv ×1
hints ×1
log ×1
migration ×1
order-by ×1
performance ×1
replication ×1
restore ×1