এসকিউএল সার্ভারে দুটি ডাটাবেস সিঙ্ক করা হচ্ছে


16

আমার দুটি এসকিউএল সার্ভার ডাটাবেস রয়েছে। একটি ক্লায়েন্ট (উইন্ডোজ অ্যাপ্লিকেশন) এবং দ্বিতীয়টি সার্ভারে রয়েছে। আমি এই দুটি ডাটাবেস প্রতি প্রায়শই সিঙ্ক করতে চাই (যেমন প্রতি 2 মিনিট!)।

প্রতিলিপি, টাইম স্ট্যাম্প, ট্রিগার ব্যবহার করে লগ টেবিল, মাইক্রোসফ্ট সিঙ্ক ফ্রেমওয়ার্ক এবং এর মতো বিভিন্ন পদ্ধতির সিঙ্কিংয়ের বিষয়ে আমি পড়েছি।

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

  1. আপনি কোন পদ্ধতিটি মনে করেন যে এই জাতীয় পরিস্থিতিতে আমার ব্যবহার করা উচিত? মনে রাখবেন যে প্রতি কয়েক মিনিটে আমাকে ক্লায়েন্ট থেকে সার্ভারে কয়েকটি টেবিল পরিবর্তন পাঠাতে হবে এবং সার্ভার থেকে দুটি টেবিল পরিবর্তন আনতে হবে।

  2. আমি একটি পদ্ধতি খুঁজে পেয়েছি যা অদ্ভুত তবে নতুন। এটা কি সম্ভব যে আমি সমস্ত কার্যকর (নির্দিষ্ট পছন্দসই জন্য) ক্লায়েন্টে সঞ্চিত পদ্ধতিগুলিতে লগ করেছি এবং তাদের পরামিতিগুলির সাথে একটি .sqlফাইলে সার্ভারে প্রেরণ করেছি এবং সেখানে চালিয়েছি? সার্ভারে একই ঘটবে এবং ক্লায়েন্টকে প্রেরণ করা হবে। আপনি কি মনে করেন যে এটি একটি সহজ তবে কার্যকর পদ্ধতি বা না?

  3. আপনি যদি পারেন তবে আমাকে কোনও কার্যকর পদ্ধতির পরামর্শ দিন। তোমাকে অনেক ধন্যবাদ.

সম্পাদনা: মনে রাখবেন যে এটি একটি রিয়েল-টাইম সিঙ্ক্রোনাইজেশন এবং এটি এটি বিশেষ করে। এর অর্থ যখন ক্লায়েন্ট ব্যবহারকারী টেবিলটি ব্যবহার করছেন তখন সার্ভারের সাথে সিঙ্ক্রোনাইজেশন প্রক্রিয়াটি প্রতি কয়েক মিনিটের মধ্যে অবশ্যই ঘটে থাকে তাই কোনও টেবিলকে লক করা উচিত নয়।


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

@ ডেভিডস্পিলিট: আপনি কি রিয়েল-টাইম সিঙ্ক্রোনাইজেশন প্রকল্পটিতে সাফল্যের সাথে প্রতিলিপি ব্যবহার করেছেন? আমার প্রধান উদ্বেগ রিয়েল-টাইম সিঙ্ক্রোনাইজেশন এবং "লকিং এবং ব্লকিং"।
এমাদ ফারোকखी

উত্তর:


14

ঠিক আছে আমি এটি নাও পেতে পারি, তবে আমি এর উত্তর দেওয়ার চেষ্টা করি।

আপনি বলেছিলেন যে আপনার একটি উচ্চ পারফরম্যান্স সমাধান দরকার যা প্রায়শই চলে (সর্বনিম্ন 2 মিনিট) এবং আপনার একটি ভাল পদ্ধতির দরকার যা লক না করে দ্রুত হওয়া উচিত। তবে আপনি একটি ব্ল্যাকবক্স সিস্টেম চান না।

একটি ব্ল্যাকবক্স সিস্টেমের পরিবর্তে, যা লক্ষ লক্ষ স্থাপনায় ভাল ফলাফল সহ ব্যবহৃত হয়, আপনি আবার চাকাটি উদ্ভাবন করে নিজের সমাধান তৈরি করার চেষ্টা করেন? এইচএম, কিছুটা অদ্ভুত লাগছে।

আসলে এই আমার পরামর্শ।

  1. এমনকি যদি আপনি বলে থাকেন যে আপনি এটি ব্যবহার করবেন না তবে প্রতিলিপি । আপনি এটির জন্য এটি ব্যবহার করতে পারেন এটি বেশ সহজ এবং সর্বোত্তম সমাধান। প্রতিলিপিটি সেটআপ করা সহজ, দ্রুত প্রতিলিপি করা এবং আপনাকে আবার চাকাটি আবিষ্কার করতে হবে না। আপনি যদি লকিংয়ের বিষয়ে কেবল অদ্ভুত হন তবে আপনি এটি সেট করার চেষ্টা করতে ISOLATION LEVELপারেন READ_COMMITTED_SNAPSHOT। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন । এটি আপনার টেম্পডিবির একটি অংশ ব্যবহার করবে তবে আপনার টেবিলটি সর্বদা পঠনযোগ্য এবং লিখিত হয় এবং অনুলিপিটি পটভূমিতে কাজ করতে পারে।

নীচের উদাহরণটি দেখুন:

ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
  1. সিডিসি (পরিবর্তন ডেটা ক্যাপচার) এর সমাধানও হতে পারে। তবে এইভাবে আপনাকে নিজেরাই প্রায় সব কিছু তৈরি করতে হবে। এবং আমি অভিজ্ঞতা তৈরি করেছি যা CDCকিছু পরিস্থিতিতে একটি ভঙ্গুর জিনিস হতে পারে। CDCএকটি পর্যবেক্ষিত টেবিলের সমস্ত ডেটা ক্যাপচার করবে (আপনার প্রতিটি দেখার টেবিলটি ম্যানুয়ালি নির্দিষ্ট করা দরকার)। এরপরে আপনি আগে মান এবং একটির পরে মান পাবেন INSERT, UPDATEবা DELETECDCকিছু সময়ের জন্য এই তথ্যগুলি ধরে রাখবে (আপনি এটি নিজেরাই নির্দিষ্ট করতে পারেন)। পদ্ধতির CDCআপনাকে নির্দিষ্ট টেবিলে ব্যবহার করতে হবে এবং অন্য ডাটাবেসে সেই পরিবর্তনগুলি ম্যানুয়ালি প্রতিলিপি করতে হবে। যাইহোক, CDCহুডের নীচেও এসকিউএল সার্ভারের প্রতিলিপি ব্যবহার করে। ;-) আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন ।

সতর্কতা: পরিবর্তনগুলি CDCসম্পর্কে সচেতন হবে না DDL। এর অর্থ, আপনি যদি কোনও টেবিল পরিবর্তন করেন এবং একটি নতুন কলাম যুক্ত করেন, CDCসারণীটি দেখবে তবে নতুন কলামে সমস্ত পরিবর্তন উপেক্ষা করা হবে। প্রকৃতপক্ষে এটি কেবল NULLআগের মান এবং পরে মান হিসাবে রেকর্ড করে । আপনার DDLদেখা এটিকে পুনরায় পুনরায় পুনর্নিবিষ্ট করা দরকার - একটি দেখা টেবিলে পরিবর্তন করা হয়েছে।

  1. আপনি উপরে বর্ণিত উপায়টি হ'ল এসকিউএল সার্ভার প্রোফাইলার ব্যবহার করে কোনও কাজের চাপ ক্যাপচার করার মতো এবং কিছু মানদণ্ডের জন্য এটি আবার অন্য ডাটাবেসে চালানো। ভাল এটা কাজ করতে পারে। তবে খুব বেশি পার্শ্ব প্রতিক্রিয়া রয়েছে তা আমার পক্ষে কিছুটা ভারী। আপনি যদি আপনার ক্লায়েন্টের কাছে কোনও প্রক্রিয়া কল ক্যাপচার করেন তবে আপনি কী করবেন। এরপরে আপনার নীতিমালা ডাটাবেসে একই কমান্ডটি চালানো যেমন সিঙ্কের বাইরে চলে গেছে? পদ্ধতিটি চলতে পারে তবে এটি আপনার ক্লায়েন্টে উপস্থিত না থাকা সারিগুলি / আপডেট / সন্নিবেশ করতে পারে। অথবা আপনি কীভাবে এক নীতি সহ একাধিক ক্লায়েন্ট পরিচালনা করেন handle আমি মনে করি এটি খুব জটিল। সবচেয়ে খারাপ ক্ষেত্রে, আপনি সম্ভবত আপনার সততা নষ্ট করেছেন।
  2. আর একটি ধারণা প্রয়োগ ভিত্তিক বা ট্রিগার ব্যবহারের হতে পারে be আপনি কতগুলি সারণি সিঙ্ক করতে চান তার উপর নির্ভরশীল। আপনি পৃথক স্টেজিং টেবিলে সমস্ত পরিবর্তন লিখতে পারেন এবং আপনার মাস্টারের সাথে স্টেজিং টেবিলে এই সারিগুলি সিঙ্ক করার জন্য সমস্ত এক্স মিনিট এসকিউএল সার্ভার এজেন্ট জব চালাতে পারেন। তবে আপনি কিছুটা ভারী হতে পারে যদি আপনি 150 টেবিলগুলি সিঙ্ক করার চেষ্টা করেন। আপনার একটি বড় ওভারহেড হবে

আচ্ছা এটি আমার 2 সেন্ট। আশা করি আপনার একটি ভাল ওভারভিউ আছে এবং সম্ভবত আপনি একটি সমাধান খুঁজে পেয়েছেন যা আপনার পক্ষে কার্যকর।


9

আমি সুবিধাগুলি এবং অসুবিধাগুলি সহ আমি এখানে কিছু বিকল্প গণনা করার চেষ্টা করব:

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

  3. ডাটাবেস পরিবর্তন ট্র্যাকিং । এটি একটি অন্তর্নির্মিত এসকিউএল সার্ভার ফাংশন যা আপনার জন্য সন্নিবেশ, আপডেট এবং মুছে ফেলা ট্র্যাকিং পরিবর্তন করে। পরিবর্তনগুলি প্রেরণ এবং প্রয়োগ করা, দ্বন্দ্বগুলি সমাধান করা ইত্যাদির মতো আপনাকে নিজেরাই কোড করতে হবে।

  4. রোভার্সন (টাইমস্ট্যাম্প) কলামগুলি যদি আপনি সমস্ত মুছে ফেলা (মুছে ফেলা রেকর্ডগুলির কোনও সিঙ্ক নয়) অস্বীকার করেন - তবে আপনি কেবলমাত্র রোভার্সন তথ্যের ভিত্তিতে নিজের সমাধানটি প্রয়োগ করতে পারেন। রোভার্সন কলামগুলি এসকিউএল সার্ভারের প্রতিরূপ দ্বারাও ব্যবহৃত হয়, সুতরাং আপনাকে সেগুলি যে কোনও উপায়ে যুক্ত করতে হবে।
  5. আয়নিকের উত্তরে বর্ণিত সিডিসি - এটির সাথে আমার কোনও অভিজ্ঞতা নেই, কারণ এটি কেবলমাত্র এন্টারপ্রাইজ বা বিকাশকারী সংস্করণগুলিতে উপলব্ধ।

  6. সম্পাদিত সঞ্চিত প্রক্রিয়াগুলি লগিংয়ের সাথে আপনার নিজস্ব কৌশলটি ব্যবহার করা - আপনার ডেটাবেস অ্যাপ্লিকেশনটির প্রকৃতির উপর নির্ভর করে। পদ্ধতিগুলি যখন কিছুটা আলাদা হয়ে যায়, সেখানে আপনি ডেটাতে একটি বড় জগাখিচুড়ি পেতে পারেন। এবং আপনি কীভাবে বিরোধগুলি মোকাবেলা করবেন?

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

  • মুছে ফেলতে পারে এবং তারপর কি ঘটে?
  • দ্বন্দ্বগুলি কি ঘটতে পারে, কীভাবে তাদের প্রতিরোধ করা যায় এবং কীভাবে সমাধান করা যায়?
  • আমি কীভাবে টেবিলের কাঠামোর পরিবর্তনগুলি মোকাবেলা করব?
  • ...

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


2

আপনার প্রতিক্রিয়ার জন্য আপনি ধন্যবাদ।

আমি সাফল্যের সাথে সমাধান করেছি সঞ্চালিত সঞ্চিত পদ্ধতিগুলি গুচ্ছ হিসাবে নয় বরং একের পর এক ক্যাপচার করে যা আমার ক্ষেত্রে দুর্দান্ত কাজ করেছে। যেহেতু সততা এবং সমস্ত কিছু সাবধানতার সাথে বিবেচনা করা হয়, তাই সিস্টেমটি এখন পর্যন্ত রিয়েল-টাইম কাজ করছে working


দুর্দান্ত তবে আপনি দয়া করে আরও কিছুর বিস্তারিত ব্যাখ্যা করতে পারেন। আপনি কি কেবল সঞ্চালিত স্টোরেজ পদ্ধতিগুলির কলগুলিতে লগ করেন এবং এগুলি কিছু টেম্প টেবিল / স্ক্রিপ্টে সঞ্চয় করেন এবং এই স্ক্রিপ্টটি চালিত করে এমন একটি ক্ষেত্র সেট করে (যেমন একটি বিট ফিল্ড বা একটি ডেটটাইম ক্ষেত্র যেখানে আপনি সকলের জন্য বলছেন) রেকর্ডগুলি যা প্রক্রিয়া করা হয়নি সেগুলি প্রক্রিয়া করে এবং বিট ফিল্ডটি আপডেট করে?) আমি কি খুশি আপনি নিজের সমস্যাটি সমাধান করেছেন তবে অন্যকে শিখতে সহায়তা করার জন্য আপনি কী করেছেন সে সম্পর্কে আপনাকে আরও অন্তর্দৃষ্টি দেওয়া দরকার?
জোনএইচ

0

দেরীতে উত্তর তবে এটি থ্রেড দর্শকদের পক্ষে সহায়ক হতে পারে

আমি বিভিন্ন সার্ভার জুড়ে ডেটা বিতরণ করার প্রয়াসে একটি অনুরূপ চ্যালেঞ্জ ছিল এবং (তৃতীয় পক্ষের সরঞ্জামগুলির ব্যবহার করে এটি মীমাংসিত পার্থক্য স্কিমা পরিবর্তন এবং জন্য DataDiff এবং PowerShell স্ক্রিপ্ট নিম্নলিখিত ডেটা সিঙ্ক পরিবর্তন) প্রক্রিয়া স্বয়ংক্রিয়রূপে করা প্রয়োজন:

#check for the existence of the Outputs folder
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder

#setting up location 
if($Outputs -eq $true)
{
    $location += "\Outputs"
}

#if the folder doesn't exist it will be created
if(-not (Test-Path $location))
{ mkdir $location -Force:$true -Confirm:$false | Out-Null }

return $location
}

#root folder for the schema sync process
$rootFolder = "SchemaSync"

#schema output summaries location 
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs

#ApexSQL Diff location, date stamp variable is defined, along with tools parameters 
$diffLoc   = "ApexSQLDiff"
$stamp = (Get-Date -Format "MMddyyyy_HHMMss") 
$Params = "/pr:""MyProject.axds""    /out:""$outsLoc\SchemaOutput_$stamp.txt"" /sync /v /f" 
$returnCode = $LASTEXITCODE

#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))

#write output to file
"$outsLoc\SchemaOutput_$dateStamp.txt"

#schema changes are detected
if($returnCode -eq 0)
{
"`r`n $returnCode - Schema changes were successfully synchronized" >> 

}
else
{
#there are no schema changes
if($returnCode -eq 102)
{
"`r`n $returnCode - There are no schema changes. Job aborted" >> 
}
#an error is encountered
else
{
"`r`n $returnCode - An error is encountered" >> 

#output file is opened when an error is encountered
Invoke-Item "$outsLoc\SchemaOutput_$stamp.txt"
}

}

এই পদ্ধতিটি দুটি ডাটাবেসের মধ্যে তুলনার সময়সূচী করে এবং রিয়েল টাইমে পরিবর্তনগুলি সিঙ্ক্রোনাইজ করে। এখানে কয়েকটি নিবন্ধ ধাপে ধাপে নির্দেশাবলী দেওয়া হচ্ছে:

https://solutioncenter.apexsql.com/auto चालित- compare- and- synchronize- sql- server- data/ https://solutioncenter.apexsql.com/how-to-auto चालित-keep- two- sql- server- database- স্কিমের-ইন-সিঙ্ক /

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