Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите заварить чайник.  [new]
hawkhawk
Member

Откуда: Northern Сapital
Сообщений: 71
Друзья, у меня к вам простенькая узконаправленная просьба с ярковыраженным желанием не отсылать на гуглодром, в эротическое сафари и муторное чтение мануалов.
(Ведь наверняка у многих есть подобный готовый T-SQL.)
Нужно создать бакап, в котором рождается первый архив полный и к нему вдогонку ложатся инкременты(всё в одном файле).
Иными словами, если файла с бакапом нет, то крейтим полный архив и потом в него добавляем только аддончики от последнего полного. А если файл с бакапом удалили или переместили, то вновь будет создан бакап с первоначальным полным архивом.
PS. БЧС(большое человеческое спасибо)
23 ноя 16, 10:38    [19923852]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
andrey odegov
Member

Откуда:
Сообщений: 474
hawkhawk, а может на powershell-е проще?
23 ноя 16, 11:08    [19923980]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
hawkhawk
Member

Откуда: Northern Сapital
Сообщений: 71
А есть готовый скрипт?
23 ноя 16, 11:18    [19924052]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
hawkhawk
и к нему вдогонку ложатся инкременты
В MSSQL нет инкрементальных бекапов.
23 ноя 16, 11:32    [19924160]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9159
Ленивые обычно платят неленивым.
23 ноя 16, 11:38    [19924202]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
hawkhawk
Member

Откуда: Northern Сapital
Сообщений: 71
Владислав Колосов, Точно! А не ленивые, вместо того, чтобы не лениться, сидят и лениво выискивают ленивых, не лениво намекая последним, что надо не лениться платить не ленивым.
23 ноя 16, 11:52    [19924302]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
andrey odegov
Member

Откуда:
Сообщений: 474
hawkhawk, завтра поищу на работе.
23 ноя 16, 19:11    [19926816]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
andrey odegov
Member

Откуда:
Сообщений: 474
hawkhawk,
+
#requires -version 2
$erroractionpreference='stop'
cls
$path='D:\BACKUPS'
$sqls="${env:computername}\sql16"
$dbas=-split @'
db1
AdventureWorks2016CTP3
ndoc25
remedy
db2
'@
$diff=@'
select min(differential_base_lsn)lsn
from master.sys.master_files
where database_id=db_id('{0}')
'@
$dbid='select coalesce(db_id(''{0}''),-1)dbid'
$sb=new-object text.stringbuilder
try{
  $smo='Microsoft.SqlServer.Smo'
  [void][reflection.assembly]::loadwithpartialname($smo)
  [void][reflection.assembly]::loadwithpartialname("${smo}Extended")
  $sql=new-object microsoft.sqlserver.management.smo.server $sqls
  $msr=$sql.databases['master']
  $rest=new-object microsoft.sqlserver.management.smo.restore
  $bdev=new-object microsoft.sqlserver.management.smo.backupdeviceitem
  $bdev.devicetype='file'
  $rest.devices.add($bdev)
  $dbas|%{
    if($msr.executewithresults(($dbid -f $_)).tables.dbid -eq -1){
      throw new-object applicationexception "На сервере '$sqls' нет БД '$_'"
    }
#    $fil=join-path $path "$_-$(date -f 'yyyyMMddHHmmss')"
#    $fil=[io.path]::changeextension((join-path $path $_),'bak')
    $fil=join-path $path "$_.bak"
    [void]$sb.appendline("backup database [$_] to"
            ).appendline("disk='$fil'"
            ).append('with noformat,skip,norewind,nounload,checksum,')
    if(test-path $fil){
      $bdev.name=$fil
      $db=$_
      while(1){
        $rest.readbackupheader($sql).rows|?{$_.databasename -eq $db}|
        ?{$_.backuptype -eq 1}|%{
          $ckp=$_.checkpointlsn
          $lsn=$msr.executewithresults($diff -f $db).tables.lsn
          if($lsn -and $lsn -eq $ckp){
            [void]$sb.append('differential,')
            break
          }
        }
      }
      [void]$sb.append('no')
    }
    [void]$sb.appendline('init;').appendline('go')
  }
}catch{[void]$sb.append(($_|out-string|%{"/*$_*/"}))}
write-host $sb.tostring()
#rv * -ea si
24 ноя 16, 12:06    [19929204]     Ответить | Цитировать Сообщить модератору
 Re: Помогите заварить чайник.  [new]
andrey odegov
Member

Откуда:
Сообщений: 474
исправил обращения к датасетам из executewithresults и обработку строк хедера
+
#requires -version 2
$erroractionpreference='stop'
cls
$path='D:\BACKUPS'
$sqls="lpc:${env:computername}\sql16"
$dbas=-split @'
AdventureWorks2016CTP3
AdventureWorks2014
StockAnalysis
AdventureWorksDW2014
'@
$diff=@'
select min(differential_base_lsn)lsn
from master.sys.master_files
where database_id=db_id('{0}')
'@
$dbid='select coalesce(db_id(''{0}''),-1)dbid'
$sb=new-object text.stringbuilder
try{
  $smo='Microsoft.SqlServer.Smo'
  [void][reflection.assembly]::loadwithpartialname($smo)
  [void][reflection.assembly]::loadwithpartialname("${smo}Extended")
  $smos=new-object microsoft.sqlserver.management.smo.server $sqls
  $msr=$smos.databases['master']
  $rest=new-object microsoft.sqlserver.management.smo.restore
  $bdev=new-object microsoft.sqlserver.management.smo.backupdeviceitem
  $bdev.devicetype='file'
  $rest.devices.add($bdev)
  $dbas|%{
    if($msr.executewithresults($dbid -f $_).tables[0].rows[0].dbid -eq -1){
      throw new-object applicationexception "На сервере '$sqls' нет БД '$_'"
    }
#    $fil=join-path $path "$_-$(date -f 'yyyyMMddHHmmss')"
#    $fil=[io.path]::changeextension((join-path $path $_),'bak')
    $fil=join-path $path "$_.bak"
    [void]$sb.appendline("backup database [$_] to"
            ).appendline("disk='$fil'"
            ).append('with noformat,skip,norewind,nounload,checksum,')
    if(test-path $fil){
      $bdev.name=$fil
      $db=$_
      foreach($i in 1){
        $rest.readbackupheader($smos).rows|?{$_.databasename -eq $db}|
        ?{$_.backuptype -eq 1}|%{
          $ckp=$_.checkpointlsn
          $lsn=$msr.executewithresults($diff -f $db).tables[0].rows[0].lsn
          if($lsn -and $lsn -eq $ckp){
            [void]$sb.append('differential,')
            break
          }
        }
      }
      [void]$sb.append('no')
    }
    [void]$sb.appendline('init;').appendline('go')
  }
}catch{[void]$sb.append(($_|out-string|%{"/*$_*/"}))}
write-host $sb.tostring()
#rv * -ea si
24 ноя 16, 17:10    [19930928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить