SQL Server 2008 Express - “En iyi” yedekleme çözümü?


20

SQL Server 2008 Express kullanırken hangi yedekleme çözümlerini önerirsiniz ? SQL Server için oldukça yeniyim, ancak MySQL arka planından geliyorum , başka bir bilgisayarda çoğaltma ayarlamayı düşündüm ve sadece bu sunucunun Xcopy yedeklerini almayı düşündüm .

Ancak ne yazık ki Express Edition'da çoğaltma kullanılamıyor.

Siteye yoğun bir şekilde erişildiğinden, gecikme ve kesinti süresi olmamalıdır. Ayrıca günde iki kez yedekleme yapmayı düşünüyorum.

Ne önerirsiniz? Kullanabileceğim birden çok bilgisayarım var, ancak Express sürümünü kullandığım için bana yardımcı olup olmadığını bilmiyorum.


Bunu yapmak için yalnızca Windows Server Yedekleme'yi kullanmayla ilgili sorun olup olmadığını bilen var mı?
James

Yanıtlar:


30

SQL Server Express 2008 veritabanı yedeklemelerini destekler. Yedeklemeleri zamanlamaya izin veren SQL Agent ve yedekleme görevleri oluşturmak için bakım planı sihirbazı eksik.

Veritabanlarını iki farklı şekilde yedekleyebilirsiniz:

  1. "Görevler" altındaki her veritabanı için sağ tıklama menüsünde Yedekleme seçeneğine sahip Microsoft SQL Server Management Studio Express kullanın .
  2. Yedek komut dosyanızı el ile yazmak için T-SQL kullanın. T-SQL BACKUP komutu için MSDN belgelerini okuyun .
    Sözdizimi gibi bir şey:BACKUP DATABASE MyDatabase TO DISK='C:\MyDatabase.bak';

Yedekleme işlerinizi zamanlamak istiyorsanız, bir T-SQL komut dosyası yazmanız ve daha sonra ilgilendiğiniz her programda komut dosyasını çalıştırmak için SQLCmd'i çağırmak için Windows Görev Zamanlamasını kullanmanız gerekir :

 sqlcmd -s server_name\sqlexpress -i C:\SqlJobs\backup.sql -o C:\Logs\output.txt

1
BACKUP sözdizimi şuna benzer: BACKUP DATABASE MyDatabase TO DISK = 'C: \ MyDatabase.bak';
Martin Marconcini

Bu bilgi için teşekkürler arkadaşlar, bunu deneyeceğim.
alexn

T-sql komut dosyasını kullanırken, db adlarınızın boşluk içermediğinden emin olun.
redknight

+1 Bir bilgi daha: -S ".\SomeInstance"sqlcmd'den giriş hataları alıyorsanız örnek adından bahsetmeyi unutmayın .
Tomalak

Yedekleme çalıştırmak için kullandığınız SQL'i eklediyseniz, geri kalanımızın aynı soruyu aramaya gelmesi yararlı olacaktır.
Ian Boyd

6

Kullandığım SQLBackupAndFTP - fantastik ve basit bir ürün.


sqlbackupandftp en iyisidir .. u istiyorsanız geri + sıkıştır + otomatik sil (belirtilen günlerden sonra)
suraj jain 15:12

Evet bunu da kullanıyorum. İyi çalışıyor.
Alan B

5

Kendimi kullanmak için yedekleme komut dosyası yazıldım, splattne tarafından metioned olarak yükleyin :

----- Version: 2.0 - 2009-12-12 - SQL 2000 Compatible
----- Pham Kim Ngan (jbngan@gmail.com)
----- Usage:
-- Copy 7za.exe (http://www.7-zip.org/download.html - Command Line Version) to @CFG_BACKUP_PATH
-- Modify @CFG_BACKUP_PATH = <Backup Store Path> - no long filename/directory please
-- Modify @CFG_DAYS_DELETE = Days to keep backups
-- Enable 'xp_cmdshell' (SQL 2005/EXPRESS or higher)

----- Configuration Variables
DECLARE @CFG_BACKUP_PATH NVARCHAR(256)
DECLARE @CFG_DAYS_DELETE INT

SET @CFG_BACKUP_PATH = 'C:\DatabaseBackup'
SET @CFG_DAYS_DELETE = 30

DECLARE @Today DATETIME
DECLARE @TodayName CHAR(8)
SET @Today = GETDATE()
SET @TodayName = CONVERT(CHAR(8), @Today, 112)

DECLARE @id INT
DECLARE @name VARCHAR(50)
DECLARE @path VARCHAR(256)
DECLARE @cmd VARCHAR(256)

----- Create Temporarity Directory
DECLARE @TempDir VARCHAR(256)
SET @TempDir = @CFG_BACKUP_PATH + '\' + CONVERT(VARCHAR(256), NEWID())
SET @cmd = 'md ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

----- List of current databases, only 'ONLINE' databases to be backup
DECLARE @dbList TABLE
    (
      dbno INT IDENTITY,
      dbname NVARCHAR(256)
    )

INSERT  INTO @dbList ( dbname )
        SELECT  name
        FROM    master.dbo.sysdatabases
        WHERE   ( name NOT IN ( 'tempdb' ) )
                AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'


------ Starting backup, one by one
SELECT  @id = dbno,
        @name = dbname
FROM    @dbList
WHERE   dbno = 1
WHILE @@ROWCOUNT = 1
    BEGIN
        PRINT N'++ Backup: ' + @name
        SET @path = @TempDir + '\' + @name + '.bak'

        BACKUP DATABASE @name TO DISK = @path

        SELECT  @id = dbno,
                @name = dbname
        FROM    @dbList
        WHERE   dbno = @id + 1
    END

PRINT N'++ Compressing: ' + @TempDir

----- Delete output file if existed
SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP'
EXEC xp_cmdshell @cmd, no_output

DECLARE @Count INT
DECLARE @StartTime DATETIME
SET @StartTime = GETDATE()
----- Compress, -mx1 = Set Compression Ratio to 1 (very low)
SET @cmd = @CFG_BACKUP_PATH + '\7za.exe a -bd -y -tzip -mx1 '
SET @cmd = @cmd + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP ' + @TempDir + '\*.bak"'
EXEC xp_cmdshell @cmd, no_output

SET @Count = DATEDIFF(second, @StartTime, GETDATE())
PRINT N'++ Compression Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'
SET @Count = DATEDIFF(second, @Today, GETDATE())
PRINT N'++ Total Execution Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'

---- Delete temporarity directory
SET @cmd = 'rd /s /q ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

---- Delete previous backup versions
DECLARE @OlderDateName CHAR(8)
SET @OlderDateName = CONVERT(CHAR(8), @Today - @CFG_DAYS_DELETE, 112)

----- List all .ZIP files
CREATE TABLE #delList
    (
      subdirectory VARCHAR(256),
      depth INT,
      [file] BIT
    )
INSERT  INTO #delList
        EXEC xp_dirtree @CFG_BACKUP_PATH, 1, 1
DELETE  #delList
WHERE   RIGHT(subdirectory, 4) <> '.ZIP'

SELECT  @Count = COUNT(1)
FROM    #delList
PRINT N'++ Number of Backups: ' + CONVERT(NVARCHAR, @Count)

SELECT TOP 1
        @name = subdirectory
FROM    #delList
WHERE   LEN(subdirectory) = 12
        AND RIGHT(subdirectory, 4) = '.ZIP'
        AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName

WHILE ( @@ROWCOUNT = 1 ) 
    BEGIN
        PRINT N'++ Delete Older Backup: ' + @name
        SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @name
        EXEC xp_cmdshell @cmd, no_output

        DELETE  #delList
        WHERE   subdirectory = @name

        SELECT TOP 1
                @name = subdirectory
        FROM    #delList
        WHERE   LEN(subdirectory) = 12
                AND RIGHT(subdirectory, 4) = '.ZIP'
                AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName
    END

DROP TABLE #delList

PRINT N'++ Done.'
PRINT ''
PRINT ''
PRINT ''

2

ExpressMaint kullanıyorum ve zamanlanmış bir görev olarak harika çalışıyor. Yaptığınız işin türü için uygun parametreleri iletmeniz yeterlidir.

Kaynak kodu da orada. Uygulama olay günlüğü açma hatasına bir girdi eklemek için biraz değiştirdik.


1

UndertheFold'un gönderisine dayanarak biraz googling yaptım ve ExpressMaint'in ayrıntılarını buldum. Bunu daha önce görmemiştim, bu yüzden bulduğum için çok memnunum.

Bilginize, web sayfası http://expressmaint.codeplex.com/

Daha sonra, her gün bir gecede çalıştırmayı planladığım bu toplu iş dosyasını oluşturmak için bulduğum örneklerden birini kullandım.

c:\expressmaint\expressmaint -S (local)\SQLExpress -D ALL_USER -T DB -R E:\backups\sqlexpress\backupreports -RU WEEKS -RV 1 -B E:\backups\sqlexpress -BU DAYS -BV 4 -V -C

Bu bir yedek alır, her yedeklemeyi ( -BU) dört gün boyunca saklar , böylece bozulma varsa bir geçmiş alırsınız. Günlükler ( -RU) bir hafta boyunca saklanır.

Sadece birkaç haftadır kullanıyorum, ancak bir el ele tutumu yaklaşımı olduğu için ondan çok memnun kaldım. Yerel olarak yedekleri ikinci bir diske koydum, daha sonra Amazon EC2 bulut depolama alanına site dışı bir yedekleme yapmak için JungleDisk'i kullanıyorum .


Expressmaint ile ilgili sorun, SQL Server 2008 R2'yi desteklememesidir. 2008 ile çalışır ve 2008'i yükleyip 2008 R2'ye yükseltirseniz çalışır, ancak veritabanlarını 2008 R2'nin yeni yüklemesinde bulamaz. Gönderilen bir yama ile bilinen bir hatadır, ancak yürütülebilir dosya yama ile güncellenmemiştir.
James

1

DBSave'i kullanabilirsiniz . MS SQL Server'ı yedeklemek ve geri yüklemek için harika bir ücretsiz araçtır. Kurulumu ve kullanımı çok basit.


0

Bir toplu iş dosyası kullanarak SQL Server hızlı veritabanı birkaç saatte bir yedeklemek için bir windows zamanlayıcı iş kullanıyorum. İyi çalışıyor gibi görünüyor.


Ayrıca, bir toplu iş dosyasının bir veritabanını nasıl yedeklediğini de belirtmelisiniz .
Ian Boyd

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.