আমি একের পরিবর্তে লঞ্চ লগগুলির একটি ব্যাচকে কীভাবে পুনরুদ্ধার করব


11

আমার একটি এসকিউএল সার্ভার ডাটাবেস রয়েছে যা প্রতি রাত্রে পুরো ব্যাকআপ সহ প্রতি 10 মিনিটে লেনদেনের ব্যাক আপ করে।

এসকিউএল ২০০ Management ম্যানেজমেন্ট স্টুডিও ব্যবহার করে আমাদের মনে হয় প্রতিটি লেনদেনের জন্য একটি করে একটি লগ নির্বাচন করতে হবে। এটি কোনও ডিরেক্টরিতে নির্দেশ করার কোনও উপায় আছে কি?

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

যদি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর আরও দ্রুততর উপায় না হয়, তবে সম্ভবত কোনও তৃতীয় পক্ষের সরঞ্জাম উপলব্ধ রয়েছে?


হ্যাঁ, সব সম্ভব হলে প্রক্রিয়া কাজ করে না করে তবে তার ভাল এসকিউএল লগিন রিকভারি টুল কাছ থেকে সাহায্য নিতে sqlserverlogexplorer.com/restore
জেসন ক্লার্ক

উত্তর:


10

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে পুনঃস্থাপনের জন্য গুচ্ছ লঞ্চ ব্যাকআপগুলি (к ফোল্ডার) নির্দিষ্ট করার কোনও উপায় নেই।

তবে আপনি এসএসকিউএল সার্ভারের ব্যাকআপ অপারেশন সম্পর্কিত সমস্ত তথ্য ডাটাবেস এমএসডিবিতে পাবেন (টেবিল ব্যাকআপসেট এবং সম্পর্কিত)।

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

DECLARE @databaseName sysname
DECLARE @backupStartDate datetime
DECLARE @backup_set_id_start INT
DECLARE @backup_set_id_end INT

-- set database to be used
SET @databaseName = '<your_database_name_here>' 

SELECT @backup_set_id_start = MAX(backup_set_id) 
FROM  msdb.dbo.backupset 
WHERE database_name = @databaseName AND type = 'D'

SELECT @backup_set_id_end = MIN(backup_set_id) 
FROM  msdb.dbo.backupset 
WHERE database_name = @databaseName AND type = 'D'
AND backup_set_id > @backup_set_id_start

IF @backup_set_id_end IS NULL SET @backup_set_id_end = 999999999

SELECT backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' FROM DISK = ''' 
               + mf.physical_device_name + ''' WITH NORECOVERY'
FROM    msdb.dbo.backupset b,
           msdb.dbo.backupmediafamily mf
WHERE    b.media_set_id = mf.media_set_id
           AND b.database_name = @databaseName
          AND b.backup_set_id = @backup_set_id_start
UNION
SELECT backup_set_id, 'RESTORE LOG ' + @databaseName + ' FROM DISK = ''' 
               + mf.physical_device_name + ''' WITH NORECOVERY'
FROM    msdb.dbo.backupset b,
           msdb.dbo.backupmediafamily mf
WHERE    b.media_set_id = mf.media_set_id
           AND b.database_name = @databaseName
          AND b.backup_set_id >= @backup_set_id_start AND b.backup_set_id < @backup_set_id_end
          AND b.type = 'L'
UNION
SELECT 999999999 AS backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' WITH RECOVERY'
ORDER BY backup_set_id

1
আপনি যদি এই স্ক্রিপ্টটি মূল সার্ভারে চালাতে পারেন তবে অন্য সার্ভারে পুনরুদ্ধার করতে চান তবে সত্যিই দুর্দান্ত কাজ করে!
realMarkusSchmidt

2
স্ক্রিপ্টটি এখান থেকে এসেছে mssqltips.com/sqlservertip/1243/…
অ্যান্ড্রু

@ সেরজি: ওয়েব থেকে আপনি যে স্ক্রিপ্টগুলি তুলেছেন সেগুলি আপনাকে গুণিত করা উচিত! : mssqltips.com/sqlservertip/1243/…
মিচ গম

4

আপনার কেবল বর্গাকার বিবৃতিগুলির একটি তালিকা প্রয়োজন যেমন ...

RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks_1.TRN' WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks_2.TRN'
GO

সুতরাং আপনি একটি ভিবি স্ক্রিপ্ট তৈরি করতে পারেন যা প্রদত্ত ফোল্ডার থেকে আপনার জন্য সহজেই এই এসকিউএল উত্পন্ন করে। এখানে একটি উদাহরণ http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/MSSQLServerAdmin/restoring-mpleple-transaction-log-backu

এটি একবার এসকিউএল তৈরি করার পরে আপনাকে কেবল এটি দেখতে ঠিক আছে তা যাচাই করে তা চালানো উচিত।


4

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

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

স্বয়ংক্রিয়ভাবে এসকিউএল সার্ভার ডাটাবেস পুনরুদ্ধার স্ক্রিপ্ট তৈরি করে


1

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

আপনি এটি একটি ফোল্ডারে দেখিয়েছেন এবং এটি সর্বাধিক সাম্প্রতিক সম্পূর্ণ ব্যাকআপ এবং পরবর্তী সমস্ত লেনদেন লগ ব্যাকআপের উপর ভিত্তি করে একটি স্ক্রিপ্ট তৈরি করে।

    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.rootfolder = "MyComputer"
    $foldername.ShowNewFolderButton = $false
    $foldername.SelectedPath = "E:\DatabaseBackups"

    if($foldername.ShowDialog() -eq "OK") {
        $backupPath = Get-Item($foldername.SelectedPath)    
        $databaseName = $backupPath.Name

        Write-Host($backupPath)
        Write-Host($databaseName)

        $transactionLogFiles = New-Object System.Collections.ArrayList;
        $outputFile = "Restore Database - Script.sql"
        $backupFile;


        foreach ($file in  get-childitem ($backupPath) | sort-object LastWriteTime -descending)
        {
            if ($file.Extension -eq '.trn')
            {
                [void]$transactionLogFiles.Add($file);
            }
            elseif ($file.Extension -eq '.bak')
            {
                $backupFile = $file;
                break;
            }
        }


        Set-Content $outputFile ""

        Add-Content $outputFile "USE master"
        Add-Content $outputFile "ALTER DATABASE $databaseName SET SINGLE_USER WITH ROLLBACK AFTER 5"
        Add-Content $outputFile "RESTORE DATABASE $databaseName FROM DISK = '$($backupFile.FullName)' WITH NORECOVERY";

        foreach ($file in $transactionLogFiles | sort-object LastWriteTime)
        {
            Add-Content $outputFile "RESTORE LOG $databaseName FROM DISK = '$($file.FullName)' WITH NORECOVERY";    
        }

        Add-Content $outputFile "RESTORE DATABASE $databaseName WITH RECOVERY";
        Add-Content $outputFile "ALTER DATABASE $databaseName SET MULTI_USER";
        Add-Content $outputFile "USE $databaseName" 

        Write-Host("Script generated at $outputFile");
        Write-Host "Press any key to continue ..."
        $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
        Invoke-Item $outputFile

    }

ধন্যবাদ! আপনি কেবলমাত্র আমার বেকনকে একটি গরম গরম আগুন থেকে বাঁচিয়েছেন ... এমএসডিবি দুর্নীতিগ্রস্থ ছিল তাই ব্যাকআপ থেকে সেটি পুনরুদ্ধার করতে হয়েছিল এবং লগ চেইনের তথ্য ছিল না। আপনার স্ক্রিপ্টটি ফাইলনামের উপর ভিত্তি করে লেনদেনের লগ পুনরুদ্ধার স্ক্রিপ্টগুলি তৈরি করে আমাকে বাঁচিয়েছে!
অগ্রণী

আপনি যদি কেবল একটি ডাটাবেস এবং সমস্ত লেনদেন লগ চান? স্ক্রিপ্টে আপনার কী পরিবর্তন দরকার?
ব্যবহারকারী 49353522

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