TableSync command

Giới thiệu


Lệnh TableSync dùng để đồng bộ dữ liệu từ các bảng được chỉ định tới những bảng tương ứng ở hai Database khác nhau.

Cấu hình đồng bộ được định nghĩa tại tính năng Table Synchronize

Nếu bảng được chỉ định không tồn tại ở database đích, TableSync sẽ tạo mới bảng với cấu trúc giống như bảng nguồn.

Dữ liệu ở bảng đích sẽ giống với bảng nguồn trừ một số trường hợp đặc biệt.

Lệnh này được dùng trong các trường hợp sau (ví dụ):

Lưu ý:

Usage Syntax:


pbs.BO.DB.TableSync?TSYNCode=ABC

Trong đó TSYNCode là mã profile sync được định nghĩa ở tính năng Table Synchronize

Dành cho consultant:


Khi được gọi, Runnable TableSync hoạt động theo các bước sau:

  1. Kết nối vào Server nguồn

  2. Đọc dữ liệu từ bảng nguồn. Nếu có nhiều bảng được chọn tại SqlTableSync, TableSync sẽ lần lượt đọc dữ liệu từ từng bảng và thực hiện các bước bên dưới thay vì đọc dữ liệu từ tất cả các bảng rồi mới thực hiện.

  3. Kết nối vào server đích

  4. Tạo bảng tạm ở server đích. Bảng tạm được tạo với tên: <Tên bảng hiện tại><Một số ngẫu nhiên kiểu Guid>. Bảng tạm này sẽ bị xóa tự động sau khi hoàn tất đồng bộ dữ liệu

  5. Copy dữ liệu vào bảng tạm. Copy dữ liệu từ bảng nguồn vào bảng tạm bằng Bulk Copy

  6. Merge dữ liệu ở bảng tạm vào bảng chính thức ở server đích. Tạo Merge script từ bảng đích và bảng tạm. Merge dữ liệu từ bảng tạm vào bảng đích.

Nếu bảng đích không tồn tại, TableSync sẽ tạo bảng đích tự động.

Lý do tạo bảng tạm là vì Bulk copy không hỗ trợ validate dữ liệu khi copy. Do đó, nếu có lỗi phát sinh trong quá trình copy dữ liệu (thường là trùng khóa chính), Bulk copy sẽ bị dừng ngay lập tức và runnable TableSync cũng sẽ bị ngừng theo.

Để tránh trường hợp này, ta phải dùng thêm bảng tạm của Sql để copy dữ liệu từ nguồn sang đích. Bảng tạm sẽ bị xóa khi ngắt kết nối, do đó mỗi lần copy dữ liệu ta không cần bận tâm về việc validate dữ liệu.

Sau khi copy hoàn tất, TableSync sẽ tạo lệnh Merge để đồng bộ dữ liệu giữa bảng tạm và bảng đích. Lệnh Merge sẽ hoạt động theo logic sau:

Câu lệnh Merge có dạng (T-SQL):

MERGE pbs_CUSTOMER AS t
USING pbs_CUSTOMERF9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 AS s
ON t.CUSTOMER_CODE = s.CUSTOMER_CODE AND t.DTB = s.DTB

WHEN MATCHED THEN
    UPDATE SET t.DTB = s.DTB, t.CUSTOMER_CODE = s.CUSTOMER_CODE…

WHEN NOT MATCHED BY TARGET THEN
    INSERT (DTB, CUSTOMER_CODE, CUSTOMER_GROUP, …)  VALUES (s.DTB, s.CUSTOMER_CODE, s.CUSTOMER_GROUP, …)

WHEN NOT MATCHED BY SOURCE THEN
    DELETE
;

Thiết lập ví dụ :


Ví dụ sau mô tả cách đồng bộ dữ liệu giữa 2 bảng dữ liệu trong 2 Database khác nhau chi tiết như bảng sau:

Source Target
Sql server Instance Sql tại PC DESKTOP-KVQR979 Instance Sql tại Laptop DESKTOP-T5FKF7O
IPv4 10.0.0.36 10.0.0.24
Database DEVELOPMENTDB TSTDB
Tables pbs_CUSTOMER, pbs_HR_EMPL
  1. Tạo connection tới 2 Source và Target tại DBC

  2. Tạo các connection tại DBC để TableSync có thể đọc và ghi dữ liệu.

Tạo connection tới database nguồn

image0

Tạo connection tới database đích

image1

Tạo cấu hình các bảng cần đồng bộ tại TSYN

Cấu hình bao gồm các thông tin cần thiết giúp TableSync có thể xác định bảng nguồn, các kết nối nguồn và đích

image2

Sau khi định nghĩa xong, người dùng nhấn Save để lưu lại.

Đồng bộ dữ liệu

Kiểm tra các table tại database nguồn trước khi thực hiện đồng bộ dữ liệu.

Thao tác này giúp kiểm tra dữ liệu trước và sau khi thực hiện đồng bộ, trong thực tế có thể bỏ qua bước này.

image3

Dữ liệu tại các bảng ở database đích.

image4

Tiến hành đồng bộ dữ liệu bằng cách chạy câu lệnh sau:

pbs.BO.DB.TableSync?TSYNCode=STT2

Câu lệnh trên sẽ gọi pbs.BO.DB.TableSync với cấu hình STT2 vừa được định nghĩa ở bước trên.

Người dùng cũng có thể chạy runnable này ngay trong giao diện của tính năng TSYN bằng cách mở cấu hình TSYN > click vào Transfer như hình dưới

image5

Kiểm tra lại các bảng dữ liệu tại database đích

image6

Troubleshoot


Các lỗi sau đây có thể xảy ra trong quá trình đồng bộ dữ liệu:

Received an invalid column length from the bcp client for colid 57.

Lỗi này phát sinh khi bảng đích có cấu trúc khác bảng nguồn. VD: cột ở bảng nguồn là CONTACT nvarchar(30) nhưng ở bảng đích là CONTACT nvarchar(50)

Giải quyết vấn đề này bằng cách sửa cấu trúc 2 bảng dữ liệu nguồn và đích giống nhau

Xem thêm


Document Link
Merge Statement

Tài liệu giới thiệu nhanh và cách dùng lệnh Merge trong SQL
https://medium.com/@naibedya.kar/https-medium-com-naibedya-kar-synchronizing-two-ms-sql-tables-using-merge-statement-91bc1c287c34
Merge Statement

Tài liệu về lệnh Merge của Microsoft
https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017
Bulk Copy (for Dev)

Cách dùng Bulk copy để chuyển dữ liệu hàng loạt
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/single-bulk-copy-operations

Updated on : 2020-09-04 07:05:48. by : . at T470-01.

Topic : . pbs.bo.db.tablesync