Nếu bạn đã thiết lập sao chép MySQL, có lẽ bạn đã biết vấn đề này: đôi khi có những truy vấn MySQL không hợp lệ khiến sao chép không hoạt động nữa. Trong hướng dẫn ngắn này, tôi sẽ giải thích cách bạn có thể sửa chữa sao chép trên máy chủ MySQL mà không cần phải thiết lập lại từ đầu. Hướng dẫn này dành cho MySQL và MariaDB.
Bạn có thể xem truy vấn nào gây ra lỗi và quá trình sao chép đã dừng ở vị trí nhật ký nào.
Để xác minh rằng quá trình sao chép thực sự không hoạt động, hãy đăng nhập vào MySQL:
Trên shell MySQL, hãy chạy:
Nếu một trong số Slave_IO_Running hoặc Slave_SQL_Running được đặt thành No, thì quá trình sao chép bị hỏng:
Việc khắc phục sự cố thực sự khá dễ dàng. Chúng tôi yêu cầu slave bỏ qua truy vấn SQL không hợp lệ:
Điều này yêu cầu slave bỏ qua một truy vấn (là truy vấn không hợp lệ khiến quá trình sao chép dừng lại). Nếu bạn muốn bỏ qua hai truy vấn, bạn sẽ sử dụng SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2; thay vào đó, v.v.
Vậy là xong. Bây giờ chúng ta có thể khởi động lại slave...
... và kiểm tra xem quá trình sao chép có hoạt động trở lại không:
Như bạn thấy, cả Slave_IO_Running và Slave_SQL_Running đều được đặt thành Yes ngay bây giờ.
Bây giờ hãy thoát khỏi shell MySQL...
... và kiểm tra lại nhật ký:
Dòng cuối cùng cho biết quá trình sao chép đã bắt đầu lại và nếu bạn không thấy lỗi nào sau dòng đó thì mọi thứ đều ổn.
1 Xác định vấn đề
Để tìm hiểu xem sao chép có hoạt động hay không và nguyên nhân khiến sao chép dừng hoạt động, bạn có thể xem nhật ký. Ví dụ, trên Debian, MySQL ghi nhật ký vào /var/log/syslog:
Mã:
grep mysql /var/log/syslog
Mã:
server1:/home/admin# grep mysql /var/log/syslog[B]THÁNG 3 19 09:56:08 http2 mysqld[1380]: 080529 9:56:08 [LỖI] Slave: Lỗi 'Bảng 'mydb.taggregate_temp_1212047760' không tồn tại' khi truy vấn. Cơ sở dữ liệu mặc định: 'mydb'. Truy vấn: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate
THÁNG 3 1909:56:08 http2 mysqld[1380]: ^ISET thread.views = thread.views + aggregate.views
THÁNG 3 1909:56:08 http2 mysqld[1380]: ^IWHERE thread.threadid = aggregate.threadid', Error_code: 1146
THÁNG 3 1909:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Lỗi khi chạy truy vấn, luồng SQL phụ bị hủy. Sửa lỗi và khởi động lại luồng SQL phụ bằng "SLAVE START". Chúng tôi đã dừng tại vị trí nhật ký 'mysql-bin.001079' 203015142
server1:/home/admin#
Để xác minh rằng quá trình sao chép thực sự không hoạt động, hãy đăng nhập vào MySQL:
Mã:
mysql -u root -p
Mã:
mysql> HIỂN THỊ TRẠNG THÁI SLAVE \G
Mã:
mysql>SHOWSLAVESTATUS\G
***************************1.row***************************
Slave_IO_State:Waitingformastertosendevent
Master_Host:1.2.3.4
Master_User:slave_user
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.001079
Read_Master_Log_Pos:269214454
Relay_Log_File:slave-relay.000130
Relay_Log_Pos:100125935
Relay_Master_Log_File:mysql-bin.001079
Slave_IO_Running:Có
Slave_SQL_Running:Không
Replicate_Do_DB:mydb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Ta ble:
Last_Errno:1146
Last_Error:Error'Table'mydb.taggregate_temp_1212047760'doesn'texist'onquery.Defaultdatabase:'mydb'.
Query:'UPDATEthreadASthread,taggregate_temp_1212047760ASaggregate
SETthread.views=thread.views+aggregate.views
WHEREthread.threadid=aggregate.threadid'
Skip_Counter:0
Exec_Master_Log_Pos:203015142
Relay_Log_Space:166325247
Until_Condition:None
Until_Log_File:
Until_Log_Pos:0
Master_SSL_Allowed:No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:NULL
1rowinset(0.00sec)
mysql>
2 Sửa chữa bản sao MySQL
Để chắc chắn, chúng ta dừng máy phụ:
Mã:
mysql> STOP SLAVE;
Mã:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
Vậy là xong. Bây giờ chúng ta có thể khởi động lại slave...
Mã:
mysql> START SLAVE;
Mã:
mysql> SHOW SLAVE STATUS \G
Mã:
mysql>SHOWSLAVESTATUS\G
******************************1.row***************************
Slave_IO_State:Waitingformastertosendevent
Master_Host:1.2.3.4
Master_User:slave_user
Master_Port:3306
Connect_Retry:60
M aster_Log_File:mysql-bin.001079
Read_Master_Log_Pos:447560366
Relay_Log_File:slave-relay.000130
Relay_Log_Pos:225644062
Relay_Master_Log_File:mysql-bin.001079
Slave_IO_Running:Có
Slave_SQL_Running:Có
Replicate_Do_DB:mydbReplicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:0
Last_Error:
Skip_Counter:0
Exec_Master_Log_Pos:447560366
Relay_Log_Space:225644062Until_Condition:None
Until_Log_File:
Until_Log_Pos:0
Master_SSL_Allowed:No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:0
1rowinset(0.00sec)
mysql>[/b]
Bây giờ hãy thoát khỏi shell MySQL...
Mã:
mysql> thoát;
Mã:
grep mysql /var/log/syslog
Mã:
server1:/home/admin# grep mysql /var/log/syslog
THÁNG 3 1909:56:08 http2 mysqld[1380]: 080529 9:56:08 [LỖI] Slave: Lỗi 'Bảng 'mydb.taggregate_temp_1212047760' không tồn tại' khi truy vấn. Cơ sở dữ liệu mặc định: 'mydb'. Truy vấn: 'UPDATE thread AS thread,taggregate_temp_1212047760 AS aggregate
THÁNG 3 1909:56:08 http2 mysqld[1380]: ^ISET thread.views = thread.views + aggregate.views
THÁNG 3 1909:56:08 http2 mysqld[1380]: ^IWHERE thread.threadid = aggregate.threadid', Error_code: 1146
THÁNG 3 1909:56:08 http2 mysqld[1380]: 080529 9:56:08 [ERROR] Lỗi khi chạy truy vấn, luồng SQL phụ bị hủy. Sửa lỗi và khởi động lại luồng SQL phụ bằng "SLAVE START". Chúng tôi dừng lại ở nhật ký 'mysql-bin.001079' vị trí 203015142
THÁNG 3 1911:42:13 http2 mysqld[1380]: 080529 11:42:13 [Lưu ý] Luồng SQL Slave đã được khởi tạo, bắt đầu sao chép trong nhật ký 'mysql-bin.001079' ở vị trí 203015142, nhật ký chuyển tiếp '/var/lib/mysql/slave-relay.000130' vị trí: 100125935
server1:/home/admin#
3 Liên kết
- MySQL: http://www.mysql.com