Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/04/2007, 10h46   #1
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
Par défaut [Talend] Copie BDD complete (MS SQL Server 05 -> Mysql)

Bonjour,

J'aimerai dupliquer d'un SGBD (SQL Server) à un autre SGBD (MySQL), une base de données complete de plusieurs tables sans avoir à faire chaque table indépendament.

Est ce possible avec Talend ? (Pour le moment, je n'y arrive pas)
Si oui, comment ?

Merci

G
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2007, 00h25   #2
co2
Membre émérite
 
Avatar de co2
 
Inscription : mai 2002
Messages : 182
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 182
Points : 823
Points : 823
Envoyer un message via Skype™ à co2
Citation:
Envoyé par GGGGG
Bonjour,

J'aimerai dupliquer d'un SGBD (SQL Server) à un autre SGBD (MySQL), une base de données complete de plusieurs tables sans avoir à faire chaque table indépendament.

Est ce possible avec Talend ? (Pour le moment, je n'y arrive pas)
Si oui, comment ?

Merci

G
Peux tu nous donner un peu plus de detail (version de TOS que tu utilises, generation en perl ou en java...). De plus, est ce que la structure dans ton MySQL est deja creee (et que tu as juste à faire une migration de données) ou bien cherches tu aussi à créer la structure dans MySQL?
Ou es tu bloquer dans la creation de ton job, qu'as tu reussi à faire?

Voila qq elements tout de meme

Avoir les listes des tables en provenance de M$ SQL Server :
Dans un tMSSqlInput, indique comme schéma un unique champ (que l'on nomera tablename) et spécifie comme requete
soit
SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE'
ou bien si tu preferes appeler la proc stock prévue à cet effet spécifie plutot :
SELECT name FROM sysobjects WHERE type='U'

Chacune des tables de ta base de données va donc arriver row apres row et sera disponible par exemple via la variable $tMSSqlInput_1['tablename'] ($tMSSqlInput_1 est le nom du composant, tablename le nom du champs dans le schéma de sortie du tMSSqlInput). Pour écrire un fichier dump portant le nom de la table en question (row apres row soit table apres table) je ne connais pas de tete comment faire dans M$ SQLServer (un peu de googling devrait te donner la solution, le mieux cela serait de paramètrer la facon de faire le dump afin qu'il soit conforme aux données d'entrées de ta base de données).
Cela constitut le sous job 1. Tu le relies avec un runBefore au sous job 2.
Le sous job2 va consister en un tFileList (lire tous tes fichiers de dump sql server) afin de les insérer en bulk dans la table correspondante MySQL (composant tMysqlOutputBulkExec dont le champ table sera rempli par le nom du fichier via la variable $_globals{tFileList_1}{CURRENT_FILE}. N'oublie pas d'utiliser l'autocomplétion via Ctrl+Space pour que TOS écrive tout seul les différents nom de variables disponibles).
En quelques composants tu devrais pouvoir y arriver!
Le truc un peu compliqué dans ton cas c'est que tu ne connais pas à l'avance le schéma des tables que tu veux manipuler.

J'espere que ces qq pistes te permettrons de résoudre ton problème!
Cédric
co2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2007, 12h21   #3
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
Merci pour votre réponse
J’utilise la dernière version de TOS (TOS-Win32-r3065-V2.0.0) avec la génération en java.
La structure MYSQL n’est pas crée car il y a un 25 tables donc c’est assez lourd et j’aimerai faire avoir un job qui soit indépendant de ma structure de table afin de le réutiliser en ayant juste a changer le SGBD source et destinataire

Comme je n’etais pas sur de la faisabilité de ce que je demande, je n’ai pas fait grand chose hormis les DB connections aux 2 SGBD.

J’ai suivi vos recommandations. J’ai donc pour la 1ere partie :

tDBInput ----------------------------------------> tExternalSortOutput

Si j’ai bien compris, je dois obtenir en lançant uniquement ce job, autant de fichier nom_de_table.txt que de table dans ma base.

Quelques questions :
1 – Lorsque j’entre la requête : "SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE'", j’ai un schéma construit par defaut qui contient :
Catalog_name, Default_Character_..., …, … Schema_Name et Schema_Owner.
Pourquoi remplacer tout par tablename ?

2 - Pour créer mes fichiers, j’ai mis comme filename : « C:/... /workspace/"$tMSSqlInput_1['tablename']".txt" mais visiblement, ca ne convient pas. Quelle serait la chaine a mettre ?

3 – Une fois que j’ai mes fichiers, il me reste juste à faire un select * from table pour récupérer toutes mes données (le sous job 3) ?

Merci par avance

Guillaume
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 11h40   #4
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
Un pti up
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 12h24   #5
co2
Membre émérite
 
Avatar de co2
 
Inscription : mai 2002
Messages : 182
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 182
Points : 823
Points : 823
Envoyer un message via Skype™ à co2
Citation:
Envoyé par GGGGG
Merci pour votre réponse
J’utilise la dernière version de TOS (TOS-Win32-r3065-V2.0.0) avec la génération en java.
La structure MYSQL n’est pas crée car il y a un 25 tables donc c’est assez lourd et j’aimerai faire avoir un job qui soit indépendant de ma structure de table afin de le réutiliser en ayant juste a changer le SGBD source et destinataire
Tu n'as que 25 tables! J'avais compris que tu en avais vraiment bcp plus! Dans ce cas pas besoin de faire un sous job pour reccuperer le nom des tables et faire ddes jobs un trop generiques...

1/ Dans ce cas, tu peux deja créer en masse les schémas sources adaptés. (via le repository>Metadata>DbCon>Create DBCon puis create Table Schema, select all...)

2/ Ensuite tu crees un DBCon (via le repository>Metadata>DbCon>Create DBCon) pour ta base de données de sortie (ne cree pas de schema, utilise plutot les fonctions d'autopropagate de tes schemas sources)

3/ Creer un job et depose un tDBMSSQLInput, un tMySQLOutput, relie les via un lien row (bouton droit sur le tDBMSSQLInput)

4/ Configure le tMSSQLInput avec la DBCON source définie en 1/, met le schemaType sur Repository et configure le
tMySQLOutput avec la DBCON définie en 2/. Ajoute l'action 'Create Table if not exist' (ou drop and create table suivant si tu veux faire un annule et remplace à chaque fois que tu fais tourner ton job) dans ton tMySQLOutput

5/ Ensuite "copy/paste" ton mini-job 24 fois . Sur chacun de tes tMSSQLInput, selectionne le schema suivant et clique sur le bouton GuessQuery

6/C'est fini, normalement tu as fait cette opération en moins d'un 1 heure et tu as 25 jobs indépendants ce qui va te permettrent de pouvoir facilement et graphiquement les séquencer (relie les différents tMSSqlInput via des liens RunBefore, RunAfter) suivant l'ordre que tu veux (tu as ders tables peres à insérer avant des tables filles) surtout si ton MySQL est en InnoDB et que tu as des foreign keys, gerer les erreurs independamment pour chacune de tes 25 réplications, de rajouter pour certaines tables des transformations spécifiques (ajout d'un tMap au milieu, utilisation d'une routine spécifique, utiliser les fonctions de date car tu as besoin d'un format un peu différent entre ta source et ta destination)...

Bon courage!
Cédric
co2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 17h25   #6
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
Merci pour ta réponse !

Je suis entrain de bencher ma machine avec ce gros job ^^ ca mouline depuis 10min
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 12h09   #7
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
Alors j'ai eu une erreur et en regardant dans les proprietés, il n'etait pas possible de lui dire de créer la table si elle n'existait pas :/



J'ai lancé Talend V2 M1 et il ya :
Action on table et Action on data

C'etait juste pour faire remonter l'info, jvais utiliser la M1 pour faire mes jobs
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2007, 12h38   #8
co2
Membre émérite
 
Avatar de co2
 
Inscription : mai 2002
Messages : 182
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 182
Points : 823
Points : 823
Envoyer un message via Skype™ à co2
Citation:
Envoyé par GGGGG
Alors j'ai eu une erreur et en regardant dans les proprietés, il n'etait pas possible de lui dire de créer la table si elle n'existait pas :/



J'ai lancé Talend V2 M1 et il ya :
Action on table et Action on data

C'etait juste pour faire remonter l'info, jvais utiliser la M1 pour faire mes jobs
En fait cette option n'est pas disponible pour les composants Java mais disponible pour les composants perl.
Je te conseille de rester en Talend V2.0.0 et d'utiliser un projet de type Perl si tu as besoin de cette fonction.

Cédric
co2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 15h29   #9
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
Bonjour,
Je finis par posté l'erreur que j'ai, aprés m'etre cassé la tete dessus pendant un bon moment :/ C'est surement un truc tout simple mais je trouve pas
J'ai recré un projet en Perl pour pouvoir agir sur les tables et notamment faire le fameux "Create Table if Not Exist".
Lorsque je lance le job (sur une table n'ayant pas de clé étrangere) j'obtiens une erreur :
Citation:
can't create table at ------------\TOS-Win32-r3065-V2.0.0\workspace\.Perl\ PERL.job_a_tableindep.pl line 280.
Issuing rollback() for database handle being DESTROY'd without explicit disconnect().
J'ai essayé en laissant le champ table vide et avec le champ table précisé et j'obtiens toujous cette erreur.



Si vous avez une idée car je suis vraiment coincé
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2007, 17h44   #10
Membre habitué
 
Avatar de GGGGG
 
Inscription : janvier 2007
Messages : 149
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2007
Messages : 149
Points : 143
Points : 143
La suite labas : http://talendforge.org/forum/viewtop...pid=2579#p2579

Pour résumer, je pensais que Talend recuperai la taille des char de MS SQL Server mais en fait il faut les préciser. Rbillerey du support Talend m'a donné un tip interessant afin de verifier le code sql generé par Talend. Il faut editer le fichier :
Citation:
***********\TOS-Win32-r3065-V2.0.0\plugins\org.talend.designer.components.localprovider_2.0.0.r3065\components\tMysqlOutput\modules\tMysqlOutput
pour un mysqloutput et retirer les "#" a la fin.
On obtient dans la console d'erreur le code sql et on voit donc plus simplement la ou on s'est planté.

Un grand merci a RBillerey et Cedric pour leur aide.
GGGGG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 11h46   #11
Invité de passage
 
Inscription : janvier 2006
Messages : 15
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2006
Messages : 15
Points : 1
Points : 1
Envoyer un message via MSN à lusitano11
Citation:
Envoyé par co2 Voir le message
Tu n'as que 25 tables! J'avais compris que tu en avais vraiment bcp plus! Dans ce cas pas besoin de faire un sous job pour reccuperer le nom des tables et faire ddes jobs un trop generiques...

1/ Dans ce cas, tu peux deja créer en masse les schémas sources adaptés. (via le repository>Metadata>DbCon>Create DBCon puis create Table Schema, select all...)

2/ Ensuite tu crees un DBCon (via le repository>Metadata>DbCon>Create DBCon) pour ta base de données de sortie (ne cree pas de schema, utilise plutot les fonctions d'autopropagate de tes schemas sources)

3/ Creer un job et depose un tDBMSSQLInput, un tMySQLOutput, relie les via un lien row (bouton droit sur le tDBMSSQLInput)

4/ Configure le tMSSQLInput avec la DBCON source définie en 1/, met le schemaType sur Repository et configure le
tMySQLOutput avec la DBCON définie en 2/. Ajoute l'action 'Create Table if not exist' (ou drop and create table suivant si tu veux faire un annule et remplace à chaque fois que tu fais tourner ton job) dans ton tMySQLOutput

5/ Ensuite "copy/paste" ton mini-job 24 fois . Sur chacun de tes tMSSQLInput, selectionne le schema suivant et clique sur le bouton GuessQuery

6/C'est fini, normalement tu as fait cette opération en moins d'un 1 heure et tu as 25 jobs indépendants ce qui va te permettrent de pouvoir facilement et graphiquement les séquencer (relie les différents tMSSqlInput via des liens RunBefore, RunAfter) suivant l'ordre que tu veux (tu as ders tables peres à insérer avant des tables filles) surtout si ton MySQL est en InnoDB et que tu as des foreign keys, gerer les erreurs independamment pour chacune de tes 25 réplications, de rajouter pour certaines tables des transformations spécifiques (ajout d'un tMap au milieu, utilisation d'une routine spécifique, utiliser les fonctions de date car tu as besoin d'un format un peu différent entre ta source et ta destination)...

Bon courage!
Cédric
Bonjour,

J'aimerai faire le même exercice mais avec 75 tables, que conseil tu comme autre méthode ?
J'ai téléchargé Talend 4.0.3 et j'ai une base oracle vers une base postgresql...

Merci d'avance pour ta résponse !

@#
lusitano11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h13.


 
 
 
 
Partenaires

Hébergement Web