একটি ব্যস্ত মাস্টার-স্লেভ প্রতিলিপি সিস্টেমে একটি একক mysql ডাটাবেস পুনরুদ্ধার করুন


10

ব্যস্ত প্রতিলিপি সিস্টেমে পয়েন্ট-ইন-টাইমে একক ডাটাবেস পুনরুদ্ধার করতে ডিলিট করার কৌশল বা সরঞ্জামের সন্ধান করছেন।

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

সম্পাদনা করুন: টেবিলগুলি ইনোডিবি এবং মাইআইএসএএম এর মিশ্রণ, সুতরাং ইঞ্জিনের নির্দিষ্ট সমাধান পাওয়া যায় না।

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

তবে আমি আংশিক ব্যর্থতা, বা একক ডাটাবেসের ব্যর্থতা কীভাবে মোকাবেলা করতে পারি তা নিয়ে আমি উদ্বিগ্ন। আমি ভাবতে পারি 2 সম্ভবত এমন পরিস্থিতিতে আছে;

  1. ডাটাবেস 7 (উদাহরণস্বরূপ) দূষিত হয়ে যায়, কেউ কেউ এটি ভেঙে পড়ে না দেখে বা লগ ফাইলগুলি থেকে সতর্কতা অবধি অবধি কিছু অনুরোধগুলি সরবরাহ করে ...
  2. কিছু ক্যোয়ারী যেমন ড্রপ ডাটাবেস, ড্রপ টেবিল, "আপডেট যেখানে ..." টাইপ ক্যোয়ারী একটি একক ডাটাবেস, বা কিছু সাবসেট এতে বর্স করে।

এই মুহুর্তে আমার কাছে ফুল-ডেট-অল-ডেটাবেসস.এসকিএল.এলজেড ফাইল এবং পুরো পার্থক্য যা ডিআইএফএফ- ATE তারিখ-সমস্ত-ডাটাবেস.এসকিএল.gz হিসাবে ফুল ডাম্পগুলিতে প্রয়োগ করা যেতে পারে তার মতো একগুচ্ছ ফুল ডাম্প রয়েছে have

কিছু পয়েন্ট-ইন-সময়ে ডেটাবেস 7 পুনরুদ্ধার করার জন্য ফুল এবং ডিআইএফএফ ফাইলগুলির মাধ্যমে একটি গ্রেপ এবং সেই বর্গাকার ম্যানুয়াল অ্যাপ্লিকেশনটির দরকার হয়।

পূর্ববর্তী একটি ডিআইএফএফ ডাম্পকে মাস্টার ডাটাবেসে পুনরুদ্ধার করা সম্ভব করার জন্য আমি কীভাবে এগিয়ে যেতে পারি?

আমার কি পৃথক ডাটাবেস ফাইলগুলিতে ব্যাকআপ নিতে হবে, যেমন

mysqldump --databases "database1" | gzip > database1.sql.gz
mysqldump --databases "database2" | gzip > database2.sql.gz
mysqldump --databases "database3" | gzip > database3.sql.gz

বরং..

mysqldump --master-data --lock--all-databases --all-databases | gzip > all-databases.sql.gz

আমি যদি পৃথক মাইএসকিल्डডাম্প ফাইলগুলির জন্য যাই তবে মাস্টার ডেটা বাইনারি লগের কি হবে এবং আমি কি মাস্টার সার্ভার পুনরুদ্ধারের ডাম্পের জন্য - মাস্টার-ডেটা সেট করা উচিত?

উত্তর:


7

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

আপনার কোনও গোলামের সমান্তরালে সমস্ত ডাটাবেস ডাম্প করা উচিত।

বাস্তবে, আপনি সমস্ত ডাটাবেসগুলিকে একই পয়েন্ট-ইন-সময়তে বাধ্য করতে পারেন।

স্লেভ সম্পর্কে প্রথমে মনে রাখার বিষয় হ'ল এটি যদি অন্য স্লেভের জন্য মাস্টার না হয় তবে বাইনারি লগিং সক্ষম করার প্রয়োজন হয় না।

--master-dataসমান্তরাল ডাম্পের জন্য আপনি বিকল্পটি ব্যবহার করতে পারবেন না কারণ প্রতিটি ডাম্পের প্রতিটি ডাম্প ফাইলের 22 লাইনে আলাদা আলাদা অবস্থান লেখা থাকবে। মাস্টারের শেষ লগ ফাইলটি রেকর্ড করা এবং স্লেভকে ব্যবহার করে মৃত্যুদন্ড কার্যকর করা ভাল SHOW SLAVE STATUS\G। এইভাবে, সমস্ত ডাটাবেসের একই পয়েন্ট-ইন-সময় অবস্থান রয়েছে।

আপনি সমস্ত ডাটাবেস সংগ্রহ করতে পারেন এবং সমস্ত ডাটাবেসের সমান্তরাল ডাম্প স্ক্রিপ্ট করতে পারেন।

DBLIST=/tmp/ListOfDatabasesToParallelDump.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}

mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos"   | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt

mysql -h... -u... -p... -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema')" > ${DBLIST}

for DB in `cat ${DBLIST}` 
do 
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz & 
done 
wait 

mysql -h... -u... -p... -e"START SLAVE;"

যদি খুব বেশি ডেটাবেস থাকে তবে নীচে সেগুলি একবারে 10 বা 20 টি ফেলে দিন:

DBLIST=/tmp/ListOfDatabasesToParallelDump.txt
SSS=/tmp/ShowSlaveStatusDisplay.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}

mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos"   | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt

mysql -h... -u... -p... -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema')" > ${DBLIST}

COMMIT_LIMIT=20
COMMIT_COUNT=0    
for DB in `cat ${DBLIST}` 
do 
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz & 
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done 
wait 
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

mysql -h... -u... -p... -e"START SLAVE;"

আপনার যদি একটি একক টেবিলটি পুনরুদ্ধার করতে হয় তবে আপনি আকারের ক্রমে 20 টি ডাম্প টেবিলের সমান্তরাল করতে পারেন ।

এটা চেষ্টা কর:

TBLIST=/tmp/ListOfTablesToParallelDump.txt
SSS=/tmp/ShowSlaveStatusDisplay.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}

mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos"   | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt

mysql -h... -u... -p... -AN -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY data_length" > ${DBLIST}

COMMIT_LIMIT=20
COMMIT_COUNT=0    
for DBTB in `cat ${TBLIST}` 
do
    DB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $2}'`
    DUMPFILE=$DB-{DB}-TBL-${TB}.sql.gz
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} ${TB} | gzip >  ${DUMPFILE} & 
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done 
wait 
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

mysql -h... -u... -p... -e"START SLAVE;"

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


উজ্জ্বল উত্তর থেক্স। আমি মনে করি xfs এ কেবল পঠনযোগ্য গোলাম থাকা আমাকে প্রচুর পরিমাণে বিকল্প দেয় এবং আপনার স্ক্রিপ্টগুলি সত্যই সহায়তা করেছে।
টম এইচ

দৃশ্যে যেখানে আমার দাসের ব্যাকআপ থেকে মাস্টারের কাছে একটি বিশাল টেবিলটি পুনরুদ্ধার করতে হবে। আমাকে কেবলমাত্র মাস্টারের টেবিলটি পুনরায় তৈরি করতে হবে, এবং সমস্ত পরিবর্তনগুলি দাসের কাছে প্রতিলিপি করা উচিত, এমনকি যদি এটি 20 জিবি ডেটা হয়? প্রক্রিয়াটি 1) কীগুলি অক্ষম করবে, 2) মাস্টার এবং স্লেভের উপর টেবিলটি ফেলে দেবে 3) টেবিলটি পুনরায় পুনঃস্থাপন করবে 4) কীগুলি সক্ষম করবে --- এবং মাস্টার সমস্ত 20 জিবি প্রতিদ্বন্দ্বিত করে স্লেভকে নামিয়ে দেবে?
টম এইচ

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

হ্যাঁ, যদি আপনি 1) সময়ক্ষণ নির্ধারণ করেন, 2) রান করুন service mysql restart --skip-networking, 3) সমান্তরাল ডাম্প সঞ্চালন করুন, 4) রান করুন service mysql restart। তারপরে আপনার প্রয়োজনীয় সারণীগুলি পুনরায় লোড করুন।
রোল্যান্ডোমাইএসকিউএলডিবিএ

সম্ভবত পুনরায় আরম্ভের উদ্দেশ্য যদি ডাটাবেসে নেটওয়ার্ক সংযোগগুলি রোধ করা হয় তবে আমি iptables i.e. iptables -I INPUT -p tcp --dport 3306 -j DROPএথ0 এবং লো ব্যবহার করে একই প্রভাব অর্জন করতে পারি
টম এইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.