Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Export d'une base SQL2008 vers SQL 2005

17 réponses
Avatar
Bill2
Bonjour à tous,

Je me trouve confronté à un joli pb.
Nous travaillons "en local" sur une base de données, pour tester une appli.
Cette base tourne sur SQL2008.

Dans cette base, nous importons un grand nb de données, histoire de vérifier
que tout fonctionne correctement.
Cette phase d'importation est assez longue, et nécessite la MAJ de plusieurs
tables.

Afin de ne pas nous embêter à refaire toutes les manips sur le serveur de
prod, je souhaiterai exporter les tables modifiées sur le serveur test, pour
les réimporter sur le serveur de prod.

Or le serveur de prod est un SQL2005.

J'ai tender un backup/restore de la base, mais j'ai une erreur :
La famille de support sur l'unité d:\....\MaBase.bak est incorrecte

Lors du backup, je précise pourtant à SQL2008 que je veux une base en
version SQL2005, mais rien n'a faire, pas moyen d'importer mes données.

Je ne peux pas simplement exporter mes tables dans des fichiers csv, j'ai
besoin de conserver la structure des tables.
Et bien entendu, les 2 serveurs ne sont pas connectables entre eux ...

Quelle solution me proposez vous ?

Merci d'avance.

--
Bill2
Utilisez Process Manager, gestionnaire de processus automatique :
http://www.bill2-software.com/processmanager/

7 réponses

1 2
Avatar
wpher56
Est-ce que tu pourrais détailler ta manière de faire ? Ma base source est
sous SQL Server 2008 x64/Windows Server 2008 x64, ma destination est sous
SQL server 2005 32bit / Windows Server 2003 32bit, et j'ai 308 tables à
transférer.

Pierrot




"zoltix" wrote in message
news:
On 23 fév, 07:40, "wpher56" wrote:
Il me semble que bcp n'est pas intégré au générateur de script: pour
autant
que j'aie pu en juger, bcp fonctionne au niveau table. J'en ai 308 dans ma
base, liées entre elles par des clés secondaires et une centaine de
triggers. Et quand je dis "ma" base, il s'agit en fait d'une base de
données
d'une application de gestion du parc informatique d'un fournisseur
externe.

Pierrot

"bruno reiter" wrote in message

news:

> bcp.exe est ton ami ;-)

> br

> "wpher56" wrote in message
>news:

>> "Med Bouchenafa" wrote in message
>>news:
>>> -Script data !!!
>>> Ils ont fait vraiment fort en 2008

>> Bof... J'ai une table History qui compte près de 2 mios de lignes; le
>> Script Data génère donc 2 mios d'Inserts, à exécuter séquentiellement !
>> Comme je le disais, à raison de 50 par seconde, cela fait quand même 10
>> heures rien que pour ça. Espérons que dans SQL 2012 il y aura un
>> "Script
>> Data Bulk Insert" !

>> Pierrot



Sur nos serveur de production, on est en 2005 et en test et deve on
est 2008.

On a fait un test de transfert de données entre 2008 vers 2005 avec
une table de 78 millions de donnée avec +300 champs varchar et 50
Boleans. On utilise le wizard import et export des données avec
l'option de recréation de la table. Ca a duré moins de 15
minutes......
Avatar
Fred BROUARD
Il suffit de faire un script en 3 parties :
1) la création des tables "brutes" sans PK, FK ni contraintes de
quelques sortes que ce soit.
2) insertion via BULK INSERT
3) passage des contraintes et index.

En moyenne vous divisez par 8 le temps de réponse.

Des ,outils comme Power AMC pour la rétro ingénié rie, sont astucieux,
parce que c'est se qu'ils font en standard !

A +

wpher56 a écrit :
Il me semble que bcp n'est pas intégré au générateur de script: pour
autant que j'aie pu en juger, bcp fonctionne au niveau table. J'en ai
308 dans ma base, liées entre elles par des clés secondaires et une
centaine de triggers. Et quand je dis "ma" base, il s'agit en fait d'une
base de données d'une application de gestion du parc informatique d'un
fournisseur externe.

Pierrot

"bruno reiter" wrote in message
news:
bcp.exe est ton ami ;-)

br

"wpher56" wrote in message
news:

"Med Bouchenafa" wrote in message
news:
-Script data !!!
Ils ont fait vraiment fort en 2008




Bof... J'ai une table History qui compte près de 2 mios de lignes; le
Script Data génère donc 2 mios d'Inserts, à exécuter séquentiellement
! Comme je le disais, à raison de 50 par seconde, cela fait quand
même 10 heures rien que pour ça. Espérons que dans SQL 2012 il y aura
un "Script Data Bulk Insert" !

Pierrot










--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Avatar
wpher56
"Fred BROUARD" wrote in message
news:%
Il suffit de faire un script en 3 parties :
1) la création des tables "brutes" sans PK, FK ni contraintes de quelques
sortes que ce soit.
2) insertion via BULK INSERT
3) passage des contraintes et index.

En moyenne vous divisez par 8 le temps de réponse.




Pour le 1 et le 3, je peux utiliser le générateur de script. Mais pour le 2,
je dois le faire pour CHAQUE table ? (j'en ai 308 dans ma base !)

Pierrot
Avatar
Med Bouchenafa
Avec un BULK INSERT, il n'est pas besoin de desactiver les contraintes et de
les reactiver. C'est fait par defaut
Un script comme ce qui suit te gere le code pour l'ensemble de tes tables
Tu peux jouer sur les options de BCP pour le personnaliser selon les besoins


DECLARE @databaseName SYSNAME,
@tableSchema SYSNAME,
@tableName SYSNAME


DECLARE crsTables CURSOR FOR SELECT Table_catalog,table_Schema, table_Name
FROM INFORMATION_SCHEMA.tables WHERE Table_Type = 'BASE TABLE'

OPEN crsTables
FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema, @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName + '
out "' + @tableName + '.bcp" -T -n'

--PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName + '
in "' + @tableName + '.bcp" -T -n'

FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema ,@tableName

END
CLOSE crsTables
DEALLOCATE crsTables

--
Bien cordialement
Med Bouchenafa


"wpher56" a écrit :


"Fred BROUARD" wrote in message
news:%
> Il suffit de faire un script en 3 parties :
> 1) la création des tables "brutes" sans PK, FK ni contraintes de quelques
> sortes que ce soit.
> 2) insertion via BULK INSERT
> 3) passage des contraintes et index.
>
> En moyenne vous divisez par 8 le temps de réponse.
>

Pour le 1 et le 3, je peux utiliser le générateur de script. Mais pour le 2,
je dois le faire pour CHAQUE table ? (j'en ai 308 dans ma base !)

Pierrot




Avatar
wpher56
Merci mille fois pour ce script. J'ai maintenant pu copier la base depuis
SQL 2008 vers SQL 2005 en moins de 15 minutes. J'ai constaté que le bulk
copy copie par groupe de 1000 lignes et qu'il lui avait fallu 24 secondes
pour copier une table de 2.2 mios de lignes, belle performance pour ce type
d'opération.

A bientôt pour d'autres aventures !
Pierrot


"Med Bouchenafa" wrote in message
news:
Avec un BULK INSERT, il n'est pas besoin de desactiver les contraintes et
de
les reactiver. C'est fait par defaut
Un script comme ce qui suit te gere le code pour l'ensemble de tes tables
Tu peux jouer sur les options de BCP pour le personnaliser selon les
besoins


DECLARE @databaseName SYSNAME,
@tableSchema SYSNAME,
@tableName SYSNAME


DECLARE crsTables CURSOR FOR SELECT Table_catalog,table_Schema, table_Name
FROM INFORMATION_SCHEMA.tables WHERE Table_Type = 'BASE TABLE'

OPEN crsTables
FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema, @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName + '
out "' + @tableName + '.bcp" -T -n'

--PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName +
'
in "' + @tableName + '.bcp" -T -n'

FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema ,@tableName

END
CLOSE crsTables
DEALLOCATE crsTables

--
Bien cordialement
Med Bouchenafa


"wpher56" a écrit :


"Fred BROUARD" wrote in message
news:%
> Il suffit de faire un script en 3 parties :
> 1) la création des tables "brutes" sans PK, FK ni contraintes de
> quelques
> sortes que ce soit.
> 2) insertion via BULK INSERT
> 3) passage des contraintes et index.
>
> En moyenne vous divisez par 8 le temps de réponse.
>

Pour le 1 et le 3, je peux utiliser le générateur de script. Mais pour le
2,
je dois le faire pour CHAQUE table ? (j'en ai 308 dans ma base !)

Pierrot






Avatar
Med Bouchenafa
Il ne faut ne pas se fier au message disant 1000 lignes....
Si tu ne specifies pas d'option -b, BCP fait tout en une seule transaction.

Pour les grosses tables, je pense que tu gagnerais a rajouter une option -b
Tu peux aussi tres certainement reduire ton temps en passant la base 2005 en
mode BULK LOGGED avant insertion et la remettre a FULL apres insertion


Pour les tres grosses tables, j'utilise sur le meme principe un script qui
me divise ma table en 10+ fichiers (Voir parametres F et L de BCP)
Je lance alors tous les BCP in en parallele et les temps d'insertion sont
alors eblouissants

--
Bien cordialement
Med Bouchenafa


"wpher56" a écrit :

Merci mille fois pour ce script. J'ai maintenant pu copier la base depuis
SQL 2008 vers SQL 2005 en moins de 15 minutes. J'ai constaté que le bulk
copy copie par groupe de 1000 lignes et qu'il lui avait fallu 24 secondes
pour copier une table de 2.2 mios de lignes, belle performance pour ce type
d'opération.

A bientôt pour d'autres aventures !
Pierrot


"Med Bouchenafa" wrote in message
news:
> Avec un BULK INSERT, il n'est pas besoin de desactiver les contraintes et
> de
> les reactiver. C'est fait par defaut
> Un script comme ce qui suit te gere le code pour l'ensemble de tes tables
> Tu peux jouer sur les options de BCP pour le personnaliser selon les
> besoins
>
>
> DECLARE @databaseName SYSNAME,
> @tableSchema SYSNAME,
> @tableName SYSNAME
>
>
> DECLARE crsTables CURSOR FOR SELECT Table_catalog,table_Schema, table_Name
> FROM INFORMATION_SCHEMA.tables WHERE Table_Type = 'BASE TABLE'
>
> OPEN crsTables
> FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema, @tableName
> WHILE @@FETCH_STATUS = 0
> BEGIN
> PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName + '
> out "' + @tableName + '.bcp" -T -n'
>
> --PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName +
> '
> in "' + @tableName + '.bcp" -T -n'
>
> FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema ,@tableName
>
> END
> CLOSE crsTables
> DEALLOCATE crsTables
>
> --
> Bien cordialement
> Med Bouchenafa
>
>
> "wpher56" a écrit :
>
>>
>> "Fred BROUARD" wrote in message
>> news:%
>> > Il suffit de faire un script en 3 parties :
>> > 1) la création des tables "brutes" sans PK, FK ni contraintes de
>> > quelques
>> > sortes que ce soit.
>> > 2) insertion via BULK INSERT
>> > 3) passage des contraintes et index.
>> >
>> > En moyenne vous divisez par 8 le temps de réponse.
>> >
>>
>> Pour le 1 et le 3, je peux utiliser le générateur de script. Mais pour le
>> 2,
>> je dois le faire pour CHAQUE table ? (j'en ai 308 dans ma base !)
>>
>> Pierrot
>>
>>




Avatar
wpher56
En fait, j'ai une seule grosse table de 2.2 mios de lignes, 5 autres de
200'000 lignes, et environ 300 petites tables, de 0 à qques milliers de
lignes. Donc à part la grosse table qui prend 20-30 secondes, je ne vais pas
gagner des tonnes avec les autres tables. D'autant plus que le passage de
2008 à 2005 est une opération unique, on ne va pas la faire tous les jours.
Ceci étant, le bcp a échoué sur 5 tables avec l'erreur suivante:

Error = [Microsoft][SQL Native Client][SQL Server]INSERT failed because the
following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify
that SET options are correct for use with indexed views and/or indexes on
computed columns and/or query notifications and/or xml data type methods.

Toutes ces tables ont une colonne calculée, avec un index. Comme il n'est
pas question de modifier la structure et/ou les paramètres des tables, j'ai
cherché une autre solution, et j'ai finalement pu charger ces tables en
utilisant Export Data depuis SQL Server 2008, en cochant l'option "Enable
identity insert" dans le Column Mappings de ces tables.

Vers 3 heures du matin dimanche, la base était opérationnelle sous SQL
Server 2005. Merci beaucoup pour ton soutien

Pierrot




"Med Bouchenafa" wrote in message
news:
Il ne faut ne pas se fier au message disant 1000 lignes....
Si tu ne specifies pas d'option -b, BCP fait tout en une seule
transaction.

Pour les grosses tables, je pense que tu gagnerais a rajouter une
option -b
Tu peux aussi tres certainement reduire ton temps en passant la base 2005
en
mode BULK LOGGED avant insertion et la remettre a FULL apres insertion


Pour les tres grosses tables, j'utilise sur le meme principe un script qui
me divise ma table en 10+ fichiers (Voir parametres F et L de BCP)
Je lance alors tous les BCP in en parallele et les temps d'insertion sont
alors eblouissants

--
Bien cordialement
Med Bouchenafa


"wpher56" a écrit :

Merci mille fois pour ce script. J'ai maintenant pu copier la base depuis
SQL 2008 vers SQL 2005 en moins de 15 minutes. J'ai constaté que le bulk
copy copie par groupe de 1000 lignes et qu'il lui avait fallu 24 secondes
pour copier une table de 2.2 mios de lignes, belle performance pour ce
type
d'opération.

A bientôt pour d'autres aventures !
Pierrot


"Med Bouchenafa" wrote in message
news:
> Avec un BULK INSERT, il n'est pas besoin de desactiver les contraintes
> et
> de
> les reactiver. C'est fait par defaut
> Un script comme ce qui suit te gere le code pour l'ensemble de tes
> tables
> Tu peux jouer sur les options de BCP pour le personnaliser selon les
> besoins
>
>
> DECLARE @databaseName SYSNAME,
> @tableSchema SYSNAME,
> @tableName SYSNAME
>
>
> DECLARE crsTables CURSOR FOR SELECT Table_catalog,table_Schema,
> table_Name
> FROM INFORMATION_SCHEMA.tables WHERE Table_Type = 'BASE TABLE'
>
> OPEN crsTables
> FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema, @tableName
> WHILE @@FETCH_STATUS = 0
> BEGIN
> PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName +
> '
> out "' + @tableName + '.bcp" -T -n'
>
> --PRINT 'BCP ' + @databaseName + '.' + @tableSchema + '.' + @tableName
> +
> '
> in "' + @tableName + '.bcp" -T -n'
>
> FETCH NEXT FROM crsTables INTO @databaseName,@tableSchema ,@tableName
>
> END
> CLOSE crsTables
> DEALLOCATE crsTables
>
> --
> Bien cordialement
> Med Bouchenafa
>
>
> "wpher56" a écrit :
>
>>
>> "Fred BROUARD" wrote in message
>> news:%
>> > Il suffit de faire un script en 3 parties :
>> > 1) la création des tables "brutes" sans PK, FK ni contraintes de
>> > quelques
>> > sortes que ce soit.
>> > 2) insertion via BULK INSERT
>> > 3) passage des contraintes et index.
>> >
>> > En moyenne vous divisez par 8 le temps de réponse.
>> >
>>
>> Pour le 1 et le 3, je peux utiliser le générateur de script. Mais pour
>> le
>> 2,
>> je dois le faire pour CHAQUE table ? (j'en ai 308 dans ma base !)
>>
>> Pierrot
>>
>>






1 2