এসকিউএল সার্ভার-ইন-প্লেস আপগ্রেডগুলি আগের মতো অসুস্থ হিসাবে পরামর্শ দেওয়া হচ্ছে?


78

এসকিউএল সার্ভার 6.৫ সাল থেকে আমি এসকিউএল সার্ভারটি চালু এবং বন্ধ করে কাজ করে যাচ্ছি, সেই পুরানো পরামর্শটি এখনও আমার মাথায় বেজে ওঠেনি কখনও কোনও স্থানের আপগ্রেড করা হয়নি।

আমি বর্তমানে আমার ২০০৮ আর ২ ডিভি এবং টেস্ট সিস্টেমগুলি এসকিউএল সার্ভার ২০১২-তে আপগ্রেড করছি এবং একই হার্ডওয়্যারটি ব্যবহার করা দরকার। আমার রিপোর্টিং পরিষেবাদির কনফিগারেশনটি পুনরুদ্ধার না করার চিন্তাভাবনা খুব আকর্ষণীয় এবং আমি সত্যই প্রাচীরের সময়ের বিপরীতে up এতে কোনও বিশ্লেষণ পরিষেবাদি জড়িত বা অস্বাভাবিক বা অ-মানক কিছু নেই - কেবল ডাটাবেস ইঞ্জিন এবং প্রতিবেদনের পরিষেবাগুলি ইনস্টল করা আছে।

ইন-প্লেস আপগ্রেডগুলি সহ কেউ কি গুরুতর সমস্যা অনুভব করেছেন? অথবা আমার স্থানের আপগ্রেডগুলি সম্পর্কে আমার অবস্থানটি পুনর্বিবেচনা করা উচিত?


আমি প্রতিবেদনের পরিষেবা ইনস্টলেশন সহ 1 সার্ভারে ইনপ্লেস আপগ্রেড করতে পছন্দ করেছি। আমি যে বিষয়টি নিয়ে এসেছি তা হ'ল দেশীয় ক্লায়েন্ট ১১ সহ এসএসএমএসে আমদানি রফতানির সরঞ্জামটি ব্যবহার করার চেষ্টা করা হয়েছিল। স্বীকৃত ডেটাটাইপগুলি সম্পর্কে একটি ত্রুটির সাথে রূপান্তর চেষ্টা ব্যর্থ হয়েছে। আমি যে কাজটি ব্যবহার করেছি তা হ'ল প্যাকেজটি সংরক্ষণ করা এবং এটি এসকিউএল ডেটা সরঞ্জামগুলিতে (বিআইডিএস প্রতিস্থাপন) চালানো যা ভাল কাজ করেছিল। আমি মনে করি এসএসআইএস ২০০৮-এর ওভাররাইট না হওয়ার জন্য কনফিগার ফাইলটি করতে হবে। এটি আমার কাছে পরে ঘটেছে, আপনি কেবল স্থানীয় ক্লায়েন্টকে আবার 10 এ পরিবর্তন করতে পারবেন
ড্যামেজড গুডস

উত্তর:


92

সত্যিই সংক্ষিপ্ত উত্তর - জায়গা ঠিক আছে। এরপরে আপনি আপনার কনফিগারেশনটি পর্যালোচনা করতে পারেন এবং এসকিউএল সার্ভার 2012 এর জন্য সেরা অনুশীলনগুলি প্রয়োগ করতে পারেন।

এসকিউএল সার্ভার আপগ্রেড / মাইগ্রেশন সম্পর্কিত দীর্ঘ উত্তর

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

কেন আমি স্থানান্তরিত আপগ্রেসে অভিবাসনকে অগ্রাধিকার দিই

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

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

আপনি যদি ডেভ / টেস্টের জন্য জায়গা করে নেওয়ার পরিকল্পনা করেন তবে উত্পাদনের জন্য মাইগ্রেশন করতে চান তবে আপনি উত্পাদনের আগে কমপক্ষে একটি মাইগ্রেশন করার বিষয়টি বিবেচনা করতে পারেন। এইভাবে আপনি সময়ের আগে আপনার চেকলিস্টটি তৈরি করতে পারেন এবং যে কোনও সম্ভাব্য সমস্যা যা আপনি ভাবেননি সেগুলি মোকাবেলা করতে পারেন।

অভিবাসনগুলির জন্য সংযুক্ত / বিচ্ছিন্ন বনাম ব্যাকআপ / পুনরুদ্ধার করুন

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

আমি ব্যাকআপ / পুনরুদ্ধার পছন্দ করি। বিচ্ছিন্নতা / সংযুক্তি সম্পর্কে আমি সবচেয়ে বড় সুবিধাটি শুনি তা হ'ল এটি কিছুটা সময় সাশ্রয় করে। আমার জন্য ব্যাকআপ / পুনরুদ্ধার কয়েকটি কারণে:

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

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

কিভাবে অভিবাসন পদ্ধতির দ্রুততর করা যায়

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

ইন-প্লেস আপগ্রেডকে কীভাবে নিরাপদ করবেন

জায়গার অভ্যন্তরীণ পদ্ধতির পছন্দটি বেছে নেওয়ার সময় আপনার অভিজ্ঞতা এবং ফলাফলগুলি উন্নত করতে আপনি কিছু কিছু করতে পারেন।

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

আপগ্রেড বা মাইগ্রেশন চেকলিস্টগুলির গুরুত্ব

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

  1. শুরুতে - একটি পরীক্ষা আপগ্রেড করার মতো কিছু কাজ করুন, সর্বশেষ ডেটাবেস সামঞ্জস্যতা স্তরে আপনার অ্যাপ্লিকেশনগুলি পরীক্ষা করুন এবং এসকিউএল করার আগে আপনাকে কী ধরণের কাজগুলি সম্পন্ন করতে হবে তা দেখার জন্য এসকিউএল সার্ভার আপগ্রেড অ্যাডভাইজারের মতো একটি সরঞ্জাম চালানো বিবেচনা করুন S সার্ভার আপগ্রেড বা মাইগ্রেশন।
  2. প্রাক পদক্ষেপ - ক্লিনআপ, ওএস টাস্ক, সময়ের আগে প্যাচিং, আপগ্রেডের জন্য অ্যাপ্লিকেশন প্রস্তুত করা (ক্লিন শাটডাউন, সংযোগের স্ট্রিং ওয়ার্ক), ব্যাকআপ ইত্যাদি
  3. আপগ্রেড / মাইগ্রেশন পদক্ষেপ - আপগ্রেড বা মাইগ্রেশন সাফল্যের জন্য এবং সঠিক ক্রমে আপনার যা কিছু করতে হবে। ইনস্টলেশন, পরিবর্তন (বা আপনার পরীক্ষার এবং পদ্ধতির উপর নির্ভর করে পরিবর্তন না) উপাত্তগুলিতে সামঞ্জস্যতা মোড পরিবর্তন ইত্যাদি etc.
  4. মাইগ্রেশন পোস্ট / আপগ্রেড পদক্ষেপ - বিভিন্ন পরীক্ষা, নতুন সংস্করণ বা নতুন সার্ভার কনফিগারেশন বিকল্পগুলি, সর্বোত্তম অনুশীলন বাস্তবায়ন, সুরক্ষা পরিবর্তন ইত্যাদি,
  5. রোলব্যাকের পদক্ষেপ - সমস্ত উপায়ে আপনার রোলব্যাক পদক্ষেপ এবং মাইলফলক থাকা উচিত। আপনি যদি এ পর্যন্ত পৌঁছে যান এবং এটি ঘটে, আপনি কি করবেন? "একটি পূর্ণ রোলব্যাক করুন" মানদণ্ড কী কী? এবং কীভাবে আপনি এই রোলব্যাক করবেন (বিপরীত সংযোগের স্ট্রিং পরিবর্তন হয়, ফিরে সেটিংস পরিবর্তন করতে হবে, পুরানো সংস্করণে ফিরে যেতে হবে, যদি স্থানে থাকে তবে পুনরায় ইনস্টল করুন, স্থানান্তরিত হলে পুরানো সার্ভারের দিকে ফিরে যান) ইত্যাদি)

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

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

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


14

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

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

আমি কেবল খারাপ পরিস্থিতি অনুমান করব। আপনি জায়গা আপগ্রেড করুন এবং এটি খারাপভাবে ব্যর্থ। এরপরে আপনাকে আপনার আরটিও এবং আরসিওর মধ্যে এটি থেকে পুনরুদ্ধার করতে হবে। ব্যবসা কি ঝুঁকিগুলি বুঝতে পারে এবং এটি হ্রাস করার জন্য আপনার কি পরিকল্পনা আছে?

যদি ব্যবসাটি এটির সাথে ঠিক না থাকে তবে এটি করবেন না আমার পরামর্শ be


2

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


1
কেবলমাত্র স্টোরেজটি ভার্চুয়ালাইজড এবং স্ন্যাপশটের অংশ হলে।
স্টোরেজটি

1

একটি বড় হার্ডওয়্যার বিনিয়োগের কারণে, বর্তমান এসকিউএল সার্ভার সংস্করণ (2012, 3 সার্ভার, 22 টি উদাহরণ, ~ 300 ডাটাবেস) রাখার সময় আমাদের কেবল ওএস আপগ্রেড করতে হয়েছিল। মিররিং ইত্যাদির মতো জটিল কোনও সেটআপ নেই

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

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

তাহলে এখানে আমাদের জন্য কাজ করা পদক্ষেপগুলি ছিল:

1) সার্ভার স্তরের সেটিংসের নোট নিন যা 12 (সার্ভার রোলস) এবং 18 থেকে 23 পদক্ষেপে পুনরুদ্ধার করা হবে।

2) এসকিউএল সার্ভার 2012 কে এসপি 3 তে প্যাচ করুন (আমরা কোনও সিস্টেমের ডিবিএস পুনরুদ্ধার করতে চাইলে ধারাবাহিকতা প্রয়োজন)।

3) প্রতিটি উদাহরণে সংস্করণ মেলে যাচাই করুন। "@@ সংস্করণ নির্বাচন করুন"

4) এই স্ক্রিপ্টটি চালিয়ে এই 6 টি স্ক্রিপ্ট তৈরি করুন। রেডগেট এসকিউএল মাল্টিস্ক্রিপ্ট একটি বিশাল টাইমসেভার হয় যদি অনেকগুলি উদাহরণ থাকে (সরঞ্জামগুলি>> বিকল্পগুলি => লাইন দৈর্ঘ্য সর্বাধিক (8192) এবং তারপরে পাঠ্য আউটপুট ব্যবহার করুন) just

  • ব্যাকআপ
  • প্রত্যর্পণ করা
  • বিচ্ছিন্ন করা
  • জোড়া
  • লগইনগুলি পুনরুদ্ধার করুন
  • ব্যবহারকারীদের লগইনগুলিতে পুনরায় সংযোগ দিন

    -- (1) BACKUP / (2) RESTORE
    --    
    --*** SET THESE to external drive location
    --*** and create the Destination Directories
    declare 
        @backupInstanceDir  varchar(300) = 'F:\ExternalDriveBackups\' + replace(@@servername, '\', '_'),
        @dateSuffix         varchar(100) = '2015-12-14'; 
    
    if (object_id('tempdb..DatabaseStatus') is not null)
    drop table #DAtabseSTatus;
    
    select 
        d.name DbName, 
        d.state_desc DbState,
        d.user_access_desc UserMode,
        convert(bit, (d.is_read_only * -1 + 1)) as IsWritable,
        d.is_trustworthy_on as IsTrustWorthy,
        d.is_in_standby IsInStandby,
        d.recovery_model_desc RecoveryModel,
        suser_sname(d.owner_sid) as Owner,
        convert(bit, 
            case when d.database_id <= 4 or d.is_distributor = 1
                then 1
                else 0
            end) as IsSystemDb,
        mf.type_desc as FileType,
        mf.name FileName,
        mf.state FileState,
        mf.state_desc FileStatDesc,
        mf.physical_name PhysicalName,
        mf.type as FileTypeId    
    into #DatabaseStatus
    from
        sys.master_files AS mf
    join sys.databases AS d
    ON  mf.database_id = d.database_id
    where
        1=1
    order by
        d.name,
        mf.physical_name;
    
    if object_id('tempdb..#sqlOut') is not null
        drop table #sqlOutBU
    
    if object_id('tempdb..#sqlOut') is not null
        drop table #sqlOutRE
    
    create table #sqlOutBU
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    create table #sqlOutRE
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOutBU select char(10) + '-- BACKUP SCRIPT' + char(10);
    insert into #sqlOutRE select char(10) + '-- RESTORE SCRIPT' + char(10);
    
    
    insert into #sqlOutBU select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    insert into #sqlOutRE select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';        
    
    PRINT '--Script for Backing up all DBs in a SQL Server Instance to a specific location' 
    
    SET nocount ON 
    
    insert into #sqlOutBU select char(10) + 
    '--' + char(10) + '-- BACKUP ' + @@servername + '--' + char(10) + 
    'use [Master]; set deadlock_priority high;' + char(10);
    
    insert into #sqlOutRE select '
    -- RESTORE
    --
    -- BE SURE TO BACKUP SYSTEM DBS TO AN ALTERNATE LOCATION JUST BEFORE RESTORING!
    --
    use [Master]; set deadlock_priority high;' + char(10);
    
    DECLARE @dbname nvarchar(128) 
    declare dblist_cursor cursor fast_forward for 
    select [name] from master.sys.databases where [name] != 'tempdb'
    order by iif(database_id <= 4, '0', '1') + [name]
    
    open dblist_cursor 
    fetch next from dblist_cursor into @dbname 
    
    while @@fetch_status = 0 
    begin 
    
        declare @bak nvarchar(300) = @backupInstanceDir + '\' + @dbname + '_' + @dateSuffix + '.bak';
    
        insert into #sqlOutBU select char(10) + 'backup database [' + @dbname + '] to disk = ''' + @bak + ''' WITH COPY_ONLY, NOFORMAT, NOINIT, ' + char(10) + 
            'NAME = N''' + @dbName + '-Full'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 25;';
    
        insert into #sqlOutRE select 'restore database [' + @dbName + '] from disk = ''' + @bak + ''' WITH FILE = 1,' + char(10) +
        (
            select '    move ''' + FileName + ''' to ''' + PhysicalName + '''' From #DatabaseStatus
            where FileType = 'Rows' and DbName = @dbName
        ) + ',' + char(10) +
        (
            select '    move ''' + FileName + ''' to ''' + PhysicalName + '''' From #DatabaseStatus
            where FileType = 'Log' and DbName = @dbName
        ) + ',' + char(10) +
        '    NOUNLOAD, REPLACE, STATS = 25;' + char(10);               
    
        fetch next from dblist_cursor into @dbname 
    end 
    
    close dblist_cursor 
    deallocate dblist_cursor 
    
    insert into #sqlOutBU select char(10) + 'go' + char(10);
    insert into #sqlOutRE select char(10) + 'go' + char(10);
    
    select Command from #sqlOutBU order by Row; -- BACKUP SCRIPT
    select Command from #sqlOutRE order by Row; -- RESTORE SCRIPT
    
    go
    
    
    
    --
    -- (3) DETACH  -  Org Author: Artemakis Artemiou
    --      
    
    if object_id('tempdb..#sqlOutDT') is not null
        drop table #sqlOutDT
    
    create table #sqlOutDT
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOutDT select char(10) + '-- DETACH all DBs from a SQL Server Instance' + char(10);      
    
    insert into #sqlOutDT select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    SET nocount ON 
    
    insert into #sqlOutDT select char(10) + '--' + char(10) + '-- DETACH ' + @@servername + char(10) + '--' + char(10) + '
    use MAster; set deadlock_priority high;' + char(10) + char(10);
    
    DECLARE @dbname nvarchar(128) 
    DECLARE dblist_cursor CURSOR fast_forward FOR 
    SELECT [name] 
    FROM   master.sys.databases 
    WHERE  database_id > 4 
    
    OPEN dblist_cursor 
    FETCH next FROM dblist_cursor INTO @dbname 
    
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        insert into #sqlOutDT select
        'alter database ' + @dbname + ' set single_user with rollback immediate;' + char(10) +
        'EXEC sp_detach_db ''' + @dbname + ''', ''true'';' + char(10);
        FETCH next FROM dblist_cursor INTO @dbname 
    END 
    
    CLOSE dblist_cursor 
    DEALLOCATE dblist_cursor 
    
    insert into #sqlOutDT select char(10) + 'go' + char(10);
    select Command from #sqlOutDT order by Row;
    
    go
    
    
    
    --
    -- (4) ATTACH  -  Org Author: Artemakis Artemiou
    --    
    
    if object_id('tempdb..#sqlOut') is not null
        drop table #sqlOutAT
    
    create table #sqlOutAT
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOutAT select char(10) + '-- ATTACH ALL DBs to a SQL Server Instance' + char(10);
    
    insert into #sqlOutAT select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    SET NOCOUNT ON
    
    insert into #sqlOutAT select char(10) + '--' + char(10) + '-- ATTACH ' + @@servername + char(10) + '--' + char(10) + 
    'use MAster;' + char(10) + char(10);
    
    DECLARE @dbname nvarchar(128);
    
    DECLARE DBList_cursor CURSOR fast_forward FOR 
    select [name] from master.sys.databases where database_id > 4
    order by name;
    
    OPEN DBList_cursor
    
    FETCH NEXT FROM DBList_cursor 
    INTO @dbname
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    declare @attach_TSQL_script varchar(max)
    set @attach_TSQL_script=''
    set @attach_TSQL_script=@attach_TSQL_script+'CREATE DATABASE ' + @dbname +' ON ' 
    
    declare @tsql varchar(max),@filename varchar(max)
    set @tsql='DECLARE DBFiles_cursor CURSOR FOR select [filename] from '+ @dbname + '.sys.sysfiles'
    
    execute (@tsql) 
    
    PRINT '--'+@dbname 
    
    OPEN DBFiles_cursor
    FETCH NEXT FROM DBFiles_cursor INTO @filename
    
    WHILE @@FETCH_STATUS = 0
    BEGIN   
    set @attach_TSQL_script=@attach_TSQL_script+ char(10)+'    (FILENAME = '''+ @filename +'''),' 
    FETCH NEXT FROM DBFiles_cursor INTO @filename
    END
    
    set @attach_TSQL_script=SUBSTRING(@attach_TSQL_script,0,len(@attach_TSQL_script))
    set @attach_TSQL_script=@attach_TSQL_script+ char(10) +'    FOR ATTACH;';
    
    insert into #sqlOutAT select @attach_TSQL_script + char(10);
    
    PRINT @attach_TSQL_script 
    PRINT ''
    
    CLOSE DBFiles_cursor
    DEALLOCATE DBFiles_cursor
    
    FETCH NEXT FROM DBList_cursor 
    INTO @dbname
    
    END 
    
    CLOSE DBList_cursor
    DEALLOCATE DBList_cursor
    
    insert into #sqlOutAT select char(10) + 'go' + char(10);
    select Command from #sqlOutAT order by Row;
    go
    
    
    
    --
    -- (5) GENERATE A 'RE-CREATE LOGINS' SCRIPT
    --
    -- This script was modified from a version that was designed to copy from one server to another:
    --      http://stackoverflow.com/a/5983773/538763
    --
    
    
    USE [master]
    
    if object_id('tempdb..#sqlOut') is not null
    drop table #sqlOut;
    
    create table #sqlOut
    (
    Command nvarchar(max) not null,
    Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOut select char(10) + '-- RECREATE LOGINS' + char(10);
    
    
    insert into #sqlOut select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    insert into #sqlOut select 'use Master;' + char(10);
    go
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    declare @Debug bit = 0;
    declare @PartnerServer varchar(100) = @@SERVICENAME;  -- use current server before it is shutdown (disabled below)
    
    declare
        @MaxID int,
        @CurrID int,
        @SQL nvarchar(max),
        @LoginName sysname,
        @IsDisabled int,
        @Type char(1),
        @SID varbinary(85),
        @SIDString nvarchar(100),
        @PasswordHash varbinary(256),
        @PasswordHashString nvarchar(300),
        @RoleName sysname,
        @Machine sysname,
        @PermState nvarchar(60),
        @PermName sysname,
        @Class tinyint,
        @MajorID int,
        @ErrNumber int,
        @ErrSeverity int,
        @ErrState int,
        @ErrProcedure sysname,
        @ErrLine int,
        @ErrMsg nvarchar(2048);
    
    declare @Logins Table (LoginID int identity(1, 1) not null primary key,
                        [Name] sysname not null,
                        [SID] varbinary(85) not null,
                        IsDisabled int not null,
                        [Type] char(1) not null,
                        PasswordHash varbinary(256) null)
    declare @Roles Table (RoleID int identity(1, 1) not null primary key,
                    RoleName sysname not null,
                    LoginName sysname not null)
    declare @Perms Table (PermID int identity(1, 1) not null primary key,
                    LoginName sysname not null,
                    PermState nvarchar(60) not null,
                    PermName sysname not null,
                    Class tinyint not null,
                    ClassDesc nvarchar(60) not null,
                    MajorID int not null,
                    SubLoginName sysname null,
                    SubEndPointName sysname null)
    
    Set NoCount On;
    
    If CharIndex('\', @PartnerServer) > 0
    Begin
    Set @Machine = LEFT(@PartnerServer, CharIndex('\', @PartnerServer) - 1);
    End
    Else
    Begin
    Set @Machine = @PartnerServer;
    End
    
    -- Get all Windows logins from principal server
    Set @SQL = 'Select P.name, P.sid, P.is_disabled, P.type, L.password_hash' + CHAR(10) +
        'From ' /*+ QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.server_principals P' + CHAR(10) +
        'Left Join '/* + QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.sql_logins L On L.principal_id = P.principal_id' + CHAR(10) +
        'Where P.type In (''U'', ''G'', ''S'')' + CHAR(10) +
        'And P.name <> ''sa''' + CHAR(10) +
        'And P.name Not Like ''##%''' + CHAR(10) +
        'and P.Name Not like ''NT SERVICE%''' + CHAR(10) +
        'And CharIndex(''' + @Machine + '\'', P.name) = 0;';
    
    Insert Into @Logins (Name, SID, IsDisabled, Type, PasswordHash)
    Exec sp_executesql @SQL;
    
    -- Get all roles from principal server
    Set @SQL = 'Select RoleP.name, LoginP.name' + CHAR(10) +
        'From '/* + QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.server_role_members RM' + CHAR(10) +
        'Inner Join '/* + QUOTENAME(@PartnerServer) + .*/ +'master.sys.server_principals RoleP' +
        CHAR(10) + char(9) + 'On RoleP.principal_id = RM.role_principal_id' + CHAR(10) +
        'Inner Join '/* + QUOTENAME(@PartnerServer) + '.*/ + 'master.sys.server_principals LoginP' +
        CHAR(10) + char(9) + 'On LoginP.principal_id = RM.member_principal_id' + CHAR(10) +
        'Where LoginP.type In (''U'', ''G'', ''S'')' + CHAR(10) +
        'And LoginP.name <> ''sa''' + CHAR(10) +
        'And LoginP.name Not Like ''##%''' + CHAR(10) +
        'And LoginP.name Not Like ''NT SERVICE%''' + CHAR(10) +
        'And RoleP.type = ''R''' + CHAR(10) +
        'And CharIndex(''' + @Machine + '\'', LoginP.name) = 0;';
    
    Insert Into @Roles (RoleName, LoginName)
    Exec sp_executesql @SQL;
    
    -- Get all explicitly granted permissions
    Set @SQL = 'Select P.name Collate database_default,' + CHAR(10) +
        '   SP.state_desc, SP.permission_name, SP.class, SP.class_desc, SP.major_id,' + CHAR(10) +
        '   SubP.name Collate database_default,' + CHAR(10) +
        '   SubEP.name Collate database_default' + CHAR(10) +
        'From '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.server_principals P' + CHAR(10) +
        'Inner Join '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.server_permissions SP' + CHAR(10) +
        CHAR(9) + 'On SP.grantee_principal_id = P.principal_id' + CHAR(10) +
        'Left Join '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.server_principals SubP' + CHAR(10) +
        CHAR(9) + 'On SubP.principal_id = SP.major_id And SP.class = 101' + CHAR(10) +
        'Left Join '/* + QUOTENAME(@PartnerServer) + '.*/ + ' master.sys.endpoints SubEP' + CHAR(10) +
        CHAR(9) + 'On SubEP.endpoint_id = SP.major_id And SP.class = 105' + CHAR(10) +
        'Where P.type In (''U'', ''G'', ''S'')' + CHAR(10) +
        'And P.name <> ''sa''' + CHAR(10) +
        'And P.name Not Like ''##%''' + CHAR(10) +
        'And P.name Not Like ''NT SERVICE%''' + CHAR(10) +
        'And CharIndex(''' + @Machine + '\'', P.name) = 0;'
    
    Insert Into @Perms (LoginName, PermState, PermName, Class, ClassDesc, MajorID, SubLoginName, SubEndPointName)
    Exec sp_executesql @SQL;
    
    --select * from @Logins;
    --select * from @Roles;
    --select * from @perms;
    
    
    Select @MaxID = Max(LoginID), @CurrID = 1
    From @Logins;
    
    While @CurrID <= @MaxID
    Begin
    Select @LoginName = Name,
        @IsDisabled = IsDisabled,
        @Type = [Type],
        @SID = [SID],
        @PasswordHash = PasswordHash
    From @Logins
    Where LoginID = @CurrID;
    
    --    If Not Exists (Select 1 From sys.server_principals
    --              Where name = @LoginName)
    Begin
    
        set @sql = char(10);
        set @sql += 'If Not Exists (Select 1 From sys.server_principals Where name = ''' + @LoginName + ''')' + char(10);
        set @sql += 'begin' + char(10) + '    ';
    
        Set @SQL += 'Create Login ' + quotename(@LoginName)
        If @Type In ('U', 'G')
        Begin
            Set @SQL = @SQL + ' From Windows;'
        End
        Else
        Begin
            Set @PasswordHashString = '0x' +
                Cast('' As XML).value('xs:hexBinary(sql:variable("@PasswordHash"))', 'nvarchar(300)');
    
            Set @SQL = @SQL + ' With Password = ' + @PasswordHashString + ' HASHED;  --, ';
    
            Set @SIDString = '0x' +
                Cast('' As XML).value('xs:hexBinary(sql:variable("@SID"))', 'nvarchar(100)');
            Set @SQL = @SQL + 'SID = ' + @SIDString + ';' + char(10);
        End
    
        set @sql += char(10) +
            '    print ''Created Login ' + @loginName  + ''';' + char(10) +
            'end' + char(10) +
            'else' + char(10) +
            convert(nvarchar(max), '    print ''Login ' + @loginName + ' already existed. '';') + char(10);
    
        If @Debug = 0
        insert into #sqlOut select @SQL;                      
        Else
        Print @SQL;
    
        If @IsDisabled = 1
        Begin
            Set @SQL = 'Alter Login ' + quotename(@LoginName) + ' Disable;'
            If @Debug = 0
                insert into #sqlOut select @SQL;                              
            Else              
                Print @SQL;              
        End
        End
    Set @CurrID = @CurrID + 1;
    End
    
    
    insert into #sqlOut select char(10) + 'use Master;' + char(10);
    
    Select @MaxID = Max(RoleID), @CurrID = 1
    From @Roles;
    
    While @CurrID <= @MaxID
    Begin
    Select @LoginName = LoginName,
        @RoleName = RoleName
    From @Roles
    Where RoleID = @CurrID;
    
    /*  If Not Exists (Select 1 From sys.server_role_members RM
                Inner Join sys.server_principals RoleP
                    On RoleP.principal_id = RM.role_principal_id
                Inner Join sys.server_principals LoginP
                    On LoginP.principal_id = RM.member_principal_id
                Where LoginP.type In ('U', 'G', 'S')
                And RoleP.type = 'R'
                And RoleP.name = @RoleName
                And LoginP.name = @LoginName)*/
    Begin
        If @Debug = 0
        Begin          
            insert into #sqlOut select 'Exec sp_addsrvrolemember @rolename = ''' + @RoleName + ''', @loginame = ''' + @LoginName + ''';';
        End
        Else
        Begin
            Print 'Exec sp_addsrvrolemember @rolename = ''' + @RoleName + ''',';
            Print '     @loginame = ''' + @LoginName + ''';';
        End
    End
    
    Set @CurrID = @CurrID + 1;
    End
    
    
    insert into #sqlOut select char(10) + 'use Master;' + char(10);
    
    
    Select @MaxID = Max(PermID), @CurrID = 1
    From @Perms;
    
    While @CurrID <= @MaxID
    Begin
    Select @PermState = PermState,
        @PermName = PermName,
        @Class = Class,
        @LoginName = LoginName,
        @MajorID = MajorID,
        @SQL = PermState + space(1) + PermName + SPACE(1) +
            Case Class When 101 Then 'On Login::' + QUOTENAME(SubLoginName)
                    When 105 Then 'On ' + ClassDesc + '::' + QUOTENAME(SubEndPointName)
                    Else '' End +
            ' To ' + QUOTENAME(LoginName) + ';'
    From @Perms
    Where PermID = @CurrID;
    
    /*If Not Exists (Select 1 From sys.server_principals P
                Inner Join sys.server_permissions SP On SP.grantee_principal_id = P.principal_id
                Where SP.state_desc = @PermState
                And SP.permission_name = @PermName
                And SP.class = @Class
                And P.name = @LoginName
                And SP.major_id = @MajorID)*/
    Begin
        If @Debug = 0
                insert into #sqlOut select @sql;                      
        Else          
            Print @SQL;          
    End
    
    Set @CurrID = @CurrID + 1;
    End
    
    
    select Command from #sqlOut as SqlOut order by Row;
    go
    
    
    --
    -- (6) Generate a script to Re-link all users to logins based on current state (before shutdown)
    --
    
    use Master;
    
    if object_id('tempdb..#sqlOut') is not null
    drop table #sqlOut;
    
    create table #sqlOut
    (
        Command nvarchar(max) not null,
        Row int identity(1,1) not null primary key
    );
    
    insert into #sqlOut select char(10) + '-- RELINK USERS TO LOGINS' + char(10);
    
    insert into #sqlOut select char(10) + char(10) + '/* ---------------------------------------------------------------------------------------------' + char(10) + 
    'ServerName: ' + @@servername + char(10) + 'ServiceName: ' + @@servicename + char(10) + 'Version: ' + @@version + 
    '--------------------------------------------------------------------------------------------- */';
    
    declare @dbCmd varchar(8000) = '
    use ?;
    
    insert into #sqlOut select char(10) + ''use ?;'' + char(10);  
    
    with links as
    (
    select u.name as UserName,
        l.loginname as LoginName
        from sysusers u 
        join master..syslogins l
        on u.sid = l.sid        
    where u.name != ''dbo''
        and u.isSqlUser = 1 or l.isNtName = 1 or l.isNtGroup = 1
    )
    insert into #sqlOut 
    select ''alter user ['' + UserName + ''] with name = ['' + UserName + ''], login = ['' + LoginName + '']''
    from links
    ';    
    
    exec sp_MSforeachdb @dbCmd;
    
    select Command from #sqlOut order by Row;
    
    go

5) বাইরের ড্রাইভে সিস্টেম (মাস্টার, এমএসডিবি, মডেল) সহ সমস্ত ডিবি ব্যাকআপ করতে স্ক্রিপ্ট চালান।

)) সমস্ত ডিবি আলাদা করতে স্ক্রিপ্ট চালান

7) সি ড্রাইভ পুনরায় ফর্ম্যাট করা হবে। এলডিএফ / এমডিএফ সংরক্ষণ করুন যদি তারা সি তে না থাকে

8) উইন্ডোজ সার্ভার 2012 সি তে ইনস্টল করা আছে

9) সিডি ড্রাইভে না থাকলে মূল সিস্টেম ফাইলগুলির জন্য এলডিএফ / এমডিএফ সরান।

10) এসকিউএল সার্ভার 2012 পুনরায় ইনস্টল করা হবে এবং এসপি 3 এ প্যাচ করা হবে। সিস্টেম ব্যবহারকারী / গোষ্ঠী অ্যাকাউন্টগুলি পুনরায় তৈরি করুন

১১) নতুন অবস্থান বা ফাইলের নামটিতে ব্যাকআপ সিস্টেমের ডিবি (মূলগুলি ওভাররাইট না করার জন্য সাবধান!)।

12) পুনরায় তৈরি করুন ভূমিকা স্নিপেট। কিছুটা এইরকম:

USE [master]
CREATE SERVER ROLE [SomeServerRole]
--ALTER SERVER ROLE [dbcreator] ADD MEMBER [SomeServerRole]
--ALTER SERVER ROLE [bulkadmin] ADD MEMBER [SomeServerRole]
-- ALTER SERVER ROLE [SomeServerRole] ADD MEMBER [SomeMemberOrRole]

১৩) পুনরায় তৈরি করুন লগইন স্ক্রিপ্ট চালান (লগইনগুলি পুনরুদ্ধার করা থাকলে কিছুই করেনা)

14) এসকিউএল এজেন্ট বন্ধ করুন।

(এখানে মাস্টার পুনরুদ্ধার করতে পারলাম, আমরা ছানা ছাড়লাম)।

15) উপর থেকে স্ক্রিপ্ট ব্যবহার করে mdf / ldf সংযুক্ত করুন। ক। যদি ব্যর্থ হয় ম্যানুয়ালি বেক থেকে উপরের স্ক্রিপ্ট ব্যবহার করে পুনরুদ্ধার।

16) মডেল পুনরুদ্ধার প্রচেষ্টা

17) এসকিউএল এজেন্ট বন্ধ হয়েছে তা নিশ্চিত করুন। এমএসডিবি পুনরুদ্ধার করুন (লিঙ্ক) ক। যদি ব্যর্থ হয় তবে চাকরী + রক্ষণাবেক্ষণ পরিকল্পনা + মেল কনফিগারেশন + অপারেটরগুলি পুনরায় তৈরি করা দরকার

18) স্ক্রিপ্ট লগইন করতে ব্যবহারকারী খুলুন ...

    a. If there are master users (rare?) then First Re-Create users for master since it was not restored:
        use master;       
        CREATE USER [ABC] FOR LOGIN [machine\ABC]

    b. Run the rest of the script

১৯) সার্ভিস ব্রোকারকে মূল মান নির্বাচন করুন, নির্বাচন করুন_সেট.ডাটাবেসগুলি থেকে ব্রোকার_ইনবেলড;

    alter database MSDB set single_user with rollback immediate;
    ALTER DATABASE [MSDB] SET ENABLE_BROKER;
    alter database MSDB set multi_user;

20) এসকিউএল এজেন্ট শুরু করুন

21) মূল মানের সমান্তরালতা প্রান্তিক সেট করুন

22) যে কোনও ডাটাবেস সেটিংসকে তাদের মূল মানগুলিতে সামঞ্জস্য করুন:

 declare @dbCmd varchar(8000) = '
      use ?;
      if db_name() not in (''master'', ''model'', ''tempdb'', ''msdb'')
      begin
             print ''Adjusting [?]...'';    
            alter database [?] set single_user with rollback immediate;
             aLTER AUTHORIZATION ON DATABASE::[?] to [sa];
            -- alter database [?] set trustworthy on;
            ALTER DATABASE [?] SET AUTO_CLOSE OFF WITH NO_WAIT;     
            alter database [?] set multi_user;
      end     
      else
             print ''Skipping [?]...'';
    ';    

    exec sp_MSforeachdb @dbCmd;

23) কাজের মালিকানা পরীক্ষা করুন:

select s.name as JobName, l.name as login, SUSER_SNAME(s.owner_sid) AS login2
from  msdb..sysjobs s 
left join master.sys.syslogins l on s.owner_sid = l.sid

যদি এসকিউএল সার্ভার সংস্করণটিও আপগ্রেড করা হত তবে আমি বিশ্বাস করি না যে মডেল এবং এমএসডিবি ডাটাবেসগুলি পুনরুদ্ধার করা যেতে পারে তাই https://support.microsoft.com/en-us/kb/264474 এর কারণে চাকরিগুলি হারাতে পারত

কি অনুপস্থিত:

  • মাস্টার ডাটাবেসে অরিয়েন্টাল ব্যবহারকারীরা (বিরল?)
  • সার্ভার ভূমিকা
  • ?

0

কোনও সেটের জন্য কোনও পদ্ধতির সাথে কোনওরকম ভুল নেই - আমি উভয়ই করেছি এবং উভয় ফলাফলই সাধারণত ভাল।

মাইগ্রেশন পদ্ধতির সাথে যদি সমস্যা হয় তবে এটি প্রযুক্তিগত নয়: এটি অলসতা। খুব প্রায়ই আমি দেখতে পেলাম যে কোনও সংস্থা পুরোপুরি এক্সএক্সএক্সএক্সএক্স সংস্করণে পুরোপুরি না গেছে কারণ এটি একটি সুইং মাইগ্রেশন বেছে নিয়েছিল এবং পুরোপুরি সরাতে কঠোর পরিশ্রম করার জন্য আর কখনও ঘুরে দেখেনি। এখন তাদের পরিবর্তে একটির পরিবর্তে দুটি বা তার বেশি সেট রয়েছে।

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