2016-09-23 8 views
0

У нас, как и у многих компаний, есть живая среда и среда разработки. По причинам, не зависящим от меня, среда Dev не способна хранить все, что есть в живой среде. Таким образом, когда необходимо обновить dev env, администратор базы данных должен вручную скопировать образец каждой таблицы (например, последние 6 месяцев данных).Создание резервной копии базы данных

Кто-нибудь знает, как это можно автоматизировать? Я знаю, что существует такая вещь, как частичное резервное копирование, но это касается создания резервных копий различных файловых групп. Дифференциальные резервные копии также не хороши, потому что, хотя многие наши данные имеют только то, что нам нужно, нам нужно больше, чем только данные, которые были изменены.

EDIT: Только перечитывая это, и я должен уточнить, что мы не имеем времени, чтобы написать длинный заказ сценарий для выполнения задачи :(

Заранее спасибо

+0

Вы хотите создать резервную копию prod для dev? – Thomas

+0

Если вы делаете это для * каждой * таблицы в базе данных, и каждая таблица имеет ключ даты, вы можете итерировать sys.tables и просто генерировать инструкции insert. Избегает вам писать длинные скрипты, определяющие все таблицы. Просто имейте в виду, что для некоторых таблиц может потребоваться установка идентификатора. – Jens

+0

Вы можете прочитать о [SSIS] (https://msdn.microsoft.com/en-us/library/ms141026.aspx) и создать пакет для копирования ваших данных и запланировать запуск этого пакета по мере необходимости. –

ответ

0

репликации моментальных снимков может быть! вариант. Вы можете поместить фильтры различных статей (таблиц), чтобы повторить только выборку данных через. Script это на первом запуске, а затем повторно использовать снова.

Следующий шаг должен был бы запланировать эти скрипты для запуска еженедельно/ежемесячно (период, который вы хотите обновить).

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; 
+0

Спасибо @Jens. Оцените усилия здесь! Я буду использовать это как отправную точку и развить ее в соответствии с нашими потребностями, когда у меня будет время. – TehJake

Смежные вопросы