Tôi đã quá lỏng lẻo với việc thực hiện sao lưu DB trên các máy chủ nội bộ của chúng tôi.
Có chương trình dòng lệnh đơn giản nào mà tôi có thể sử dụng để sao lưu cơ sở dữ liệu nhất định trong SQL Server 2005 không? Hay là có một VBScript đơn giản?
Tôi đã quá lỏng lẻo với việc thực hiện sao lưu DB trên các máy chủ nội bộ của chúng tôi.
Có chương trình dòng lệnh đơn giản nào mà tôi có thể sử dụng để sao lưu cơ sở dữ liệu nhất định trong SQL Server 2005 không? Hay là có một VBScript đơn giản?
Câu trả lời:
Để sao lưu một cơ sở dữ liệu từ dòng lệnh, hãy sử dụng osql hoặc 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"
Bạn cũng sẽ muốn đọc tài liệu về SAO LƯU và KHÔI PHỤC và các quy trình chung .
WITH FORMAT
định dạng phương tiện lưu trữ: " Tùy chọn FORMAT làm mất hiệu lực của toàn bộ nội dung phương tiện, bỏ qua bất kỳ nội dung hiện có nào. " Đảm bảo đây là những gì bạn muốn.
osql.exe
đã ởC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Tôi sử dụng ExpressMaint .
Để sao lưu tất cả cơ sở dữ liệu người dùng, tôi làm ví dụ:
C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Lập lịch trình sau đây để sao lưu tất cả Cơ sở dữ liệu:
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)
Ngoài ra còn có nhiều chi tiết hơn trên blog của tôi: cách Tự động hóa sao lưu SQL Server Express .
Tôi tìm thấy điều này trên trang Hỗ trợ của Microsoft http://support.microsoft.com/kb/2019698 .
Nó hoạt động tuyệt vời! Và vì nó đến từ Microsoft, tôi cảm thấy nó khá hợp pháp.
Về cơ bản có hai bước.
Lên lịch sao lưu từ trình lập lịch tác vụ của bạn. Bạn có thể muốn đưa vào tệp .bat hoặc .cmd trước rồi lập lịch cho tệp đó.
sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'" 1>c:\SQL_Backup\backup.log
Rõ ràng là thay thế YOUR_SERVER_NAME bằng tên máy tính của bạn hoặc tùy ý thử. \ SQLEXPRESS và đảm bảo rằng thư mục sao lưu tồn tại. Trong trường hợp này, nó đang cố gắng đưa nó vào c: \ SQL_Backup
Bạn có thể sử dụng ứng dụng sao lưu của ApexSQL. Mặc dù đó là một ứng dụng GUI, nó có tất cả các tính năng được hỗ trợ trong CLI. Có thể thực hiện các hoạt động sao lưu một lần hoặc tạo một công việc sao lưu các cơ sở dữ liệu được chỉ định một cách thường xuyên. Bạn có thể kiểm tra các quy tắc chuyển đổi và lấy mẫu trong các bài viết:
Tôi đang sử dụng tsql trên cơ sở hạ tầng Linux / UNIX để truy cập cơ sở dữ liệu MSSQL. Đây là một tập lệnh shell đơn giản để kết xuất một bảng vào một tệp:
#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}
Cuối cùng nếu bạn không có kết nối đáng tin cậy như công tắc –E khai báo
Sử dụng dòng lệnh sau
"[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]
Ở đâu
[program dir] là thư mục chứa osql.exe
Trên hệ điều hành 32bit c: \ Program Files \ Microsoft SQL Server \
Trên hệ điều hành 64bit c: \ Program Files (x86) \ Microsoft SQL Server \
[phiên bản máy chủ sql] phiên bản máy chủ sql 110 hoặc 100 hoặc 90 hoặc 80 của bạn bắt đầu bằng số lớn nhất
[máy chủ] tên máy chủ hoặc ip máy chủ của bạn
[id đăng nhập] tên đăng nhập người dùng máy chủ ms-sql của bạn
[password] mật khẩu đăng nhập bắt buộc
C:\tmp
là đường dẫn trong máy chủ hay cục bộ ?
Câu trả lời của Microsoft để sao lưu tất cả cơ sở dữ liệu người dùng trên SQL Express là ở đây :
Quá trình này là: sao chép, dán và thực thi mã của chúng (xem bên dưới. Tôi đã nhận xét một số dòng không nhận xét kỳ lạ ở trên cùng) dưới dạng truy vấn trên máy chủ cơ sở dữ liệu của bạn. Điều đó có nghĩa là trước tiên bạn nên cài đặt SQL Server Management Studio (hoặc kết nối với máy chủ cơ sở dữ liệu của bạn bằng SSMS). Việc thực thi mã này sẽ tạo ra một thủ tục được lưu trữ trên máy chủ cơ sở dữ liệu của bạn.
Tạo một tệp hàng loạt để thực hiện quy trình đã lưu trữ, sau đó sử dụng Bộ lập lịch tác vụ để lên lịch chạy định kỳ (ví dụ: hàng đêm) cho tệp hàng loạt này. Mã của tôi (hoạt động) là một phiên bản sửa đổi một chút của ví dụ đầu tiên của họ:
sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
Điều này đã làm việc cho tôi, và tôi thích nó. Mỗi lần bạn chạy nó, các tệp sao lưu mới sẽ được tạo. Bạn sẽ cần phải nghĩ ra một phương pháp xóa các tệp sao lưu cũ một cách thường xuyên. Tôi đã có một thói quen làm những việc như vậy, vì vậy tôi sẽ giữ các bản sao lưu có giá trị trong vài ngày trên đĩa (đủ lâu để chúng được sao lưu theo thói quen sao lưu thông thường của tôi), sau đó tôi sẽ xóa chúng. Nói cách khác, tôi sẽ luôn có sẵn các bản sao lưu có giá trị trong vài ngày mà không cần phải khôi phục từ hệ thống sao lưu của mình.
Tôi sẽ dán tập lệnh tạo thủ tục được lưu trữ của Microsoft bên dưới:
--// 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
Bạn có thể sử dụng VB Script mà tôi đã viết chính xác cho mục đích này: https://github.com/ezrarieben/mssql-backup-vbs/
Lập lịch một tác vụ trong "Bộ lập lịch tác vụ" để thực thi tập lệnh theo ý muốn và nó sẽ sao lưu toàn bộ DB vào tệp BAK và lưu nó ở bất cứ đâu bạn chỉ định.
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
Nếu bạn có thể tìm thấy các tệp DB ... "cp DBFiles backup /"
Hầu như chắc chắn là không nên trong hầu hết các trường hợp , nhưng nó đơn giản như tất cả mọi thứ.