这确实是多个问题的组合。
问题 1 和 2
- 创建旧数据库的新数据库维护结构
- 设置新数据库的名称
最简单的备份命令是:
BACKUP DATABASE dbname TO DISK = 'C:\some folder\dbname.bak' WITH INIT;
-- or WITH INIT, COMPRESSION if you are on Enterprise or Developer
现在要将其还原为不同的数据库,您需要知道文件名,因为它会尝试将相同的文件放在同一个位置。因此,如果您运行以下命令:
EXEC dbname.dbo.sp_helpfile;
您应该会看到包含数据和日志文件的名称和路径的输出。当你构建你的恢复时,你需要使用这些,但是将路径替换为新数据库的名称,例如:
RESTORE DATABASE newname FROM DISK = 'C:\some folder\dbname.bak'
WITH MOVE 'dbname' TO 'C:\path_from_sp_helpfile_output\newname_data.mdf',
MOVE 'dbname_log' TO 'C:\path_from_sp_helpfile_output\newname_log.ldf';
您必须将dbname
and替换newname
为您的实际数据库名称,以及C:\some folder
您C:\path_from_sp_helpfile_output\
的实际路径。除非我知道那些是什么,否则我无法更具体地回答。
这是一个完整的复制品:
CREATE DATABASE [DB-A];
GO
EXEC [DB-A].dbo.sp_helpfile;
部分结果:
name fileid filename
-------- ------ ---------------------------------
DB-A 1 C:\Program Files\...\DB-A.mdf
DB-A_log 2 C:\Program Files\...\DB-A_log.ldf
现在我运行备份:
BACKUP DATABASE [DB-A] TO DISK = 'C:\dev\DB-A.bak' WITH INIT;
当然,如果克隆目标(在这种情况下DB-B
)已经存在,你会想要删除它:
USE [master];
GO
IF DB_ID('DB-B') IS NOT NULL
BEGIN
ALTER DATABASE [DB-B] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [DB-B];
END
GO
现在此还原将成功运行,为您提供重命名为 DB-B 的 DB-A 副本:
RESTORE DATABASE [DB-B] FROM DISK = 'C:\dev\DB-A.bak'
WITH MOVE 'DB-A' TO 'C:\Program Files\...\DB-B.mdf',
MOVE 'DB-A_log' TO 'C:\Program Files\...\DB-B_log.ldf';
问题 3 和 4
- 将所有 varchar 和 char 数据类型更改为 nvarchar 和 nchar
- 将所有文本数据类型更改为 nvarchar(MAX)
重构是一个主要的痛苦,特别是如果其中一些列参与约束。您可以通过这种方式构建一个非常基本的脚本,但您将需要更强大的工业实力来处理所有这些变量。这假设所有列都可以为空并且不参与约束。
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += '
ALTER TABLE ' +
QUOTENAME(OBJECT_SCHEMA_NAME(c.[object_id]))
+ '.' + QUOTENAME(OBJECT_NAME(c.[object_id]))
+ ' ALTER COLUMN ' + QUOTENAME(c.name) + ' '
+ CASE t.name WHEN N'text'
THEN N'nvarchar(max)'
ELSE N'n' + t.name + '(' + RTRIM(c.max_length) + ')'
END + ';'
FROM sys.columns AS c
INNER JOIN sys.types AS t
ON c.user_type_id = t.user_type_id
WHERE c.system_type_id IN (35, 167, 175)
AND OBJECTPROPERTY(c.[object_id], 'IsMsShipped') = 0;
PRINT @sql;
-- EXEC sp_executesql @sql;
您可以使用 PRINT 输出来验证脚本的前 8K,当您认为它看起来不错时,取消注释EXEC
.
完成后,您将需要重建所有索引。
也就是说,按照 Tony 的建议编写数据库脚本(或使用像Red Gate 的 SQL Compare 之类的工具- 或其众多替代方案之一- 针对空数据库)可能会容易得多,特别是如果其中一些列参与约束 - 这可能需要删除并重新创建才能更改类型。
问题 5 和 6
- 如何将 sql server 数据库升级到 sql server 2012
- 我需要对数据库进行任何准备工作以确保我可以轻松升级它吗?
您不能只升级 2008 实例上的单个数据库。您要么就地升级,要么设置一个新实例(如托尼所述),然后迁移您的数据库(最好使用备份/恢复 - 许多人会告诉您分离/附加,但这远不安全)。你应该做的准备工作包括:
升级后,您需要: