Sql server 备份MSSQL数据库模式

Sql server 备份MSSQL数据库模式,sql-server,powershell,sql-server-2008,tsql,database-backups,Sql Server,Powershell,Sql Server 2008,Tsql,Database Backups,我正在尝试使用以下约束将生产数据库备份到本地开发人员计算机: 这将是一个常规备份,因此应该(理想情况下?)避免使用UI 有些表被标记为要删除,因此这些表不应包含在备份中 我希望能够将解决方案(文件/包/等)传递给团队的其他成员,他们只需更改一个文件中的几个变量,然后就可以执行并获得自己的备份 数据库超过100GB,包含我不需要的数据。我已经确定了最大的表,并且只希望从每个表中提取大约5k行—这将为我提供足够的数据,并限制本地驱动器上使用的空间 我尝试从仅使用以下方法备份架构开始: 仅使用UI备份

我正在尝试使用以下约束将生产数据库备份到本地开发人员计算机:

  • 这将是一个常规备份,因此应该(理想情况下?)避免使用UI
  • 有些表被标记为要删除,因此这些表不应包含在备份中
  • 我希望能够将解决方案(文件/包/等)传递给团队的其他成员,他们只需更改一个文件中的几个变量,然后就可以执行并获得自己的备份
  • 数据库超过100GB,包含我不需要的数据。我已经确定了最大的表,并且只希望从每个表中提取大约5k行—这将为我提供足够的数据,并限制本地驱动器上使用的空间
  • 我尝试从仅使用以下方法备份架构开始:

  • 仅使用UI备份架构(任务->生成脚本) 获取以下错误:
  • Microsoft.SqlServer.Management.Smo.FailedOperationException:发现依赖项失败。-->System.ArgumentException:已添加项。输入字典:“Server[@Name='PRODSQL']/Database[@Name='Database1']/unsolvedentity[@Name='SomeObjectName'和@Schema='Some.Schema.SomeObjectName']”正在添加的键:“Server[@Name='PRODSQL']/Database[@Name='Database1']/unsolvedentity[@Name='SomeObjectName'和@Schema='Some.Schema.SomeObjectName']”位于System.Collections.SortedList.Add(对象键,对象值)位于Microsoft.SqlServer.Management.Smo.DependencyTree..ctor(Urn[]urns,DependencyChainCollection dependencies,Boolean fParents,Server Server)的Microsoft.SqlServer.Management.Smo.DependencyWalker.Discoverdependency(Urn[]urns,Boolean parents)---内部异常堆栈跟踪的结束---位于Microsoft.SqlServer.Management.SqlScriptPublish.GeneratePublishPage.worker_DoWork(对象发送方,DoWorkerVentargs e),位于System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkerVentargs e),位于System.ComponentModel.BackgroundWorker.WorkerThreadStart(对象参数)

    所以我继续前进

  • 任务->复制数据库

    我收到一条消息说磁盘上没有足够的空间

  • 提取数据层应用程序

    得到与上面1.中相同的错误

  • Powershell脚本,以及在运行PS脚本后对生成的.sql文件调用sqlcmd的批处理文件

  • 我确信这个方法会奏效,我花了两天的时间才做到这一点,但仍能克服多个错误

    基本上,我正在做以下工作:

  • 从源数据库(模式、SP、表、视图、UDF、触发器、索引)创建db对象,并将它们输出到.sql文件中,然后再添加一些工作

  • 如果数据库已存在于我的服务器上,请终止、删除,然后重新创建它(DropCreate.sql):

    我遇到的最新错误是:

    已将数据库上下文更改为“主”。 Msg 6107,第14级,状态1,服务器MYSERVER,第1行 只能终止用户进程。 在这个时候,这是出乎意料的

    无论我走到哪里,我都会遇到新的错误,并且已经花了2天多的时间在上面,而我甚至还没有得到数据


    TLDR:有没有更简单的方法从某些表备份MSSQL Db模式和前n行数据?

    创建脚本和/或提取数据库项目是一种明智的做法,但SMO可能存在问题,或者您的数据库存在问题(并不是所有可能在运行时使数据库受影响的内容都可以稍后正确编写脚本)。尝试将数据库导入到项目中。(这是一次性的UI步骤。)尝试编译该项目,并查看是否存在关于定义不正确的对象的错误,这些对象可能也会阻止正则脚本的生成。为了获得额外的安全感,请运行
    DBCC CHECKDB
    。要重新创建数据库,顺便提一句,使用
    use master;ALTER database myDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE;DROP database;
    而不是关闭并显式终止会话。如果可以让DACPAC工作,它将自动处理这些内容(如果您告诉它;默认情况下,它将升级现有数据库)。
    IF(db_id(@DatabaseName) IS NOT NULL)
    BEGIN
    DECLARE @SQL VARCHAR(max)
    SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(VARCHAR, SPId) + ';'
    FROM MASTER..SysProcesses
    WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
    EXEC(@SQL);
    END 
    
    DROP DATABASE MYDATABASE
    
    CREATE DATABASE MYDATABASE ON PRIMARY (...)
    
    sqlcmd -S %Server% -U %UserName% -P %Password% -i C:\Database\DatabaseScripts\TestDatabase\DropCreateDB.sql
    
    #loop through and execute multiple .sql files in the directory
    for /f %f in (`dir /b C:\Database\DatabaseScripts\TestDatabase\2018-04-18-15-13-13\StoredProcedures\`) do sqlcmd -S %Server% -d %Database% -U %UserName% -P %Password% -i %f
    #Just one sql file in this directory, execute it
    sqlcmd -S %Server% -d %Database% -U %UserName% -P %Password% -i C:\Database\DatabaseScripts\TestDatabase\2018-04-18-15-13-13\Schemas\AllSchemas.sql
    sqlcmd -S %Server% -d %Database% -U %UserName% -P %Password% -i C:\Database\DatabaseScripts\TestDatabase\2018-04-18-15-13-13\Tables\AllTables.sql 
    .............