দুটি ভিন্ন ডাটাবেসের মধ্যে ডেটা সিঙ্ক্রোনাইজ করার সর্বোত্তম উপায়


24

আমাকে দুটি বড় ডাটাবেসের মধ্যে ডেটা সিঙ্ক্রোনাইজেশন প্রয়োগ করতে হবে যার সম্পূর্ণ ভিন্ন কাঠামো রয়েছে। মূলত, আমার প্রথম ডাটাবেসে বিভিন্ন টেবিলের পণ্য সম্পর্কে কিছু তথ্য আঁকতে হবে এবং দ্বিতীয় ডাটাবেসে অন্যান্য টেবিলের জন্য তাদের পুনরায় ব্যবস্থা করতে হবে।

প্রথমবারে আমার পণ্যগুলি তৈরি করা খুব জটিল নয়। তবে আমি প্রতিটি পণ্য সম্পর্কে কিছু নির্দিষ্ট ডেটা - সমস্ত ডেটা নয় - আপডেট করার উপায় খুঁজছি।

স্পষ্টতই, কয়েকটি সমস্যা রয়েছে যা এই কৌশলটিকে জটিল করে তোলে।

  • উত্স ডাটাবেসে কিছু জিজ্ঞাসা বাদ দিয়ে আমাকে কিছু করার অনুমতি নেই।
  • লক্ষ্য ডাটাবেসে, আমি সাধারন প্রশ্নগুলি করতে পারি (নির্বাচন করুন, আপডেট করুন, সন্নিবেশ করুন, তৈরি করুন) তবে আমি বিদ্যমান কাঠামো / সারণীগুলি সংশোধন করতে পারি না।
  • টার্গেট এবং সোর্স ডিবিতে সম্পূর্ণ আলাদা কাঠামো রয়েছে, টেবিল মোটেও এক রকম নয়, সুতরাং ডেটা সত্যিই পুনরায় সাজানো দরকার - তুলনা টেবিলগুলি কাজ করবে না।
  • লক্ষ্য ডাটাবেস একটি মাইএসকিউএল সার্ভার ব্যবহার করে - উত্সটি ডিবি 2 হতে পারে।
  • কোথাও কোনও "আপডেট সময়" ক্ষেত্র নেই।

সুতরাং পুরো প্রক্রিয়াটি একটি একক পাইথন (আদর্শ) স্ক্রিপ্টে করা দরকার।

আমি লক্ষ্যবস্তু ডাটাবেসে আপডেট করার ক্ষেত্রগুলির উপর ভিত্তি করে প্রতিটি পণ্যের জন্য একটি হ্যাশ তৈরি করার বিষয়ে চিন্তা করি: এমডি 5 (কোড + বিবরণ + সরবরাহকারী + প্রায় 10 অন্যান্য ক্ষেত্র)। উত্স ডাটাবেস থেকে দৈনিক ভিত্তিতে একই ডেটা ভিত্তিক একটি নতুন হ্যাশ তৈরি করা হবে। পারফরম্যান্সের উদ্দেশ্যে আমি সমস্ত হ্যাশ একক টেবিলের (আইটেম কোড, কারেন্ট_হ্যাশ, ওল্ড হ্যাশ) সংরক্ষণ করব store তারপরে নতুন হ্যাশটি পুরানোটির থেকে আলাদা হলে পণ্যটির তুলনা করুন এবং আপডেট করুন।

প্রায় 500 000 পণ্য রয়েছে তাই আমি পারফরম্যান্স সম্পর্কে কিছুটা চিন্তিত।

এটা কি ভাল উপায়?


2
তারা কি চান যে আপনিও এটি চোখের পাতায় রেখে করতে পারেন? এটি এখনই আমার সমস্যা ...
ক্যাপ্টেন হাইপারটেক্সট

1
@ এখন, কিভাবে গেল? আপনি এখন কোন পরামর্শ দিতে পারেন?
এডউইন ইভান্স

4
@ এডউইন ইভানস মূলত আমি আমার প্রথম ধারণার সাথেই ছিলাম, তবে বিশেষত আমার প্রতিবন্ধকতার কারণে। আমার স্ক্রিপ্ট সমস্ত আইটেমের কী ডেটার উপর ভিত্তি করে এমডি 5 হ্যাশগুলি তৈরি করে। তারপরে আমি আগের হ্যাশগুলির সাথে তুলনা করি। যদি হ্যাশগুলি আলাদা হয়, তবে এটি আইটেমটির জন্য সমস্ত ডেটা লোড করে এবং সবকিছু আপডেট করে। এটি সর্বোত্তম উপায় কিনা তা নিশ্চিত নন তবে এটি রাত্রে সঞ্চালিত হয় এবং অভিনয়গুলি শালীন হয়।
Neow

উত্তর:


9

এটি আমি বেশ কয়েক বছর ধরে যা করছি বা গত কয়েক বছরে যাচ্ছি তা হ'ল এবং আমার অন্ত্র প্রবৃত্তিটি হ'ল উত্স ডাটাবেস থেকে 500,000 আইটেম পড়ার এবং গন্তব্যস্থলে সিঙ্ক করার সময় যতটা মনে হয় তত বেশি সময় লাগবে না এবং "কী" ক্ষেত্রগুলি পড়তে, MD5 হ্যাশ গণনা করতে, এবং পরিবর্তিত হয়নি এমন আইটেমগুলির সিঙ্ক এড়ানোর জন্য আপনার টেবিলের সাথে ক্রস চেক করার সময় নেওয়া খুব বেশি সময় সাশ্রয় করবে না এবং এটি আরও দীর্ঘকাল চলতে পারে। আমি কেবল সব পড়তে এবং সমস্ত আপডেট করতে চাই। যদি সেই রানটাইমের ফলাফল যদি খুব দীর্ঘ হয় তবে আমি ইটিএলকে মুটি-থ্রেডযুক্ত রানটাইমটি সংকুচিত করতাম, প্রতিটি থ্রেড কেবল টেবিলের একটি অংশে কাজ করে তবে সমান্তরালে কাজ করে।

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

আপনি বলছেন উত্স ডিবি "হতে পারে ডিবি 2"। আপনি যখন "মে" বলবেন তখন ইঙ্গিত দেয় যে ডিবি এখনও ডিজাইন / পরিকল্পনা করা হচ্ছে? ডিবি 2 9 বা তারও বেশি শেষ আপডেট সময়টির অন্তর্নির্মিত ট্র্যাকিং রয়েছে এবং সময়কালের পরে পরিবর্তিত কেবলমাত্র আইটেমগুলিকেই জিজ্ঞাসা করতে এবং ফিরে পেতে পারে। সম্ভবত এই কারণেই ডিবি ডিজাইন করা হয়েছিল যাতে সর্বশেষ আপডেট হওয়া সময়কে নির্দেশ করে একটি কলাম নেই, যেমন:

SELECT * FROM T1 WHERE ROW CHANGE TIMESTAMP FOR TAB t1 > current timestamp - 1 hours;

উপরের ক্যোয়ারির টাইমস্ট্যাম্প কাট অফটি আপনার সিঙ্কের দৌড়ে শেষ টাইমস্ট্যাম্প হবে।

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


মাইএসকিএল-এর জন্যও কি তেমন কোনও সমাধান রয়েছে?
ফারদিন বেহবুদি

5

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

এসকিউএল সার্ভার ডিবিতে, আপনি ব-দ্বীপ ভিত্তিক সনাক্তকারী তৈরি করতে চেকসাম এফএন এর সহায়তা নিতে পারেন ।

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

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


ধন্যবাদ তবে আমি নিশ্চিত না যে আপনার সমাধানটি কার্যকর হতে পারে - "সমস্যাগুলি" অংশে আমার সম্পাদনাগুলি দেখুন।
Neow

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

যেহেতু আপনার উত্সটি ডিবি 2। আপনি কীভাবে এটি থেকে ডেটা টানতে চান? কিছু ওয়েবসার্ভিস বা এপিআইয়ের মাধ্যমে ..
করণ

ওএসবিসি ড্রাইভার ব্যবহার করে একটি ডিএসএন স্থাপন করা হয়েছে। পাইথনের জন্য পাইডবিসি ব্যবহার করে আমি সংযোগ করতে এবং কোয়েরি করতে পারি।
Neow

ঠিক আছে এটি ভাল, যেহেতু আপনি রিমোট ডিবিতে পাইওডবিসি নামক সরঞ্জামটি ব্যবহার করে ক্যোরিগুলি সম্পাদন করতে পারেন। আপনি আরও একটি জিনিস করতে পারেন। কোনও পণ্য যাচাই বা বৈধতা ছাড়াই আপনার টার্গেট ডিবিতে নতুন "স্টেজিং টেবিল" এর মধ্যে যেমন রয়েছে তেমন ডেটা আপনি একই ফর্ম্যাটে টানতে পারেন। এইভাবে আপনি স্টেজ টেবিলগুলির নীচে আপনার টার্গেট ডিবিতে একক শটে সরাসরি ডেটা পাবেন। তারপরে দ্বিতীয় ধাপে পরে, আপনি চেকসাম ক্রিয়াকলাপ সম্পাদন করতে পারেন এবং লক্ষ্য লেনদেনের সারণী ডেটা আপডেট করতে পারেন। এটি আসল সময়ে সোর্স ডিবি ডেটা দিয়ে হ্যাশ বা চেকসাম মূল্যায়ন আটকাতে পারে।
করণ

1

একটি হ্যাশ ব্যবহার করা ভাল ধারণা। যেহেতু সুরক্ষা এই ক্ষেত্রে লক্ষ্য নয়, তাই একটি হ্যাশ ফাংশন চয়ন করুন যা দ্রুত (এমডি 5 ঠিক আছে)।

আপনি যদি একাধিক থ্রেড / প্রসেস জুড়ে হ্যাশ গণনা বিভক্ত করার পরিকল্পনা না করেন, আপনার সত্যিকারের বর্তমান হ্যাশ মানটি ডাটাবেসে সংরক্ষণ করার দরকার নেই। যদি আপনার প্রক্রিয়াটি একটি একক স্ক্রিপ্ট হয় তবে আপনার নতুন স্মৃতিতে বর্তমান হ্যাশ থাকবে এবং নতুন ডাটাবেসে ডেটা আপডেট করার পরে এটি পুরাতন হ্যাশ হিসাবে এটি ডাটাবেসে লিখবে।


-1

আপনার একটি উইন্ডোজ পরিষেবা তৈরি করা উচিত যা আপনি যখনই চান কিছু স্পিফিফ সময়ে চলতে পারে এবং এটি আপনার উত্স ডাটাবেসে পরিবর্তনগুলি খুঁজে পেতে পারে এবং এটি আপনার গন্তব্য ডাটাবেসে পরিবর্তনটি সন্নিবেশ করে।


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

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