মাইএসকিউএল অটো-ইনক্রিমেন্ট ক্ষেত্রগুলি নিজেই পুনরায় সেট করে


12

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

ক্ষেত্রটি অন্য কোনও কিছুর জন্য বিদেশী নয়।

স্বতঃবৃদ্ধি মনে হয় এলোমেলোভাবে নিজেকে শূন্যে পুনরায় সেট করে although

সমস্যাটি স্পষ্ট হয়ে ওঠে কারণ আমরা দেখি যে অটো-ইনক্রিমেন্ট ফিল্ডটি 600,000 রেকর্ড বা তার পরে দেখা যায় এবং তারপরে কিছুক্ষণ পরে অটো-ইনক্রিমেন্ট ফিল্ডটি কম 1000 এর মধ্যে চলেছে বলে মনে হয়।

টেবিলটি খালি থাকলে অটো-ইনক্রিমেন্টটি নিজেকে পুনরায় সেট করে দেয় এমন প্রায় almost

এটি কি সম্ভব এবং যদি এটি হয় তবে আমি কীভাবে এটি বন্ধ করব বা এটি পুনরায় সেট করা পদ্ধতিটি কীভাবে পরিবর্তন করব?

যদি তা না হয় তবে কারও কাছে কেন এটি করা হতে পারে তার ব্যাখ্যা আছে?

ধন্যবাদ!


মাইএসকিউএল এর কোন সংস্করণ? লেনদেন বা প্রতিলিপি ব্যবহার করা হয়?
111

উত্তর:


26

অটো-ইনক্রিমেন্ট কাউন্টারটি কেবলমাত্র মেমরিতে সঞ্চয় করা হয়, ডিস্কে নয়।

http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html

এই কারণে যখন পরিষেবা (বা সার্ভার) নিম্নলিখিতটি ঘটবে তখন:

সার্ভার শুরুর পরে কোনও টেবিল টিতে প্রথম sertোকানোর জন্য, ইনোডিবি এই বিবৃতিটির সমতুল্য সম্পাদন করে: আপডেটের জন্য ম্যাক্স (ii_col) থেকে নির্বাচন করুন;

ইনোডিবি একসাথে ইনক্রিমেন্ট বৃদ্ধি করে বিবৃতিটি পুনরুদ্ধার করে এবং কলামে এবং টেবিলের জন্য স্বতঃবৃদ্ধি কাউন্টারে বরাদ্দ করে। টেবিলটি খালি থাকলে InnoDB মান 1 ব্যবহার করে।

সুতরাং সরল ইংরেজিতে, মাইএসকিউএল পরিষেবা শুরু হওয়ার পরে আপনার টেবিলের স্বতঃবৃদ্ধি মান কী হবে তা কোনও ধারণা নেই। সুতরাং আপনি যখন প্রথম সারি সন্নিবেশ করান তখন এটি ক্ষেত্রের সর্বাধিক মান সন্ধান করে যা স্বতঃবৃদ্ধি ব্যবহার করে, এই মানটিতে 1 যোগ করে এবং ফলস্বরূপ মানটি ব্যবহার করে। যদি কোনও সারি না থাকে তবে এটি শুরু হবে 1 থেকে।

এটি আমাদের জন্য একটি সমস্যা ছিল, কারণ আমরা একাধিক-থ্রেড পরিবেশে আইডিগুলি ঝরঝরেভাবে পরিচালনা করতে টেবিল এবং মাইএসকিএল-এর অটো-ইনক্রিমেন্ট বৈশিষ্ট্যটি ব্যবহার করছি যেখানে ব্যবহারকারীরা তৃতীয় পক্ষের অর্থ প্রদানের সাইটটিতে পুনঃনির্দেশিত হচ্ছিলেন। সুতরাং আমাদের তা নিশ্চিত করতে হয়েছিল যে তৃতীয় পক্ষটি আমাদের কাছে ফিরে পেয়েছিল এবং যে আইডিটি আমাদের কাছে ফেরত পাঠানো হয়েছিল তা অনন্য ছিল এবং সেভাবেই চলবে (এবং অবশ্যই তাদের পুনঃনির্দেশের পরে ব্যবহারকারী লেনদেনটি বাতিল করে দেওয়ার সম্ভাবনা রয়েছে)।

সুতরাং আমরা একটি সারি তৈরি করছিলাম, উত্পন্ন স্বয়ংক্রিয়-বৃদ্ধি মান অর্জন করছিলাম, সারণিটি পরিষ্কার রাখতে সারিটি মোছা এবং মানটি অর্থপ্রদানের সাইটে ফরোয়ার্ড করছিলাম। InnoDB এআই মানগুলি যেভাবে পরিচালনা করে তা ইস্যুটি ঠিক করতে আমরা কী শেষ করেছি:

$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query); 

এটি সর্বদা সর্বশেষতম লেনদেনকে সারণীতে একটি সারি হিসাবে উত্পন্ন করে রাখে, অকারণে টেবিলটি ফুটিয়ে তোলে।

আশা করি এটি যে কারওর পক্ষে এটিকে চালিত করতে সহায়তা করে।

সম্পাদনা (2018-04-18) :

চার্চের নীচে উল্লিখিত হিসাবে এটি প্রদর্শিত হয় এর আচরণটি মাইএসকিউএল 8.0+ এ পরিবর্তন করা হয়েছে।

https://dev.mysql.com/worklog/task/?id=6204

সেই ওয়ার্কলগে শব্দটি সর্বোপরি ত্রুটিযুক্ত, তবে নতুন সংস্করণগুলিতে এটি InnoDB-এ প্রদর্শিত হবে যা এখন রিবুটগুলি জুড়ে অবিচ্ছিন্ন স্বয়ম্ভর মানগুলিকে সমর্থন করে।

-Gremio


প্রথম পোস্টের জন্য খারাপ নয়, দোস্ত। +1 টি।
ceejayoz

জ্ঞান মিষ্টি সেখানে গ্রিমিও। ধন্যবাদ !! আমি এটিকে পুরোপুরি বন্ধ করে দিয়েছিলাম এবং পরবর্তী তারিখে পর্যালোচনা করার মতো কিছু হিসাবে ইস্যুটি অভ্যন্তরীণভাবে সংরক্ষণাগারভুক্ত করেছি তবে এটির দিকে ফিরে আসা আপনার সমাধানটি মনোমুগ্ধকর কাজ করে!
হুলিগানকাট

3

আমরা এই সমস্যাটি দেখেছি এবং আবিষ্কার করেছি যে যখন খালি টেবিলে অনুকূলিতকরণের টেবিলটি চালিত হত, তখন স্বয়ংক্রিয়-বৃদ্ধি মানও পুনরায় সেট করা হয়েছিল। দেখুন এই মাইএসকিউএল বাগ রিপোর্ট

কার্যকারণ হিসাবে, আপনি এটি করতে পারেন:

ALTER TABLE a AUTO_INCREMENT=3 ENGINE=innoDB;

পরিবর্তে OPTIMIZE TABLE

মনে হচ্ছে মাইএসকিউএল অভ্যন্তরীণভাবে এটি করে (অটো বর্ধনের মান সেট না করেই স্পষ্টতই)


2

অন্ধকারে কেবল একটি শট - যদি অ্যাপ্লিকেশনটি TRUNCATE TABLEটেবিলটি প্রসেসিংয়ের পরে খালি করার জন্য ব্যবহার করে , যা স্বয়ং-বৃদ্ধি ক্ষেত্রটি পুনরায় সেট করবে। এখানে প্রশ্নের উপর একটি সংক্ষিপ্ত আলোচনা করা হচ্ছে। যদিও এই লিঙ্কটিতে উল্লেখ করা হয়েছে যে InnoDB একটি কাণ্ডের উপর স্বয়ংক্রিয়_সংশোধনগুলি পুনরায় সেট করে না, এটি একটি বাগ হিসাবে রিপোর্ট করা হয়েছিল এবং কয়েক বছর আগে এটি ঠিক করা হয়েছিল।

আমার অনুমানটি সঠিক বলে ধরে নিলে আপনি সমস্যার সমাধানের জন্য কাটা থেকে মুছে ফেলাতে পরিবর্তন করতে পারেন।


আমি মনে করি না যে আমরা ট্রানসেট ব্যবহার করছি, তবে এটি নিশ্চিত করার জন্য আমাদের চেক করতে হবে। এমনকি এটি নিশ্চিত করার জন্য পিএইচপি ড্রাইভারের স্তরে যাচাই করা এতদূর গেছে। কিন্তু আমরা ছিলাম না। যদিও সম্ভাব্য সমাধানটির প্রশংসা করুন।
হুলিগানকাট

1

কেবলমাত্র সেই মানটির একটি স্পষ্ট পুনরায় সেট করা, বা সেই ক্ষেত্রের একটি ড্রপ / পুনরায় তৈরি করা, বা অন্যান্য অনুরূপ সহিংস অপারেশনে কখনও কোনও অটো_সংশোধন কাউন্টার পুনরায় সেট করা উচিত। (ট্রানসেটটি সত্যই একটি ভাল তত্ত্ব ছিল)) আপনি অসম্ভব বলে মনে করছেন আপনি হঠাৎ একটি 32-বিট INT মোড়ানো করবেন যখন আপনার শেষের মানটি কেবল 600 কিলোমিটার witness এটি অবশ্যই টেবিল খালি হওয়ার কারণে পুনরায় সেট করা উচিত নয়। আপনার হয় হয় পিএইচপি কোডে একটি মাইএসকিএল বাগ বা কিছু রয়েছে। বা পাশের কিউবিকেলের লোকটি আপনার উপর চালাকি করছে।

আপনি বাইনারি লগটি চালু করে ডিবাগ করতে পারেন , কারণ এটিতে এই জাতীয় বিবৃতি থাকবে:

SET INSERT_ID=3747670/*!*/;

তারপরে কমপক্ষে আপনি কাউন্টার পুনরায় সেট করার ঠিক আগে, সেই টেবিলের সাথে কী ঘটছে তার প্রতিটি বিবরণ দেখতে পাবেন।


ডিবাগ টিপ জন্য ধন্যবাদ। এটা তোলে দিন হলো আমি একটা Serverfault চেক করা প্রয়োজন একটি হয়েছে আমি তোমার ডগা প্রশংসা
Hooligancat

0

টেবিলের টেবিলের নাম পরিবর্তন করুন ENGINE = মাইআইএসএএম

আমার জন্য কাজ করে। আমাদের টেবিলটি সর্বদা খুব ছোট রাখা হয়, সুতরাং InnoDB এর দরকার নেই।


আপনার কি লেনদেন দরকার?
অ্যান্টনি রটলেজ

0

মাইএসকিউএল সার্ভারটি বন্ধ হয়ে গেলে ইনোডিবি এইভাবে ডিস্কে অটো ইনক্রিমেন্ট মান সংরক্ষণ করে না। যখন মাইএসকিউএল আবার শুরু করা হয়, InnoDB ইঞ্জিন স্বয়ং বৃদ্ধি মান এই ভাবে পুনরুদ্ধার: SELECT (MAX(id) + 1) AS auto_increment FROM table। এটি একটি বাগ যা মাইএসকিউএল 8.0.0 সংস্করণে স্থির করা হয়েছে।

সমস্যা সমাধানের জন্য টেবিল ইঞ্জিনটি পরিবর্তন করুন:

ALTER TABLE table ENGINE = MyISAM

বা মাইএসকিউএল সার্ভারটি প্রকাশিত হওয়ার পরে 8.0 সংস্করণে আপডেট করুন।

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