# Di chuyển SQL Server sang MySQL

DTS hỗ trợ các tác vụ di chuyển toàn bộ (full) và di chuyển toàn bộ + tăng trưởng (full+incremental) từ SQL Server 2008 trở đi sang MySQL 5.5 và các phiên bản mới hơn.

## Hạn chế chức năng
1. Hỗ trợ di chuyển cơ sở dữ liệu đơn lẻ, có khả năng di chuyển toàn bộ cơ sở dữ liệu hoặc các bảng được chỉ định. Nó không hỗ trợ di chuyển các thủ tục lưu trữ (stored procedures), trình kích hoạt (triggers) hoặc dạng xem (views).
2. Di chuyển toàn bộ + tăng trưởng không hỗ trợ DDL.
3. Trong quá trình di chuyển toàn bộ + tăng trưởng, cơ sở dữ liệu nguồn và các bảng cần di chuyển cần phải được bật tính năng cdc.

```sql
-- Chỉ định tên cơ sở dữ liệu
use dbname
-- Bật tính năng cdc
exec sys.sp_cdc_enable_db
-- Kiểm tra xem cdc đã được bật cho cơ sở dữ liệu dbname hay chưa, giá trị trả về là 1 nghĩa là đã bật
select is_cdc_enabled from sys.databases where name = "dbname";
-- Bật cdc cho bảng dbo.tablename
exec sys.sp_cdc_enable_table @source_schema = 'dbo',@source_name = 'tablename',@role_name = null;
-- Kiểm tra xem cdc đã được bật cho bảng dbo.tablename hay chưa, giá trị trả về là 1 nghĩa là đã bật
select is_tracked_by_cdc from sys.tables where name = 'tablename'
-- Sửa đổi thời gian lưu trữ dữ liệu cdc, ít nhất thay đổi thành 1440 phút (1 ngày) trở lên, khuyến nghị 14400 phút (7 ngày).
EXECUTE sys.sp_cdc_change_job @job_type = N'cleanup', @retention = 14400;
```

4. Các bảng cần di chuyển phải có khóa chính (primary key) hoặc chỉ mục duy nhất (unique index), và khuyến nghị sử dụng kiểu int làm khóa chính. Nếu khóa chính là kiểu chuỗi và lượng dữ liệu lớn, tốc độ di chuyển sẽ bị ảnh hưởng.
5. Thuộc tính tự động tăng (auto-increment) của khóa chính trong các bảng cần di chuyển không thể được di chuyển.
6. Trường rowversion trong các bảng cần di chuyển không thể được di chuyển.
7. Khi cơ sở dữ liệu đích là MySQL, tên schema của cơ sở dữ liệu nguồn sẽ không được di chuyển. Nếu có các bảng trùng tên trong các schema khác nhau ở cơ sở dữ liệu nguồn, chỉ một trong số chúng sẽ được di chuyển.

## Nội dung di chuyển

| Nội dung di chuyển | Mô tả |
| ----------------- | ----------- |
| Cấu trúc di chuyển | 1. Cơ sở dữ liệu, Cấu trúc bảng và dữ liệu<br>2. Các thư viện và bảng đã tồn tại trong cơ sở dữ liệu đích sẽ không bị xóa trước khi quá trình di chuyển bắt đầu. Nếu việc tạo bảng tự động không đáp ứng yêu cầu, khách hàng có thể tự tạo bảng trước trong cơ sở dữ liệu đích. |
| Phạm vi di chuyển    | Chỉ di chuyển các thư viện và bảng có thể phát hiện được khi tác vụ được tạo. Các bảng mới được thêm vào trong quá trình chạy tác vụ sẽ tạm thời không được tự động di chuyển. |
| DDL               | Không được hỗ trợ |
| DML               | insert/update/delete |

## Điền biểu mẫu

Biểu mẫu dữ liệu nguồn

| Tên tham số | Mô tả |
| -------------- | ----------- |
| Địa chỉ        | Hỗ trợ hai loại: địa chỉ mạng nội bộ (intranet) và địa chỉ đường truyền riêng (dedicated line). Địa chỉ mạng nội bộ yêu cầu điền thông tin VPC và mạng con; địa chỉ đường truyền riêng hỗ trợ cả IP và tên miền. Nếu sử dụng tên miền, mạng của người dùng phải có cổng kết nối mạng bên ngoài. |
| Cổng (Port)           | Cổng kết nối SQL Server |
| Tên người dùng       | Tên người dùng kết nối SQL Server |
| Mật khẩu       | Mật khẩu tương ứng với người dùng cơ sở dữ liệu SQL Server |
| Tên cơ sở dữ liệu  | Tên cơ sở dữ liệu SQL Server, chỉ hỗ trợ di chuyển cơ sở dữ liệu đơn lẻ |
| Tên bảng     | Tên bảng chuyển giao SQL Server. Sử dụng dấu phẩy để phân tách các tên bảng. Ví dụ: `dbo.tablename1,dbo.tablename2`. Nếu schema là dbo, nó có thể được bỏ qua, chỉ cần điền tên bảng. Ví dụ: `tablename1,tablename2` |

Biểu mẫu chuyển giao MySQL đích

| Tên tham số | Mô tả |
| -------------- | ----------- |
| Loại địa chỉ   | Hiện tại đích chỉ hỗ trợ mạng nội bộ (intranet) |
| Cổng (Port)           | Cổng kết nối MySQL |
| Tên người dùng       | Tên người dùng kết nối MySQL |
| Mật khẩu       | Mật khẩu tương ứng với người dùng cơ sở dữ liệu MySQL |