Phương pháp tốt nhất để làm mới chỉ một vài bảng trong cơ sở dữ liệu thử nghiệm từ sản xuất là gì?


12

Tôi có một cơ sở dữ liệu sản xuất rất lớn và cơ sở dữ liệu môi trường thử nghiệm rất lớn trong SQL Server 2008R2. Cả hai cơ sở dữ liệu có cấu trúc bảng tương tự nhưng người dùng / đăng nhập / quyền / vai trò khác nhau.

Tôi chỉ cần làm mới một vài bảng trong cơ sở dữ liệu thử nghiệm định kỳ từ sản xuất, khoảng một tháng một lần.

Cách hiện tại tôi đang lên kế hoạch để làm điều này là

  1. Sử dụng tiện ích BCP để xuất các bảng tôi cần từ Sản xuất.
  2. Sao chép tệp xuất bcp vào máy chủ thử nghiệm
  3. Vô hiệu hóa các chỉ mục và các ràng buộc trên tất cả các bảng tôi đang làm mới trong Test
  4. Cắt bớt các bảng cơ sở dữ liệu thử nghiệm
  5. Tải dữ liệu trở lại vào bảng cơ sở dữ liệu thử nghiệm bằng BCP.
  6. xây dựng lại các chỉ mục và kích hoạt lại các ràng buộc trong Test

Tất cả điều này có vẻ hơi quá phức tạp cho một nhiệm vụ nhỏ như vậy. Có vẻ như nó sẽ tạo ra rất nhiều làm lại (trong nhật ký t) Có cách nào tốt hơn để làm điều này không?

Một cách khác tôi nghĩ làm điều này là khôi phục bản sao lưu từ Sản xuất vào môi trường thử nghiệm - nhưng vấn đề tôi gặp phải là bản sao lưu đầy đủ sẽ khá lớn và tôi không cần làm mới tất cả các bảng, chỉ một vài- -Và người dùng và bảo mật trong cơ sở dữ liệu sản xuất khác với thử nghiệm. Điều đó sẽ bị ghi đè bởi cài đặt bảo mật trong cơ sở dữ liệu sản xuất nếu tôi khôi phục toàn bộ cơ sở dữ liệu.


Phương pháp này cũng có thể là giá trị điều tra: sqlperformance.com/2012/08/t-sql-queries/...sqlperformance.com/2013/04/t-sql-queries/...
Aaron Bertrand

Câu trả lời:


4

Có 2 phương pháp sẽ phù hợp với nhu cầu của bạn:

(Lưu ý: Nếu các bảng được tham chiếu bằng khóa ngoại, thì bạn sẽ không thể sử dụng TRUNCATE. Bạn phải xóa theo từng khối . Ngoài ra, bạn có thể thả tất cả các chỉ mục + Khóa ngoại và tải dữ liệu rồi tạo lại chúng).

  • BCP OUT và BULK INSERT INTO cơ sở dữ liệu đích .

    • Hãy chắc chắn rằng bạn đặt cơ sở dữ liệu kiểm tra ở chế độ phục hồi đơn giản / đăng nhập hàng loạt.
    • Kích hoạt Trace Flag 610 - chèn tối thiểu vào các bảng được lập chỉ mục.

      /************************************************************************************************************************************************
      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)

-

  • Phương pháp 2: SSIS - Phương pháp ưa thích của tôi trong trường hợp này.

    • Không cần dàn dựng vào đĩa. Tất cả xử lý được thực hiện trong bộ nhớ.
    • Bạn có thể lên lịch gói SSIS bằng cách sử dụng công việc của đại lý sql mỗi tháng để tự động làm mới các bảng từ máy chủ PROD sang TEST.
    • Chọn tùy chọn " NHANH CHÓNG "
    • Đảm bảo bạn chọn một hàng tốt cho mỗi số lô (Nếu bạn chọn quá cao, sẽ có khóa leo thang - giữ ở mức thấp hơn 5K)

Tham khảo: Hướng dẫn hiệu suất tải dữ liệucâu trả lời của tôi cho - Chèn vào bảng chọn * từ bảng so với chèn số lượng lớn


1
SSIS chắc chắn là con đường để đi đến đây. Bơm dữ liệu là những gì được thiết kế để làm.
Steve Mangiameli

3

Không cần thực hiện sao lưu và khôi phục, hoặc gọi / phối hợp các quy trình bên ngoài (ví dụ BCP), hoặc thậm chí gây rối với SSIS (rất mạnh mẽ, rất tuyệt, nhưng nếu tôi có thể tránh được, tôi chắc chắn sẽ :). Bạn có thể xử lý tất cả những điều này một cách thoải mái với T-SQL, trong một quy trình được lưu trữ mà bạn có thể lên lịch thông qua SQL Agent hoặc một tập lệnh mà bạn chạy mỗi tháng một lần (mặc dù có nó trong một Proc và lập lịch trình sẽ ít hoạt động hơn trong thời gian dài chạy). Làm sao? Bằng cách sử dụng SQLCLR để truy cập SqlBulkCopyClass trong .NET vì về cơ bản nó là BCP mà không cần phải gọi BCP. Bạn có thể tự viết mã này: không có thiết lập siêu phức tạp hay bất cứ thứ gì nhưSqlBulkCopylớp sẽ chăm sóc gần như mọi thứ cho bạn (bạn có thể đặt kích thước lô, có kích hoạt kích hoạt hay không, v.v.). Hoặc, nếu bạn không muốn gây rối với việc biên dịch và triển khai một hội, bạn có thể sử dụng một thủ tục được lưu trữ SQLCLR dựng sẵn như DB_BulkCopy , một phần của thư viện SQL # SQLCLR (mà tôi là tác giả của, nhưng được lưu trữ này thủ tục trong phiên bản miễn phí). Tôi mô tả điều này chi tiết hơn, bao gồm một ví dụ về việc sử dụng DB_BulkCopy , trong câu trả lời sau:

Nhập dữ liệu từ cơ sở dữ liệu này sang tập lệnh khác

Nếu không rõ nơi để đặt cái này trong kế hoạch hiện tại của bạn, bạn sẽ làm như sau:

  • Xóa các bước 1 và 2 (woo hoo!)
  • Thay thế bước 5 với EXECcác DB_BulkCopy hoặc bất cứ điều gì bạn gọi nó là nếu bạn viết mã đó cho mình, mà chỉ cần di chuyển dữ liệu từ điểm A đến điểm B.

Ngoài ra, cần phải chỉ ra rằng SqlBulkCopyDB_BulkCopy :

  • có thể chấp nhận bất kỳ tập kết quả nào: không thành vấn đề nếu đó là CHỌN hoặc EXEC của một thủ tục được lưu trữ
  • rất dễ cập nhật khi thay đổi lược đồ được thực hiện cho bất kỳ bảng nào trong số này; chỉ THAY ĐỔI truy vấn trong Quy trình được lưu trữ của bạn gọi Thủ tục lưu trữ SQLCLR này
  • cho phép ánh xạ lại các trường, nếu điều đó là cần thiết

CẬP NHẬT Về các hoạt động được ghi nhật ký tối thiểu thông qua SqlBulkCopy

Có thể nhận được các hoạt động được ghi lại tối thiểu, nhưng bạn nên biết:

  • Bạn cần sử dụng tùy chọn Sao chép hàng loạt TableLock
  • Làm điều này sẽ, đối với các bảng có Chỉ mục được nhóm, trước tiên hãy tải dữ liệu vào [tempdb]và sau đó thực hiện thao tác chèn theo thứ tự vào đích. Do đó, có một số tải bổ sung phải chịu, cả về I / O vật lý cho tempdb (tệp dữ liệu và nhật ký) cũng như thao tác sắp xếp (do ORDER BYyêu cầu phải có các hoạt động được ghi tối thiểu)
  • Một số kết quả thử nghiệm ở đây: Whitepaper: hiệu suất của SqlBulkCopy
  • Một số kết quả thử nghiệm ở đây: Khắc phục sự cố SqlBulkCopy không thực hiện ghi nhật ký tối thiểu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.