使用Powershell实现数据库自动化运维

Powershell (4.4万) 2016-12-06 10:06:28

当读取文件列表时,你可以抽取的一个属性是存储的文件的类型:

使用Powershell实现数据库自动化运维_https://www.tiejiang.org_Powershell_第1张

不同的类型为:

  • L代表日志文件
  • D代表数据文件
  • F代表全文目录

步骤2 – 使用NORECOVERY恢复最后的好的完整备份

在恢复操作的第一步是恢复最后的已知好的完整备份。这提供了你一个基线,基于此你可以恢复额外的文件。NORECOVERY选项非常重要,它保持(或不回滚)未提交的事务,并允许额外的文件被恢复。我们将会使用NORECOVERY选项在我们真个恢复过程中。

因为完整备份总是第一个需要恢复的文件,所有的准备工作需要就绪,此时移动文件也开始。

对于我们的方案,我们想去恢复数据库,从源默认实例KERRIGAN到另一个实例KERRIGAN\SQL01。因此,我们需要移动我们的文件,从存储我们备份文件的路径,到我们想去使用的新路径。在这个例子中,我们只想从默认实例的默认数据目录,移动到命名实例KERRIGAN\SQL01的数据目录。我们从文件列表的原始数据和日志文件获取完整的路径,使用我们想去恢复到的新位置来替代完整路径。在下面片段中的高亮代码显示了如何修改位置:

$relocateFileList = @()

$relocatePath = "C:\Program Files\Microsoft SQL Server\MSSQL11.SQL01\

MSSQL\DATA"

#we are putting this in an array in case we have

#multiple data and logfiles associated with the database

foreach($file in $fileList)

{

#restore to different instance

#replace default directory path for both

$relocateFile = Join-Path $relocatePath (Split-Path $file.

PhysicalName -Leaf)

$relocateFileList += New-Object Microsoft.SqlServer.Management.

Smo.RelocateFile($file.LogicalName, $relocateFile)

}

注意,我们的数组包含了Microsoft.SqlServer.Management.Smo.RelocateFile对象,将包含我们数据库文件的逻辑和(重定位的)物理文件名。

$relocateFileList += New-Object Microsoft.SqlServer.Management.Smo.
RelocateFile($file.LogicalName, $relocateFile)

为了恢复我们的数据库,我们只使用Backup-SqlDatabase cmdlet。这里有一对很重要的选项,像RelocateFile和NoRecovery。

#restore the full backup to the new instance name
#note we have a NoRecovery option, because we have
#additional files to restore
Restore-SqlDatabase `
-ReplaceDatabase `
-ServerInstance $instanceName `
-Database $restoredDBName `
-BackupFile $fullBackupFile.FullName `
-RelocateFile $relocateFileList `
-NoRecovery

步骤3 – 在完整备份恢复完后,使用NORECOVERY恢复最后的好的差异备份

一旦完整备份恢复,你可以添加最后的好的差异备份跟随着完整备份。他并不是一个集成的过程,因为在这点上我们已经恢复了基础数据库并重定位了我们的文件。我们需要使用NORECOVERY恢复差异备份,阻止未提交的事务被回滚:

#using PowerShell V2 Where syntax
$diffBackupFile =
Get-ChildItem $backupfilefolder -Filter "*Diff*" |
Where {$_.LastWriteTime -ge $fullBackupFile.LastWriteTime} |
Sort -Property LastWriteTime -Descending |
Select -Last 1
Restore-SqlDatabase `
-ReplaceDatabase `
-ServerInstance $instanceName `
-Database $restoreddbname `
-BackupFile $diffBackupFile.FullName `
-NoRecovery

注意,在你的环境中,你可能有,也可能没有一个差异备份文件。如果没有,不用担心,它不会影响到你的可恢复性,只要所有的事务日志文件可用于恢复。

步骤4 – 在恢复差异备份后恢复事务日志

在我们恢复了差异备份文件,我们开始恢复我们的事务日志备份文件。这些事务日志备份文件应该是跟随着你的差异备份。你可能需要,或不需要跟随着差异备份的日志文件的完整集合。如果你需要恢复直到数据库故障点,你将需要恢复所有的事务日志备份包括尾日志备份。如果不是,你只需要知道你想恢复的事件点的备份文件。

对于我们的方案,我们识别出我们想去恢复的最后日志备份文件。这很重要,因为我们需要知道如何使用PointInTime参数,当我们使用这个特定的事务日志备份文件时。

#identify the last txn log backup file we need to restore
#we need this so we can specify point in time
$lastTxnFileName = "AdventureWorks2008R2_Txn_201507270252"
$lastTxnBackupFile =
Get-ChildItem $backupfilefolder -Filter "*$lastTxnFileName*"

对于所有其他的事务日志备份文件,我们遍历所有的备份目录,恢复所有的在最后差异备份后的,在我们想去恢复的最后事务日志备份文件之前的所有.txn文件。我们也需要通过WriteTime参数来排序这些文件,以便于我们依次恢复它们到数据库。注意,我们需要使用NORECOVERY恢复所有的这些文件。

foreach ($txnBackup in Get-ChildItem $backupfilefolder -Filter "*Txn*"
|
Where {$_.LastWriteTime -ge $diffBackupFile.LastWriteTime -and
$_.LastWriteTime -lt $lastTxnBackupFile.LastWriteTime} |
Sort -Property LastWriteTime)
{
Restore-SqlDatabase `
-ReplaceDatabase `
-ServerInstance $instanceName `
-Database $restoreddbname `
-BackupFile $txnBackup.FullName `
-NoRecovery
}

一旦所有的这些文件恢复后,然后我们准备恢复最后的事务日志文件。一旦这个文件恢复,数据库需要可访问,所有的未提交事务需要被回滚。

有两个方法去实现。第一个方法,我们在这个方案中使用的,是去使用ToPointInTime参数恢复最后的文件,并且不使用NoRecovery参数。

Restore-SqlDatabase `
-ReplaceDatabase `
-ServerInstance $instanceName `
-Database $restoreddbname `
-BackupFile $lastTxnBackupFile.FullName `
-ToPointInTime "2015-07-27 02:51:59"

另一个方法是恢复最后的事务日志文件,也使用NoRecovery,但是在最后添加另一个命令,使用WITH RECOVERY恢复该数据库。实际上,一直以来使用NORECOVERY恢复所有需要的事务日志备份文件更为安全。它更安全,是因为当我们突然使用WITH RECOVERY恢复一个文件,纠正它的唯一方法是重做整个恢复过程。这可能对于小型数据库没多大关系,但是对于大型数据库可能非常消耗时间。

一旦我们确认所有需要的文件已经被恢复,我们就可以使用WITH RECOVERY来恢复数据库。在我们的方案中,一个方法是使用T-SQL语句,并传递该语句到Invoke-Sqlcmd:

#get the database out of Restoring state
#make the database accessible
$sql = "RESTORE DATABASE $restoreddbname WITH RECOVERY"
Invoke-Sqlcmd -ServerInstance $instanceName -Query $sql

RESTORE DATABASE命名使得我们的数据库从一个正在恢复中的状态,到可访问和以备使用状态。RESTORE命名回滚了所有未完成的事务,并让数据库以备使用。

二、 使用PowerShell调用MTools分析MongoDB性能并发送邮件

在MongoDB日常运维中,经常需要查看连接数的趋势图、慢查询、Overflow语句、连接来源。任何数据库的DBA都应该对数据库情况进行定期的巡检,以清楚了解数据库的运行情况,健康状况,隐患等等。MTools工具应运而生,它带给DBA极大地帮助。

Mtools简介

Mtools是由MongoDB Inc 官方工程师所写,设计之初是为了方便自己的工作,但是随着MongoDB用户的增加,越来越多的朋友也开始使用Mtools,也越来越感受到Mtools带来的便捷。

Github地址如下:

Mtools github地址

Mtools主要有以下组件:

mlogfilter
mloginfo
mplotqueries
mlogvis
mlaunch
mgenerate

首先,我们来简单介绍下 mlogfilter,mloginfo和mplotqueries。

mlogfileter我们可以简单理解为日志的过滤器,参数如下:

mlogfilter [-h] [--version] logfile [logfile ...]
[--verbose] [--shorten [LENGTH]]
[--human] [--exclude] [--json]
[--timestamp-format {ctime-pre2.4, ctime, iso8601-utc, iso8601-local}]
[--markers MARKERS [MARKERS ...]] [--timezone N [N ...]]
[--namespace NS] [--operation OP] [--thread THREAD]
[--slow [SLOW]] [--fast [FAST]] [--scan]
[--word WORD [WORD ...]]
[--from FROM [FROM ...]] [--to TO [TO ...]]

示例:

通过mlogfilter查询日志中某个表的slow log(超过100ms的)

mlogfilter --namespace xxx.xx --slow 100 mongod.log-20160611

mloginfo可以过滤总结出slow query的情况,以及为日志中各类最常常出现情况进行统计,参数如下:

mloginfo [-h] [--version] logfile
[--verbose]
[--queries] [--restarts] [--distinct] [--connections] [--rsstate]

示例:

通过mloginfo统计日志中connections的来源情况

mloginfo mongod.log-20160611 --connections

mplotqueries相对复杂一些,功能是可以根据需求画图,以便更直观的找出问题或者隐患所在,参数如下:

mplotqueries [-h] [--version] logfile [logfile ...]
[--group GROUP]
[--logscale]
[--type {nscanned/n,rsstate,connchurn,durline,histogram,range,scatter,event} ]
[--overlay [ {add,list,reset} ]]
[additional plot type parameters]

示例:

通过mplotqueries对连接情况进行分析,时间块单位1800(30min)

mplotqueries mongod.log-20160611 --type connchurn --bucketsize 1800 --output-file 01-9.png

解决方案

笔者将在Windows上安装MTools工具来分析mongod.log日志,然后通过Powershell发送邮件。

1. 将Windows备份机目录挂载到MongoDB本地目录下,将LogRotate切换后的最新一个日志拷贝到备份目录。

参考博文:《在Linux下挂载Windows系统共享目录》

2. 在Windows服务器上安装Mtools。

参考博文:《在64位Windows Server 2008 R2上安装mtools》

3. 编写PowerShell脚本,通过Mtools分析日志文件,并发送邮件。

Github源码地址:https://github.com/UltraSQL/MongoDBDailyReport.git

使用方法:

a) 将DBA模块放到相应的Modules\DBA目录下。

b) 在配置文件中加载模块:Import-Module DBA -Force。

c) 创建任务计划,定时执行该MTools.ps1脚本。
使用Powershell实现数据库自动化运维_https://www.tiejiang.org_Powershell_第2张

THE END

Leave a Reply