Điều gì gây ra lỗi MySQL 1062 - mục trùng lặp khi bắt đầu nô lệ?


11
  • Phiên bản MySQL Master: 5.5.16-1
  • Phiên bản nô lệ của MySQL: 5.5,18-1

Ảnh chụp nhanh của chủ được tạo bởi:

mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql

Tệp kết xuất này được nhập vào nô lệ (được bắt đầu bằng --skip-slave-starttùy chọn) mà không gặp lỗi:

shell> pv dbname_`date +%F`.sql | mysql -u root -p

Nhưng tôi đã gặp lỗi sau khi thực hiện mysql> start slave;:

    Last_SQL_Errno: 1062
    Last_SQL_Error: Error 'Duplicate entry '115846' for key
'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO
request_posted (id, user_id, channel, message, link, picture, name, ...

Chỉ có một bản ghi với ID 115846 trên bản gốc:

mysql> select count(*) from request_posted where id=115846;
Current database: db

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)

Hãy thử bỏ qua một số truy vấn với:

mysql> STOP SLAVE; 
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE;

đã không giúp đỡ. Tôi không muốn bỏ qua những lỗi đó bằng cách thêm:

slave-skip-errors = 1062

để my.cnfnộp vì nó có thể mang lại nô lệ không nhất quán.

Điều gì có thể là lý do cho lỗi này?


CẬP NHẬT

Đây không phải là cách tôi thường thiết lập sao chép myQuery

Những bước mà bạn nghĩ rằng tôi không làm theo tài liệu?

Tôi tự hỏi nếu bạn sẽ gặp phải vấn đề tương tự nếu bạn thiết lập toàn bộ cấu hình thay vì truyền lệnh mysqldump.

Không, nó hoạt động như bình thường nếu tôi cũng thay đổi chủ thành tọa độ tương ứng.

Tôi sẽ thử bỏ cơ sở dữ liệu vào nô lệ, đảm bảo các binlog rõ ràng và bắt đầu lại. Đồng thời kiểm tra bảng trong câu hỏi trên bản gốc để đảm bảo các chỉ mục không có lỗi.

Là xóa (di chuyển) tất cả các datadir đủ? Tôi đã làm điều đó và nhận được kết quả tương tự.


Trả lời @Dmytro Leonenko

'hiển thị trạng thái nô lệ \ G' trên nô lệ để đảm bảo rằng nó được định cấu hình đúng, MASTER_LOG_POS là 0

Chỉ 'hiển thị statug nô lệ \ G' sau khi nhập nhưng trước 'bắt đầu nô lệ;' có thể cho chúng tôi câu trả lời

Tôi đã sao lưu datadir, xóa tất cả và chạy mysql_install_db, nhập tệp kết xuất, thực thi change master tovà đây là kết quả:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: x.x.x.x
                  Master_User: xx
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_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: 0
              Relay_Log_Space: 106
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)

Tôi đang tự hỏi tại sao Master_Log_Pos là 4?


1
Chỉ có thể có một bản ghi với id đó, do đó, nó sẽ không bao giờ được ghi. Khi bạn phát hành SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1Truy vấn gây ra lỗi ít nhất có thay đổi không? Là thiết lập vị trí binlog nô lệ chính xác?
mỏng

Mỗi khi tôi bỏ qua bộ đếm, nó sẽ thay đổi thành một ID khác. Các --master-datatùy chọn đã được viết tọa độ ghi nhị phân để các tập tin dump. Tôi chỉ cần thay đổi master thành master_host, master_user, master_password.
lượng tử

Đây không phải là cách tôi thường thiết lập sao chép myQuery (Tôi thường thiết lập sao chép trên mỗi URL tại đây: dev.mysql.com/doc/refman/5.0/en/replication-howto.html ) Tuy nhiên, đọc qua các tùy chọn mysqldump, không có lý do gì Tại sao nó không hoạt động. Tôi tự hỏi nếu bạn sẽ gặp phải vấn đề tương tự nếu bạn thiết lập toàn bộ cấu hình thay vì truyền lệnh mysqldump.
Rilindo

Ý bạn là tôi không nên sử dụng --master-datatùy chọn khi tạo ảnh chụp nhanh dữ liệu? Nếu nó vẫn xảy ra khi tôi sử dụng --lock-all-tablestùy chọn và change master to master_log_file='', master_log_pos='', ..., nguyên nhân có thể là gì?
lượng tử

Không, đó không phải là điều tôi đang nói. Như tôi đã đề cập, những gì bạn đã làm nên hoạt động như dự định - theo tôi có thể thấy, không có lỗi hiện có với tùy chọn đó. Tuy nhiên, điều đó không có nghĩa là không có, vì vậy, như một bước cô lập, tôi sẽ tuân theo quy ước được cung cấp bởi myQuery trước thông qua URL đó. t. Nếu điều đó hoạt động, ít nhất bạn có hướng để bắt đầu xử lý sự cố. Nếu điều đó không, tốt, chúng tôi có một vấn đề khác. :)
Rilindo

Câu trả lời:


7

Những gì cần cố gắng khắc phục vấn đề của bạn:

  1. Bạn nên xóa master.info trên Slave trước và khởi động lại mysql
  2. phát hành THAY ĐỔI MASTER ĐẾN MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'repl', MASTER_PASSWORD = 'nô lệ';
  3. thực hiện mysqldump với tùy chọn '--flush-log' trên master
  4. 'mysql -u người dùng -p <dump.sql' trên nô lệ
  5. 'hiển thị trạng thái nô lệ \ G' trên nô lệ để đảm bảo rằng nó được định cấu hình đúng, MASTER_LOG_POS là 0
  6. 'bắt đầu nô lệ;' về nô lệ.

Kiểm tra những gì cũng:

  • Định dạng Binlog: MIXED
  • server_ids khác nhau trên master và Slave

Việc phát hành toàn bộ chuỗi chủ thay đổi (bao gồm tên nhật ký và số vị trí) thực sự đã sửa nó, nhưng tại thời điểm này, tôi nghĩ câu hỏi cốt lõi là tại sao Quanta phải nhập lại tên đăng nhập và số vị trí khi đã có trong tập tin dump.
Rilindo

Chỉ 'hiển thị statug nô lệ \ G' sau khi nhập nhưng trước 'bắt đầu nô lệ;' có thể cho chúng tôi câu trả lời
Dmytro Leonenko

nối các thông tin được yêu cầu vào bài viết gốc của tôi
lượng tử

Làm thế nào bạn kết thúc với "Master_host: xxxx Master_User: xx" mà không phát hành "THAY ĐỔI MASTER ...". Hoặc bạn chỉ không đề cập đến nó trong câu trả lời? Bạn đã kiểm tra định dạng binlog và dòng lệnh cho mysqldump là gì chưa?
Dmytro Leonenko

Tôi đã đề cập rằng trong bài viết của mình " nhập tệp kết xuất, thực thichange master to ". Tôi đang sử dụng ghi nhật ký dựa trên MIXED. Tôi đã thử nghiệm với MySQL 5.0.77 (dựa trên câu lệnh), nó cũng gây ra lỗi này. Toàn bộ mysqldump làmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
quanta

2

Vấn đề xảy ra là do thiết lập bản gốc trên máy chủ sản xuất đang chạy TRƯỚC KHI thực hiện kết xuất (theo như tôi có thể nói). Vì vậy, có những truy vấn được viết trong master_log đã được thực thi trên dữ liệu cư trú trên nô lệ. Tôi chưa bao giờ thực sự thấy một giải pháp trên trang web mysql hoặc danh sách gửi thư. Vì vậy, tôi đã đưa ra giải pháp sau đây giải quyết vấn đề của mình.

trên nô lệ:

mysql> STOP SLAVE;
mysql> FLUSH PRIVILEGES;  # dump likly included users too

trên chủ:

mysql> RESET MASTER;

trên nô lệ:

mysql> RESET SLAVE;
mysql> START SLAVE;

Nhân tiện, tôi đã chạy bãi rác của mình với những điều sau đây về nô lệ:

mysqldump -uROOTUSER -pROOTPASSWORD -hMYSQLMASTER.EXAMPLE.COM --all-databases --delete-master-logs | mysql -uROOTUSER -pROOTPASSWORD

Tôi mong điều này giúp được người nào khác.

http://dev.mysql.com/doc/refman/5.0/en/reset-master.html

http://dev.mysql.com/doc/refman/5.0/en/reset-slave.html


được chỉnh sửa để bao gồm các đặc điểm riêng; Tôi nhận ra sau một lỗi khác mà ngay cả người dùng của tôi đã được nhập với kết xuất, đặc quyền của họ chưa hoạt động.
BroknDodge

RESET MASTER nên được chạy trên nô lệ, không phải trên chủ, xem percona.com/blog/2013/02/08/ Mark
Jon

1

Nếu bạn không muốn REDO thủ tục hoàn chỉnh, một cách khắc phục tốt sẽ là sử dụng

STOP SLAVE;    
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

Nếu có quá nhiều lỗi như vậy, một ý tưởng tốt sẽ là tự động hóa nó bằng cách sử dụng tập lệnh bash.

Tham chiếu: Sửa lỗi nhập trùng lặp


1

Tôi đã có vấn đề chính xác và liên kết của Ut xd đã giúp. nhưng lệnh trong liên kết đó có lỗi cú pháp và đây là phiên bản phù hợp với tôi:

while [ 1 ]; do if [ `mysql -uroot -ppassword -e"show slave status \G;" | grep "Duplicate entry" | wc -l` -eq 2 ] ; then mysql -uroot -ppassword -e"stop slave; set global sql_slave_skip_counter=1; start slave;"; fi; sleep 1; mysql -uroot -ppassword -e"show slave status\G"; done

Về cơ bản, nó kiểm tra nếu có lỗi nhập trùng lặp và bỏ qua sự kiện này từ chủ. và làm điều đó trong một vòng lặp.


1
Đây sẽ là một câu trả lời tốt hơn nhiều nếu bạn giải thích mã đó làm gì và định dạng mã để dễ đọc hơn.
kasperd

0

Trong trường hợp của tôi, vấn đề được giải quyết bằng các lệnh sau

theo các bước sau

STOP SLAVE;
RESET SLAVE;
START SLAVE;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.