Я слишком небрежно выполнял резервное копирование БД на наших внутренних серверах.
Есть ли простая программа командной строки, которую я могу использовать для резервного копирования определенных баз данных в SQL Server 2005? Или есть простой VBScript?
sql-server
command-line
scripting
backup
Франк Крюгер
источник
источник
Ответы:
Для резервного копирования отдельной базы данных из командной строки используйте 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"
Вы также захотите прочитать документацию по BACKUP и RESTORE и общим процедурам .
источник
WITH FORMAT
форматирует носитель: « Параметр FORMAT делает недействительным все содержимое мультимедиа, игнорируя любое существующее содержимое». Убедитесь, что это то, что вы хотите.osql.exe
былC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Я использую ExpressMaint .
Например, для резервного копирования всех пользовательских баз данных я делаю:
источник
Запланируйте следующее для резервного копирования всех баз данных:
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, а затем запланировать этот файл.
Очевидно, замените YOUR_SERVER_NAME именем своего компьютера или, при желании, попробуйте. \ SQLEXPRESS и убедитесь, что папка резервной копии существует. В этом случае он пытается поместить его в c: \ SQL_Backup
источник
Вы можете использовать приложение резервного копирования от ApexSQL. Хотя это приложение с графическим интерфейсом пользователя, все его функции поддерживаются в интерфейсе командной строки. Можно либо выполнить одноразовые операции резервного копирования, либо создать задание, которое будет выполнять резервное копирование определенных баз данных на регулярной основе. Вы можете проверить правила переключения и примеры в статьях:
источник
Я использую tsql в инфраструктуре Linux / UNIX для доступа к базам данных MSSQL. Вот простой сценарий оболочки для выгрузки таблицы в файл:
#!/usr/bin/ksh # #..... ( tsql -S {database} -U {user} -P {password} <<EOF select * from {table} go quit EOF ) >{output_file.dump}
источник
В конечном итоге, если у вас нет доверенного соединения, как объявляет переключатель –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.
[версия сервера sql] ваш сервер sql версии 110, 100, 90 или 80 начинается с наибольшего числа
[server] ваше имя сервера или IP-адрес сервера
[идентификатор входа] ваше имя пользователя для входа на сервер ms-sql
[пароль] требуемый пароль для входа
источник
C:\tmp
путь на сервере или локальный ?Ответ Microsoft на резервное копирование всех пользовательских баз данных в SQL Express находится здесь :
Процесс состоит в следующем: скопируйте, вставьте и выполните их код (см. Ниже. Я прокомментировал несколько странно не прокомментированных строк вверху) в качестве запроса на вашем сервере базы данных. Это означает, что вы должны сначала установить SQL Server Management Studio (или иным образом подключиться к серверу базы данных с помощью SSMS). Выполнение этого кода создаст хранимую процедуру на вашем сервере базы данных.
Создайте пакетный файл для выполнения хранимой процедуры, а затем используйте планировщик задач для планирования периодического (например, ночного) запуска этого пакетного файла. Мой код (который работает) - это немного измененная версия их первого примера:
У меня это сработало, и мне это нравится. Каждый раз, когда вы запускаете его, создаются новые файлы резервных копий. Вам нужно будет разработать метод удаления старых файлов резервных копий на регулярной основе. У меня уже есть такая процедура, поэтому я буду хранить резервные копии на пару дней на диске (достаточно долго для их резервного копирования с помощью обычной процедуры резервного копирования), а затем я удалю их. Другими словами, у меня всегда будут под рукой резервные копии на несколько дней без необходимости восстановления из моей системы резервного копирования.
Я вставлю ниже скрипт создания хранимой процедуры 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
источник
Если вы можете найти файлы БД ... "cp DBFiles backup /"
Почти наверняка не рекомендуется в большинстве случаев , но это просто, как и любой костюм.
источник