Cara membuat cadangan / mengembalikan database SQL Server dari baris perintah mirip dengan mysql

8

Saya perlu mengotomatiskan migrasi untuk beberapa database dari server lama. Saya tahu bahwa skrip alat menggunakan C # misalnya dapat menjadi kemungkinan tetapi saya membutuhkan solusi sederhana, cepat dan efektif untuk membangun file batch untuk melakukan pekerjaan itu.

Rui Marques
sumber

Jawaban:

9

Buat file .sql dengan pernyataan backup / restore Anda dan gunakan SQLCMD

Sekitar setengah jalan dari artikel itu ada contoh melakukan backup.

Anda dapat merujuk ke halaman-halaman berikut dengan informasi tentang T-SQL untuk melakukan backup dan mengembalikan:

squillman
sumber
Anda dapat memanggil Sqlcmd di atas dalam file batch. Itu akan membuatnya lebih meyakinkan untuk digunakan, sementara Anda dapat menetapkan nama server dan nama pengguna secara berbeda jika Anda membutuhkannya.
Langit
2

Karena Anda harus memigrasi basis data dari server lama ke yang baru, di bawah ini adalah skrip yang akan mengotomatisasi itu ..

Penting: Uji terlebih dahulu di TEST Server, sehingga Anda memahami apa yang dilakukan skrip ... Saya tidak bertanggung jawab atau berkewajiban atas jumlah KERUGIAN DATA !!!

set nocount on
/****************************************************************************** 
    Author  :: Kin
    Desc    :: Transfer Logins, Databases from one instance/Server to another
*******************************************************************************/
  declare @datafile varchar(255),
            @logfile varchar(255),
            @dbid tinyint,
            @SQLText varchar(8000),
            @dbname varchar(255),
            @destserver varchar(255),
            @SQLText2 varchar(8000)
set @destserver ='' --Destination Server Name goes here.

--1.Transfer Logins
select @SQLText='exec master..xp_cmdshell ''sqlcmd -S'+@@servername+' -E -Q"execute master.dbo.sp_help_revlogin" -oD:\logs\revloginout.sql'''
--print @sqltext
exec (@sqltext)
-- Create on Destination Server.
select @SQLText='exec master..xp_cmdshell ''sqlcmd -S'+@destserver+' -E -iD:\logs\revloginout.sql'''
--print @sqltext
exec (@sqltext)

--2. Detach All Local Databases and prepare for Attach on dest.
 --- if you want to filer only some database, then you can do it here !!
if exists(select 1 from tempdb..sysobjects where name like '%#filetable%')
      begin
      drop table #filetable
      end
      create table #filetable (mdf varchar(255),ldf varchar(255),dbid tinyint,dbname varchar(100),fileid tinyint)
      --

      insert #filetable (mdf,dbid,fileid) 
      select physical_name,database_id,data_space_id from sys.master_files where data_space_id=1

      insert #filetable (ldf,dbid,fileid) 
      select physical_name,database_id,data_space_id from sys.master_files where data_space_id=0

      update u 
      set u.dbname = s.name
      from #filetable u
      inner join master..sysdatabases s 
      on u.dbid = s.dbid


select @dbid = min(dbid) from #filetable where dbid > 4
while @dbid is not null
begin

      select @SQLText = 'alter database '+ dbname from #filetable where dbid = convert(varchar,@dbid) 
      select @SQLText = @SQLText+' set single_user with rollback immediate'
      select @SQLText = @SQLText+' exec master..sp_detach_db ' + dbname from #filetable where dbid = convert(varchar,@dbid)
      print @SQLText
      Exec(@SQLText)

      select @SQLText2 = 'exec opendatasource(''SQLNCLI'',''Datasource='+@destserver+';Persist Security Info=False;Integrated Security=SSPI'').master.dbo.sp_attach_db '''+dbname+'''' from #filetable where dbid = @dbid
      select @SQLText2= @SQLText2+','''+ mdf+'''' from #filetable where dbid = @dbid and mdf is not null
      select @SQLText2=@SQLText2+','''+ ldf+''''  from #filetable where dbid = @dbid and ldf is not null
      print @SQLText2
      Exec(@SQLText)
      select @dbid = min(dbid) from #filetable where dbid > 4 and dbid > @dbid
end

select * from #filetable
drop table #filetable
--Finally Shutdown SQL Server
shutdown with nowait
Kin Shah
sumber