Apa yang dimaksud dengan program baris perintah atau skrip sederhana untuk membuat cadangan database server SQL?


94

Saya terlalu lalai dalam melakukan backup DB di server internal kami.

Apakah ada program baris perintah sederhana yang dapat saya gunakan untuk membuat cadangan database tertentu di SQL Server 2005? Atau apakah ada VBScript sederhana?


6
Secara pribadi, saya memiliki keberuntungan yang jauh lebih baik dengan aplikasi pesanan lemon dan utilitas instruksi jeruk. Program command lime jauh lebih merepotkan daripada nilainya.
Jim

Jawaban:


108

Untuk mencadangkan database tunggal dari baris perintah, gunakan osql atau sqlcmd .

"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" 
    -E -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"

Anda juga ingin membaca dokumentasi tentang CADANGAN dan KEMBALIKAN dan prosedur umum .


3
Ada skrip yang bagus untuk mencadangkan semua basis data pengguna sekaligus: mssqltips.com/tip.asp?tip=1070
Marnix van Valen

7
Dokumentasi mengatakan bahwa WITH FORMATmemformat media penyimpanan: " Opsi FORMAT membatalkan seluruh konten media, mengabaikan konten yang ada. " Pastikan ini yang Anda inginkan.
alexg

4
@Tjaart, Makanya saya bilang baca dokumentasinya dulu. Jika Anda tidak menggunakan WITH FORMAT dan memilih file cadangan yang ada, maka cadangan baru akan ditambahkan ke cadangan yang ada di file tersebut, yang mungkin bukan yang Anda inginkan.
Craig Trader

@Kiquenet Bzzzzzt - Itu akan menjadi produk GUI, dan oleh karena itu, bukan program atau skrip baris perintah sederhana, sesuai permintaan asli.
Craig Trader

pada instalasi saya osql.exeberada diC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

9

Saya menggunakan ExpressMaint .

Untuk mencadangkan semua database pengguna yang saya lakukan misalnya:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS

1
Meixger, saya tidak dapat menemukan satu alasan pun untuk menggunakan ExpressMaint, ketika SQLBackupAndFTP mengalahkannya dalam setiap skenario yang bisa dibayangkan

8

Jadwalkan hal berikut untuk mencadangkan semua Database:

Use Master

Declare @ToExecute VarChar(8000)

Select @ToExecute = Coalesce(@ToExecute + 'Backup Database ' + [Name] + ' To Disk =     ''D:\Backups\Databases\' + [Name]   + '.bak'' With Format;' + char(13),'')
From
Master..Sysdatabases
Where
[Name] Not In ('tempdb')
and databasepropertyex ([Name],'Status') = 'online'

Execute(@ToExecute)

Ada juga detail lebih lanjut di blog saya: cara Mengotomatiskan Pencadangan SQL Server Express .


Bisakah Anda menjelaskan cara menjadwalkan?
Frank Krueger

Silakan baca Posting Blog saya. Ini merinci semua yang perlu Anda ketahui.
GateKiller

Saya pikir pertanyaannya menanyakan sesuatu yang berjalan di luar SQL Server.
bzlm

@bzlm, Seperti yang saya katakan. Blog saya memiliki detail tentang cara melakukan ini di luar SQL Server :)
GateKiller

1
@GateKiller Apakah link blog Anda masih valid? Saya tidak dapat membukanya
Yash Saraiya

5

Saya menemukan ini di halaman Dukungan Microsoft http://support.microsoft.com/kb/2019698 .

Ini bekerja dengan baik! Dan karena ini berasal dari Microsoft, saya merasa ini cukup sah.

Pada dasarnya ada dua langkah.

  1. Buat prosedur tersimpan di master db Anda. Lihat tautan msft atau jika rusak coba di sini: http://pastebin.com/svRLkqnq
  2. Jadwalkan pencadangan dari penjadwal tugas Anda. Anda mungkin ingin memasukkan file .bat atau .cmd terlebih dahulu dan kemudian menjadwalkan file itu.

    sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'"  1>c:\SQL_Backup\backup.log            

Jelas ganti YOUR_SERVER_NAME dengan nama komputer Anda atau secara opsional coba. \ SQLEXPRESS dan pastikan folder cadangan ada. Dalam hal ini mencoba untuk meletakkannya di c: \ SQL_Backup


1
Untuk apa nilainya, saya akhirnya menggunakan metode di atas sesuai dengan hal-hal dari ola.hallengren.com yang menurut saya sangat dihormati di antara komunitas dba. Ini bekerja seperti pesona.
John W.

5

Anda dapat menggunakan aplikasi backup oleh ApexSQL. Meskipun ini adalah aplikasi GUI, semua fiturnya didukung di CLI. Dimungkinkan untuk melakukan operasi pencadangan satu kali, atau membuat pekerjaan yang akan mencadangkan database tertentu secara teratur. Anda dapat memeriksa aturan sakelar dan dicontohkan di artikel:


4

Saya menggunakan tsql pada infrastruktur Linux / UNIX untuk mengakses database MSSQL. Berikut ini skrip shell sederhana untuk membuang tabel ke file:

#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}

3

Akhirnya jika Anda tidak memiliki koneksi tepercaya seperti yang dideklarasikan oleh sakelar –E

Gunakan baris perintah berikut

"[program dir]\[sql server version]\Tools\Binn\osql.exe" -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak'" -S [server] –U [login id] -P [password]

Dimana

[program dir] adalah direktori tempat osql.exe berada

Pada 32bit OS c: \ Program Files \ Microsoft SQL Server \
Pada 64bit OS c: \ Program Files (x86) \ Microsoft SQL Server \

[versi server sql] server sql Anda versi 110 atau 100 atau 90 atau 80 dimulai dengan angka terbesar

[server] nama server atau ip server Anda

[login id] nama login pengguna server ms-sql Anda

[sandi] sandi login yang diperlukan


1
C:\tmpadalah jalur di server atau lokal ?
Kiquenet

cadangan selalu disimpan di disk server, jadi c: \ tmp ada di server
George Vrynios

1

Jawaban Microsoft untuk mencadangkan semua database pengguna di SQL Express ada di sini :

Prosesnya adalah: salin, tempel, dan jalankan kode mereka (lihat di bawah. Saya telah mengomentari beberapa baris aneh yang tidak diberi komentar di bagian atas) sebagai kueri di server database Anda. Itu berarti Anda harus menginstal SQL Server Management Studio terlebih dahulu (atau terhubung ke server database Anda dengan SSMS). Eksekusi kode ini akan membuat prosedur tersimpan di server database Anda.

Buat file batch untuk menjalankan prosedur yang tersimpan, kemudian gunakan Penjadwal Tugas untuk menjadwalkan proses berkala (misalnya setiap malam) dari file batch ini. Kode saya (yang berfungsi) adalah versi yang sedikit dimodifikasi dari contoh pertama mereka:

sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'" 

Ini berhasil untuk saya, dan saya menyukainya. Setiap kali Anda menjalankannya, file cadangan baru dibuat. Anda harus merancang metode untuk menghapus file cadangan lama secara rutin. Saya sudah memiliki rutinitas yang melakukan hal semacam itu, jadi saya akan menyimpan cadangan selama beberapa hari di disk (cukup lama bagi mereka untuk dicadangkan oleh rutinitas pencadangan normal saya), lalu saya akan menghapusnya. Dengan kata lain, saya akan selalu memiliki cadangan selama beberapa hari tanpa harus memulihkan dari sistem cadangan saya.

Saya akan menempelkan skrip pembuatan prosedur tersimpan Microsoft di bawah ini:

--// Copyright © Microsoft Corporation.  All Rights Reserved.
--// This code released under the terms of the
--// Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)

USE [master] 
GO 

/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


-- ============================================= 
-- Author: Microsoft 
-- Create date: 2010-02-06
-- Description: Backup Databases for SQLExpress
-- Parameter1: databaseName 
-- Parameter2: backupType F=full, D=differential, L=log
-- Parameter3: backup file location
-- =============================================

CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
            @databaseName sysname = null,
            @backupType CHAR(1),
            @backupLocation nvarchar(200) 
AS 

       SET NOCOUNT ON; 

            DECLARE @DBs TABLE
            (
                  ID int IDENTITY PRIMARY KEY,
                  DBNAME nvarchar(500)
            )

             -- Pick out only databases which are online in case ALL databases are chosen to be backed up

             -- If specific database is chosen to be backed up only pick that out from @DBs

            INSERT INTO @DBs (DBNAME)
            SELECT Name FROM master.sys.databases
            where state=0
            AND name=@DatabaseName
            OR @DatabaseName IS NULL
            ORDER BY Name


           -- Filter out databases which do not need to backed up

           IF @backupType='F'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')
                  END
            ELSE IF @backupType='D'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE IF @backupType='L'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE
                  BEGIN
                  RETURN
                  END


            -- Declare variables

            DECLARE @BackupName varchar(100)
            DECLARE @BackupFile varchar(100)
            DECLARE @DBNAME varchar(300)
            DECLARE @sqlCommand NVARCHAR(1000) 
        DECLARE @dateTime NVARCHAR(20)
            DECLARE @Loop int                  

            -- Loop through the databases one by one

            SELECT @Loop = min(ID) FROM @DBs
       WHILE @Loop IS NOT NULL
      BEGIN

-- Database Names have to be in [dbname] format since some have - or _ in their name

      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'


-- Set the current date and time n yyyyhhmmss format

      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  


-- Create backup filename in path\filename.extension format for full,diff and log backups

      IF @backupType = 'F'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'D'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'L'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'


-- Provide the backup a name for storing in the media

      IF @backupType = 'F'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime

      IF @backupType = 'D'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime

      IF @backupType = 'L'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime


-- Generate the dynamic SQL command to be executed

       IF @backupType = 'F' 
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
                  END

       IF @backupType = 'D'
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END

       IF @backupType = 'L' 
                  BEGIN
               SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END


-- Execute the generated SQL command

       EXEC(@sqlCommand)


-- Goto the next database

SELECT @Loop = min(ID) FROM @DBs where ID>@Loop


END


0
SET NOCOUNT ON;
declare @PATH VARCHAR(200)='D:\MyBackupFolder\'
 -- path where you want to take backups
IF OBJECT_ID('TEMPDB..#back') IS NOT NULL

DROP TABLE #back

CREATE TABLE #back
(
RN INT IDENTITY (1,1),
DatabaseName NVARCHAR(200)

)

INSERT INTO #back 
SELECT       'MyDatabase1'
UNION SELECT 'MyDatabase2'
UNION SELECT 'MyDatabase3'
UNION SELECT 'MyDatabase4'

-- your databases List

DECLARE @COUNT INT =0 ,  @RN INT =1, @SCRIPT NVARCHAR(MAX)='',  @DBNAME VARCHAR(200)

PRINT '---------------------FULL BACKUP SCRIPT-------------------------'+CHAR(10)
SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN

SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.bak'''+CHAR(10)+'WITH COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END

 PRINT '---------------------DIFF BACKUP SCRIPT-------------------------'+CHAR(10)

  SET  @COUNT  =0 SET  @RN  =1 SET @SCRIPT ='' SET @DBNAME =''
 SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN
SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.diff'''+CHAR(10)+'WITH DIFFERENTIAL, COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END

-10

Jika Anda dapat menemukan file DB ... "cp DBFiles backup /"

Hampir pasti tidak dianjurkan dalam banyak kasus , tetapi itu sederhana seperti semua getup.


1
JANGAN lakukan ini jika SQL Server sedang berjalan, meskipun tidak ada yang menggunakannya.
Craig Trader

6
Kemungkinan menggunakan metode ini untuk berhasil membuat cadangan dan memulihkan database sangat kecil. Ini hanya akan berfungsi JIKA, selama pencadangan dan pemulihan: tidak ada proses SQL Server yang berjalan, Anda mengidentifikasi dan menyalin SEMUA file biner yang terlibat, Anda menjalankan PERSIS versi dan tingkat patch SQL Server yang sama (dan / atau Windows). Format file cadangan dirancang untuk menjadi portabel lintas versi; file database biner TIDAK. Ini berlaku untuk SEMUA database, bukan hanya SQL Server. Jangan lakukan itu. BETULKAH. JANGAN LAKUKAN INI.
Craig Trader

Jawaban ini 98,7% adalah lelucon. OTOH jika Anda hanya akan memulihkan ke pengaturan yang sama persis (alias memulihkan / mengembalikan) dan dapat dimatikan (alias server pengembang lokal) dan mungkin beberapa hal lain ...
BCS
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.