Điều kiện tiên quyết
- Môi trường MySQL
- Môi trường OceanBase
- Cấu trúc bảng và một số dữ liệu dùng để kiểm tra
Trước tiên, tạo bảng kiểm tra trong MySQL bằng đoạn script sau, đồng thời chèn 10.000 bản ghi để kiểm tra quá trình di chuyển:
use test;
CREATE TABLE students (
`id` int NOT NULL PRIMARY KEY,
`name` varchar(255),
`code` varchar(20),
`class` varchar(255)
);
DELIMITER $$
DROP PROCEDURE IF EXISTS insertStudents;
CREATE PROCEDURE insertStudents()
BEGIN
DECLARE i INT;
SET i = 0;
WHILE i < 10000 DO
INSERT INTO students(id, name, code, class) VALUES(i + 1, CONCAT('User', i), '2020010' + i + 10, CONCAT(FLOOR(RAND() * 10), 'c'));
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;
CALL insertStudents();
SELECT COUNT(*) FROM students;
Sau khi hoàn tất chuẩn bị, chọn phương pháp di chuyển phù hợp để thực hiện. Đối với MySQL tenant của OceanBase, thường có hai cách di chuyển toàn bộ dữ liệu:
- mysqldump: Công cụ xuất dữ liệu tích hợp trong MySQL, dễ sử dụng cho các trường hợp dữ liệu nhỏ. Nó xuất cấu trúc bảng và dữ liệu thành file SQL.
- DataX: Công cụ di chuyển dữ liệu đa dạng do Alibaba phát triển, hỗ trợ nhiều loại nguồn dữ liệu khác nhau và tương thích tốt với OceanBase, lý tưởng cho việc di chuyển lượng lớn dữ liệu với hiệu suất cao.
Phương pháp 1: mysqldump
mysqldump không cần cài đặt riêng, chỉ cần môi trường MySQL là có thể sử dụng. Kiểm tra bằng lệnh:
[root@localhost ~]# which mysqldump
/usr/bin/mysqldump
Hoặc sử dụng mysqldump tích hợp trong obclient:
[root@localhost ~]# su - ob
[ob@localhost ~]$ which mysqldump
~/.oceanbase-all-in-one/obclient/u01/obclient/bin/mysqldump
Quy trình tổng thể là: xuất file SQL từ MySQL → thực thi file SQL trên OceanBase. File được xuất ra tuân thủ cú pháp SQL chuẩn.
Bước 1: Xuất dữ liệu:
[ob@localhost ~]$ mkdir mysqldump_data
[ob@localhost ~]$ mysqldump -h x.x.x.222 -u root -P 3306 -p -B "test" --tables "students" > /home/ob/mysqldump_data/students.sql
Bước 2: Nhập dữ liệu. Có hai cách phổ biến: dùng lệnh mysql hoặc lệnh source.
# Cách 1: Sử dụng lệnh mysql
[ob@localhost ~]$ mysql -h x.x.x.222 -u root -P 2883 -D test < /home/ob/mysqldump_data/students.sql
# Cách 2: Sử dụng lệnh source
[ob@localhost ~]$ obclient -h x.x.x.222 -u root -P 2883 -D test
obclient [test]> source /home/ob/mysqldump_data/students.sql;
Query OK, 10000 rows affected (0.069 sec)
obclient [test]> SELECT COUNT(*) FROM students;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
Quá trình di chuyển dữ liệu đã hoàn tất.
Mở rộng: Bất kỳ file SQL chuẩn nào cũng có thể được thực thi theo hai cách này.
Phương pháp 2: DataX
DataX là một thành phần độc lập nên cần tải xuống trước khi sử dụng, tuy nhiên cài đặt đơn giản và không phức tạp.
Chuẩn bị môi trường DataX:
[root@localhost ~]# wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz
[root@localhost ~]# tar -xvzf datax.tar.gz
Nhiệm vụ di chuyển trong DataX được định nghĩa dưới dạng job. Tạo một tệp cấu hình như sau:
{
"job": {
"setting": {
"speed": {
"channel": 4
},
"errorLimit": {
"record": 0,
"percentage": 0.1
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "điền mật khẩu thật",
"column": ["*"],
"connection": [
{
"table": ["students"],
"jdbcUrl": ["jdbc:mysql://x.x.x.222:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false"]
}
]
}
},
"writer": {
"name": "oceanbasev10writer",
"parameter": {
"obWriteMode": "insert",
"column": ["*"],
"preSql": ["truncate table students_datax"],
"connection": [
{
"jdbcUrl": "jdbc:oceanbase://x.x.x.222:2883/test?",
"table": ["students_datax"]
}
],
"username": "root",
"password":"điền mật khẩu thật",
"writerThreadCount":10,
"batchSize": 1000,
"memstoreThreshold": "0.9"
}
}
}
]
}
}
Cấu hình gồm các phần chính:
- setting: Cấu hình tốc độ, giới hạn lỗi…
- reader: Thông tin kết nối đến nguồn dữ liệu MySQL
- writer: Thông tin kết nối đến đích OceanBase và hành vi ghi dữ liệu
Do DataX không sao chép cấu trúc bảng, cần tạo bảng trước trong OceanBase (tên có thể khác nhưng kiểu dữ liệu phải giống nhau):
obclient [test]> CREATE TABLE students_datax (
`id` int NOT NULL PRIMARY KEY,
`name` varchar(255),
`code` varchar(20),
`class` varchar(255)
);
Sau khi chuẩn bị xong, chạy DataX:
[root@localhost job]# python ../bin/datax.py mysql2ob_test.json
...
2024-03-17 11:37:29.012 [job-0] INFO StandAloneJobContainerCommunicator - Total 10000 records, 207784 bytes | Speed 20.29KB/s, 1000 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.143s | All Task WaitReaderTime 0.022s | Percentage 100.00%
2024-03-17 11:37:29.013 [job-0] INFO JobContainer -
Task started at: 2024-03-17 11:37:18
Task ended at: 2024-03-17 11:37:29
Total time taken: 10s
Average speed: 20.29KB/s
Record write rate: 1000rec/s
Total records read: 10000
Total errors: 0
Kiểm tra lại dữ liệu:
[ob@localhost ~]$ obclient -h x.x.x.222 -u root -P 2883 -D test -p
obclient [test]> SELECT COUNT(*) FROM students_datax;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
Các phương pháp khác
OMS (OceanBase Migration Service)
OMS là dịch vụ di chuyển dữ liệu do OceanBase cung cấp, tích hợp trong OCP. Có thể cấu hình qua giao diện web để thực hiện di chuyển dữ liệu, hỗ trợ di chuyển cấu trúc và dữ liệu đầy đủ, đồng thời hỗ trợ đồng bộ hóa tăng trưởng.
Đồng bộ hóa thời gian thực
Hai phương pháp trên đều là di chuyển toàn bộ dữ liệu. Với các tình huống cần đồng bộ hóa thời gian thực, các công cụ này không đáp ứng được. Cần sử dụng các công cụ khác như Canal (do Alibaba phát triển), hoạt động bằng cách theo dõi binlog của MySQL và tái tạo lại thành các truy vấn SQL để thực thi tại đích.
Xem thêm tại:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000507573