如何高效的使用PowerShell备份数据库

如何高效的使用PowerShell备份数据库

初始脚本

Get-SqlDatabase -ServerInstance localhost |
Where { $_.Name -ne 'tempdb' } |
Backup-SqlDatabase

 


 

使用上面的命令我们就能每天备份数据库到指定路径去。当然,这只是一个实例,加入打算备份每一个数据库在备份在各自的数据库实例的服务器上,又该如何修改上面的语句那?

目的是批量备份多个实例的数据库,注意这里需要提前把数据库实例存储在一个地方,然后循环遍历出来,代码如下:

foreach $RegisteredSQLs IN dir -recurse SQLSERVER:\SQLRegistration\'Database Engine Server Group'\Host\ | where {$_.Mode -ne 'd'} )
  {
  Get-SqlDatabase -ServerInstance $RegisteredSQLs.Name |
  Where { $_.Name -ne 'tempdb' } |
  Backup-SqlDatabase
  }

 

代码可是真心简短。当然这不足以促使你用PS来替代现有的数据库备份,只是提供了一个一次性备份数据库的简便方式。对于数据库的常规备份来说,你或许不会特别担心,因为这些备份可能由系统管理员或者SAN来负责。假如你的工作中包含了备份数据库,那么使用PowerShell来备份数据库就是一种值得使用的方式了,尤其是当你数据库服务器上都有PowerShell的时候。

这是PowerShell最为重要的技巧之一

接下来,考虑当需要一次性备份数据库时,大多数时候我遇到的备份都是只备份部分数据库,因此按需求从一个列表中备份数据库是一个不错的方式。型号ps有一个叫做Out-GridView的命令,方便我们做这样的操作。上面的脚本中使用where子句,这里我们可以使用Out-GridView -PassThru代替where,并保证结尾用一个“|”来结束。代码如下:

Get-SqlDatabase -ServerInstance localhost |
Out-GridView -PassThru |
Backup-SqlDatabase

对我而言-PassThru 参数是个非常有用的命令参数。方便我们仅仅通过一个参数修改完成命令。上面的脚本中这个参数其实就是数据库名称。进一步而言也可能是数据表,SQL Server Agent Jobs,CSV 文件等等。

Out-GridView 如何使用

下面这个例子使用了Out-GridView 命令,这个场景下,我选择三个数据库,然后会只备份我选择的三个。

<span>如何高效的使用PowerShell备份数据库</span>

 

另一个很有用的功能就是过滤。如果使用了过滤栏,将会查询每一个展示名字中包含我输入的文字的数据库。为了精确查找,我们可以点击“Add Criteria”来选择过滤的字段,这样就能只过滤数据库的名字。

<span>如何高效的使用PowerShell备份数据库</span>

 

接下来点击DW词条,会展示数据库查询后的结果,并高亮选中行。

<span>如何高效的使用PowerShell备份数据库</span>

 

一旦点击ok,将会看到4个数据库被自动备份。

<span>如何高效的使用PowerShell备份数据库</span>

PowerShell 变得更容易

如果你已经相信PS至少对于热备份是更简便的备份方式,我接下来在提供几个备份选项。再次返回最上面的备份例子中,如在备份指令后添加一个-CompressionOption参数,然后空格会显示几个可选参数,如on、off、default等,如图: 

<span>如何高效的使用PowerShell备份数据库</span>

 

注意:这是在PowerShell ISE中,其他的编辑器可能会有不同的弹出参数的的触发。比如我尝试了在PowerShell console 中需要用“Crtl”+空格键才会触发。

  Get-SqlDatabase -ServerInstance localhost |
  Out-GridView -PassThru |
  Backup-SqlDatabase -CompressionOption On

 

通过这个指定可以压缩备份结果,减少不必要的空间。

有趣的脚本参数和实践

这里先要介绍一下-Script ,在备份语句的最后添加这个参数将会允许输出指令,不必等到实际执行的时候。这就让我们可以不用等到备份完成就可以看到脚本。如下图所示,其实我们的PS脚本就是封装了T-SQL脚本而已。

<span>如何高效的使用PowerShell备份数据库</span>

更多备份参数

 

让我们看看这个指令其他的可选参数。如果我想能够了解更多信息可以使用Get-Help指令。

Get-Help -Full Backup-SqlDatabase

也可以找到-ShowWindow 选项,这个参数会弹出帮助文件在一个独立窗口中。使用搜索来方便查找有用的参数。

Get-Help -ShowWindow Backup-SqlDatabase
-BackupAction

使用这个参数可以选择备份数据库、文件或者是日志。默认为完整备份数据库,因此如果你不指定那就为完整备份。如果打算做一个差异备份,使用-Incremental 参数。

<span>如何高效的使用PowerShell备份数据库</span>

(注意这个可选中没有差异备份,因为差异备份用的是独立参数-Incremental )

-DatabaseFile & –DatabaseFileGroup

Backup-SqlDatabase 指令还能够备份单一数据文件或者文件组。如果选择Files作为-BackupAction 参数的可选项,你会需要增加-DatabaseFile或者 -DatabaseFileGroup ,根据数据文件或者文件组名称来备份。

-BackupFile

现在,你已经选择了备份的类型以及备份内容。默认情况是备份为.bak后缀的文件。这是附加备份这样可以不删除文件的情况下附加备份,相应的空间占用会越来越大。这个时候你可以用-BackupFile 参数来修改路径,或者直接备份到Azure存储。

如果需要找到默认备份实例的默认备份路径,可以执行下面的命令:

(Get-Item sqlserver:\sql\localhost\default\).BackupDirectory

 

对于备份文件的名字我一般采用日期模式,这样确保文件不会充满。使用下面来获得名字:

Get-Date -UFormat %Y%m%d%H%M

综上,我们需要添加一个循环所有备份语句指令,以便于我们可以修改备份文件名字。详细代码如下:

<# 备份素有数据库并提供包含文件和日期的文件名 *>
Get-SqlDatabase -ServerInstance localhost |
Where { $_.Name -ne 'tempdb' } | foreach{
Backup-SqlDatabase -DatabaseObject $_ -CompressionOption On -BackupFile "$($_.NAME)_db_$(Get-Date -UFormat %Y%m%d%H%M).bak" -Script}
-ServerInstance & -Database

我们没有提供-ServerInstance & -Database 两个参数,因为例子中使用了Get-SqlDatabase 指令已经传递了包含数据库对象的数组,$_包含了这些参数被以属性的方式保存。Backup-SqlDatabase 指令使用了-DatabaseObject 参数默认去使用。

如果打算备份一个数据库,你可以使用下面的方式而不去调用Get-SqlDatabase。

Backup-SqlDatabase -ServerInstance localhost -Database msdb
-PassThru

这里要说一下pipeline,是否已经在pS中遇到过,并且调试进程。你可以使用-PassThru 参数来看一下管道。这也是提供一个机会来看我们发出命令参数被编译为什么?

Backup-SqlDatabase -ServerInstance localhost -Database msdb -Script -PassThru;

 

<span>如何高效的使用PowerShell备份数据库</span>

 

SQL Provider

最后一个选项就是你可以在SQL Server PowerShell Provider中运行这个命令。能够通过打开PowerShell ISE 得到SQL Provider,然后运行导入模块 Import-Module SqlServer 或者在数据库节点中右击数据库。

<span>如何高效的使用PowerShell备份数据库</span>

这里,您可以通过输入backup-sqldatabase和想要备份的数据库的名称来备份一个数据库。如果您需要在备份完成后启动其他任务,则此选项可能是有益的。或者使用下面的代码样例来备份这个实例中的所有数据库。

<span>如何高效的使用PowerShell备份数据库</span>

If you choose to use the ISE, VS Code (or another rich PowerShell editor) to get to the SQL Provider you will want to start out like this

如果你选择使用ISE获得SQLProvider,执行下面指令:

Import-Module SqlServer;

CD SQLSERVER:\SQL\localhost\default\Databases\
 

总结

我希望利用PS来备份数据库的指令Backup-SqlDatabase cmdlet 能够给大家提供便利。提供给大家一个比起T-sql更便捷的方式。同时可以用它来输出T-sql语句。

本文中显示的所有代码都是使用SqlServer PowerShell模块完成的,该模块使用SSMS 2016(16.5+),而我的机器运行的是PowerShell的5.1版本。除此之外我还测试了2012 在PS3.0也是可行的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119683.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java笔试题大全带答案_java笔试题大全带答案(经典11题)[通俗易懂]

    java笔试题大全带答案_java笔试题大全带答案(经典11题)[通俗易懂]#java笔试题大全带答案(经典11题)**1.不通过构造函数也能创建对象吗()**A.是B.否**分析:答案:A**Java创建对象的几种方式(重要):(1)用new语句创建对象,这是最常见的创建对象的方法。(2)运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。(3)调用对象的clo…

  • ODT入门_odt是什么

    ODT入门_odt是什么操作关键:推平一段区间cf896c题意:操作分四种,区间加上一个数、区间赋值、求区间第k小、求区间幂次和将序列中连续的相同的元素整合、用一个三元组(L,R,val)来表示set维护定义内部类:structnode{intl,r;//区间的左端点、右端点mutableLLv;//数值node(intL,intR=-1,LLV=…

  • MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」

    MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法时间差函数TIMESTAMPDIFF、DATEDIFF的用法我们在写sql语句,尤其是存储过程中,会频繁用到对于日期、时间的比较和判断,那么对于这两个时间差比较函数用法做一个举例介绍。datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒。–相差2天selectdatediff(‘2018-03-2209:…

  • golang2020激活码【在线破解激活】

    golang2020激活码【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • pycharm怎么进行断点调试_pycharm怎么设置断点调试

    pycharm怎么进行断点调试_pycharm怎么设置断点调试PyCharm作为IDE,断点调试是必须有的功能。否则,我们还真不如用纯编辑器写的快。【运行】和【调试】前的设置,请看文章1.添加断点断点的添加如下图所示在代码前面左键单机即可 2.调试断点点击那个绿色的甲虫图标,进行断点调试。点击后,会运行到第一个断点。会显示该断点之前的变量信息。 点击StepOver或者按F8,我们继续往下运行,到下一个断点,按钮…

  • C#时间控件[通俗易懂]

    C#时间控件[通俗易懂]1、添加DateTimerPicker控件2、代码:dateTimePicker1.Format=DateTimePickerFormat.Custom;//设置Format属性为Custom,使用户自定义的时间格式生效dateTimePicker1.CustomFormat=”MMMMdd,yyyy-dddd”

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号