Để thực thi câu lệnh SQL trên Master mà không ghi vào binary log (không replicate sang Slave), thiết lập biến session sql_log_bin = 0.
Cú pháp
SET sql_log_bin = 0; -- Các câu lệnh không muốn replicate SET sql_log_bin = 1;
Yêu cầu: Cần quyền SYSTEM_VARIABLES_ADMIN hoặc SUPER (MySQL 5.7) / BINLOG_ADMIN (MySQL 8.0+).
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE SQLStatementsDemo (
-> UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.79 sec)
Chèn dữ liệu ban đầu (sẽ replicate):
mysql> INSERT INTO SQLStatementsDemo(UserName) VALUES
-> ('John'), ('Carol'), ('Bob'), ('Mike'), ('Sam'), ('David');
Tắt binary log, thực hiện UPDATE/INSERT/DELETE:
mysql> SET sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE SQLStatementsDemo SET UserName = 'Maxwell' WHERE UserId = 6;
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO SQLStatementsDemo(UserName) VALUES ('Chris');
Query OK, 1 row affected (0.16 sec)
mysql> DELETE FROM SQLStatementsDemo WHERE UserId = 7;
Query OK, 1 row affected (0.10 sec)
mysql> SET sql_log_bin = 1;
Query OK, 0 rows affected (0.00 sec)
Kiểm tra dữ liệu trên Master (đã thay đổi):
mysql> SELECT * FROM SQLStatementsDemo;
+--------+----------+ | UserId | UserName | +--------+----------+ | 1 | John | | 2 | Carol | | 3 | Bob | | 4 | Mike | | 5 | Sam | | 6 | Maxwell | +--------+----------+
Trên Slave: Dữ liệu vẫn giữ nguyên (John, Carol, Bob, Mike, Sam, David) — 3 thao tác trên không được replicate.
Trường hợp sử dụng phổ biến
- Dọn dẹp dữ liệu test/rác trên Master
- Chạy script migration/bảo trì không muốn ảnh hưởng Slave
- Nạp dữ liệu lịch sử (initial load) chỉ trên Master
- Sửa lỗi dữ liệu cục bộ
⚠️ Cảnh báo quan trọng
- Chỉ ảnh hưởng đến session hiện tại. Mở session mới → sql_log_bin = 1 mặc định
- Lạm dụng gây data drift (Master/Slave khác nhau) → khó khắc phục
- Không dùng cho DDL (CREATE/ALTER/DROP TABLE) — DDL luôn ghi binlog
- Kiểm tra bằng
SHOW BINLOG EVENTSsau khi thực hiện