জেডএফএস স্ন্যাপশটের মাধ্যমে একটি মাইএসকিউএল ডাটাবেস ব্যাক আপ করা


12

আমি বেশ কয়েকটি সাইটগুলি ঠিক এটি করার বিষয়ে কথা বলেছি, তবে আমি কয়েকটি গুরুত্বপূর্ণ বিবরণ হারিয়েছি। সাধারণ পদক্ষেপগুলি হয়

  • চালান FLUSH TABLES WITH READ LOCK
  • জেডএফএস স্ন্যাপশটটি নিন
  • চালান UNLOCK TABLES

বিভিন্ন উত্স রিপোর্ট করে যে আমি ব্যবহার করছি, ইনোডিবি আসলে একটিকে সম্মান করে না FLUSH। মাইএসকিউএল ব্যবহারকারীদের ম্যানুয়াল নোটগুলিতে FLUSH TABLES...FOR EXPORTইনোডিবি ব্যবহারের জন্য বৈকল্পিক রয়েছে, তবে এর জন্য পুরো ডাটাবেসটিকে ব্যাক আপ না করে প্রতিটি টেবিল স্বতন্ত্রভাবে নির্দিষ্ট করা দরকার। আমি প্রতিটি টেবিলে স্বতন্ত্রভাবে উল্লেখ করা এড়াতে পছন্দ করতাম কারণ সারণীতে তালিকাগুলির তালিকাগুলি তালিকাগুলির তালিকাগুলির তালিকাগুলির সাথে তাল মিলবে না a

আমার অন্যান্য সমস্যাটি হ'ল আমিও এরকম কিছু করার পরিকল্পনা করেছি mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK"। যাইহোক, এটি সেশনটি প্রস্থান করার সাথে সাথে লকটি ড্রপ করে। এটি বোধগম্য হয় তবে এটি বেশ বিরক্তিকরও যেহেতু যখন আমি আমার স্ন্যাপশটটি নেব তখন আমার পঠন লকটি রাখা উচিত।

আমার অন্য ধারণাটি হ'ল পারকোনা এক্সট্রাব্যাকআপের মতো সরঞ্জাম ব্যবহার করে গরম ব্যাকআপ নেওয়া এবং ব্যাকআপের স্ন্যাপশট নেওয়া, তবে আমি আমার সমস্ত ডেটা কেবলমাত্র স্ন্যাপশট করার জন্য দ্বিতীয় অবস্থানে লেখার জন্য ব্যয় করতে পছন্দ করব না।


টেবিলগুলির স্থির তালিকা কেন? আপনি অবশ্যই রানটাইমে গতিশীলভাবে একটি তালিকা তৈরি করতে পারেন।
EEAA

1
ডাটাবেসটি কোনও ভিএম বা খালি ধাতুতে রয়েছে? স্টোরেজটি কি একই মেশিনে রয়েছে?
মাইকেল হ্যাম্পটন

EEAA, যথেষ্ট ন্যায্য।
অ্যান্ডি শুলমান

মাইকেল, ডাটাবেস এবং জেডএফএস বক্স বিভিন্ন মেশিন, তবে উভয়ই ভার্চুয়ালাইজড নয়।
অ্যান্ডি শুলমান

@ অ্যান্ডি শুলম্যান আমার ধারণা আপনার কিছুটা আরও ভাল লেআউটটি ব্যাখ্যা করা উচিত। এটা কোন মানে নেই।
ew white

উত্তর:


4

আপনি যদি কেবল সমস্ত টেবিলের জন্য InnoDB ব্যবহার করেন এবং এতে সেট innodb_flush_log_at_trx_commitকরেন:

  • 1 (InnoDB লগ বাফারের সামগ্রীগুলি প্রতিটি লেনদেন কমিটের সময়ে লগ ফাইলটিতে লেখা থাকে এবং লগ ফাইলটি ডিস্কে ফ্লাশ করা হয়) বা,
  • 2 (প্রতিটি লেনদেন কমিট করার পরে ইনোডিবি লগ বাফারের সামগ্রীগুলি লগ ফাইলে লেখা হয় এবং লগ ফাইলটি প্রতি সেকেন্ডে প্রায় একবার ডিস্কে ফ্লাশ করা হয়),

তাহলে আপনার স্ন্যাপশট করার আগে ফ্ল্যাশ ট্যাবলেটগুলির দরকার নেই, সরাসরি জেডএফএস স্ন্যাপশট চালান। InnoDB ডেটা ক্ষতি ছাড়াই লেনদেন প্রতিশ্রুতিবদ্ধ লগগুলি থেকে ডেটা পুনরুদ্ধার করতে পারে।

রেফ: https://dev.mysql.com/doc/refman/5.5/en/innodb-paraters.html#sysvar_innodb_flush_log_at_trx_commit


মাইএসকিউএল 8-এ প্রবর্তিত ডেটা ডিকশনারি সহ , এমনকি ডিডিএল (স্কিমা পরিবর্তন) ক্রিয়াকলাপগুলি এখন পারমাণবিক। তার আগে, একটি ফাইল সিস্টেমের স্ন্যাপশটের সময় ডিডিএল অপারেশনগুলি আংশিক প্রতিশ্রুতিবদ্ধ (যেমন দূষিত) ফলাফল দিতে পারে।
বার্নি

13

ধারাবাহিকভাবে একটি (সর্বাধিক) ডাটাবেস (গুলি) ব্যাকআপ করতে আপনার একটি সম্পূর্ণ ডাটাবেস লক দরকার।

ম্যানুয়াল https://dev.mysql.com/doc/refman/5.5/en/backup-methods.html বলেছে যে লক সহ ফ্ল্যাশ ট্যাবলেটগুলি বিশেষত জেডএফএস স্ন্যাপশটের জন্য সঠিক।

একটি ফাইল সিস্টেম স্ন্যাপশট ব্যবহার করে ব্যাকআপ করা

আপনি যদি ভেরিটাস ফাইল সিস্টেম ব্যবহার করেন তবে আপনি এটির মতো একটি ব্যাকআপ তৈরি করতে পারেন:

  1. একটি ক্লায়েন্ট প্রোগ্রাম থেকে, চালানো FLUSH TABLES WITH READ LOCK
  2. অন্য শেল থেকে, মাউন্ট vxfsস্ন্যাপশট চালাও।
  3. প্রথম ক্লায়েন্ট থেকে, চালানো UNLOCK TABLES
  4. স্ন্যাপশট থেকে ফাইলগুলি অনুলিপি করুন।
  5. স্ন্যাপশটটি আনমাউন্ট করুন।

অনুরূপ স্ন্যাপশট ক্ষমতা অন্যান্য ফাইল সিস্টেমে যেমন এলভিএম বা জেডএফএসে উপলভ্য হতে পারে।

এটি এক ধরণের হাস্যকর বিষয় যে এই নির্দেশাবলী থেকে আপনার সত্যিকারের InnoDB দরকার তা FLUSH TABLES table_a, table_b, table_c FOR EXPORTতারা এড়িয়ে গিয়েছিল। এটির মতো প্রতিটি টেবিল নির্দিষ্ট করাও বোকামি। তবে ইইএএ যেমন বলেছে, মোটামুটি সহজেই আপনি ব্যাকআপটি শুরু করার সাথে সাথে আপনি টেবিলগুলির একটি তালিকা তৈরি করতে পারেন।

লকটি ধরে রাখার ক্ষেত্রে, স্ন্যাপশটটি সম্পাদন করার সময় আপনাকে অবশ্যই ডিবি সংযোগটি সচল রাখতে হবে

সাধারণত আমি পার্ল বা অন্য প্রোগ্রামিং ভাষার মতো কিছু ব্যবহার করতাম যা সংযোগ করতে পারে, ডিবি লক করতে পারে এবং ডিবি সংযোগ বজায় রাখার সময় স্ন্যাপশট নিতে পারে, তারপরে আনলক এবং সংযোগ বিচ্ছিন্ন করতে পারে। এটি জটিল নয়। আমি বাজি ধরতাম যে সেখানে এমন সরঞ্জাম রয়েছে যা ইতিমধ্যে এটি করে তবে একটি লেখা সহজ is

আমি বলি সহজ, জটিল নয়, ইত্যাদি .. কয়েকবার। আমি ধরে নিচ্ছি আপনার কাছে কিছু বেসিক প্রোগ্রামিং বা ভাল স্ক্রিপ্টিং দক্ষতা রয়েছে।


আমি আশা করছিলাম যে এ জাতীয় ধারণাটি সহজ সরল স্ক্রিপ্ট বাশের মধ্যে রাখব, তবে আপনি ঠিক ভাষা পরিবর্তন করতে এটিকে আরও সহজ করে তুলেছেন। আমি আপনার উত্তরটি ভুলভাবে পড়ছি, তবে মনে হচ্ছে আপনি বলছেন যে আমাকে FLUSH TABLES WITH READ LOCKএবং তারপরে উভয়কেই কার্যকর করা দরকার FLUSH TABLES...FOR EXPORT, যখন আমার মাইএসকিউএল ম্যানুয়ালটি পড়ে বলেছে যে কেবল একটি প্রয়োজনীয় হওয়া উচিত।
অ্যান্ডি শুলম্যান

দুঃখিত আমি পরিষ্কার ছিল না। আমি শুধু ম্যানুয়াল দ্বারা যাচ্ছি এবং এটি দুটি ভিন্ন জিনিস বলে। আমি অনুমান করছি আপনি সঠিক এবং কেবল পরে প্রয়োজন। তবে সমস্ত টেবিলকে একটি কমান্ডে লক করা উচিত।
রায়ান বাবচিশিন

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

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

7

আমি ছিড়ে ফেলেছে এবং যা আমি অন্য সার্ভার ফল্ট পাওয়া ব্যাশ একটি ধারণার দিক থেকে সহজ স্ক্রিপ্ট অভিযোজিত থাকেন পোস্টে দ্বারা Tobia । এটি আপনাকে প্রায় 90% রাস্তাটি পাওয়া উচিত।

mysql_locked=/var/run/mysql_locked

# flush & lock MySQL, touch mysql_locked, and wait until it is removed
mysql -hhost -uuser -ppassword -NB <<-EOF &
    flush tables with read lock;
    delimiter ;;
    system touch $mysql_locked
    system while test -e $mysql_locked; do sleep 1; done
    exit
EOF

# wait for the preceding command to touch mysql_locked
while ! test -e $mysql_locked; do sleep 1; done

# take a snapshot of the filesystem, while MySQL is being held locked
zfs snapshot zpool/$dataset@$(date +"%Y-%m-%d_%H:%M")

# unlock MySQL
rm -f $mysql_locked

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

ফাইলটির নির্দেশিত ফাইলটি $mysql_lockedউভয় মেশিনের অ্যাক্সেসযোগ্য হওয়া দরকার, যা আপনি সহজেই যথেষ্ট করতে সক্ষম হবেন যেহেতু তারা উভয়ই একটি সাধারণ ডেটাসেট অ্যাক্সেস করতে পারে (তবে তারা বিভিন্ন পথ ব্যবহার করতে পারে, এবং আপনার এটির জন্য অ্যাকাউন্ট করা উচিত)।


আমি মাইএসকিউএল স্ক্রিপ্টিং জানি না, সুতরাং এটি একটি নির্বোধ ধারণা হতে পারে, তবে আপনি কেবল system zfs snapshot...মূল স্ক্রিপ্টের ভিতরে করতে পারবেন না ? অথবা স্ন্যাপ-shotting নেই আছে একটি আলাদা প্রক্রিয়ায় চালানোর?
ট্রিপহাউন্ড

@ ট্রাইপহাউন্ড উভয় জিনিসই একরকম সমান্তরালভাবে হওয়া দরকার
রায়ান বাবচিশিন ২

@ রায়ানবাচিশিন আমার মনে হয় তিনি আসলেই ঠিক বলেছেন। SYSTEMকমান্ড জিনিষ স্থানীয়ভাবে চালায়। আমি যদি ফ্রিবিএসডি বাক্সে মাইএসকিএল ক্লায়েন্ট চালনা করি এবং কার্যকর LOCK; SYSTEM zfs snapshot; UNLOCKকরি তবে মনে হয় এটি কার্যকর হবে।
অ্যান্ডি শুলম্যান

@ অ্যান্ডি আমি কেবল বলেছিলাম যে তাদের সমান্তরালভাবে হওয়া দরকার। কীভাবে আপনি এটি সম্পর্কে যান না।
রায়ান বাবচিশিন

2

মাইস্যামের জন্য আপনার কাছে তালা পড়ার ফ্ল্যাশ ট্যাবলেটগুলি দরকার কারণ এটি জার্নাল নয়।

আইএনএমও, ইনডোডাবের জন্য আসলেই আপনার কোনও প্রয়োজন নেই কারণ এটি জার্নাল। এটি যাইহোক সামঞ্জস্য বজায় থাকবে, পারমাণবিক তাত্ক্ষণিকভাবে আপনার স্ন্যাপশটে কিছু ঘটছে তা যদি কেবল জার্নালটিকে স্বয়ংক্রিয়ভাবে ফিরিয়ে দেয়।

আপনি যদি অ্যাপ্লিকেশন স্তরের ধারাবাহিকতা চান তবে আপনার আবেদনের লেনদেনগুলি ব্যবহার করা উচিত। যদি আপনার অ্যাপ্লিকেশন লেনদেন এবং ইনডোডব ব্যবহার করে তবে যে কোনও স্ন্যাপশট স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশন স্তর পর্যন্ত যেতে জিজ্ঞাসা করবে।


2

লকটি রাখার সময় কীভাবে জেডএফএস স্ন্যাপশট তৈরি করবেন এটি আমার সমাধান is

mysql << EOF
    FLUSH TABLES WITH READ LOCK;
    system zfs snapshot data/db@snapname
    UNLOCK TABLES;
EOF
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.