Який найкращий спосіб оновити лише кілька таблиць у тестовій базі даних від виробництва?


12

У мене дуже велика виробнича база даних і дуже велика база даних тестового середовища в SQL Server 2008R2. Обидві бази даних мають схожу структуру таблиці, але різні користувачі / входи / дозволи / ролі.

Мені потрібно періодично оновлювати лише кілька таблиць у тестовій базі даних, приблизно один раз на місяць.

Зараз я планую це зробити

  1. Використовуйте утиліту BCP, щоб взяти експорт потрібних мені таблиць із виробництва.
  2. Скопіюйте експортний файл bcp на тестовий сервер
  3. Вимкнути індекси та обмеження у всіх таблицях, які я оновлюю в Тесті
  4. Обрізати таблиці баз даних тестів
  5. Завантажте дані назад у таблиці тестових баз даних за допомогою BCP.
  6. відновити індекси та повторно включити обмеження в тесті

Це все здається занадто складним для такого невеликого завдання. Також здається, що це створило б багато повторень (у t-журналі) Чи є кращий спосіб це зробити?

Ще один спосіб, який я думав зробити це, - це відновити резервну копію з Production у тестовому середовищі, - але проблема в мене полягає в тому, що повна резервна копія була б досить великою, і мені не потрібно оновлювати всі таблиці, лише кілька- -і також користувачі та безпека у виробничій базі даних відрізняються від тестових. Це буде замінено налаштуваннями безпеки у виробничій базі даних, якщо я відновлю всю базу даних.


Цей підхід також може бути вартим вивчення: sqlperformance.com/2012/08/t-sql-queries/… та sqlperformance.com/2013/04/t-sql-queries/…
Аарон Бертран

Відповіді:


4

Є два способи, які відповідають вашим потребам:

(Примітка. Якщо на таблиці посилається іноземний ключ, користуватися ними ви не зможете TRUNCATE. Вам потрібно видалити шматки . Крім того, ви можете скинути всі індекси + зовнішні ключі та завантажити дані, а потім відтворити їх).

  • BCP OUT і БУЛЬКО ВСТАВИТИ В базу даних призначення .

    • Переконайтеся, що ви перевели тестову базу даних у простий режим відновлення / з масовим журналом.
    • Включити Trace Flag 610 - мінімально введені вставки в індексовані таблиці.

      /************************************************************************************************************************************************
      Author      :   KIN SHAH    *********************************************************************************************************************
      Purpose     :   Move data from one server to another*********************************************************************************************
      DATE        :   05-28-2013  *********************************************************************************************************************
      Version     :   1.0.0   *************************************************************************************************************************
      RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
      *************************************************************************************************************************************************/
      
      -- save below output in a bat file by executing below in SSMS in TEXT mode
      -- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 
      
      select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
              +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
              +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
              +  QUOTENAME(name)  
              +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
              +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
              +  REPLACE(name,' ','') 
              + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
      and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
      order by schema_name(schema_id)                         
      
      
      
      --- Execute this on the destination server.database from SSMS.
      --- Make sure the change the @Destdbname and the bcp out path as per your environment.
      
      declare @Destdbname sysname
      set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
      select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
              +  QUOTENAME(@Destdbname)+ '.'
              +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
              +  QUOTENAME(name) 
              + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
              +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
              +  REPLACE(name,' ','') 
              +'.dat'' 
              with (
              KEEPIDENTITY,
              DATAFILETYPE = ''native'',  
              TABLOCK
              )'  + char(10) 
              + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
      and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
      order by schema_name(schema_id)

-

  • Спосіб 2: SSIS - Мій кращий метод в даному випадку.

    • Постановка на диск не потрібна. Вся обробка робиться в пам'яті.
    • Ви можете запланувати пакет SSIS, використовуючи завдання агента sql щомісяця, щоб автоматизувати оновлення таблиць з PROD на TEST-сервер.
    • Оберіть опцію " Швидке завантаження "
    • Переконайтеся, що ви вибрали хороші рядки на номер партії (якщо ви вибрали занадто високу, відбудеться ескалація блокування - тримайте її нижче 5 К)

Довідка: Посібник з продуктивності завантаження даних і моя відповідь за - Вставити в таблицю select * з таблиці вставку


1
SSIS, безумовно, шлях сюди. Навантаження даних - це те, що було розроблено.
Стів Манґямелі

3

Немає необхідності робити резервні копії та відновлення, або викликати / координувати зовнішні процеси (тобто BCP), або навіть возитися з SSIS (дуже потужний, дуже крутий, але якщо я можу цього уникнути, я, безумовно, буду :). Ви можете впоратися з усім цим із зручності T-SQL, у збереженій процедурі, яку ви можете запланувати за допомогою SQL Agent, або в скрипті, який ви запускаєте раз на місяць (хоча мати його в програмі і плануванні - це менше роботи в довгому періоді бігати). Як? Використовуючи SQLCLR для доступу до SqlBulkCopyкласу в .NET, оскільки це по суті BCP без усієї суєти виклику BCP. Ви можете це зашифрувати самостійно: немає суперскладних налаштувань і нічого подібногоSqlBulkCopyклас опікується майже всім для вас (ви можете встановити розмір партії, незалежно від того, чи потрібно спрацьовувати тригери тощо). Або якщо ви не хочете возитися зі збиранням та розгортанням збірки, ви можете використовувати попередньо вбудовану процедуру, що зберігається SQLCLR, таку як DB_BulkCopy, яка є частиною бібліотеки SQL # SQLCLR (якої я є автором, але ця зберігається процедура у вільній версії). Я описую це більш докладно, включаючи приклад використання DB_BulkCopy , у наступній відповіді:

Імпорт даних із однієї бази даних в інший сценарій

Якщо незрозуміло, де розмістити це у вашому поточному плані, ви зробите наступне:

  • Видаліть кроки 1 і 2 (ого, ого!)
  • Замінити крок 5 з EXECз DB_BulkCopy або що ви називаєте це , якщо ви код це самостійно, який просто переміщує дані з точки А в точку Б.

Також слід зазначити, що SqlBulkCopyі DB_BulkCopy :

  • може прийняти будь-який набір результатів: не має значення, чи це SELECT або EXEC збереженої процедури
  • їх дуже легко оновити, коли в будь-яку з цих таблиць вносяться зміни схеми; просто ПІСЛЯ запит у вашій процедурі збереження, що викликає цю процедуру зберігання SQLCLR
  • дозволяють проводити повторну перестановку полів, якщо це коли-небудь знадобиться

ОНОВЛЕННЯ щодо операцій з мінімальною реєстрацією через SqlBulkCopy

Можна отримати мінімально зареєстровані операції, але ви повинні знати:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.