মাইএসকিউএল ত্রুটি 1062 - স্লেভ শুরু করার সময় ডুপ্লিকেট এন্ট্রিটির কারণ কী?


11
  • মাইএসকিউএল মাস্টার সংস্করণ: 5.5.16-1
  • মাইএসকিউএল স্লেভ সংস্করণ: 5.5.18-1

মাস্টারের স্ন্যাপশটটি তৈরি করেছেন:

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

এই ডাম্প ফাইলটি --skip-slave-startত্রুটি ছাড়াই দাসের (যা বিকল্প দিয়ে শুরু করা হয় ) আমদানি করা হয় :

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

কিন্তু কার্যকর করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি 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, ...

মাস্টারটিতে 115846 আইডি সহ কেবল একটি রেকর্ড রয়েছে:

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

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

এর সাথে কিছু জিজ্ঞাসা বাদ দেওয়ার চেষ্টা করুন:

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

সাহায্য করেনি আমি যুক্ত করে এই ত্রুটিগুলি এড়িয়ে যেতে চাই না:

slave-skip-errors = 1062

থেকে my.cnfফাইল করা হয়েছে কারণ এটি ক্রীতদাস অসঙ্গত আনতে পারে।

এই ত্রুটির কারণ কী হতে পারে?


হালনাগাদ

এটি সাধারণত আমি মাইএসকিউএল প্রতিলিপি সেটআপ করি না

আপনি দস্তাবেজটি অনুসরণ করেন না এমন কোন পদক্ষেপগুলি আপনি মনে করেন?

আমি ভাবছি আপনি যদি একই কনফিগারেশনের মুখোমুখি হন তবে আপনি যদি পুরো কনফিগারেশনটি সেটআপ করতে চেয়েছিলেন তবে যে মাইএসকিএলডাম কমান্ডটি পাস করেছিল।

না, এটি সাধারণভাবে কাজ করে যদি আমিও মাস্টারটিকে সংশ্লিষ্ট স্থানাঙ্কে পরিবর্তন করি।

আমি স্লেভের উপর ডাটাবেস ফেলে দেওয়ার চেষ্টা করব, বাইনলগগুলি পরিষ্কার রয়েছে তা নিশ্চিত করে আবার শুরু করব। সূচকের ত্রুটি নেই তা নিশ্চিত করার জন্য মাস্টারের প্রশ্নে থাকা সারণীটিও পরীক্ষা করুন।

সমস্ত ডাটাডির মুছে ফেলা (সরানো) কি যথেষ্ট? আমি তা করেছিলাম এবং একই ফলাফল পেয়েছি।


প্রত্যুত্তর

এটি সঠিকভাবে কনফিগার করা হয়েছে কিনা তা নিশ্চিত করার জন্য স্লেভের উপর 'স্লেভের অবস্থা \ G' দেখান, MASTER_LOG_POS 0 হয়

আমদানির পরে কেবল 'স্লেভ স্ট্যাটগ \ জি' দেখান তবে 'স্টার্ট স্টাভ' এর আগে; আমাদের উত্তর দিতে পারেন

আমি ডেটাডির ব্যাক আপ করেছি, সমস্ত মুছে ফেলেছি এবং চালনা করব mysql_install_db, ডাম্প ফাইল আমদানি করব, সম্পাদন করব change master toএবং ফলাফলগুলি এখানে:

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)

আমি ভাবছি মাস্টার_লগ_পোস 4 কেন?


1
সেই আইডি দিয়ে কেবল একটি রেকর্ড থাকতে পারে, সুতরাং ত্রুটিটি, এটি কখনই লেখা হবে না। আপনি যখন ইস্যু করেন তখন SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1কি কোয়েরি ত্রুটির পরিবর্তন ঘটায়? দাস বিনলগ অবস্থান সঠিকভাবে সেট আপ ছিল?
দু'বার

আমি যখনই কাউন্টার এড়িয়ে যাই তখন এটি অন্য আইডিতে পরিবর্তন হয়। --master-dataবিকল্প ইতিমধ্যে ডাম্প ফাইলে বাইনারি লগ স্থানাঙ্ক লিখুন। আমার কেবলমাত্র মাস্টার_হোস্ট, মাস্টার_উজার, মাস্টার_ পাসওয়ার্ডে মাস্টার পরিবর্তন করতে হবে।
কোয়ান্টা

এটি সাধারণত আমি মাইএসকিউএল প্রতিলিপি সেটআপ করি না (আমি সাধারণত ইউআরএল প্রতি প্রতিলিপি এখানে সেটআপ করি: dev.mysql.com/doc/refman/5.0/en/replication-howto.html ) তবে, মাইএসকিএলডাম বিকল্পগুলি পড়ার কোনও কারণ নেই কেন এটি কাজ করা উচিত নয়। আমি ভাবছি আপনি যদি একই কনফিগারেশনের মুখোমুখি হন তবে আপনি যদি পুরো কনফিগারেশনটি সেটআপ করতে চেয়েছিলেন তবে যে মাইএসকিএলডাম কমান্ডটি পাস করেছিল।
রিলিন্ডো

আপনার অর্থ কী --master-dataকোনও ডেটা স্ন্যাপশট তৈরি করার সময় আমার বিকল্পটি ব্যবহার করা উচিত নয় ? যদি আমি --lock-all-tablesঅপশনটি ব্যবহার করি এবং এটি এখনও ঘটে থাকে change master to master_log_file='', master_log_pos='', ...তবে এর কারণগুলি কী হতে পারে?
কোয়ান্টা

না, আমি যা বলছি তা নয়। আমি যেমন ইঙ্গিত দিয়েছি, আপনি যা করেছেন তা উদ্দেশ্য অনুযায়ী কাজ করা উচিত - যতদূর আমি দেখতে পাচ্ছি, সেই বিকল্পটির সাথে কোনও বিদ্যমান বাগ নেই। যাইহোক, এর অর্থ এই নয় যে এটি নেই, তাই বিচ্ছিন্ন পদক্ষেপ হিসাবে, আমি প্রথমে মাইএসকিউএল দ্বারা প্রদত্ত কনভেনশনটি সেই URL এর মাধ্যমে অনুসরণ করব। টি। যদি এটি কাজ করে তবে কমপক্ষে আপনার সমস্যার সমাধান শুরু করার দিকনির্দেশ রয়েছে। যদি তা না হয়, তবে আমাদের আলাদা সমস্যা আছে। :)
রিলিন্ডো

উত্তর:


7

আপনার সমস্যা সমাধানের জন্য কী চেষ্টা করবেন:

  1. আপনাকে প্রথমে স্লেভের উপর মাস্টার.info সরানো উচিত এবং মাইএসকিএল পুনরায় চালু করা উচিত
  2. MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'repl', MASTER_PASSWORD = 'ক্রীতপাস' পরিবর্তন করুন;
  3. মাস্টার উপর '--ফ্লাশ-লগস' বিকল্পের সাথে মাইএসকিএলডম্প করুন do
  4. 'মাইএসকিএল-ইউ ব্যবহারকারী-পি <ডাম্প.এসকিউএল' স্লেভ-এ
  5. এটি সঠিকভাবে কনফিগার করা হয়েছে কিনা তা নিশ্চিত করার জন্য স্লেভের উপর 'স্লেভের অবস্থা \ G' দেখান, MASTER_LOG_POS 0 হয়
  6. 'স্লেভ স্টার্ট'; দাস উপর

কি চেক করতে হবে:

  • বিনলগ ফর্ম্যাট: মিশ্রিত
  • সার্ভার_আইডিস্টগুলি মাস্টার এবং ক্রীতদাসে আলাদা

পুরো পরিবর্তন মাস্টার স্ট্রিং (লগের নাম এবং অবস্থানের নম্বর সহ) প্রদান করা আসলে এটি সংশোধন করে, তবে এই মুহুর্তে, আমি মনে করি মূল প্রশ্নটি কেন কোয়ান্টাকে ইতিমধ্যে উপস্থিত থাকলে লগ-নাম এবং অবস্থানের নম্বরটি আবার প্রবেশ করতে হবে? ডাম্প ফাইল.
Rilindo

আমদানির পরে কেবল 'স্লেভ স্ট্যাটগ \ জি' দেখান তবে 'স্টার্ট স্টাভ' এর আগে; আমাদের উত্তরটি দিতে পারে
ডিএমাইট্রো লিওনেনকো

অনুরোধ করা তথ্যটি আমার মূল পোস্টে সংযুক্ত করে।
কোয়ান্টা

"মাস্টারহোস্ট: এক্সএক্সএক্সএক্সএক্স মাস্টার_উজার: এক্সএক্স" কীভাবে আপনি "চেস্ট মাস্টার ..." জারি না করে শেষ করেছেন? অথবা আপনি কেবল উত্তরে এটি উল্লেখ করেননি? আপনি কি বিন্লগ ফর্ম্যাটটি পরীক্ষা করেছেন এবং মাইএসকিএলডাম্পের জন্য কমান্ড লাইনটি কী ছিল?
Dmytro Leonenko

আমি ইতিমধ্যে উল্লেখ করেছি যে আমার পোস্টে " ডাম্প ফাইলটি আমদানি করুন, চালানchange master to "। আমি মিশ্রিত-ভিত্তিক লগিং ব্যবহার করছি। আমি মাইএসকিউএল 5.0.77 (স্টেটমেন্ট-ভিত্তিক) দিয়ে পরীক্ষা করেছি, এটিও এই ত্রুটি ঘটায়। পুরো মাইএসকিলডাম্পটি হলmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
কোয়ান্টা

2

সমস্যাটি ডাম্প করার আগে একটি চলমান প্রোডাকশন সার্ভারে মাস্টার সেট করার কারণে ঘটে (যতদূর আমি বলতে পারি)। সুতরাং, মাস্টার_লগে এমন প্রশ্ন রয়েছে যা ইতিমধ্যে স্লেভের উপর থাকা ডেটাতে কার্যকর করা হয়েছে। আমি আসলে কখনই মাইএসকিএল ওয়েবসাইট বা মেলিং তালিকার কোনও সমাধান দেখিনি। সুতরাং, আমি নিম্নলিখিত সমাধান নিয়ে এসেছি যা আমার সমস্যার সমাধান করেছে।

দাস উপর:

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

মাস্টার উপর:

mysql> RESET MASTER;

দাস উপর:

mysql> RESET SLAVE;
mysql> START SLAVE;

যাইহোক, আমি দাসের উপরে নিম্নলিখিতটি দিয়ে আমার ডাম্প চালিয়েছি:

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

আমি আশা করি এটি অন্য কাউকে সহায়তা করে।

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

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


ফ্লুশ প্রাইভেলিজ অন্তর্ভুক্ত করার জন্য সম্পাদিত; আমি অন্য ত্রুটির পরে বুঝতে পেরেছিলাম যে এমনকি আমার ব্যবহারকারীরা ডাম্প দিয়ে আমদানি করা হয়েছিল, তাদের অধিকারগুলি এখনও সক্রিয় ছিল না।
ব্রুকনডজ

রিসেট মাস্টারটি মাস্টারে নয়, ক্রীতদাসের উপর চালানো উচিত, percona.com/blog/2013/02/08/… দেখুন
জন

1

আপনি যদি রেডো সম্পূর্ণ প্রক্রিয়াটি না চান তবে একটি ভাল ফিক্স ব্যবহার করা উচিত

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

যদি এরকম অনেকগুলি ত্রুটি থাকে তবে একটি ভাল ধারণাটি হ'ল ব্যাশ স্ক্রিপ্টটি ব্যবহার করে এটি স্বয়ংক্রিয় করা।

রেফ: ডুপ্লিকেট এন্ট্রি ত্রুটি ঠিক করা


1

আমার সঠিক সমস্যা ছিল এবং উত্সের লিঙ্কটি সহায়তা করেছিল। তবে সেই লিঙ্কের কমান্ডটিতে সিনট্যাক্স ত্রুটি ছিল এবং এটি আমার জন্য কাজ করা সংস্করণটি এখানে রয়েছে:

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

এটি মূলত সেখানে সদৃশ প্রবেশের ত্রুটি আছে কিনা তা পরীক্ষা করে এবং মাস্টার থেকে এই ইভেন্টটি এড়িয়ে যান। এবং এটি একটি লুপ করতে।


1
আপনি যদি সেই কোডটি কী করে তা ব্যাখ্যা করেন এবং কোডটি আরও পঠনযোগ্য হওয়ার জন্য ফর্ম্যাট করেন তবে এটি আরও উত্তরের উত্তর হবে।
ক্যাস্পার্ড

0

আমার ক্ষেত্রে সমস্যাটি নিম্নলিখিত আদেশগুলি দ্বারা সমাধান করা হয়েছে

নিম্নলিখিত পদক্ষেপ দ্বারা

STOP SLAVE;
RESET SLAVE;
START SLAVE;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.