Я був надто розхитаний із виконанням резервних копій БД на наших внутрішніх серверах.
Чи існує проста програма командного рядка, яку я можу використовувати для резервного копіювання певних баз даних у SQL Server 2005? Або існує простий VBScript?
Я був надто розхитаний із виконанням резервних копій БД на наших внутрішніх серверах.
Чи існує проста програма командного рядка, яку я можу використовувати для резервного копіювання певних баз даних у SQL Server 2005? Або існує простий VBScript?
Відповіді:
Щоб створити резервну копію однієї бази даних із командного рядка, використовуйте osql або 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"
Ви також захочете прочитати документацію щодо РЕЗЕРВУВАННЯ та ВІДНОВЛЕННЯ та загальні процедури .
WITH FORMAT
форматування носія інформації: " Параметр FORMAT робить недійсною весь вміст мультимедіа, ігноруючи будь-який наявний вміст. " Переконайтеся, що це саме те, що ви хочете.
osql.exe
було вC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Я використовую ExpressMaint .
Для резервного копіювання всіх баз даних користувачів я роблю, наприклад:
C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Заплануйте наступне для резервного копіювання всіх баз даних:
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)
У моєму блозі також є додаткова інформація: як автоматизувати резервне копіювання SQL Server Express .
Я знайшов це на сторінці підтримки Microsoft http://support.microsoft.com/kb/2019698 .
Це чудово працює! І оскільки це надійшло від Microsoft, я вважаю, що це цілком законно.
В основному є два кроки.
Заплануйте резервне копіювання за допомогою планувальника завдань. Можливо, спочатку потрібно додати до файлу .bat або .cmd, а потім запланувати цей файл.
sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'" 1>c:\SQL_Backup\backup.log
Очевидно, замініть YOUR_SERVER_NAME на ім'я вашого комп'ютера або необов'язково спробуйте. \ SQLEXPRESS і переконайтеся, що папка резервної копії існує. У цьому випадку він намагається помістити його в c: \ SQL_Backup
Ви можете використовувати програму резервного копіювання від ApexSQL. Хоча це програма з графічним інтерфейсом, вона має всі функції, що підтримуються в CLI. Можна або виконувати одноразові операції резервного копіювання, або створювати завдання, яке б регулярно створювало резервні копії вказаних баз даних. Ви можете перевірити правила перемикання та приклади в статтях:
Можливо, якщо у вас немає надійного з’єднання, як оголошує перемикач –E
Використовуйте наступний командний рядок
"[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]
Де
[каталог програми] - це каталог, де існує файл osql.exe
У 32-бітній ОС c: \ Program Files \ Microsoft SQL Server \
У 64-бітній ОС c: \ Program Files (x86) \ Microsoft SQL Server \
[версія SQL-сервера] ваш сервер sql версії 110 або 100 або 90 або 80 починається з найбільшого числа
[сервер] ваше ім'я сервера або ip сервера
[ідентифікатор входу] ваше ім'я для входу користувача сервера ms-sql
[пароль] необхідний пароль для входу
C:\tmp
шлях на сервері чи локальний ?
Відповідь Microsoft на резервне копіювання всіх баз даних користувачів на SQL Express знаходиться тут :
Процес: копіювати, вставляти та виконувати їх код (див. Нижче. Я прокоментував деякі дивно не коментовані рядки вгорі) як запит на сервері бази даних. Це означає, що спочатку слід встановити SQL Server Management Studio (або іншим чином підключитися до сервера баз даних за допомогою SSMS). Це виконання коду створить збережену процедуру на сервері бази даних.
Створіть пакетний файл для виконання збереженої процедури, а потім використовуйте Планувальник завдань, щоб запланувати періодичний (наприклад, нічний) запуск цього пакетного файлу. Мій код (який працює) - це дещо змінена версія їх першого прикладу:
sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
Це спрацювало для мене, і мені це подобається. При кожному запуску створюються нові файли резервних копій. Вам потрібно буде розробити метод видалення старих файлів резервної копії на звичайній основі. У мене вже є процедура, яка робить подібні речі, тому я буду зберігати резервні копії на диску на кілька днів (достатньо, щоб вони були підкріплені моєю звичайною процедурою резервного копіювання), а потім видалю їх. Іншими словами, я завжди матиму під рукою резервні копії на кілька днів без необхідності відновлення з моєї резервної системи.
Я вставлю сценарій створення збереженої процедури Microsoft нижче:
--// 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
Ви можете використати сценарій VB, який я написав саме для цієї мети: https://github.com/ezrarieben/mssql-backup-vbs/
Заплануйте завдання в "Планувальнику завдань", щоб виконати сценарій, як вам подобається, і він зробить резервну копію всієї БД у файлі BAK і збереже її, де б ви не вказали.
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
Якщо ви можете знайти файли DB ... "cp DBFiles backup /"
Майже напевно не рекомендується в більшості випадків , але це просто, як і всі випадки.