Sha*_*mad 7 sql-server testing backup sql-server-2008-r2 restore
我有一个测试数据库,我定期从 SQL Server 2008 R2 中的生产备份文件中恢复该数据库以获取新数据。与生产的存储过程相比,我们经常编辑\更改或更新测试数据库中的存储过程来测试数据!
是否只刷新\恢复表而不是存储过程?所以我不必将它们重新编辑回我需要的更改?
这两个数据库(生产和测试)都在一台服务器上。
我的数据库大小约为 5 GB,我们负担不起第三方工具。
Sol*_*zky 10
是的,您可以这样做,只是不能使用数据库BACKUP
/ RESTORE
。相反,您将使用SqlPackage.exe实用程序,它是 SQL Server Data Tools (SSDT) 的一部分。此实用程序通常有助于将 Visual Studio 中的数据库项目迁移到 SQL Server。但是,它还可以将数据库中的模式和数据提取到一个文件中,然后它可以将该文件中的任何内容推送到另一个数据库中。
我创建了一个 CMD 脚本GetDataFromProduction.cmd,它提取架构和数据,然后只发布表和数据。存储过程、函数等被提取到.dacpac文件中(无法绕过),但在将内容发布到数据库时可以将它们排除在外。以下脚本调用SqlPackage.exe两次,一次使用/Action:Extract
,一次使用/Action:Publish
. 它使用/p:ExtractAllTableData=True
“提取”来获取所有表的数据。
@ECHO OFF
"C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\SqlPackage.exe" ^
/Action:Extract ^
/SourceDatabaseName:TEMPTEST ^
/SourceServerName:(local) ^
/TargetFile:C:\TEMP\_Extract.dacpac ^
/p:IgnoreExtendedProperties=True ^
/p:ExtractAllTableData=True
ECHO Hit the "any" key to publish the extracted data
PAUSE
"C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\SqlPackage.exe" ^
/Action:Publish ^
/SourceFile:C:\TEMP\_Extract.dacpac ^
/TargetDatabaseName:TestPublish ^
/TargetServerName:(local) ^
/p:DropObjectsNotInSource=False ^
/p:ExcludeObjectTypes=Aggregates;ApplicationRoles;Assemblies;AsymmetricKeys;^
BrokerPriorities;Certificates;Contracts;DatabaseRoles;DatabaseTriggers;^
ExtendedProperties;FileTables;MessageTypes;Permissions;Queues;RemoteServiceBindings;^
RoleMembership;Rules;ScalarValuedFunctions;SearchPropertyLists;Sequences;Services;^
Signatures;StoredProcedures;SymmetricKeys;Synonyms;TableValuedFunctions;^
UserDefinedDataTypes;UserDefinedTableTypes;ClrUserDefinedTypes;Views;Audits;Credentials;^
CryptographicProviders;DatabaseAuditSpecifications;Endpoints;ErrorMessages;^
EventNotifications;EventSessions;LinkedServerLogins;LinkedServers;Routes;^
ServerAuditSpecifications;ServerRoleMembership;ServerRoles;ServerTriggers;^
ColumnEncryptionKeys;ColumnMasterKeys;Defaults;ExternalDataSources;ExternalFileFormats;^
ExternalTables;Filegroups;FullTextCatalogs;FullTextStoplists;PartitionFunctions;^
PartitionSchemes;SecurityPolicies;Users;XmlSchemaCollections;DatabaseScopedCredentials;^
Logins
PAUSE
Run Code Online (Sandbox Code Playgroud)
现在,如果您不想要所有表的数据,那么您可以指定要获取的单个表。请注意,没有选项可以指示SqlPackage获取除一两个表之外的所有表。如果您只需要一两个表,则需要指定要抓取的所有表。指定单个表时,您需要先指定/p:ExtractAllTableData=False
(True
在上面的示例中),然后添加一个新的“属性”以“SchemaName.TableName”格式指定每个表:
/p:TableData="dbo.Table1" ^
/p:TableData="Orders.Order" ^
/p:TableData="Orders.OrderItems"
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以/p:TableData="SchemaName.TableName"
根据需要指定多次。不幸的是,似乎没有任何能力为“SchemaName.%”或类似的东西指定一个通配符(因为这会让事情变得太容易了,这有什么好玩的?)。但是,您可以使用以下内容生成该表列表,只需将其复制并粘贴到CMD脚本中即可:
/p:TableData="dbo.Table1" ^
/p:TableData="Orders.Order" ^
/p:TableData="Orders.OrderItems"
Run Code Online (Sandbox Code Playgroud)
另请注意,虽然此方法确实完成了此处所要求的操作,但我没有依据可以估计哪些数据量会变得无法管理。我想如果数据库对于 来说太大/p:ExtractAllTableData=True
,那么您可以通过指定/p:ExtractAllTableData=False
然后指定可管理的表子集,并在其中的 2 个或多个脚本中重复该操作,将迁移分解为多个部分。
话虽如此,它确实可以很好地处理数据同步,因为它将进行任何必要的更改以使现有架构和数据匹配.dacpac文件中的任何内容。您不需要先截断表格或类似的事情。
如果您尚未安装 Visual Studio 和/或 SSDT,则可以从以下位置自行获取 SSDT:下载最新的 SQL Server Data Tools
关于相关主题:
与生产的存储过程相比,我们经常编辑\更改或更新测试数据库中的存储过程来测试数据!
为什么要更改存储过程?这样做或需要这样做,可能表明您的发布过程和/或架构中存在可以改进的问题。一般来说,您不应该更改代码以匹配不同的数据集。这意味着您要么在代码中硬编码客户信息(由于多种原因非常糟糕)和/或硬编码环境敏感信息,例如 URL、文件路径等。这些都不应该是硬编码的; 它应该全部从配置文件和/或配置表中的值中提取。你可以有一个配置表,其中有一个字段EnvironmentName
或EnvironmentID
这样所有环境都可以拥有完全相同的数据,然后您只需要一个函数来返回当前环境的值,这将用于过滤配置表。这使得在添加/更新/删除配置数据时发布过程更容易,因为相同的发布脚本(通常包括所有环境的值)在所有环境中运行,并且不需要任何 IF 条件来检查它在哪个环境中运行。
OP对此答案的评论:
不幸的是,我无法在未经批准的情况下安装该软件包
这种方法在技术上不需要安装在运行 SQL Server 的服务器上。SqlPackage
是一个客户端工具,就像SQLCLD、SSMS等一样,只需要安装在一台可以连接源服务器的电脑上即可。因此,如果 IT 不允许您在本地 PC 上安装它,那么也许您可以在某处找到一个开发或 QA 服务器来安装它。
在 SQLServer 中,没有选项可以仅备份/恢复表。您可以创建一个 SSIS 包来从特定/所有表导入数据,并使用 SQL 代理安排它或手动运行。
由于数据库生产和测试都位于同一服务器上,因此与从远程服务器提取数据相比,数据加载可能更快。为了最大限度地减少生产数据库的负载,请将备份恢复到新数据库,然后将数据导入到测试数据库。
如果您删除并重新创建表以进行刷新,请确保在数据导入后创建索引。
或者,如果您选择批量导入到现有表,请删除索引并稍后重新创建它们,并将恢复模式更改为简单或批量记录。
如果您只有几个非常大的表,您可能可以考虑移动到单独的文件组并进行部分备份和恢复。
您还可以尝试使用Dell Litespeed、Idera 虚拟数据库或Apex SQL 恢复等第三方工具进行对象级恢复。