Cách chuyển cơ sở dữ liệu từ SQL Server 2012 sang SQL Server 2005


30

Tùy chọn của tôi là gì nếu tôi cần chuyển cơ sở dữ liệu từ SQL Server 2012 (32 bit) sang SQL Server 2005 (64 bit)?

Tôi biết tôi không thể:

  • khôi phục bản sao lưu cơ sở dữ liệu trên SQL Server 2005
  • tách ra và đính kèm

Tôi biết tôi có thể:

  • sử dụng trình hướng dẫn nhập dữ liệu và tôi đã thử nó trên một cơ sở dữ liệu, nhưng nó chỉ di chuyển dữ liệu và thậm chí điều đó thật rắc rối vì tôi cần phải thực hiện nhiều công việc tạo bảng tạm thời để duy trì các cột định danh, tạo lại tất cả các FK, chỉ mục, v.v.

Có một lựa chọn dễ dàng hơn?


12
Tùy chọn dễ dàng hơn là nâng cấp đích đến năm 2012, thành thật mà nói.
Aaron Bertrand

Câu trả lời:


40

Bạn có thể làm theo bất kỳ phương pháp nào dưới đây:

Lưu ý: Nếu bạn đang sử dụng bất kỳ tính năng mới nào như các loại dữ liệu mới, v.v. thì bạn phải kiểm tra vì nó sẽ đưa ra lỗi.

PHƯƠNG PHÁP 1: Sử dụng các công cụ bản địa

  1. Viết ra cơ sở dữ liệu SCHema_ONLY và tạo lại cơ sở dữ liệu trống trên máy chủ đích. Dưới đây là ảnh chụp màn hình:

    nhập mô tả hình ảnh ở đây

    nhập mô tả hình ảnh ở đây

    nhập mô tả hình ảnh ở đây

  2. Sử dụng BCP OUT và BULK INSERT để chèn dữ liệu.

Dưới đây là kịch bản sẽ giúp bạn với Phần 2.

/************************************************************************************************************************************************
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: Sử dụng các công cụ của bên thứ ba

Tạo một cơ sở dữ liệu trống trên máy chủ đích. Sử dụng so sánh lược đồ và so sánh dữ liệu của Redgate để tạo và tải dữ liệu vào máy chủ đích.

Lưu ý: Tôi đã sử dụng so sánh lược đồ và dữ liệu của Redgate và chúng là những công cụ tốt nhất cho loại nhiệm vụ đó và do đó nếu bạn đang sử dụng các công cụ của bên thứ 3, thì đề xuất của tôi sẽ là Redgate.


7
+1 nhưng hãy nhớ rằng có một số điều nhất định sẽ không hoạt động tại điểm đến (và tôi không chắc các công cụ của bên thứ 3 duyên dáng sẽ xử lý tất cả những điều đó như thế nào). Các đối tượng như SEQUENCE, mã như OFFSET / FETCH, LAG / LEAD, v.v.
Aaron Bertrand

1
Khi bạn có lược đồ được tạo bằng cách tạo kịch bản và chạy các tập lệnh đó dựa trên cơ sở dữ liệu cũ hơn, một tùy chọn khác để truyền dữ liệu là sao chép trực tiếp từ phiên bản này sang phiên bản khác bằng cách thiết lập máy chủ được liên kết. Sẽ không khó để tạo kịch bản cho một vòng lặp thực hiện tất cả công việc. Để đối phó với các ràng buộc FK, bạn cần đảm bảo rằng bạn sao chép các bảng theo thứ tự phù hợp hoặc bạn có thể xóa FK tạm thời và chỉnh sửa chúng sau khi sao chép. Tương tự như vậy, bạn sẽ muốn vô hiệu hóa bất kỳ kích hoạt nào ở đích trong khi sao chép.
David Spillett

4

Ngoài các phương pháp đã được đề xuất ở đây, bạn cũng có thể thử tạo tệp BACPAC và nhập tệp đó vào đích của mình. Điều này tương tự như cách Microsoft khuyên bạn nên di chuyển cơ sở dữ liệu của mình từ cơ sở dữ liệu đám mây tại chỗ sang Azure.

Lợi ích của nó là sự kết hợp giữa lược đồ xuất cũng như dữ liệu và nó không phụ thuộc vào phiên bản cơ sở dữ liệu, vì vậy về mặt lý thuyết bạn có thể nhập cơ sở dữ liệu từ bất kỳ phiên bản nào sang bất kỳ phiên bản nào.

Nhược điểm của nó là trước khi tạo tệp BACPAC tại nguồn, nó chạy một số quy trình xác thực nghiêm ngặt có thể dễ dàng thất bại nếu bạn có tham chiếu đến các đối tượng bên ngoài cơ sở dữ liệu của mình (có thể là người dùng hoặc cơ sở dữ liệu hệ thống) hoặc nếu bạn có đối tượng được mã hóa. Nhưng nếu bạn may mắn và nó không thất bại, thì đó có thể là một giải pháp khá dễ dàng.

Tất cả những gì bạn cần là một trong những phiên bản SSMS mới hơn (17 hoặc 18): https://docs.microsoft.com/en-us/sql/ssms/doad-sql-server-manloyment-studio-ssms

Để bắt đầu tạo tệp BACPAC, nhấp chuột phải vào cơ sở dữ liệu và chọn "Xuất ứng dụng tầng dữ liệu ..." (đảm bảo không bị nhầm lẫn với "Trích xuất ứng dụng tầng dữ liệu ..." có gì đó khác biệt):

Xuất ứng dụng tầng dữ liệu ...

Bạn sẽ được trình bày với một trình hướng dẫn đơn giản để hướng dẫn bạn qua các bước. Khi bạn đã hoàn tất, bạn có thể sử dụng "Nhập ứng dụng cấp dữ liệu ..." trong máy chủ đích mà bạn có thể thấy bằng cách nhấp chuột phải vào nút "Cơ sở dữ liệu" (một lần nữa, đừng nhầm lẫn với "Triển khai dữ liệu Ứng dụng -tier ... "):

Nhập ứng dụng tầng dữ liệu ...

Điều này cũng vậy, sẽ cho bạn thấy một trình hướng dẫn đơn giản để hướng dẫn bạn qua các bước.


-1

Để giảm phiên bản của Sql Server là một công việc rất khó.
Có một số tùy chọn để giảm like;
Trước hết, tạo tất cả các kịch bản đối tượng cơ sở dữ liệu và chạy tại máy chủ đích.
Sau đó bạn có thể sử dụng;

  • SSIS,
  • Công cụ nhập dữ liệu,
  • Công cụ của bên thứ ba như RedGate hoặc khác.

Nhưng đối với công cụ So sánh dữ liệu RedGate ,

bạn phải xem xét rằng nó chỉ so sánh các bảng có khóa chính. Vì vậy, nếu các bảng của bạn không có khóa chính, bạn phải sử dụng các cách khác


8
Tôi không nghĩ câu trả lời này sẽ cải thiện câu trả lời của Kins
James Anderson

-3

Không thể hạ cấp cơ sở dữ liệu trên SQL Server. Tuy nhiên, một cách giải quyết là kịch bản tất cả các đối tượng DB và áp dụng tập lệnh trên cơ sở dữ liệu đích. SSIS là một cách tuyệt vời để giúp thực hiện điều này.


4
Bạn có nghĩ điều này thêm bất cứ điều gì quan trọng vào câu trả lời của Kin không?
dezso
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.