Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

Lỗi hay gặp khi bật replication

ICT

1. Trùng key quan trọng

Last_Error: Could not execute Write_rows_v1 event on table clbv_ict.node; Duplicate entry '2326' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mariadb-bin.000001, end_log_pos 97091991

Nguyên nhân gốc không thay đổi: seed (snapshot) và GTID position bắt đầu replication không khớp, nên SQL thread đang cố “insert lại” các bản ghi đã có trong seed → duplicate PK.

Cách đúng lúc này là re-seed lại chuẩn theo GTID snapshot (chốt một GTID tại thời điểm dump), rồi trên S2 đặt GTID position tương ứng trước khi START SLAVE.

Bước 1. Trên S1: chốt GTID snapshot (khóa rất ngắn)

Đăng nhập MariaDB trên S1:

 
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only=ON;

Ngay lập tức lấy GTID position:

 
SELECT @@GLOBAL.gtid_binlog_pos;

Ví dụ nó trả 0-1-30253 (bạn sẽ dùng đúng giá trị thực tế của bạn). Ghi lại giá trị này.

Sau đó mở khóa ngay (không giữ lock lâu):

 
UNLOCK TABLES; SET GLOBAL read_only=OFF;

Ghi chú: FLUSH TABLES WITH READ LOCK + read_only=ON chỉ cần vài giây để chốt GTID. Dump sẽ chạy bằng --single-transaction nên không cần giữ lock trong suốt quá trình.

Bước 2. Trên S1: tạo dump seed, rồi Copy dump sang S2 rồi import vào S2 (sau khi đã xóa các database lỗi trước đó)

Xóa các database lỗi đã import trước đó:

mariadb -N -e "SHOW DATABASES" \
| egrep -v "^(information_schema|performance_schema|mysql|sys)$" \
| while read -r db; do
   echo "DROP DATABASE \`$db\`;"
 done | mariadb
 

Bước 3. Trên S2: set GTID position đúng snapshot

Đây là bước bạn đang thiếu trước đó.

Giả sử GTID snapshot bạn lấy ở bước 1 là 0-1-30253 (ví dụ). Trên S2 chạy:

 
SET GLOBAL gtid_slave_pos = '0-1-30253';

Bạn phải thay bằng đúng giá trị @@GLOBAL.gtid_binlog_pos bạn đã ghi lại trên S1.

Kiểm tra:

 
SELECT @@GLOBAL.gtid_slave_pos;

Bước 4. Trên S2: cấu hình lại master và start slave

Và chạy replication như bình thường

2. Trùng key không quan trọng: dòng đã có rồi, nên không tạo được

Last_Error: Could not execute Write_rows_v1 event on table ai_ct.key_value; Duplicate entry 'feeds_feed.14-clean' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mariadb-bin.000164, end_log_pos 6260501

Skip bỏ qua 1 key này nếu không quan trọng, không khuyến nghị cho dữ liệu quan trọng.

Nếu bạn chấp nhận “bỏ qua” event gây lỗi để replication chạy tiếp:

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
SHOW SLAVE STATUS\G
 

3. Các bảng cache, log

Last_Error: Could not execute Delete_rows_v1 event on table ask_bvtwctd7.h5p_libraries_hub_cache; Can't find record in 'h5p_libraries_hub_cache', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mariadb-bin.000001, end_log_pos 12322143

Giải pháp: không replication các bảng này.

root@ai:/mnt/data# nano /etc/mysql/mariadb.conf.d/50-server.cnf

[mysqld]
server_id=2

replicate-wild-ignore-table=%.cache\_%
replicate-wild-ignore-table=%.cache
# Ignore các bảng kết thúc bằng _cache (Drupal modules thường dùng)
replicate-wild-ignore-table=%.\%\_cache
replicate-wild-ignore-table=%.h5p\_%\_cache
replicate-wild-ignore-table=%.h5p\_%\_cache\_%
replicate-wild-ignore-table=%.h5p_libraries_hub_cache

# Drupal volatile tables (khuyến nghị tối thiểu)
replicate-wild-ignore-table=%.watchdog
replicate-wild-ignore-table=%.sessions
replicate-wild-ignore-table=%.flood
replicate-wild-ignore-table=%.semaphore
replicate-wild-ignore-table=%.accesslog
replicate-wild-ignore-table=%.ultimate_cron_log

replicate-wild-ignore-table=%.queue
replicate-wild-ignore-table=%.variable