আমি কীভাবে দুটি ডাটাবেসের স্কিমা তুলনা করতে পারি?


19

দুটি এসকিউএল সার্ভার ডাটাবেসে (কেবলমাত্র স্কিমা) পার্থক্যগুলি খুঁজে পাওয়ার কোনও উপায় আছে কি? একটি স্থানীয় এবং দ্বিতীয়টি গ্রাহকের সাইটে। স্ফটিক রিপোর্টে কিছু প্রতিবেদন চলছে এবং কিছু কোড কার্যকর হচ্ছে না এমন সমস্যা নিয়ে আমরা সমস্যায় পড়ছি এবং মনে হবে এটি স্কিমার সাথে মেলে না।

আমি উভয় ডাটাবেসে একই কমান্ড চালাতে পারি এবং ফলাফলগুলি কোথায় পার্থক্য তা বলতে তুলনা করতে পারি?


এসও সম্পর্কিত এই প্রশ্নের কয়েকটি ভাল পরামর্শ রয়েছে।
লোলিডিবিএ

উত্তর:


13

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

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


6

আর একটি বিকল্প হ'ল এসকিউএল সার্ভার ডেটা সরঞ্জাম (এসএসডিটি), ভিজ্যুয়াল স্টুডিওর একটি এক্সটেনশন use আপনি .dacpac ফাইল হিসাবে আপনার ডাটাবেস স্কিমাটি বের করতে এবং এটি অন্য .ড্যাকপ্যাক ফাইল বা বিদ্যমান ডাটাবেসের সাথে তুলনা করতে পারেন। এসএসডিটিটি এসকিউএল সার্ভার 2012 ক্লায়েন্ট সরঞ্জামগুলির সাথে অন্তর্ভুক্ত করা হয়েছে, এটি একেবারে অ্যাক্সেসযোগ্য making এমএসডিএন সাইটে কীভাবে তুলনা চালানো যায় তার পুরো নির্দেশাবলী আপনি খুঁজে পেতে পারেন ।


6

এই একই কাজটি করার সহজ উপায়ের সাথে লড়াই করার পরে - দেখুন 2 টি মডেলের মধ্যে কী পরিবর্তন হয়েছে, আমি নিম্নলিখিত এসকিউএল স্ক্রিপ্টটি লিখেছি যা নতুন এবং মুছে ফেলা কলামগুলি নির্ধারণ করতে দুটি স্কিমার তুলনা করবে

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

দ্রুত এবং নোংরা সমাধানের জন্য যাতে কোনও অতিরিক্ত সফ্টওয়্যার প্রয়োজন হয় না, এটি দুর্দান্ত! এটা ঠিক আমার প্রয়োজন ছিল। ধন্যবাদ!
মির

2

আপনার যদি একাধিক ডাটাবেস ফাইলের তুলনা করতে হয় তবে আপনি স্ক্রিপ্ট করতে পারবেন SQLPackage.exe

আপনার জন্য আমার কাছে কার্যকরী কোড নেই তবে আপনি কিছু অনুপ্রেরণার জন্য এসকিউএলপ্যাকেজ.এক্সে ডকুমেন্টেশনটি দেখতে পারেন ।

আপনি আপনার মাস্টার ডাটাবেস একটি ড্যাকপ্যাক ফাইলের সাথে বের করতে এবং তারপরে ড্যাকপ্যাক ফাইলটিকে আপনার বাকী ডাটাবেসের সাথে তুলনা করতে পারেন। তুলনার ফলাফলটি হয় পরিবর্তনগুলির একটি এক্সএমএল প্রতিবেদন বা একটি .sql ফাইল হতে পারে যা আপনি ডাটাবেসগুলি সিঙ্ক্রোনাইজ করতে চালাতে পারেন।

এটার মতো কিছু:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

এবং তারপর

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

আপনি একটি চেহারা থাকতে পারে এই নিবন্ধটি বা এই এক নমুনা কোড জন্য।


1

"এসকিউএল সার্ভার তুলনা করুন" এর জন্য অনুসন্ধান করুন এবং আপনি প্রচুর সরঞ্জাম পাবেন। আমরা আমার কাজে যেটি ব্যবহার করি তা হ'ল রেড গেট এসকিউএল কম্পিউটার । এটির 14 দিনের বিচার রয়েছে। আপনি যেহেতু দুটি পৃথক পরিবেশের বিষয়ে কথা বলছেন তা আমি মনে করি না যে এটি আপনার পক্ষে কার্যকর হবে, যদি না ক্লায়েন্ট আপনাকে তাদের ডিবি ব্যাকআপ না পাঠায়। অন্য বিকল্পটি হ'ল সিস্টেম টেবিলগুলির বিরুদ্ধে প্রশ্ন লিখুন (যেমন: sys.indexes, sys.tables, ইত্যাদি)।


আপনার উভয় সার্ভারে লগইন থাকলে এসকিউএল তুলনা ঠিকঠাক কাজ করে। আপনি প্রতিটি ডিবিতে আলাদা লগইন ব্যবহার করতে পারেন, যাতে ক্লায়েন্টকে আপনার অ্যাক্সেস রয়েছে তা নিশ্চিত করতে হবে।
মার্ক সিংকিনসন

1

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

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

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


1

সদৃশ হিসাবে চিহ্নিত করা একটি নতুন প্রশ্নের খাতিরে আমি এই উত্তরটি অন্তর্ভুক্ত করছি।

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

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

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

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

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

মেটাডেটাবেসসের মডেলটি প্রশ্নযুক্ত সিস্টেম সারণী দ্বারা প্রস্তাবিত হয়েছিল। প্রশ্নগুলি বেশিরভাগ গ্রুপের চারদিকে ঘোরে এবং গণনা (ডাটাবেসের নাম) = 1 দ্বারা তৈরি করা শক্ত ছিল না।

আপনার ক্ষেত্রে, 700 উত্পাদন ডেটাবেসগুলির সাথে, আপনি তুলনা করার জন্য মাত্র দুটি ডাটাবেসের সাথে আমার চেয়ে দুটি প্রথম পদক্ষেপটি স্বয়ংক্রিয় করতে চাইতে পারেন। তবে ধারণাটিও একই রকম।


1

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

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

Presto! প্রকৃত তুলনা করার চেয়ে এটিকে লেখা উল্লেখযোগ্যভাবে শক্ত।


0

আমি যে দুর্দান্ত সরঞ্জামটি ব্যবহার করি (এটি এখনও কার্যকর হলেও কিছুক্ষণের মধ্যে আপডেট হয়নি) হ'ল অ্যাডেপটসকিএলডিফ iff

উভয় স্কিমা ডেটার তুলনা পাশাপাশি। ঠিক রেডগেটের মতো একটি ব্যয় কিন্তু 30 দিনের ট্রায়ালও রয়েছে। এবং দাম বেশ যুক্তিসঙ্গত।


0

হতে পারে এই নিখরচায় স্ক্রিপ্ট https://github.com/dlevsha/compalex আপনাকে সহায়তা করতে পারে। এটি মাইক্রোসফ্ট এসকিউএল সার্ভার সমর্থন করে।

দুটি ডাটাবেস স্কিমার তুলনা করার জন্য কমপ্লেক্স একটি ফ্রি লাইটওয়েট স্ক্রিপ্ট। এটি মাইএসকিউএল, এমএস এসকিউএল সার্ভার এবং পোস্টগ্রিজ এসকিউএল সমর্থন করে।

আপনি এখানে ডেমো চেষ্টা করতে পারেন

http://demo.compalex.net/


0

অনেকগুলি তৃতীয় পক্ষের সরঞ্জাম রয়েছে যা স্কিমা এবং ডেটা তুলনা এবং সিঙ্ক্রোনাইজেশন করবে। আপনি যে দুটি সরঞ্জাম ব্যবহার করতে পারেন তা হ'ল আমার দলটি এবং আমি বিকাশ করেছি, এক্সএসকিউএল স্কিমা স্কিমা তুলনার জন্য তুলনা করুন এবং এক্সএসকিউএল ডেটা একই স্কিমার সাথে বস্তুর মধ্যে ডেটার তুলনা করার জন্য তুলনা করুন । আশাকরি এটা সাহায্য করবে!
দাবি অস্বীকার: আমি এক্সএসকিউএল সম্পর্কিত


0

বাজারে প্রচুর সরঞ্জাম রয়েছে যা আপনি কাজটি পেতে ব্যবহার করতে পারেন। আমার সংস্থা তুলনা এবং সিঙ্ক উভয়ের জন্য অ্যাপেক্সএসকিউএল ডিফ ব্যবহার করছে কারণ এটি অ্যাজুরের জন্য বিনামূল্যে, তবে আপনি ডিভার্ট বা রেডগেট সরঞ্জামগুলির সাথে ভুল করতে পারবেন না।


0

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


0

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


-1

এটা দেখ:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

এখানে চিত্র বর্ণনা লিখুন


3
এটি কেবল তুলনামূলকভাবে তুলনামূলক হওয়া দরকার, কেবল স্কিমা না পেয়ে
মার্ক সিনকিনসন

আমি এটি এখানে রেখে দিই এটি অন্যকে সহায়তা করে ase এটি আমাকে সহায়তা করেছিল
জেরেমি থম্পসন


-1

ডিবিডিফ এটির জন্য সেরা সরঞ্জাম, আপনি এটি এখানে খুঁজে পেতে পারেন ।


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