SQL Server - Actualizar tablas entre dos servidores

 
Vista:
sin imagen de perfil

Actualizar tablas entre dos servidores

Publicado por Malospelos (3 intervenciones) el 08/06/2016 13:28:47
Hola a todos,

Antes de nada presentarme, me llamo Carlos y soy nuevo por aqui, espero que nos podamos ayudar entre todos.

Mi pregunta es la siguiente:

Tengo 2 servidores SQL Server, en uno de ellos trabaja una serie de personas y el otro normalmente esta desocupado o acceden otros aunque menos.

La historia es que el modo espejo de SQL Server no me vale por diversas razones, hice un programa que cada x minutos va viendo la diferencias entre los registros de los dos servidores y actualizando hacia un servidor o hacia el otro dependiendo de donde esta el cambio, en general todo funciona bien.

Básicamente tengo dos campos DateTime, en uno de ellos almaceno el ultimo cambio de un registro y en el otro indico cuando se ha actualizado, por lo tanto siempre se que esta al día y que no.

El problema es que es algo lento, hay alguna sentencia que tenga SQL Server para comparar dos tablas idénticas en estructura, pero que puede indicar donde están los registros diferentes o algo que permita que se mantengan actualizadas con unos parámetros como esos dos campos DateTime?

Se os ocurre alguna forma de mejorar y acelerar esos procesos?

Un saludo y muchas gracias.

Carlos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Actualizar tablas entre dos servidores

Publicado por Isaias (4558 intervenciones) el 08/06/2016 17:24:34
Perdona, pero ya hubo gente, que le invirtio tiempo y desarrollo varios metodos de replicacion, ¿porque quieres inventar el "hilo negro"?

No te sirve el MIRRORING, ¿porque?, ¿cuales son todas esas razones?

¿Tampoco te sirve la replicacion?
¿Que tal el log shipping?

¿Que version - edicion de SQL Server manejas?

Te dejo un procedimiento que compara 2 tablas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
CREATE PROCEDURE [dbo].[usp_GetComparison_SECOND] (@first_db varchar(100), @first_table varchar(100), @first_col_list varchar(1000),
                                              @second_db varchar(100), @second_table varchar(100), @second_col_list varchar(1000))
as
declare
@sql1 varchar(3000),
@sql2 varchar(3000),
@sql3 varchar(3000),
@sql_pk varchar(3000),
@col_name varchar(100),
@counter int,
@data_type varchar(50);
declare @key_cur as cursor;
SET @sql1 = ''
SET @sql2 = ''
set @sql_pk = ''
 
 
if @second_col_list = '' SET @second_col_list = @first_col_list
IF OBJECT_ID('tempdb..#KeysTemp') IS NOT NULL
        DROP TABLE #KeysTemp;
BEGIN
SET @sql_pk = 'select KCU.COLUMN_name COL_NAME, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH CHAR_LENGTH, c.NUMERIC_PRECISION NUMERIC_PRECISION,
              c.NUMERIC_PRECISION_RADIX NUMERIC_PREC_RADIX
              from '+@second_db
              +'.INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
              Join '+@second_db+'.INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
              ON  KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
              AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
              AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA
              AND KCU.TABLE_NAME = TC.TABLE_NAME
              join '+@second_db+'.INFORMATION_SCHEMA.COLUMNS C
              ON c.TABLE_CATALOG = tc.TABLE_CATALOG
              and c.TABLE_SCHEMA = tc.TABLE_SCHEMA
              and c.TABLE_NAME = tc.TABLE_NAME
              and c.COLUMN_NAME = kcu.COLUMN_NAME
              and TC.TABLE_CATALOG = '''+@second_db+''' and TC.TABLE_NAME = '''+@second_table+''''
 
 
CREATE TABLE #KeysTemp
(
 COL_NAME VARCHAR(100),
 DATA_TYPE VARCHAR(50),
 CHAR_LENGTH INT,
 NUMERIC_PRECISION INT,
 NUMERIC_PREC_RADIX INT
 )
Insert
into #KeysTemp
exec (@sql_pk)
 
SET @sql1 = 'SELECT '+@first_col_list++CHAR(10)+' FROM '+@first_db+'.dbo.'+@first_table+ ' as COPY'+CHAR(10)+
           ' WHERE EXISTS'+ CHAR(10)+
           '(SELECT '+@second_col_list++CHAR(10)+' FROM '+@second_db+'.dbo.'+@second_table +' as ORIG'+ CHAR(10)+
           ' WHERE '+ CHAR(10)
 
SET @key_cur = CURSOR FOR
                SELECT COL_NAME, DATA_TYPE
                from #KeysTemp ;
set @counter = 0
    OPEN @key_cur
	FETCH NEXT FROM @key_cur into @col_name, @data_type;
	WHILE @@FETCH_STATUS = 0
	BEGIN
	     select @counter = @counter + 1
	     IF @counter = 1
			 IF @data_type = 'varchar'
				BEGIN
					SET @sql2 = 'ORIG.'+@col_name +' = ISNULL(COPY.'+@col_name+' ,0)'
				END
			ELSE IF @data_type = 'int'
				BEGIN
					SET @sql2 = 'ORIG.'+@col_name +' = ISNULL(COPY.'+@col_name+',0)'
				END
			ELSE IF @data_type = 'datetime'
				BEGIN
					SET @sql2 = 'ORIG.'+@col_name +' = ISNULL(COPY.'+@col_name+',0)'
				END
			ELSE IF @data_type = 'float'
				BEGIN
					SET @sql2 = 'ORIG.'+@col_name +' = ISNULL(CAST(LTRIM(RTRIM(COPY.'+@col_name+')) as VARCHAR(10)),0)'
				END
			ELSE SET @sql2 = 'ORIG.'+@col_name +'= COPY.'+@col_name
 
	     ELSE
 
	     IF @data_type = 'varchar'
				BEGIN
					SET @sql2 = @sql2 + CHAR(10)+' and ORIG.'+@col_name +' = ISNULL(COPY.'+@col_name+',0)'
				END
			ELSE IF @data_type = 'int'
				BEGIN
					SET @sql2 = @sql2 + CHAR(10)+' and ORIG.'+@col_name +' = ISNULL(COPY.'+@col_name+',0)'
				END
			ELSE IF @data_type = 'datetime'
				BEGIN
					SET @sql2 = @sql2 + CHAR(10)+' and ORIG.'+@col_name +' = ISNULL(COPY.'+@col_name+',0)'
				END
			ELSE IF @data_type = 'float'
				BEGIN
					SET @sql2 = @sql2 + CHAR(10)+' and ORIG.'+@col_name +' = ISNULL(CAST(LTRIM(RTRIM(COPY.'+@col_name+')) as VARCHAR(10)),0)'
				END
 
			ELSE SET @sql2 = @sql2 + CHAR(10)+' and ORIG.'+@col_name +' = COPY.'+@col_name
 
 
	     FETCH NEXT FROM @key_cur into @col_name, @data_type;
	END
	CLOSE @key_cur;
	DEALLOCATE @key_cur;
 
SET @sql3 = ''
 
 
SET @sql3 = @sql1 + @sql2++CHAR(10)+')'
 
print @sql3
 
exec (@sql3)
END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Actualizar tablas entre dos servidores

Publicado por Malospelos (3 intervenciones) el 08/06/2016 22:02:08
Te cuento,

Uso Sql Server 2008 R2 Standard, aunque podría actualizar sin problemas a la 2014 Standard.

Yo te cuento y quizás puedas asesorarme.

Lo que necesito es tener 2 servidores online funcionando, que se pueden conectar tanto a uno como a otro indistintamente sin problema, si uno se cae el otro siga y cuando se levante se actualice.

Estuve mirando mucho sobre espejos y me parecía un lío y no encontré una forma que hiciera solo eso, si vi varias formas, pero hacía falta otro servidor que hiciera de puente y no sé qué cosas más.

Por eso desistí y me hice un programa que actualizaba cada 5 minutos toda la información, se conectan varios usuarios a la vez pero nunca trabajan añadiendo o editando en la misma información, aunque sí leyendo, por eso me valía el retraso de 5 minutos, el problema es que tarda, es lento actualizando.

Qué opinas? Cuál sería la mejor opción y más simple?

Conoces alguna documentación de un paso a paso o algo sencillo?

Un saludo y gracias de antemano.

Carlos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar