অন্য এসকিউএল ২০০৮ ডাটাবেসে সারণী সরিয়ে নেওয়া (ইনডেক্স, ট্রিগার ইত্যাদি)


16

আমাকে একটি এসকিউএল ২০০৮ ডাটাবেস থেকে অন্য এক বৃহত্তর (কয়েক মিলিয়ন সারি) সারণীগুলি সরানো দরকার।

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

এটি করার সঠিক উপায় কী?

যদি এটি কেবল কয়েকটি টেবিল থাকে তবে আমি উত্সটিতে ফিরে যেতে পারি, টেবিলের সংজ্ঞাটি স্ক্রিপ্ট আউট করব (সমস্ত সূচী ইত্যাদি), তারপরে গন্তব্যের স্ক্রিপ্টের সূচী তৈরির অংশগুলি চালান। তবে অনেকগুলি সারণী সহ এটি অযৌক্তিক বলে মনে হয়।

যদি খুব বেশি ডেটা না পাওয়া যায়, তবে ডেটা সহ উত্স স্ক্রিপ্টের জন্য আমি "স্ক্রিপ্ট তৈরি করুন ..." উইজার্ডটি ব্যবহার করতে পারতাম, তবে একটি 72 মি সারি স্ক্রিপ্টটি কোনও ভাল ধারণা বলে মনে হয় না!


এবং এটি ডাটাবেসের সব টেবিল না?
বৃহস্পতিবার

@ থ্রি বৃহস্পতিবার: এটি প্রায় সমস্ত টেবিল, তবে গন্তব্য ডেটাবেসে ইতিমধ্যে 100+ টেবিল রয়েছে। সুতরাং কেবল আলাদা নামের সাথে ব্যাকআপ থেকে পুনরুদ্ধার করা কোনও বিকল্প নয়। এটিকে মূলত "এই দুটি বৃহত ডাটাবেস একসাথে একত্রিত করুন" হিসাবে ভাবেন।
ব্র্যাডিসি

উত্তর:


14

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


9

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

আমাদের হতাশার অংশটি হ'ল এসকিউএল 2000 "ডিটিএস ইম্পোর্ট / এক্সপোর্ট উইজার্ড" আসলে "কপিরাইট অবজেক্টস এবং ডেটা" নির্বাচন করে এটি প্রায় তুচ্ছভাবে সহজ করে তুলেছে:

ডিটিএস আমদানি উইজার্ড

এই তৃতীয় বিকল্পটি হ'ল সূচক / ট্রিগার ইত্যাদি অন্তর্ভুক্ত করার ক্ষমতা রাখে:

উন্নত বিকল্প

এই বিকল্পটি এসকিউএল 2005/2008 আমদানি উইজার্ড থেকে সরানো হয়েছিল । কেন? কোন ধারণা নেই:

2008 আমদানি উইজার্ড

2005/2008, আপনি দৃশ্যত আছে ম্যানুয়ালি বিআইডিএসের একটি SSIS প্যাকেজ তৈরি এবং ব্যবহার ট্রান্সফার SQL সার্ভার অবজেক্টস টাস্ক , যা সব একই বিকল্প যে 2000 জাদুকর ছিল রয়েছে:

এসএসআইএস স্থানান্তর এসকিউএল সার্ভার অবজেক্ট টাস্ক


কেবল পোস্ট করতে চেয়েছিলাম যে আমি এই এসএসআইএস পদ্ধতিটি অন্য একটি অনুরূপ কাজের জন্য ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করেছে!
ব্র্যাডিসি

8

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

তারপরে আমি একই সার্ভারে একটি আলাদা নামের সাথে ডাটাবেস পুনরুদ্ধার এবং করা বিবেচনা করব

 INSERT newdb.dbo.newtable SELECT * FROM olddb.dbo.oldtable

.. প্রতিটি টেবিলের জন্য, প্রয়োজনে সেট পরিচয় লিখুন with

তারপরে আমি ডেটা লোড করার পরে সূচি এবং সীমাবদ্ধতাগুলি যুক্ত করব।

এটি এসএসআইএস (এমডেন্নির উত্তর) বা আপনি যদি কাঁচা এসকিউএল পছন্দ করেন তবে এটি আপনার আরামের স্তরের উপর নির্ভর করে।


6

আমি মিঃ ডেনির জবাবটিতে যুক্ত করব: টেবিলগুলির স্কিমা স্ক্রিপ্ট আউট করে ডেটা সরিয়ে নিতে বিসিপি ব্যবহার করুন। আপনি যদি এসএসআইএসের সাথে পরিচিত না হন, তবে বিসিপি এবং ব্যাচগুলি ব্যবহার করা সহজ হওয়া উচিত। কয়েক মিলিয়ন সারি বিসিপি (বাল্ক সন্নিবেশ) কে হারায় না :)।


4

আমিই সেই ব্যক্তি যিনি এসএসআইএস-এ সম্পূর্ণ অস্বস্তিকর।

যখন উত্স টেবিলগুলির কোনও পরিচয় কলাম নেই

  1. লক্ষ্য সার্ভারে একটি খালি ডাটাবেস তৈরি করুন
  2. লক্ষ্য সার্ভারে উত্স সার্ভারের সাথে একটি লিঙ্কযুক্ত সার্ভার তৈরি করুন
  3. * ইন ... বিবৃতি নির্বাচন করতে উত্স ডাটাবেসে নীচে স্ক্রিপ্টটি চালান
  4. লক্ষ্য ডাটাবেস থেকে উত্পন্ন স্ক্রিপ্ট চালান
  5. উত্স ডাটাবেস থেকে প্রাথমিক কী, সূচি, ট্রিগার, ফাংশন এবং পদ্ধতি স্ক্রিপ্ট
  6. উত্পন্ন স্ক্রিপ্ট দ্বারা এই বস্তু তৈরি করুন

টি-এসকিউএল সিলেক্ট * ইন ... স্টেটমেন্ট জেনারেট করে

SET NOCOUNT ON

declare @name sysname
declare @sql varchar(255)

declare db_cursor cursor for
select name from sys.tables order by 1
open db_cursor

fetch next from db_cursor into @name
while @@FETCH_STATUS = 0
begin
    Set @sql = 'select * into [' + @name + '] from [linked_server].[source_db].[dbo].[' + @name + '];'
    print @sql

    fetch next from db_cursor into @name
end

close db_cursor
deallocate db_cursor

এটি প্রতিটি টেবিলের মতো অনুলিপি করার জন্য একটি লাইন তৈরি করে

select * into [Table1] from [linked_server].[source_db].[dbo].[Table1];

সারণীতে পরিচয় কলাম রয়েছে সে ক্ষেত্রে আমি পরিচয় সম্পত্তি এবং প্রাথমিক কীগুলি সহ টেবিলগুলি স্ক্রিপ্ট করি।

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

সূচী ইত্যাদির বিন্যাস ইত্যাদি উপরের ক্ষেত্রে অনুরূপ। এবার আমি প্রাথমিক কীগুলির বিনোদন বাদ দিতে পারি।


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

1
@ মারিয়ান দয়া করে যদি আপনি এসএসআইএস প্রচার করতে চান তবে dba.stackexchange.com/Qestions/297/… একবার দেখুন । আমি এসএসআইএস চেষ্টা করিনি, তবে আমদানি এক্সপোর্ট উইজার্ডটিও ব্যর্থ হয়েছে (লিঙ্কযুক্ত সার্ভারের পাশাপাশি)।
bernd_k

আমি আনন্দের সাথে সাহায্য করতে পারতাম, তবে আমার কাছে কোনও ওরাকল বাক্স উপলব্ধ নেই available যাইহোক, আমি যা পড়তে পেরেছি সেখান থেকে এমন কোনও সরবরাহকারী নেই যা ওরাকল সিএলওবি সমর্থন করবে ..
মেরিয়ান

আমি এটিতে আপনার সাথে আছি - আমি কখনও কখনও ডেটা মাইগ্রেট করি তবে এসএসআইএস কখনই ব্যবহার করি না।
একে

2

আপনি তুলনামূলক সরঞ্জামগুলি ব্যবহার করতে পারেন যা ডেটাবেস স্কিমা এবং ডেটা তুলনা করে এবং সমস্ত টেবিল তৈরি করতে প্রথমে একটি খালি ডাটাবেস স্কিমাকে মূল ডিবি দিয়ে সিঙ্ক্রোনাইজ করে।

তারপরে, টেবিলগুলিতে রেকর্ড সন্নিবেশ করানোর জন্য মূল ডাটাবেস থেকে ডেটা সিঙ্ক্রোনাইজ করুন (সমস্ত টেবিল রয়েছে তবে তারা সমস্ত খালি রয়েছে)

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

এই প্রক্রিয়াটি সম্পর্কে ভাল বিষয়টি হ'ল আপনাকে ডিভাইসটি ব্যবহার করে ডাটাবেসগুলিকে আসলে সিঙ্ক্রোনাইজ করতে হবে না, কারণ এটি কয়েক মিলিয়ন সারিগুলির জন্য বেশ বেদনাদায়ক হতে পারে।

আপনি কেবল এসকিউএল স্ক্রিপ্টের মধ্যে একটি INSERT INCO স্ক্রিপ্ট তৈরি করতে পারেন (এটি বেশ কয়েকটি জিগ থাকলে অবাক হবেন না) এবং এটি সম্পাদন করতে পারেন।

যেহেতু এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে এত বড় স্ক্রিপ্টগুলিও খুলতে পারে না, তাই আমি sqlcmd বা osql ব্যবহার করি


1

যেমন @ এমর্ডেনি উল্লেখ করেছেন -

  1. সমস্ত সূচক, এফকে ইত্যাদির সাহায্যে প্রথমে টেবিলগুলি স্ক্রিপ্ট করুন এবং গন্তব্য ডেটাবেসে ফাঁকা সারণী তৈরি করুন।

এসএসআইএস ব্যবহার করার পরিবর্তে, ডেটা toোকাতে বিসিপি ব্যবহার করুন

  1. বিসিপি নীচে স্ক্রিপ্ট ব্যবহার করে তথ্য। পাঠ্য মোডে এসএসএমএস সেট করুন এবং ব্যাট ফাইলে নীচের স্ক্রিপ্ট দ্বারা উত্পন্ন আউটপুট অনুলিপি করুন।

    -- save below output in a bat file by executing below in SSMS in TEXT mode
    
    -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
    
    select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
        +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
    from sys.tables
    where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
    /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
  2. ব্যাট ফাইলটি চালান যা আপনার নির্দিষ্ট করা ফোল্ডারে .dat ফাইল তৈরি করবে।

  3. স্ক্রিপ্টের নীচে চালান

    --- Execute this on the destination server.database from SSMS.
    
    --- Make sure the change the @Destdbname and the bcp out path as per your environment.
    
    declare @Destdbname sysname
    set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
    select 'BULK INSERT ' 
    /*Remember Tables must be present on destination database */ 
    + QUOTENAME(@Destdbname) + '.' 
    + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
    + '.' + QUOTENAME(name) 
    + ' from ''D:\BCP\' /* Change here for bcp out path */ 
    + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
    + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
    + char(10) 
    + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
    + char(10) + 'go'
       from sys.tables
       where is_ms_shipped = 0
    and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
    and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
  4. টেবিলগুলিতে ফিরে ডেটা toোকাতে এসএসএমএস ব্যবহার করে আউটপুট চালান।

এটি নেটিভ মোড ব্যবহার করার কারণে এটি খুব দ্রুত বিসিপি পদ্ধতি।

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