这确实是多个问题的组合。
问题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
和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;
您可以使用打印输出来验证脚本的第一8K,当你认为它看起来不错,取消对EXEC
。
一旦完成,您将需要重建所有索引。
这就是说,脚本数据库托尼建议(或使用工具,如Red Gate's SQL Compare - 或one of its many alternatives - 对一个空数据库)很可能将更加容易,特别是当一些列的参与约束 - 这可能需要被删除并重新创建以改变类型。
质询5,6
- 如何升级SQL Server数据库到SQL Server 2012
- 是否有任何准备工作,我需要进行数据库来确保我可以轻松升级它吗?
您不能仅升级2008实例上的单个数据库。你要么就地升级,要么设置一个新的实例(如Tony所述),然后迁移你的数据库(最好使用备份/恢复 - 很多人会告诉你要分离/连接,但安全性要低得多)。准备工作你应该做的包括:
,并在升级之后你会想:
总之,beautimus!谢谢。 – MikeMalter
哇...答案! – SFun28