·
如何把高版本的SQLServer 还原到低版本的 sqlserver
微软的软件设计方案基本上都是新版本兼容旧版本,旧版本不兼容新版本。
所以,直接通过 【数据库备份】的.bak文件,来进行【数据库还原】的方式是不支持的。
方案一:直接使用生成的完整数据库sql来还原
{ 仅用于小数据库(数据库完整导出的.sql文件小于100M) }
整体思路: 通过新版本的SQLServer生成兼容低版本的.sql脚本,然后将sql脚本实现在低版本SQLServer上执行。从而创建数据库。
假设:需要实现的功能是 把sqlserver2016(2012)的数据库备份到sqlserver2012(2008),数据库名为Test,并且这两个数据库在不同的服务器上。
1. 打开SQL Server Management Studio (下方简称SSMS),链接新版本的数据库服务器;
2. 右键点击需要导出的数据库Test-属性-选项 看到如下图
2. 右键Test-任务-生成脚本,下一步-下一步到达下图,点【高级】选项。把【script for sql version】改成你要降级的那个版本 也就是【sql2008】。确定完成即可。会生成一个【script.sql】脚本文件。
3.下一步要把sqlserver2012源文件复制到另外一个电脑上。由于SqlServer正在运行是无法复制的。所以首先要【停止】sqlserver服务。
4. 找到sql2012数据库在电脑中的位置。 右键【数据库】-【文件】会有路径,复制出这两个文件来。 至此sqlserver2012的电脑操作完成。
5. 把上面得到的【script.sql】文件和两个数据源文件复制到sql2008所在的电脑中。在sql2008中【新建】-【查询管理器】。把【script.sql】拖进去,会看到代码。
(注意绿色部分。此时显示的数据库文件位置是sql2012电脑的位置。需要把这两个地址改为 sql2008 中 复制过来的那两个源文件的地址即可。按【F5】键执行,即可完成数据库从SQL2012到SQL2008的降级。 )
方案二:使用CMD命令
很多时候,我们的数据库比较大,通过数据库生成的.sql脚本(>100M)在SQL Server manager Studio(SSMS)中打开不了,提示“文件太大,无法打开” 。
这时候,我们就需要通过命令行(cmd命令提示符)来执行sql脚本的还原数据库了。
特别说明:-d 后面跟的数据库名称,必须是目标数据库中已经存在的数据库!!!请先在SqlServer中创建一个空白数据库。
在开始菜单上右击,单击 “命令提示符(管理员)”打开
注意,如果脚本太大,可以关闭stderr消息,以加快执行速度。
前提: 备份数据库,生成sql脚本备用
1. 右击数据库 --> 任务 --> 生成脚本。
2. 在生成脚本的“选择对象”步骤选择“编写整个数据库及所有数据库对象的脚本选项”。下一步。
3. 在生成脚本的“设置脚本编写选项”界面, 点击【高级】按钮进入高级选项。
● 设置 “编写USE DATABASE 脚本” 和 “架构限定对象名称” 选项为False;
● 并将“服务器版脚本” 选择为你的低版本数据库的版本。生成脚本。
生成脚本完成。
使用sqlcmd命令还原数据库,要求-d 数据库名 必须要先手工创建这个数据库! 所以在备份时生成sql脚本最好先去掉下方这两项:
“编写Use Database脚本” 和 “架构限定对象名称” 设置为False
4. 在低版本的数据库中新建数据库,数据库名称随意(与原高版本的数据库名不同即可)。
CMD命令中的“dbname” 部分,可以在下方替换。
5. 完成,后面就是执行cmd命令了。
运行CMD命令: 还原数据
2.1 方法一: 标准的sqlcmd命令
SQLCMD -U sa -P 123 -S "172.0.0.1\SQLExpress" -d dbname -r -i d:\dbscript.sql
说明:SQLExpress是本地数据库服务器(低版本的),dbname 是数据库名称,dbscript.sql 是备份的脚本文件
-U 后面是数据库用户名, -P 后面是数据库用户的密码 -S后是服务器名(数据库地址\实例)。
2.2 方法2:标准的osql命令
OSQL -U sa -P 123 -S (local)\SQLExpress -d dbname -r -i "d:\dbscript.sql"
2.3 方法3:通过Windows身份验证Sqlserver的sqlcmd命令 (通过master来执行创建数据库命令)
SQLCMD -E -d dbname -i d:\dbscript.sql
(通过master来执行创建数据库命令,没有输入数据库账号密码,需要Windows身份验证且登录的账号是数据库管理员)
Sqlcmd: The -E and the -U/-P options are mutually exclusive. (-E和 -U / -P 选项是互斥的。)
sqlcmd工具(或者osql)的命令参数如下:
特别说明:-d 后面跟的数据库名称,必须是目标数据库中已经存在的数据库!!!
sqlcmd [-U 登录 ID] [-P 密码]
[-S 服务器] [-H 主机名] [-E 可信连接]
[-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
[-h 标题] [-s 列分隔符] [-w 列宽]
[-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
[-L 列出服务器] [-c 命令结束] [-D ODBC DSN 名称]
[-q "命令行查询"] [-Q "命令行查询" 并退出]
[-n 删除编号方式] [-m 错误级别]
[-r 发送到 stderr 的消息] [-V 严重级别]
[-i 输入文件] [-o 输出文件]
[-p 打印统计信息] [-b 出错时中止批处理]
[-X[1] 禁用命令,[退出的同时显示警告]]
[-O 使用旧 ISQL 行为禁用下列项]
<EOF> 批处理
自动调整控制台宽度
宽消息
默认错误级别为 -1 和 1
[-? 显示语法摘要]
扩展阅读: 使用SQLCMD在SQLServer执行多个脚本https://blog.csdn.net/dba_huangzj/article/details/8350829
SQLCMD -E -dmaster -ic:\Scripts\create_db.sql
SQLCMD有一个很重要的命令::r,记住,SQLCMD是大小写敏感的。当:r发现正在运行SQL脚本,它会告诉SQLCMD把这个文件所引用的文件一并放入调用脚本中。这将告诉你,停止目前的单个查询。并重新调整查询,把应该关联的查询放到适当的位置。另外,使用:r命令在一个批处理中执行多个脚本,使得你可以定义一个单独的变量集,用于包含所有脚本,但是不包含GO终结符。
方案三: 暂无
············