Escenario :
Tengo un servidor principal con SQL Server como manejador de
base de datos. Adicionalmente, tengo un servidor Linux (con redhat) con un
sistema en php que conecta a una base de datos MySQL instalada en dicho terminal. El problema : Necesito pasar información de
SQL a Mysql de 2 a 4 veces por día.
¿Como hago para pasar toda la información y que se mantenga en la capa
de Datos ?. Después de varios días de investigación y de haber encontrado 3
posibles soluciones sin salir de la capa de datos ( freetds era una muy buena
opción, ejecuciones con procesos en segundo plano bajo en cron de linux) , he
optado por solucionar el problema con lo que me parece la manera mas elegante y
certera. servidores vinculados.
¿Qué es un servidor vinculado?
Su nombre lo dice todo, agrego una BD externa al SQL y la
hago accesible, con esto puedo hacer todo tipo de consultas tipo transac
sql.
EMPEZAMOS
1. Instala
los driver que te permite manejar la base Mysql. Entonces bajar el conector ODBC para mysql
http://dev.mysql.com/downloads/connector/odbc/
2. Luego de
instalarlo debemos configurarlo, creamos el odbc y lo configuramos:
Yo tengo el sql server 2005 :
Entra al "Panel de Control" y busca
"Herramientas Administrativas". Entra en este y aparecerá
"Orígenes de datosODBC".
Se abrirá la siguiente ventana. Busca el botón
"Agregar".
Clic sobre Mysql ODBC 3.51 driver (que es lo que instalaste
en el paso 1). Luego sobre finalizar.
Se abre el conector ODBC del MySQL. En este debes definir
los parámetros de conexión a tu base de datos MySQL. Simplemente agrega el
nombre de tu servidor, tu user y password. No olvides colocar el nombre de la
conexión (DataSource Name). Lo vamos a usar en el Paso 3. Sugiero
"MySQL_LINK".
3. Vincular
Mysql con SQL Server 2005
En el administrador
corporativo del SQL Server 2005 buscas
la opción "Objetos del servidor". Dentro existe una subcarpeta
llamada "Servidores vinculados".
clic derecho sobre Servidores vinculados y buscamos la
opción "Nuevo servidor vinculado".
Se abre la ventana "Nuevo servidor vinculado" y
colocas los parámetros para conectarse con la base MySQL.
Marcas la opción "Otro origen de datos" . Debes
colocar los siguientes parámetros.
Servidor vinculado : LINKED_MYSQL (coloca el nombre que
desees)
Proveedor :
Microsoft OLE DB Provider for ODBC Drivers.
Nombre del Producto : MySQL
Origen de datos : MySQL_LINK (Ojo: Este es el nombre del
ODBC que creaste en el paso 2, colocale el que tu hayas colocado.)
Cadena de proveedor : ODBC:DSN=MySQL_LINK::Table=aaa (el
valor aaa es una tabla de la base MySQL, coloca cualquiera de las tablas de tu
base. DSN es el nombre del ODBC que creaste en el paso 2)
Catálogo : pyp1 (nombre de la base de datos a la cuál
quieras conectarte)
Dentro de la misma ventana, clic en la ficha
"Seguridad" para que establecer con que user y password nos vamos a
conectar. Clic en "Se establecerán usando este contexto de seguridad"
y colocamos el user y password. Luego clicen el botón "Aceptar". Eso
es todo, ya tenemos vinculado nuestro servidor MySQL con SQL 2005.
4. Hacer consultas
SQL en el servidor vinculado.
Ubicación : En el servidor central donde esta la base SQL
Server 2005
Vayamos a probar si podemos hacer consultas en MySQL.
Ejecutamos exec sp_Tables_Ex 'LINKED_MYSQL' (Devolvemos
información acerca de las tablas de el servidor que hemos vinculado.LINKED_MYSQL
es el nombre del servidor vinculado que hemos creado). Se deben mostrar las
tablas del servidor vinculado.
Veamos algunos ejemplos de sentencias SQL con openquery.
¿Si quiero mostrar datos de las tablas?
select *
from openquery (LINKED_MYSQL,'select * from aaa')
¿Si quiere eliminar los datos de un tabla?
Delete
openquery (LINKED_MYSQL,'select * from aaa'). ¡Borramos todos los datos
de la tabla 'aaa'!
¿Si quiero insertar datos en dicha tabla?
insert into
openquery(LINKED_MYSQL,'select * FROM aaa')
(Field1,
Field2,...)
SELECT
Field1, Field2,...
FROM Tabla
¿Y para
actualizar datos?
Update
openquery(LINKED_MYSQL,'Select * from aaa') SET Cod_Ind = 7
WHERE Cod_Ind = 7.5
http://www.forosdelweb.com/f21/como-hacer-insert-liskserver-por-openquery-238208/
excelente!!!
ResponderEliminareste post me ha salvado de muchas en el trabajo, que bueno que te haya servido!
ResponderEliminarMuy buen post, saludos
ResponderEliminarSaludos igualmente desde Lima.
Eliminarmuchas gracias, me ha servido de mucha ayuda
ResponderEliminarPara el insert no me funciono esa sintaxis me funciono esta:
ResponderEliminarINSERT INTO
OPENQUERY( link_mysql, 'SELECT columna FROM tabla')
VALUES('Valor de la columna')
Por cierto :) excelente post, se podría mejorar la forma en que posteas para una mejor legibilidad, he visto en otros varios blogs que la sintaxis de códigos la formatean.
ResponderEliminarEl contenido me ayudo bastante. ¡Gracias!
Hola Eduardo. Gracias por tus comentarios, tendré en cuenta mejorar la legibilidad, siempre hay donde mejorar! un gusto.
EliminarDetalle 2:
ResponderEliminarUn update me funciona si pongo el where dentro del openquery no fuera.
Sintaxis
UPDATE
OPENQUERY(
LINK_MYSQL,
'SELECT * FROM table WHERE ')
SET column_name = 'Value'
Saludos.
PD: Utilizo Sql server 2008
funciona!
EliminarExcelente
ResponderEliminarGenial Oswaldo! saludos.
Eliminartengo un problema puedo ver las tablas mas no puedo ver los campos ni los valoes -- [OJO4].[admin_saintTEST]..[saExis] no contiene columnas que se puedan seleccionar o el usuario actual no tiene permisos en ese objeto.
ResponderEliminarBuen tutorial y con un escenario al contrario?
ResponderEliminarTengo un servidor Debian 8 con syslog-ng, una bbdd mysql en dicho servidor donde registra los eventos del syslog en la bbd.
Por otro lado tengo una bbdd SQLServer, donde tengo que mandar los datos, he probado directamente desde el syslog-ng sin exito, es posible mandar los datos desde MySQL a SQLServer?
Gracias
buenas tardes, como podria hacer lo mismo pero ejecutando la sentencia select desde el mysql a una tabla de ms sql? gracias
ResponderEliminarEn tu problema comentas que quieres pasar datos de SQLSERVER hacia Mysql pero estas haciendo lo contrario estas pasando datos de Mysql hacia SQLSERVER
ResponderEliminarno se puede hacer la conexion desde mysql no tiene la funcionalidad
ResponderEliminar