假定有两个Server:192.168.0.1和192.168.0.2,需要复制的数据库名为TestDB,现将该库由192.168.0.1复制到192.168.0.2,其中%source_database_backup_file_dir%为存放192.168.0.1上TestDB库备份文件的文件夹,%target_database_file_dir%为192.168.0.2上TestDB数据库文件所在的文件夹,BAT脚本如下:
-
@echo off
-
-
set source_server=192.168.0.1
-
set source_server_user=sa
-
set source_server_password=sa
-
-
set target_server=192.168.0.2
-
set target_server_user=sa
-
set target_server_password=sa
-
-
set database=TestDB
-
-
set source_database_backup_file_dir=\\Systemname\ShareName\Path
-
set target_database_file_dir=\\Systemname\ShareName\Path
-
-
echo Start to backup source database...
-
osql -S"%source_server%" -U"%source_server_user%" -P"%source_server_password%" -n -h-1 -d"%database%" -Q"BACKUP DATABASE %database% TO DISK = '%source_database_backup_file_dir%\%database%.bak' WITH INIT;"
-
-
echo Disconnect all existing connections of target database.
-
osql -S"%target_server%" -U"%target_server_user%" -P"%target_server_password%" -Q"declare @i int declare cur cursor for select spid from sysprocesses where db_name(dbid)= '%database%' open cur fetch next from cur into @i while @@fetch_status=0 begin exec('kill '+@i) fetch next from cur into @i end close cur deallocate cur"
-
-
echo Start to resotre target database from source database backup file...
-
osql -S"%target_server%" -U"%target_server_user%" -P"%target_server_password%" -n -h-1 -d"Master" -Q"RESTORE DATABASE %database% FROM DISK = '%source_database_backup_file_dir%\%database%.bak' WITH REPLACE,MOVE '%database%' TO '%source_database_backup_file_dir%\%database%.mdf',MOVE '%database%_Log' TO '%source_database_backup_file_dir%\%database%_log.ldf';"
-
-
echo DONE!!
-
-
pause
本脚本主要使用BACKUP命令为原库生成一个备份文件,然后使用RESTORE命令将备份文件恢复到目标库,从而实现数据库复制。
有两个细节说明一下:
1. BACKUP语句中的WITH INIT用于每次备份时覆盖原备份文件中的数据。
2. 由于两个Server都需要访问数据库备份文件 ,存放备份文件的文件夹一般要设置为"共享"文件夹。