রানটাইমে বাইনলগ ফর্ম্যাটটি স্যুইচ করার নিরাপদ কোনটি?


25

এতে নিম্নলিখিত সতর্কতার কারণে mysqld.log:

[সতর্কতা] BINLOG_FORMAT = STATEMENT থেকে বিবৃতি ফর্ম্যাট ব্যবহার করে বাইনারি লগটিতে অনিরাপদ বিবৃতি লিখিত। বিবৃতিটি অনিরাপদ কারণ এটি একটি সীমাবদ্ধ ধারা ব্যবহার করে। এটি অনিরাপদ কারণ অন্তর্ভুক্ত সারির সেটটি পূর্বাভাস দেওয়া যায় না।

আমি প্রতিলিপি ফর্ম্যাট এ স্যুইচ করতে চান MIXED

তবে মাইএসকিউএল ডকুমেন্ট অনুসারে:

কোনও অস্থায়ী সারণী উপস্থিত থাকলে রানটাইমের সময় প্রতিলিপি বিন্যাসটি স্যুইচ করা বাঞ্ছনীয় নয়, কারণ অস্থায়ী টেবিলগুলি কেবলমাত্র বিবৃতি-ভিত্তিক প্রতিলিপি ব্যবহার করার সময় লগ হয়, যেখানে সারি-ভিত্তিক প্রতিলিখনের সাহায্যে তারা লগ হয় না।

সুতরাং, প্রশ্নটি হল যে বাইনারি লগ ফর্ম্যাটটি নিরাপদে স্যুইচ করার জন্য কোনও অস্থায়ী সারণী উপস্থিত থাকলে আমি কীভাবে সনাক্ত করতে পারি?


1
দ্রুত সতর্কতা আরবিআর-> এসবিআর থেকে যেতে এবং পড়ার জন্য প্রতিশ্রুতিবদ্ধ ব্যবহার করার জন্য এটি দেখুন: বাগস.মাইসকিএল.বগ.এফপি?id=62493
মরগান টকার

উত্তর:


35

যেহেতু আপনি এটি করার মুহুর্তে একটি বিনলগের একটি নির্দিষ্ট ফর্ম্যাট থাকবে, তাই আপনি মাইএসকিউএল (এহ ওরাকল [এখনও আমার জিহ্বাকে রোল করতে পারে না]) এই বৈশিষ্ট্যটি তৈরি করার পরে দুটি বিন্যাসের সাথে একসাথে জুয়া না খাওয়ার সিদ্ধান্ত নিতে পারেন।

এটি কোনও মাইএসকিএল পুনরায় চালু না করে সম্পূর্ণ নিরাপদ খেলতে, নিম্নলিখিত চেষ্টা করে দেখুন:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

এটি 'মিশ্রিত' ফর্ম্যাটে শেষ বেনলগটি ছেড়ে যাবে। পেনাল্টিমিয়েট (শেষের পরের) বাইনলগ উপস্থিত রয়েছে কেবল পূর্বের বিন্যাসে যে শেষ বাইনলগ ছিল তা বন্ধ করে দেয়।

প্রথম বিদ্যমান সমস্ত সেশনগুলি FLUSH LOGS;একবার শেষ হয়ে গেলে শেষ বিনলগে লেখা শুরু করবে UNLOCK TABLES;

একবার চেষ্টা করে দেখো !!!

বিচারকার্য স্থগিত রাখার আদেশ

কৃতিত্ব দেওয়া যেখানে ক্রেডিট কারণে, আমার উত্তর সত্যিই বন্ধ piggybacking হয় @ যোনাথনের উত্তর । আমি ঠিক এর উপরে বাইনলগগুলি বন্ধ এবং খুলি। এটিকে প্রথমে আনার জন্য তিনি একটি +1 পান।

আপডেট করুন ২০১০-১১-২০১ 13 13:58 ইডিটি

আপনি যদি কোনও সক্রিয় মাস্টারের সাথে এটি করেন এবং সেই মাস্টারটির থেকে এক বা একাধিক স্ল্যাভ প্রতিলিপি তৈরি করা হচ্ছে, আপনার রিলে লগগুলিও নতুন ফর্ম্যাটে থাকা নিয়ে উদ্বিগ্ন হওয়া দরকার। আপনি যা করতে পারেন তা এখানে:

দাসের উপর, চালান STOP SLAVE;

মাস্টার এ চালান:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

দাসের উপর, চালান START SLAVE;

চলতে থাকে STOP SLAVE;এবং START SLAVE;রিলে লগগুলিকে ঘোরায় এবং নতুন এন্ট্রিগুলির যে কোনও ফর্ম্যাটই এটি প্রতিলিপি তৈরি করে। আপনি দাসে বিনলগ_ফর্ম্যাট পরিবর্তনটি প্রয়োগ করতেও পারেন।


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

কৌতূহলীদের জন্য, আপনি এই "বাইনল_ফর্ম্যাট = 'মিশ্রিত'ও রাখতে পারেন;" আপনার my.cnf এ into
খ্রিস্টান

2
এফওয়াইআই, এই উত্তরটি এখানে একটি উত্তরের সাথে একমত নয়: dba.stackexchange.com/questions/58539/…
HTTP500

ম্যানুয়ালটিতে বলা হয়েছে : এর অর্থ হ'ল প্রতিলিপি মাস্টারে লগিং ফর্ম্যাট পরিবর্তন করার কারণে কোনও ক্রীতদাস তার লগিং ফর্ম্যাটটি মেলে না। (..স্নিপ ..) প্রতিলিপি চলাকালীন মাস্টারের উপর বাইনারি লগিং ফর্ম্যাট পরিবর্তন করা বা দাসের উপরে পরিবর্তন না করে এভাবে অপ্রত্যাশিত ফলাফল হতে পারে, এমনকি প্রতিরূপ সম্পূর্ণ ব্যর্থ হতে পারে।
হাফগগার

@ হালফগার এই মাত্র গত সপ্তাহে, আমি কোনও দাসের কোনও প্রভাব ছাড়াই তিনবার মিশ্রড থেকে STATEMENT এ একটি দাস পরিবর্তন করেছি। আমি এটি করছিলাম কারণ একটি রেসের শর্তের কারণে প্রতিলিপি ভঙ্গ হচ্ছে। স্বেচ্ছাসেবীর কার্য সম্পাদনের আগে টেবিলটি কোনও গোলামের কাছে উপস্থিত ছিল না। সুতরাং, আমি পরিস্থিতি স্থিতিশীল করতে STATEMENT এ স্যুইচ করেছি। অবশ্যই, সমস্ত লেখাগুলি বন্ধ করে দেওয়া হয়েছিল যখন আমি এটি করেছি। বিটিডাব্লু আমি মাস্টারও করেছি।
রোল্যান্ডোমাইএসকিউএলডিবিএ

6

রানটাইমে বিনলগ_ফর্ম্যাটটি স্যুইচ করতে আপনি এটি করতে পারেন:

set global binlog_format = 'MIXED';

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

আপনি set session binlog_format = 'MIXED';সেশনটির সাথে যে কোনও সমস্যা বিশেষভাবে সমাধানের জন্য ম্যানুয়ালিও করতে পারেন ।


আমি উপায়টি জিজ্ঞাসা করি না, আমি নিরাপদতম উপায় জিজ্ঞাসা করি এবং কোনও অস্থায়ী টেবিলের উপস্থিতি আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি।
কোয়ান্টা

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