备份MSSQL DB架构

时间:2018-04-18 15:41:06

标签: sql-server powershell sql-server-2008 tsql database-backups

我正在尝试使用以下限制将我的生产数据库备份到我的本地开发机器:

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

    1. 仅使用UI备份架构(任务 - >生成脚本) 收到以下错误:
    2. Microsoft.SqlServer.Management.Smo.FailedOperationException: Discover dependencies failed. ---> System.ArgumentException: Item has already been added. Key in dictionary: 'Server[@Name='PRODSQL']/Database[@Name='Database1']/UnresolvedEntity[@Name='SomeObjectName' and @Schema='Some.Schema.SomeObjectName']' Key being added: 'Server[@Name='PRODSQL']/Database[@Name='Database1']/UnresolvedEntity[@Name='SomeObjectName' and @Schema='Some.Schema.SomeObjectName']' at System.Collections.SortedList.Add(Object key, Object value) at Microsoft.SqlServer.Management.Smo.DependencyTree..ctor(Urn[] urns, DependencyChainCollection dependencies, Boolean fParents, Server server) at Microsoft.SqlServer.Management.Smo.DependencyWalker.DiscoverDependencies(Urn[] urns, Boolean parents) --- End of inner exception stack trace --- at Microsoft.SqlServer.Management.SqlScriptPublish.GeneratePublishPage.worker_DoWork(Object sender, DoWorkEventArgs e) at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

      所以我继续前进。

      1. 任务 - >复制数据库

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

      2. 提取数据层应用程序

        获得与上述相同的错误。

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

      4. 我确信这种方法可行,我花了两天时间才能做到这一点,但仍然在解决多个错误。

        基本上我正在做以下事情:

        1. 从源数据库创建数据库对象(模式,SP,表,视图,UDF,触发器,索引)并将它们输出到.sql文件 - 大致遵循http://cfmumbojumbo.com/index.cfm/coding/using-powershell-to-backup-your-stored-procedures-and-triggers/并添加了更多工作。< / p>

        2. 如果我的服务器上已经存在数据库,请执行kill,drop,然后重新创建它(DropCreate.sql):

          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 (...)
          
        3. .bat文件基本上是这样做的

          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 
          .............
          

          我遇到的最新错误是:

            

          将数据库上下文更改为“master”。   消息6107,状态1,状态1,服务器MYSERVER,第1行   只能杀死用户进程。   在这个时候出乎意料。

          我转向的任何地方我都遇到了新的错误,花了2天以上的时间,我还没有得到数据......

          TLDR:有没有更简单的方法来备份MSSQL Db架构和来自某些表的前n行数据?

0 个答案:

没有答案