ডায়নামিক এসকিউএল ব্যাকআপ কমান্ডগুলির জন্য ট্র্যাচ / ক্যাচ ব্যবহার করার সময় কীভাবে ত্রুটির বিবরণ লগ করতে হয়


10

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

এসপির মধ্যে চেষ্টা করুন / ধরুন:

    begin try
        execute sp_executesql @sql;  -- a backup command
    end try
    begin catch  
        print ERROR_MESSAGE();  -- save to log, etc.
    end catch

ফলাফল স্বরূপ

50000: usp_Backup: 117: ব্যাকআপ ডেটাবেস অস্বাভাবিকভাবে শেষ করছে।

Wheareas কাঁচা কমান্ড জারি:

    backup DATABASE someDb to disk...

উন্নত বিশদে ফলাফল:

অনুসন্ধানের ত্রুটি - এসকিউএল সার্ভার ডেটাবেস ত্রুটি: "এইচ: \ ফোল্ডারনাম \ ফাইলের নাম.বাক:" 112 ফাইলটিতে একটি পুনরুদ্ধারযোগ্য I / O ত্রুটি ঘটেছে: "112 (ডিস্কে পর্যাপ্ত স্থান নেই))।

সঞ্চিত প্রক্রিয়াটির মধ্যে এই বিবরণগুলি ভেরিয়েবলগুলিতে ধরার কোনও উপায় আছে (লগ ইন করতে, কলিকের কাছে ফিরে যেতে, আবার যুক্তির চেষ্টা করার জন্য)? মনে হচ্ছে বিশদটি মেসেজ চ্যানেলে আসছে তবে আমি চাই এসপিগুলির মধ্যে সেগুলি পাওয়া যায়।


: আপনি এই দেখতে চাইবেন stackoverflow.com/questions/5966670/...
8kb

উত্তর:


13

যখন BACKUP DATABASEত্রুটি উত্পন্ন হয়, এটি আসলে দুটি উত্পন্ন করে। দুর্ভাগ্যক্রমে TRY/CATCHপ্রথম ত্রুটি ক্যাপচার করতে সক্ষম নয়; এটি কেবল দ্বিতীয় ত্রুটি ক্যাপচার করে।

আমি আপনার সেরা বাজি আসল কারণ ক্যাপচার পিছনে একটি ব্যর্থ ব্যাকআপ মাধ্যমে আপনার ব্যাকআপ স্বয়ংক্রিয় হয় সন্দেহ SQLCMD (সঙ্গে -oএকটি ফাইল আউটপুট পাঠাতে), SSIS, সি #, PowerShell ইত্যাদি সমস্ত যা আপনার অনেক বেশি নিয়ন্ত্রণ ধরে রাখার তুলে দেব সব ত্রুটি।

মন্তব্যে এসও উত্তরটি ব্যবহারের পরামর্শ দেয় DBCC OUTPUTBUFFER- এটি সম্ভব হওয়ার পরেও এটিকে মোটেই বাচ্চাদের খেলার মতো মনে হয় না। এরল্যান্ড سومমারস্কোগের সাইট থেকে এই পদ্ধতিটি নিয়ে নির্দ্বিধায় মজা পান তবে এটি এখনও মিলবে না বলে মনে হয় TRY/CATCH

আমি কেবল ত্রুটি বার্তাটি ক্যাপচার করতে সক্ষম হলাম বলে মনে spGET_LastErrorMessageহ'ল আসল ত্রুটিটি যদি ফেলে দেওয়া হয়। আপনি যদি এটিকে একটি TRY/CATCHমুড়ে রাখেন ত্রুটিটি গ্রাস হয়ে যায় এবং সঞ্চিত পদ্ধতিটি কিছুই করে না:

BEGIN TRY
  EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
  EXEC dbo.spGet_LastErrorMessage;
END CATCH

এসকিউএল সার্ভার <2012 এ আপনি নিজেই ত্রুটিটি পুনরায় উত্থাপন করতে পারবেন না তবে আপনি এসকিউএল সার্ভার 2012 এবং আরও নতুন করতে পারবেন। সুতরাং এই দুটি ভিন্নতা কাজ করে:

CREATE PROCEDURE dbo.dothebackup
AS
BEGIN
  SET NOCOUNT ON;
  EXEC sp_executesql N'backup that fails...';
END
GO

EXEC dbo.dothebackup;
EXEC dbo.spGET_LastErrorMessage;

বা 2012 এবং তারও বেশি ক্ষেত্রে, এটি কাজ করে, তবে TRY/CATCHমূল ত্রুটিটি এখনও ছুঁড়ে দেওয়া থেকে, এর উদ্দেশ্যকে বড় পরিমাণে পরাস্ত করে :

CREATE PROCEDURE dbo.dothebackup2
AS
BEGIN
  SET NOCOUNT ON;
  BEGIN TRY
    EXEC sp_executesql N'backup that fails...';
  END TRY
  BEGIN CATCH
    THROW;
  END CATCH
END
GO

EXEC dbo.dothebackup2;
EXEC dbo.spGET_LastErrorMessage;

এই উভয় ক্ষেত্রেই ত্রুটিটি অবশ্যই ক্লায়েন্টের কাছে ফেলে দেওয়া হয়। সুতরাং যদি আপনি এটি TRY/CATCHএড়াতে ব্যবহার করেন তবে যদি এমন কিছু ফাঁক না হয় যার বিষয়ে আমি ভাবছি না, তবে আমি ভয় করি আপনার একটি পছন্দ করতে হবে ... হয় ব্যবহারকারীকে ত্রুটি দিন এবং তার সম্পর্কে বিশদ বিবরণ ক্যাপচার করতে সক্ষম হবেন এটি, বা ত্রুটি এবং আসল কারণ উভয়ই দমন করে।


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

@ ক্রোকুসেক আমি একটি ভিন্নতার চেষ্টা করেছি এবং ফলাফলটি খালি এসে গেছে। আমি আজ এটি অন্য শট দেব।
অ্যারন বারট্র্যান্ড

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

2

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

IF OBJECT_ID('tempdb.dbo.#Results') IS NOT NULL DROP TABLE #Results
CREATE TABLE #Results (LogDate datetime,ProcessInfo nvarchar(100),LogText nvarchar(4000))
BEGIN TRY
SELECT @begintime = GETDATE()
EXEC sp_executesql @SQL --your backup statement string
INSERT #Results
EXEC  xp_readerrorlog 0, 1, N'backed up',@databasename,@begintime
SELECT @result = LogText from #Results where ProcessInfo = 'Backup' order by logdate desc
END TRY
BEGIN CATCH
INSERT #Results
EXEC  xp_readerrorlog 0, 1, N'Backup',@databasename,@begintime
SELECT @result = LogText from #Results where ProcessInfo = 'spid'+cast(@@SPID as varchar(6)) order by logdate desc
END CATCH
PRINT @result

আছে HTH


এটি কিছু সাধারণ ত্রুটির জন্য দুর্দান্ত কাজ করে তবে কিছু ত্রুটি রয়েছে যা দৃশ্যত কেবল ক্লায়েন্টের কাছে সরাসরি ফেলে দেওয়া হয়। Sp_readerrorlog লগটিতে "অ্যাপ্লিকেশন লগ" উল্লেখ করে একটি বার্তা অন্তর্ভুক্ত থাকবে, যেখানে আমি "অ্যাপ্লিকেশন" দ্বারা অনুমান করি তারা কমান্ড জারি করে এমন বাহ্যিক প্রক্রিয়া বোঝায়। এসও লিঙ্ক
ক্রোকুসেক

0

আপনি কোনও টেবিলে ত্রুটির বিবরণ লগ করতে পারেন। আপনি একটি লগ ফাইলও তৈরি করতে পারেন তবে এটি করার জন্য একটি সিএলআর বা এক্সপি_সিএমডি শেল প্রয়োজন হতে পারে। আপনি ডাটাবেস মেলও প্রেরণ করতে পারেন, তবে এটি স্প্যাম সমস্যার কারণ হতে পারে এবং এটি সঠিক লগ নয়।

টেবিলটি সবচেয়ে সহজ।

  1. ত্রুটিগুলি সংরক্ষণের জন্য একটি সারণী তৈরি করুন
  2. একটি সঞ্চিত পদ্ধতি তৈরি করুন যা ত্রুটি সারণিতে সন্নিবেশ করায়
  3. ক্যাচ ব্লকের সঞ্চিত পদ্ধতিতে কল করুন

নীচের লিঙ্কে সরবরাহ করা জেরেমি কাদলেকের উদাহরণটি দেখুন:

http://www.mssqltips.com/sqlservertip/1152/standardized-sql-server-error-handling-and-centralized-logging/


3
সমস্যাটি ত্রুটিগুলি দিয়ে কী করা উচিত তা নয়, এটি হ'ল কিছু ত্রুটির বার্তাটি সঠিকভাবে খুঁজে পাওয়া যায় না CATCH। এটি কারণ শুধুমাত্র শেষ ত্রুটি বার্তাটি ফিরে এসেছে ERROR_MESSAGE()...
অ্যারন বারট্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.