none
請問如何排程將資料庫中資料表的資料搬移到另一台主機上 RRS feed

  • 問題

  • 你好,

    我有兩台 SQL 主機(SQL1及SQL2),他們都有相同的資料庫.

    由於SQL1為遠離資料源,SQL2靠近資料源. 因此必須將資料先存放在SQL2,然後定時將資料搬移到SQL1.

    我想將 SQL2 中的某一個資料庫中所有資料表中的資料全部搬移到SQL1, 讓SQL2盡可能保持空資料庫.

    除了寫程式做這件是外,是否可以透過"SQL Server Management Studio"設定的方式完成這個功能.

    我試過用搬移資料庫的功能,但是他會把來源資料庫刪除.這樣並不符合我要的功能.

    還請先進們指教.

    謝謝.

    2019年1月5日 下午 05:30

所有回覆

  • You can backup db on sql2 then restore it in sql1.
    2019年1月5日 下午 08:06
  • 感謝你的回答。如果不只只有兩台SQL. 如5台,SQL1-5, SQL2-5需把資料定時搬移到SQL1. 用restore 的方法如何將SQL1的舊資料保留?
    2019年1月6日 上午 02:20
  • You can restore dbs on sql1 with different names.
    2019年1月6日 下午 06:29
  • 我寫了一個procedure 您看看


    CREATE PROCEDURE [dbo].[PROC_資料庫單向同步]
    (@serverIP nvarchar(50)='192.168.0.30')
    AS
    declare @dbname nvarchar(50)=(SELECT DB_NAME()) 
    declare @資料來源 nvarchar(50)
    set @資料來源='['+@serverIP+'].'+@dbname+'.dbo.'


    create table #tb(
    TABLE_QUALIFIER  nvarchar(200) null,
    TABLE_OWNER  nvarchar(200) null,
    TABLE_NAME  nvarchar(200) null,
    TABLE_TYPE  nvarchar(200) null,
    REMARKS  nvarchar(200) null)

    CREATE TABLE #col(
    [TABLE_QUALIFIER] [nvarchar](255) NULL,
    [TABLE_OWNER] [nvarchar](255) NULL,
    [TABLE_NAME] [nvarchar](255) NULL,
    [COLUMN_NAME] [nvarchar](255) NULL,
    [DATA_TYPE] [float] NULL,
    [TYPE_NAME] [nvarchar](255) NULL,
    [PRECISION] [float] NULL,
    [LENGTH] [float] NULL,
    [SCALE] [nvarchar](255) NULL,
    [RADIX] [nvarchar](255) NULL,
    [NULLABLE] [float] NULL,
    [REMARKS] [nvarchar](255) NULL,
    [COLUMN_DEF] [nvarchar](255) NULL,
    [SQL_DATA_TYPE] [float] NULL,
    [SQL_DATETIME_SUB] [nvarchar](255) NULL,
    [CHAR_OCTET_LENGTH] [float] NULL,
    [ORDINAL_POSITION] [float] NULL,
    [IS_NULLABLE] [nvarchar](255) NULL,
    [SS_DATA_TYPE] [float] NULL





    insert #tb
    exec SP_TABLES

    delete #tb where TABLE_NAME in(select name from sysobjects where xtype='V')

    declare @TABLE_NAME nvarchar(500)
    declare @COLUMN_NAME nvarchar(500)
    declare @數量 int
    declare @sql nvarchar(2000)=''
    declare @sql2 nvarchar(2000)=''
    declare @sql3 nvarchar(2000)=''

    DECLARE db_cursor CURSOR FOR 
    select TABLE_NAME from #tb t1 where t1.TABLE_OWNER='dbo'
    OPEN db_cursor  
    FETCH NEXT FROM db_cursor INTO @TABLE_NAME

    WHILE @@FETCH_STATUS = 0  
    BEGIN  

    insert #col
    exec sp_columns @TABLE_NAME

    FETCH NEXT FROM db_cursor INTO @TABLE_NAME
    END 
    CLOSE db_cursor  
    DEALLOCATE db_cursor 


    select t1.TABLE_NAME,
           (select count(*) from #col tx where TYPE_NAME='int identity' and tx.TABLE_NAME=t1.TABLE_NAME ) 數量 
       into #識別
       from #tb t1 where TABLE_OWNER='dbo'



    DECLARE cur CURSOR FOR 
    select TABLE_NAME,數量 from #識別 t1  
    OPEN cur 
    FETCH NEXT FROM cur INTO @TABLE_NAME,@數量

    WHILE @@FETCH_STATUS = 0  
    BEGIN  

    set @sql2='truncate table ['+@TABLE_NAME+']'
    execute(@sql2)

    if @數量<>0
    begin
     set @sql='set identity_insert ['+@TABLE_NAME+'] on; insert ['+ @TABLE_NAME+']('
    end
    if @數量=0
    begin
     set @sql='insert ['+ @TABLE_NAME+']('
    end
    ------------------------------------------------------------------------
    DECLARE curA curSOR FOR 
    select t1.COLUMN_NAME from #col t1 where t1.TABLE_NAME=@TABLE_NAME
    OPEN curA 
    FETCH NEXT FROM curA INTO @COLUMN_NAME

    WHILE @@FETCH_STATUS = 0  
    BEGIN  

    set @sql=@sql+'['+@COLUMN_NAME+'],'

    FETCH NEXT FROM curA INTO @COLUMN_NAME
    END 
    CLOSE curA 
    DEALLOCATE curA
    ------------------------------------------------------------------------

    set @sql= left(@sql,len(@sql)-1)+ ') select * from '+@資料來源+'['+@TABLE_NAME+'];'

    if @數量<>0
    begin
    set @sql=@sql + 'set identity_insert ['+@TABLE_NAME+'] off; '
    end

    begin try
    execute(@sql)
    end try
    begin catch
    end catch


    FETCH NEXT FROM cur INTO @TABLE_NAME,@數量
    END 
    CLOSE cur 
    DEALLOCATE cur
    GO

    2019年1月10日 上午 03:50
  • Hi, 謝謝了。不過我已經找到方法了。
    2019年7月27日 上午 11:11