创建示例数据库备份

时间:2016-09-23 09:05:22

标签: sql-server sql-server-2008

与许多企业一样,我们拥有实时环境和开发环境。由于我无法控制的原因,开发环境无法存储实时环境中的所有内容。因此,当需要刷新dev env时,DBA必须手动复制每个表的样本(例如,最近6个月的数据)。

有谁知道这种方式可以实现自动化?我知道存在部分备份这样的事情,但是有关备份不同文件组的事情。差异备份也不好,因为尽管我们的数据很多,但我们需要的不仅仅是已更改的数据。

编辑:重读这一点,我应该澄清一点,我们也没有时间写一个冗长的定制脚本来完成任务:(

提前致谢!

2 个答案:

答案 0 :(得分:0)

快照复制可以是一个选项。 您可以在不同的文章(表格)上放置过滤器,以仅复制数据样本。 在第一次运行时编写此脚本,然后重新使用。

下一步是安排这些脚本每周/每月运行(您希望它刷新的时间段)。

答案 1 :(得分:0)

这样的事情会产生插入语句,以防你要创建一些东西。但是,从我的头顶开始,未经测试。

DECLARE @v_SourceDatabase      NVARCHAR(250); 
DECLARE @v_DestinationDatabase NVARCHAR(250);
DECLARE @t_TablesToProcess     TABLE (FullTableName NVARCHAR(250),
                                      TableName     NVARCHAR(250),
                                      TableSchema   NVARCHAR(250),
                                      ColumnList    NVARCHAR(MAX));
DECLARE @v_ColumnList         NVARCHAR(MAX);
DECLARE @v_TableName          NVARCHAR(250);
DECLARE @v_TableSchema        NVARCHAR(250);

-- -------------------------------------- --
-- Set Source & destination database here --
-- -------------------------------------- --

SET @v_SourceDatabase      = N'DatabaseSource';
SET @v_DestinationDatabase = N'DatabaseDestination';

-- Generate tables to process
INSERT INTO @t_TablesToProcess
SELECT CONCAT('[', syssch.name, '].[', systab.name, ']') FullTableName
     , systab.name
     , syssch.name
     , NULL
FROM   sys.tables systab
INNER JOIN sys.schemas syssch
  ON syssch.schema_id = systab.schema_id
WHERE type = 'U';

DECLARE TableList CURSOR FAST_FORWARD FOR
  SELECT TableName, TableSchema
  FROM @t_TablesToProcess;

OPEN TableList;
FETCH NEXT FROM TableList INTO @v_TableName, @v_TableSchema;

WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @v_ColumnList = CONCAT(@v_ColumnList, N'[', column_name, N'], ')
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = @v_TableName
    AND TABLE_SCHEMA = @v_TableSchema

  SET @v_ColumnList = LEFT(@v_ColumnList, LEN(@v_ColumnList) - 1);

  UPDATE @t_TablesToProcess
  SET ColumnList = @v_ColumnList
  WHERE TableName = @v_TableName
    AND TableSchema = @v_TableSchema;

  SET @v_ColumnList = '';

    FETCH NEXT FROM TableList INTO @v_TableName, @v_TableSchema;
END 

CLOSE TableList;
DEALLOCATE TableList;

-- Generate insert statements
SELECT CONCAT(N'IF (OBJECTPROPERTY(OBJECT_ID(''', FullTableName, '''), ''TableHasIdentity'') = 1) SET IDENTITY_INSERT ', FullTableName, N' ON; '
            , N'INSERT INTO [', @v_DestinationDatabase, N'].', FullTableName
            , N' (', ColumnList, N')'
            , N' SELECT * FROM [', @v_SourceDatabase, N'].', FullTableName, N';'
            , N' IF (OBJECTPROPERTY(OBJECT_ID(''', FullTableName, '''), ''TableHasIdentity'') = 1) SET IDENTITY_INSERT ', FullTableName, N' OFF; ')
FROM @t_TablesToProcess;