Sql Server 数据迁移问题的解决
在工作中遇到一个数据迁移的问题。是通过Sql Server 2008 Management studio产生的scripts来解决的。现在来说说此实际问题:生产环境的配置是数据文件有20GB大,log文件有10GB大,实际数据只占用了500MB,所以大部分空间是空的。而测试环境因硬盘小,数据文件所在的驱动器总共只有28GB。现在想做的是把生产环境的数据拷贝到测试环境上来。之前的办法都是完整备份。即从生产上做一个完整备份,然后到测试环境上恢复,就可以将数据很好地复制到测试环境。完整备份有挺多好处,比如,数据和log都和生产环境保持一样,权限,还有自增属性等都是和生产环境一样。可是在这里却不能用,因为测试环境的驱动器空间不够。完整备份要求目标驱动器有至少30GB,而现在只有28GB,这就注定了完整备份再恢复是在此处做不了的。和DBA聊了这些限制后,DBA建议我们将新的硬盘或者其他的存储空间加到该服务器上,这样问题就解决了。但是我们当初的策略就是利用现有的服务器,不增加硬盘,不增加存储空间,所以DBA的建议我们没有办法采用。只有另外寻找办法。DBA说也许可以通过将生产环境的数据库压缩一下,再来进行备份和恢复操作。比如将现有数据库压缩到数据文件10GB,log文件5GB,那么就可以继续用备份和恢复操作来进行。测试环境上也可以容纳得下总共15GB的数据+log的空间占用(有28GB)。这办法行的通,但问题是,刚好有一个年底封闭期,不让对生产环境做改动。这就有点难办了。必须得想别的办法才行。找了一下,一种办法是用数据引入或者数据输出,另一种办法是将所有用户对象都变成脚本,再在测试环境中执行一下,就复制了所有数据。以前用过一些数据引入或者数据输出,觉得问题比较多,有些问题还比较棘手。于是选择了将所有用户对象都变成脚本。但是印象中Sql Server似乎没有这个功能的,找了一下,居然有点发现:Sql Server 2008支持将用户对象都变成脚本。
下面说一下怎么做:找到数据库这一级,右键点该数据库,选“Tasks”,再“Generate Scripts”。
选数据库,
选择输出脚本的选项。上下看了一遍,稍微改几个就可以了。
“Include If NOT EXISTS”,“Script drop”都选了True。因为我们要复制数据,“Script data”也选了True,另外我们也需要索引,所以“Script Indexes”也选了True。据我们说知,这个数据库没有用触发器,所以有些选项就直接用默认的。然后是选择表,视图,存储过程,自定义函数等。(以下示例的图只有表)
再选择具体的表,视图,存储过程,自定义函数等。我们这里是全选。
将脚本产生到一个文件中去。
最后完成。检查一下产生的脚本。
USE [learn] GO /****** Object: Table [dbo].[Student] Script Date : 12/21/2010 21:42:46 ******/ IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N '[dbo].[Student]' ) AND type in (N 'U' )) DROP TABLE [dbo].[Student] GO /****** Object: Table [dbo].[Student] Script Date : 12/21/2010 21:42:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N '[dbo].[Student]' ) AND type in (N 'U' )) BEGIN CREATE TABLE [dbo].[Student]( [StudentID] [ int ] IDENTITY(1,1) NOT NULL , [StudentName] [nvarchar](50) NOT NULL , [Gender] [ nchar ](10) NOT NULL , [BirthDate] [ date ] NOT NULL , [Address] [nvarchar](100) NULL , CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ( [StudentID] ASC ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ] ) ON [ PRIMARY ] END GO SET IDENTITY_INSERT [dbo].[Student] ON INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (1, N '王超' , N '男 ' , CAST (0x89F90A00 AS Date ), N '北京东城区万台路1300号' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (2, N '李然' , N '男 ' , CAST (0x0FFD0A00 AS Date ), N '西安二碗区' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (3, N '张三' , N '男 ' , CAST (0x7CF70A00 AS Date ), N '廊坊店村区' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (4, N '梅雨' , N '女 ' , CAST (0xD1040B00 AS Date ), N '西村区' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (5, N '陈骏' , N '男 ' , CAST (0x69090B00 AS Date ), N '一号地区' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (6, N '马欣' , N '女 ' , CAST (0xB3120B00 AS Date ), N '石家庄端区仓防' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (7, N '丁一若' , N '男 ' , CAST (0x01E60A00 AS Date ), N '太原' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (8, N '冷丁' , N '男 ' , CAST (0x30F30A00 AS Date ), N '乌鲁木齐' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (9, N '诸葛健文' , N '女 ' , CAST (0x7C150B00 AS Date ), N '贵阳' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (10, N '东格' , N '男 ' , CAST (0xCB040B00 AS Date ), N '合肥' ) INSERT [dbo].[Student] ([StudentID], [StudentName], [Gender], [BirthDate], [Address]) VALUES (11, N '马波涛' , N '男 ' , CAST (0xB30D0B00 AS Date ), N '福州' ) SET IDENTITY_INSERT [dbo].[Student] OFF |
似乎满足我们的要求。再拿到测试环境一执行。好,测试环境就都有数据了,视图,存储过程等也都有了。问题解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库