将SQL数据库备份脚本/查询与powershell

时间:2016-04-11 20:56:21

标签: sql sql-server powershell

我正在尝试将我的SQL备份脚本/查询与我的power shell脚本结合起来,我不知道如何转换它,因为我不太了解SQL只有Powershell。我一直试图在脚本的每一行之前使用invoke-sqlcmd,但我不会想到你是怎么做的。我不完全理解invoke-sqlcmd Micrsoft的语法没有帮助。这是我需要使用的SQL数据库备份脚本:

DECLARE @name VARCHAR(50) -- database name  

DECLARE @path VARCHAR(256) -- path for backup files  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- used for file name


-- specify database backup directory
SET @path = 'F:\Backups\'  


-- specify filename format
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 


DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name IN ('dbname','dbname','dbname','dbname','dbname','dbname')  -- exclude these databases


OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   


WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @fileName = @path + @name + '_' + @fileDate + '.BAK'  
       BACKUP DATABASE @name TO DISK = @fileName
       WITH COMPRESSION


       FETCH NEXT FROM db_cursor INTO @name   
END   


CLOSE db_cursor   
DEALLOCATE db_cursor

在sql查询的每一行的前面添加invoke-sqlcmd是否正确?此外,无论采用何种解决方案,都需要与Windows Server 2008兼容。我认为这可能就像将整个脚本放在invoke-sqlcmd的引号中一样简单,但我对此表示怀疑。每当我谷歌这个答案太复杂,并没有真正解释SQL如何与Powershell联系。他们只是假设你知道。此脚本中唯一需要更改的字段是在SQL Studio上运行它时的路径。

3 个答案:

答案 0 :(得分:1)

Sqlcmd旨在替代sqlcmd命令行工具。

  

使用sqlcmd可以做的很多事情也可以完成   调用-SQLCMD。

因此,您将一次执行命令。使用外部文件或多行SQL字符串。请参阅下面的示例。

外部文件示例

将sql备份脚本保存到backupDaily.sql等其他文件中。之后使用以下语法。

Invoke-Sqlcmd -InputFile "C:\backupScripts\backupDaily.sql" | Out-File -filePath "C:\backupScripts\backupDailyCmd.rpt"

命令来自Microsoft documentation

好处是你可以在Sql Server Management Studio中尝试这个sql文件,看看它是否有效。

多行SQL字符串示例

$SQL_QUERY = @"
  YOUR QUERY HERE.
"@
Invoke-Sqlcmd -Query $SQL_QUERY -ServerInstance "MyComputer\MyInstance"

您可以在此处轻松使用字符串替换。

$name = 'atilla'
$SQL_QUERY = @"
  SELECT * FROM Employees WHERE NAME LIKE $($name)
"@

Invoke-Sqlcmd -Query $SQL_QUERY -ServerInstance "MyComputer\MyInstance"

答案 1 :(得分:0)

我不会使用powershell进行备份。

我建议使用SQL存储过程来安排作业。

   USE msdb ;
GO
-- creates a schedule named NightlyJobs. 
-- Jobs that use this schedule execute every day when the time on the server is 01:00. 
EXEC sp_add_schedule
    @schedule_name = N'NightlyJobs' ,
    @freq_type = 4,
    @freq_interval = 1,
    @active_start_time = 010000 ;
GO
-- attaches the schedule to the job BackupDatabase
EXEC sp_attach_schedule
   @job_name = N'BackupDatabase',
   @schedule_name = N'NightlyJobs' ;
GO

希望这个链接会有所帮助。 asked it again

答案 2 :(得分:0)

您可以使用sqlcmd备份数据库。 对于默认实例

SqlCmd -E -S MyServer –Q “BACKUP DATABASE [MyDB] TO DISK=’D:BackupsMyDB.bak'”

用于命名实例

SqlCmd -E -S MyServerMyInstance –Q “BACKUP DATABASE [MyDB] TO DISK=’D:BackupsMyDB.bak'”