`

PowerShell 數據庫備份與還原(帶替換)

 
阅读更多

同一目錄下config.xml:

 

<?xml version="1.0" encoding="UTF-8"?>
<config index="0">  
	<backup>
		<whether>0</whether> <!-- wheter download -->
		<ServerName>10.1.100.13</ServerName>
		<UserName>test</UserName>	
		<PassWord>test123</PassWord>
		<DataBase>BarCode09</DataBase>
		<BackupObject>2;5</BackupObject><!--     All Objects = 0; Tables = 1; Table Triggers = 2; Views = 3; Functions = 4; Stored Procedures = 5;     -->
		<WildCard>el_mp*;el_get_date</WildCard>		
	</backup>
	
	<replace>
	    <BackupFolder>D:\sp\masterplan\backup</BackupFolder>
	    <whether>1</whether> <!--whether  replace -->
		<newChar>live.dbo.</newChar>
		<oldChar>uat18.dbo.</oldChar>
		<ReplaceFolder>D:\sp\masterplan\replace</ReplaceFolder>
	</replace>
	
	<restore>
	    <whether>0</whether> <!--whether upload/restore -->
		<ServerName>10.1.100.58</ServerName>
		<UserName>sa</UserName>
		<PassWord>sa123</PassWord>
		<DataBase>stu</DataBase>
	</restore>
</config>
PowerShell腳本如下:
[String]$CurrentPath = get-location;
[String]$xmlDocPath = $CurrentPath+"\config.xml";
#write-host $xmlDocPath  
$xmlDoc = New-Object "System.Xml.XmlDocument"  
$xmlDoc.Load($xmlDocPath)  
$modelList = $xmlDoc.GetElementsByTagName("config");#tagName  
$index=$modelList.ItemOf(0).GetAttribute("index")
if($index -eq 0 )
{
  #-------------------Start Param-----------------
  $backupNodelist=$xmlDoc.GetElementsByTagName("backup");
  $backupConfig=$backupNodelist.ItemOf(0);   #first <backup> node
  #below is backup tag attributes
  $whetherBackup=$backupConfig.GetElementsByTagName("whether").ItemOf(0).get_InnerXml();  
  $backupServer=$backupConfig.GetElementsByTagName("ServerName").ItemOf(0).get_InnerXml();  
  $backupLogin=$backupConfig.GetElementsByTagName("UserName").ItemOf(0).get_InnerXml();
  $backupPassWord=$backupConfig.GetElementsByTagName("PassWord").ItemOf(0).get_InnerXml();
  $backupDataBase=$backupConfig.GetElementsByTagName("DataBase").ItemOf(0).get_InnerXml();
  $backupObject=$backupConfig.GetElementsByTagName("BackupObject").ItemOf(0).get_InnerXml();
  $backupWildCard=$backupConfig.GetElementsByTagName("WildCard").ItemOf(0).get_InnerXml();
  
  $replaceNodelist=$xmlDoc.GetElementsByTagName("replace");
  $replaceConfig=$replaceNodelist.ItemOf(0);   #first <replace> node
  #below is replace tag attributes
  $backupFolder=$replaceConfig.GetElementsByTagName("BackupFolder").ItemOf(0).get_InnerXml();
  $whetherReplace=$replaceConfig.GetElementsByTagName("whether").ItemOf(0).get_InnerXml();
  $newChar=$replaceConfig.GetElementsByTagName("newChar").ItemOf(0).get_InnerXml();
  $oldChar=$replaceConfig.GetElementsByTagName("oldChar").ItemOf(0).get_InnerXml();  
  $replaceFolder=$replaceConfig.GetElementsByTagName("ReplaceFolder").ItemOf(0).get_InnerXml();
  
  $restoreNodelist=$xmlDoc.GetElementsByTagName("restore");
  $restoreConfig=$restoreNodelist.ItemOf(0);   #first <restore> node
  #below is restore tag attributes
  $whetherRestore=$restoreConfig.GetElementsByTagName("whether").ItemOf(0).get_InnerXml();
  $restoreServer=$restoreConfig.GetElementsByTagName("ServerName").ItemOf(0).get_InnerXml();
  $restoreLogin=$restoreConfig.GetElementsByTagName("UserName").ItemOf(0).get_InnerXml();
  $restorePassWord=$restoreConfig.GetElementsByTagName("PassWord").ItemOf(0).get_InnerXml();
  $restoreDataBase=$restoreConfig.GetElementsByTagName("DataBase").ItemOf(0).get_InnerXml();
   
 #-------------------End Param----------------------
  #Load Class
  #cls
  #load assemblies
  [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
  #Need SmoExtended for backup
  [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
  [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
  [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null
 
  $serverConn=new-object Microsoft.SqlServer.Management.Common.ServerConnection
  $serverConn.ServerInstance=$backupServer
  $serverConn.LoginSecure =$false
  $serverConn.Login = $backupLogin
  $serverConn.Password =$backupPassWord

  #trap errors(catch error )
  $errors =$backupFolder+"\errors.txt"
  trap
  {

	"______________________" | out-file $errors -append;
	"ERROR SCRIPTING TABLES" | out-file $errors -append;
	get-date | out-file $errors -append;
	"ERROR: " + $_ | out-file $errors -append;
	"`backupServer = $backupServer" | out-file $errors -append;
	"`backupDataBae = $backupDataBase" |out-file $errors -append;
	"`backupFolder = $backupFolder" | out-file $errors -append;
	"`restoreServer = $restoreServer" | out-file $errors -append;
	"`restoreDataBae = $restoreDataBase " | out-file $errors -append;
	#throw "ERROR: See $errors"
  }
  
  function MakeDirectory 
  {
	param([string]$DirName)
	Process
	{
		if (!(Test-Path -path $DirName))
		{
		  New-Item $DirName -type directory | Out-Null
		}
	}
  }
  $srv = new-object Microsoft.SqlServer.Management.Smo.Server($serverConn)
  $db=$srv.databases[$backupDataBase]
  $dbName=$db.Name

  $scr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"
  $scr.Server = $srv
  $scrOptions = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"

  #Script Options Setting
  $scrOptions.AllowSystemObjects = $false #not include system object
  $scrOptions.IncludeDatabaseContext = $false #not include database infomation
  $scrOptions.IncludeIfNotExists = $true
  $scrOptions.ClusteredIndexes = $true
  $scrOptions.NoCollation = $true
  $scrOptions.Default = $true
  #$scrOptions.DriAll = $true
  $scrOptions.Indexes = $true
  $scrOptions.NonClusteredIndexes = $true
  $scrOptions.IncludeHeaders = $false
  $scrOptions.ToFileOnly = $true
  $scrOptions.Permissions = $true
  $scrOptions.ScriptDataCompression = $true
  $scrOptions.ScriptSchema = $true
  $scrOptions.AppendToFile = $true
  $sEnc = [System.Text.Encoding]::UTF8
  $scrOptions.Encoding=$sEnc
  
  $scr.Options = $scrOptions 

  if($whetherBackup -eq 1){
	if (Test-Path -path $backupFolder){
	    remove-item $backupFolder\*.* -Recurse
	}
  }
  if($whetherReplace -eq 1){#remove replaceFolder before replace
	if (Test-Path -path $replaceFolder){
		remove-item $replaceFolder\*.* -Recurse
	}
  }

  $WildCard="";
  function getWildCard{
      param($obj)
	  $WildCard="";
	  foreach($element in $backupWildCard.split(';'))
	  {
		 $WildCard+="'"+$obj+"' -like '"+$element+"' -or "
	  }
	  $WildCard=$WildCard.substring(0,$WildCard.length-5)
	  invoke-expression $WildCard
  }
  function ScriptDropStatement
  {
    param($object)
    $scrOptions.ScriptDrops = $true  # drop statement of sql
	MakeDirectory($backupFolder);
	$scrOptions.FileName = $backupFolder+"\"+$object.Name+".sql";
	$scr.Options = $scrOptions;
	$scr.Script($object);
  }
  function ScriptCreateStatement
  {
    param($object)
    $scrOptions.ScriptDrops = $false  #create statement for sql
	MakeDirectory($backupFolder);
	$scrOptions.FileName = $backupFolder+"\"+$object.Name+".sql";
	$scr.Options = $scrOptions;
	$scr.Script($object);
  }
  if($whetherBackup -eq 1){ #If want to backup
    ">>>>>Start Backup[Download] the Database Script !!!"
    $multiObject = $backupObject.split(";");
	foreach($obj in $multiObject)
	{     
	     $tables=$db.Tables;
	     if ($obj -eq 0 -or $obj -eq 1)
	     {     
		 $srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.Table],"IsSystemObject")
		 foreach ($table in $tables | where-object {getWildCard($_.name)} | where-object{$_.IsSystemObject -eq $false})
		 {   
			MakeDirectory ($backupFolder); 
			#ScriptDropStatement($table)
			ScriptCreateStatement($table)
			write-host "Table "$table.Name" backup Complete !"
		 }
	     }
            if ($obj -eq 0 -or $obj -eq 2)
	    {
		$srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.Trigger],"IsSystemObject")
		foreach ($table in $tables)
		{
			foreach ($trigger in $Table.Triggers |where-object {getWildCard($_.name)} | where-object{$_.IsSystemObject -eq $false})
			{
				MakeDirectory ($backupFolder); 
				ScriptDropStatement($trigger)
				ScriptCreateStatement($trigger)
				write-host "Trigger "$trigger.Name" backup Complete !"
			}
		}
	   }
	   if ($obj -eq 0 -or $obj -eq 3)
	   {
		$srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.View],"IsSystemObject")
		foreach ($view in $db.Views | where-object { getWildCard($_.name)} | where-object {$_.IsSystemObject -eq $false} )
		{
			MakeDirectory ($backupFolder); #Check for folder, and create if needed
			ScriptDropStatement($view)
			ScriptCreateStatement($view)
			write-host "View "$view.Name" backup Complete !"
		}
	  }
	  if ($obj -eq 0 -or $obj -eq 4)
	  {
		$srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.UserDefinedFunction],"IsSystemObject")
		foreach ($function in $db.UserDefinedFunctions | where-object {getWildCard($_.name)} | where-object {$_.IsSystemObject -eq $false})
		{
			MakeDirectory ($backupFolder); #Check for folder, and create if needed
			ScriptDropStatement($function)
			ScriptCreateStatement($function)
			write-host "Function "$function.Name" backup Complete !"
		}
	  }
	  if ($obj -eq 0 -or $obj -eq 5)
	  {
		$srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.StoredProcedure],"IsSystemObject")
		foreach ($procedure in $db.StoredProcedures | where-object {getWildCard($_.name)} | where-object{$_.IsSystemObject -eq $false})
		{
			MakeDirectory ($backupFolder); #Check for folder, and create if needed
			ScriptDropStatement($procedure)
			ScriptCreateStatement($procedure)
			write-host "Stored Procedure "$procedure.Name" backup Complete !"
		}
	  }
	}
	">>>>>>>>Backup[Download] the Database Script Complete !!!"
  }
  if($whetherReplace -eq 1){#If want to replace 
    ">>>>>>>>Start Replace The BackupFolder's Script  !"
	if(!(Test-Path -path $backupFolder)){
	  write-host "Information: "$backupFolder" Directory not exist! Please Backup Before !"
	}else{
	      MakeDirectory($replaceFolder);#Check replaceFolder whether exist!
	      $file=Get-ChildItem $backupFolder;
	      if($oldChar -eq "" -and $newChar -eq "")
	      {
		   write-host "No replace necearray !"
	      }else{
		    foreach($str in $file)
		   { 
			$backfileAddr=$backupFolder+"\"+$str;			
			if(Test-Path -path $backfileAddr){
				$replacefileAddr=$replaceFolder+"\"+$str;
				write-host $replacefileAddr;
				$content=Get-Content -path $backfileAddr -Encoding UTF8
				$content | foreach-object {$_ -replace $oldChar,$newChar} | Set-Content $replacefileAddr -force -Encoding UTF8	
			}else{
				write-host "file "$backfileAddr" can't found! So the replace Action can't work !"
			}				
		  }
             }
	}
    ">>>>>>Replace Script Complete !"
  }
  if($whetherRestore -eq 1){#If want to restore
    ">>>>>>>Start Restore Database  !"
	if(!(Test-Path -path $replaceFolder)){
	  write-host "Information: "$replaceFolder "Directory not exist !please replace Before"
	}else{
	  foreach($f in get-childitem -path $replaceFolder -Filter *.sql | sort-object)
	  {   
		  sqlcmd -i $f.fullname -S $restoreServer -U $restoreLogin -P $restorePassWord  -d $restoreDataBase
	  }
	}  
	">>>>>>>Restore DataBase Complete !"
  }
  if($whetherBackup -eq 0 -and $whetherReplace -eq 0 -and $whetherRestore -eq 0){
    ">>>>>>You don't let progress do anything !<<<<<<"
  }
}
同一目錄下的批處理文件run.bat:
cls
powershell -command "&{set-executionpolicy RemoteSigned }"

powershell -command "&{.\beta.ps1 Club.Secretary}"
分享到:
评论

相关推荐

    SMO+PowerShell 实现SQLServer数据库的备份与还原

    标题 "SMO+PowerShell 实现SQLServer数据库的备份与还原" 涉及到的是在SQL Server环境中,使用SQL Server Management Objects (SMO) 和 PowerShell脚本来自动化数据库的备份和恢复过程。这是一种高效且灵活的方法,...

    sql数据库的备份与还原

    在IT领域,数据库管理是至关重要的任务之一,SQL(Structured Query Language)作为最广泛使用的数据库语言,其数据库的备份与还原功能是确保数据安全和业务连续性的重要手段。本篇文章将详细探讨SQL数据库的备份与...

    C# 编写的SqlServer 数据库自动备份服务,带配置,功能强大

    5. `Lb.BackDb`:这个名字暗示这可能是核心的数据库备份模块,包含了与数据库交互的逻辑,比如连接数据库、执行备份脚本等功能。 综合以上信息,我们可以推断这个项目包括一个C#编写的Windows服务程序,用于自动...

    数据库备份脚本.zip

    在本主题中,我们将深入探讨如何在Windows环境中利用脚本实现数据库的自动备份,特别是与MySQL数据库相关的操作。"数据库备份脚本.zip"文件包含了一个适用于Windows的任务计划器脚本,用于定期执行MySQL数据库的备份...

    实验13-数据库备份与恢复.pdf

    数据库备份与恢复是数据库管理中的核心任务,它确保在数据丢失或系统故障时能够恢复到安全的状态。在中山大学计算机学院的《数据库系统原理实验》中,实验13重点介绍了如何针对教学管理系统进行这一过程。以下是对...

    Powershell生成数据库脚本.zip

    标题"PowerShell生成数据库脚本.zip"暗示了主要内容是关于使用PowerShell编写脚本来创建SQL Server数据库的备份或迁移方案。在SQL Server环境中,我们经常需要导出数据库的结构(如表、视图、存储过程等)或者数据,...

    PlexBackup:在Windows系统上备份和还原Plex应用程序数据的PowerShell脚本

    是的,它可以备份Plex数据库,但是如果您需要将Plex实例移至其他系统或在硬盘崩溃后将其还原,则单个数据库备份文件几乎没有用。 为了进行有意义的备份,除了Plex数据库之外,您还需要Plex Windows注册表项的副本...

    服务器上自动备份数据库

    - PowerShell脚本:通过编写PowerShell脚本,结合SQL Server的SMO(SQL Server Management Objects)库,实现数据库的自动备份。 - 批处理命令:结合SQL Server的T-SQL备份命令,可以通过Windows的计划任务来定时...

    SharePoint 2010 网站集 备份 还原

    参数含义与备份命令类似,但需要注意的是: - `&lt;Site collection URL&gt;` 是你要恢复的网站集的URL。 - `-DatabaseServer` 和 `-DatabaseName` 分别指备份文件中网站集关联的数据库服务器名称和内容数据库名。 例如...

    SQL SERVER数据库批量备份、恢复、附加工具

    这在数据库迁移、硬件升级或数据库的临时移除与恢复中十分有用。使用`ALTER DATABASE ATTACH`命令,配合合适的脚本,可以快速地处理大量数据库的附加操作。 在实际应用中,**用友**是一款常见的企业资源规划(ERP)...

    SQL Server with Powershell

    ### SQL Server 与 PowerShell:提升数据库管理效率 #### 核心知识点概述 1. **SQL Server 2012 特性与应用** - SQL Server 2012 的新特性及其对数据库管理和开发的影响。 - 如何利用 SQL Server 2012 提升数据...

    SharePoint2013-备份与恢复解决方案

    2. **选择数据库**:在对象资源管理器中找到需要还原的备份文件。 3. **执行还原**:右键点击备份文件,选择“任务” -&gt; “还原”。 ##### 3.3 还原网站集 **通过管理中心还原网站集** 1. **选择网站集**:在...

    备份、还原或移动 SharePoint 网站的几种方法

    本文将详细探讨备份、还原和移动 SharePoint 网站的几种方法,帮助管理员确保数据的完整性和业务连续性。 1. **SharePoint 内置备份功能** - SharePoint 提供了内置的备份工具,允许管理员执行网站集级别的备份。...

    PowerShell 自动备份oracle并上传到ftp

    # Purpose: Windows平台下采用PowerShell使用rman自动备份oracle并上传备份到ftp,并根据日期自动保留所需备份 # Created: 2015/8/12 $env:ORACLE_SID=orcl $env:NLS_LANG=AMERICAN_AMERICA.AL32UTF8 $NOWDATE=Get-...

    Nginx 日志定时备份powershell脚本,无需任何第三方程序

    解决nginx在windows下日志定期备份问题的powershell脚本,文件名为前一天的日期。无需任何第三方程序。

    【powershell脚本】链接sqlserver数据库执行增删查改

    【powershell脚本】链接sqlserver数据库执行增删查改

    SQL SERVER 数据库自动备份及定期删除设置步骤

    在SQL Server数据库管理中,确保数据的安全性和可用性至关重要,其中自动备份和定期删除策略是两个重要的环节。本文将详细阐述SQL Server中如何配置数据库自动备份以及设置定期删除的步骤,帮助管理员有效管理数据库...

    SQLSERVER数据库自动备份软件的实现

    在SQL Server环境中,数据库自动备份是确保数据安全性和业务连续性的重要环节。本文将深入探讨如何实现SQL Server数据库的自动备份,以及相关的知识点。 首先,理解SQL Server的备份类型至关重要。主要有完整备份、...

    WindowsPowerShell实战指南 高清带书签第2版.zip

    在深入学习章节,书中涵盖了PowerShell的高级特性和使用技巧,如脚本编写、函数创建、模块开发、错误处理、调试工具以及与其他系统工具的集成。通过这些内容,读者可以掌握如何构建复杂的自动化解决方案,提高工作...

Global site tag (gtag.js) - Google Analytics