Vous êtes sur la page 1sur 5

02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience

Carrire
La vie du blog

BI experience

la BI en gnral
Dfinitions
Datawarehouse
Mode projet
News
ETL
SSIS
Talend
Autre
Reporting
SSRS
Reporting open source
Sharepoint
BO
SSAS
Autre
SGBD
SQL
BDD
Data management
Big data
Data quality
Master Data Management
Infrastructure
vnements

Copier une base de donnes vers une autre avec Talend


25 aot 2011 par maryam khiali | 1 Commentaire

Depuis la version 4.1.2, Talend a sorti une option assez remarquable :le Dynamic Schema

Je vous propose dans ce post de dtailler la dmarche que nous avons adopte pour lalimentation de notre infocentre : copie des diffrentes bases de donnes de la
socit partir desquelles le datawarehouse est aliment.

Un simple job sera ralis pour amener les donnes dune base de donnes source vers une base de donnes cible :

Voici loption en question que vous pourrez utiliser dans votre input:

Et si vous avez des rgles de gestion ajouter nhsitez pas avec le tJavaFlex :

http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 1/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
/**lexemple de traitement en plus lisible**/
for(int i = 0; i < row3.dyn_Col.metadatas.size(); i++) { row3.dyn_Col.metadatas.get(i).setName(row3.dyn_Col.metadatas.get(i).getName().toLowerCase());
}

Ce job, dcrit ci-dessus, est appel ainsi par un job pre qui lui donne le contexte contenant le nom de la table courante migrer :

Une variable de context est passe au sous job (monsousjobcopie) : my_current_table

Linput requte sur une table de paramtrage. En effet nous navons pas forcment besoin de toutes les tables de toutes les bases de donnes. Donc travers une table
de paramtrage nous choisissons celle que lon veut migrer :

Ce job pre appelle aussi un autre sous job qui lui va permettre de migrer les indexes :

Donc pour chaque table on fera un appel une routine (code quil y a dans le tJava):

routines.IndexMigrer.migrate_index(((java.sql.Connection)globalMap.get( conn_tMSSqlConnection_2)), ((String)globalMap.get( current_TABLE.nom_table )),


((java.sql.Connection)globalMap.get( conn_tPostgresqlConnection_4)),context.Cible_Schema + (String)globalMap.get( schema ) + . +
((String)globalMap.get( current_TABLE.nom_table )));

Et en bonus voici la routine que nous avons cre qui selon la base de donnes (Oracle, Posgres, SQL Server 2000 ou SQL Server 2005) va requter dans la bonne
table systme :

/***************Routines migration indexes ************************/

public class IndexMigrer {


public static void migrate_index(Connection org_connect, String org_nomtable,
Connection dest_connect, String dest_nomtable) throws java.sql.SQLException
{
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase( Microsoft SQL Server ) )
{
Statement stat = org_connect.createStatement();
ResultSet rs;
if(org_connect.getMetaData().getDatabaseMajorVersion()==9)
{
rs=stat.executeQuery( SELECT IDX.name as index_name, COL.name as column_name FROM sys.index_columns IDXC
+ INNER JOIN sys.objects OBJ
+ ON IDXC.object_id = OBJ.object_id
+ INNER JOIN sys.schemas SCH
+ ON SCH.schema_id = OBJ.schema_id
+ INNER JOIN sys.indexes IDX
+ ON (IDXC.object_id = IDX.object_id AND IDXC.index_id = IDX.index_id)
+ INNER JOIN sys.columns COL
+ ON (IDXC.column_id = COL.column_id AND OBJ.object_id = COL.object_id)
+ where OBJ.name=\ +org_nomtable+ \
+ ORDER BY OBJ.name );
}
else
{
rs=stat.executeQuery( select i.name as index_name,c.name as column_name
+ from sysindexkeys as indk
+ inner join sysindexes as i on
+ (indk.indid=i.indid and indk.id=i.id )
+ inner join syscolumns as c on
+ (indk.colid=c.colid and indk.id=c.id )
+ inner join sysobjects as o on
+ (indk.id=o.id)
+ and o.name=\ +org_nomtable+ \
+ ORDER BY o.name );
}
Map m =new HashMap();
Map m_key=new HashMap();
while(rs.next())
{
if(!m.containsKey(rs.getString(1)))
{
List l = new ArrayList();
l.add(rs.getString(2));
m.put(rs.getString(1),l);
m_key.put(rs.getString(1), rs.getString(1));
}

http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 2/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
else if(m.containsKey(rs.getString(1)))
{
List l=(List)m.get(rs.getString(1));
l.add(rs.getString(2));
m.put(rs.getString(1),l);
}
}
StringBuffer sb=new StringBuffer();
for (Iterator i = m.keySet().iterator() ; i.hasNext();){
String key = (String)i.next();
sb.append( CREATE INDEX );
sb.append( IDX_ +key);
sb.append( ON +dest_nomtable+ ( );
List l=(List)m.get(key);
for(int j=0;j<l.size();j++)
{
sb.append(l.get(j));
if(j!=l.size()-1)
sb.append( , );
}
sb.append( );\n );
}
try{
Statement bla=dest_connect.createStatement();
System.out.println( +sb.toString());
bla.execute(sb.toString());
}
catch (java.sql.SQLException e)
{
//System.out.println(dest_nomtable);
System.out.println(e.getMessage());
}
dest_connect.commit();
//System.out.println(dest_nomtable);
}
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase( PostgreSQL ))
{
Statement stat = org_connect.createStatement();
ResultSet rs=stat.executeQuery( SELECT indkey as colonne_index,pci.relname as nom_index,pct.relname as nom_table from pg_index as pi
+ , pg_class as pci, pg_class as pct
+ where pci.oid=pi.indexrelid
+ and pct.oid=pi.indrelid and pct.relname not like pg_% and pct.relname= +org_nomtable+ );
while( rs.next())
{
String s=rs.getString(1);
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(s, );
List <Integer> num_columns=new ArrayList();
while ( tokenizer.hasMoreTokens() ) {
num_columns.add(Integer.parseInt(tokenizer.nextToken()));
}
Statement sel=org_connect.createStatement();
ResultSet rsset=sel.executeQuery( SELECT * from +org_nomtable+ LIMIT 1);
StringBuffer sb=new StringBuffer();
sb.append( CREATE INDEX +rs.getString(2)+ ON +dest_nomtable+ ( );
Iterator i=num_columns.iterator();
while(i.hasNext())
{
sb.append(rsset.getMetaData().getColumnLabel((Integer)i.next()));
if(i.hasNext())
sb.append( , );
}
sb.append( ) ;\n );
Statement bla=dest_connect.createStatement();
bla.execute(sb.toString());
dest_connect.commit();
bla.close();

}
}
if(org_connect.getMetaData().getDatabaseProductName().equalsIgnoreCase( Oracle ))
{
Statement stat = org_connect.createStatement();
ResultSet rs=stat.executeQuery( SELECT col.index_name,col.column_name FROM all_indexes cons INNER JOIN all_ind_columns col ON cons.owner = col.index_owner AND
cons.index_name = col.index_name WHERE OWNER = AEFE AND cons.table_name=\ +org_nomtable+ \ );
Map m =new HashMap();
Map m_key=new HashMap();
while(rs.next())
{
if(!m.containsKey(rs.getString(1)))
{
List l = new ArrayList();
l.add(rs.getString(2));
m.put(rs.getString(1),l);
m_key.put(rs.getString(1), rs.getString(1));
}
else if(m.containsKey(rs.getString(1)))
{
List l=(List)m.get(rs.getString(1));
l.add(rs.getString(2));
m.put(rs.getString(1),l);
}
}
StringBuffer sb=new StringBuffer();
for (Iterator i = m.keySet().iterator() ; i.hasNext();){
String key = (String)i.next();
sb.append( CREATE INDEX );
sb.append( IDX_ +key);

http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 3/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
sb.append( ON +dest_nomtable+ ( );
List l=(List)m.get(key);
for(int j=0;j<l.size();j++)
{
sb.append(l.get(j));
if(j!=l.size()-1)
sb.append( , );
}
sb.append( );\n );
}
Statement bla=dest_connect.createStatement();
System.out.println( +sb.toString());
bla.execute(sb.toString());
dest_connect.commit();

}}}

Trs important, si un problme de typage persiste nhsitez pas modifier les fichiers de mapping dans :

Ces fichiers sont utiles et simples utiliser puisquils


permettent de connaitre les transformations de typage. En gros voici comment procde Talend :

typage BDD source => typage JAVA => typage BDD cible

Exemple dutilisation :

ma base de donnes source est SQL server et ma base de donnes cible est postgres :

La dmarche sera donc daller dans MSSQL_mapping.xml et de regarder la rubrique : <dbToTalendTypes> pour voir en quel type Java les typages de ma base de
donnes MSSQL seront transforms. Ensuite il faudra regarder dans postgres_mapping.xml pour regarder les typages par dfault que propose Talend dans la
rubrique <talendToDbTypes> pour la retransformation des types JAVA en typages postgres.

Vous pourrez ainsi personnaliser ces transformations.

Si ces fichiers sont modifis il faudra bien sr les rpercuts sur tous les clients TIS et sur le serveur dans les workspaces dans:

.JAVA > src > xmlMappings


et dans .JAVA > classes > xmlMappings

Jespre que ce post vous aura permis de voir les possibilits quoffre la solution Talend pour ce genre de besoin.

Nhsitez pas poster pour donner votre opinion!

Catgories : Talend | Mots-cls : Base de donnes, dynamic schema, Talend, TIS | Lien Permanent

Un Commentaire

Rpondre

1.
Aurelien
27 mars 2012 21 h 19 min
http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 4/5
02/11/2017 Copier une base de donnes vers une autre avec Talend | BI experience
Ce topic est super !
Mais pourrait-on aller plus loin en effectuant un update/insert ?
Jai essay, mais bloc toujours sur le fait de ne pas pouvoir dfinir en variable de context le nom dun champ dans un schema.
Auriez-vous une ide ?

Merci

Laisser un commentaire
Champs Requis *.

Nom *

Adresse de contact *

Site web

Message *

Laisser un commentaire

Article Prcdent
Article Suivant

Recherche

Rechercher

Archives
Choisir un mois
Bienvenue, BI experience tentera, je l'espre, d'apporter des explications sur des concepts et astuces BI que je rencontre au fil du temps. En esprant vous aider,
n'hsitez pas, commentez. Bonne visite! khiali.maryam@yahoo.fr

Livres Amazon sur la Business Intelligence

Commentaires rcents

DeciVision dans Le leader mondial Business Object


ADJE Cyrille dans ODS vs Staging Area
Sonia dans Cube SSAS dynamique

Flux RSS

Femme ingnieure
Reportservertempdb grossit de manire significative
SQL server Index et statistiques

http://infodecisionnel.com/etl/talend/copier-une-base-de-donnees-vers-une-autre-avec-talend/ 5/5