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

WD12/MySQL - Archivage de données

15 réponses
Avatar
I.G.LOG
Bonjour,
Je voudrais implémenter dans mon appli un système d'archivage "sélectif" des
données. Par exemple permettre à l'utilisateur d'archiver tous les documents
d'un client antérieurs à une date donnée. A votre avis, quel est le meilleur
moyen pour y arriver ? Est ce, par exemple, en créant toutes les tables
nécessaires vides en ensuite en recopiant les données une à une ou
existe-t-il un système plus pratique, notamment grace au langage sql ?
Faut-il envisager une gestion de répertoires dans lesquels on stockerait les
archives (mais dans ce cas, comment procéder avec une base relationnelle
comme MySQL) ? Par la même occasion, peut on raisonnablement envisager un
système de restauration ? etc...
Pour information, mon appli utilise une centaine de tables, bien sûr liées
entre elles par de multiples clés.
En somme j'aurais besoin de vos avis pour avoir un début de piste qui ne me
mène pas dans une impasse.
Merci à tous

10 réponses

1 2
Avatar
Firetox
Bonjour,

"I.G.LOG" a écrit dans le message de
news:49ec90ff$0$12645$
Bonjour,
Je voudrais implémenter dans mon appli un système d'archivage "sélectif"
des données. Par exemple permettre à l'utilisateur d'archiver tous les
documents d'un client antérieurs à une date donnée. A votre avis, quel est
le meilleur moyen pour y arriver ?


des script SQL reprenant toutes les tables concernées par la sauvegarde
dans un script par exemple les données commande et ligne de commandes qui
vont avec

Est ce, par exemple, en créant toutes les tables nécessaires vides en
ensuite en recopiant les données une à une ou existe-t-il un système plus
pratique, notamment grace au langage sql ?


a toi de voir si tu veux aussi sauvé la strucutre des tables
en mySQL le fait de pouvoir faire create table Matable if notExists evite
au script de ce planter
sur la creation (sinon prevoir le cas)

Faut-il envisager une gestion de répertoires dans lesquels on stockerait
les archives (mais dans ce cas, comment procéder avec une base
relationnelle comme MySQL) ?


difficile mais pas impossible, mais c'est du pur mySQL pour manipuler
correctement les fichiers bases
mais cela enleve le fait d'avoir un client seul dans la sauvegarde

Par la même occasion, peut on raisonnablement envisager un système de
restauration ? etc...


avec les fichiers script tu peux prevoir aussi un delete ou agir d'une
certaine façon suivant si la ligne existe deja ou non
avec les commandes de mySQL il y a des options comme replace ou alors faire
un delete avant dans une meme transaction avec le script

Pour information, mon appli utilise une centaine de tables, bien sûr liées
entre elles par de multiples clés.
En somme j'aurais besoin de vos avis pour avoir un début de piste qui ne
me mène pas dans une impasse.


j'utilise ce mecanisme avec les bases SQLite (et mySQL) ou je sauve en
script avec un delete devant. pour les sauvegardes particulieres je propose
l'option effacer avant les commandes de meme N° , ou alors les remplacer ou
alors ne rien faire c'et au choix. le script sera modifié en consequence. la
restauration devient simple lire le script et executer les requetes.

Merci à tous



Bon dev
@+
Avatar
I.G.LOG
Bonjour Firetox

des script SQL reprenant toutes les tables concernées par la sauvegarde
dans un script par exemple les données commande et ligne de commandes qui
vont avec




si je comprend bien un script contient plusieurs commandes SQL (ou requetes
plutot) ?! Dans ce cas, comment l'exécuter sous windev ?

a toi de voir si tu veux aussi sauvé la strucutre des tables
en mySQL le fait de pouvoir faire create table Matable if notExists evite
au script de ce planter sur la creation (sinon prevoir le cas)




si j'utilise create table, la base MySQL va s'alourdir avec des données dont
on n'a pas forcement besoin. A moins de créer une autre base nommée
"sauvegarde" par exemple. C'est le principe ?

difficile mais pas impossible, mais c'est du pur mySQL pour manipuler
correctement les fichiers bases
mais cela enleve le fait d'avoir un client seul dans la sauvegarde




En fait, je voudrais pouvoir cumuler plusieurs clients dans ces tables; pour
créer une sauvegarde annuelle par exemple.

...
alors ne rien faire c'et au choix. le script sera modifié en consequence.
la restauration devient simple lire le script et executer les requetes.




dans ce cas le script doit etre construit dynamiquement ?

Encore merci
Avatar
Firetox
Bonjour,

si je comprend bien un script contient plusieurs commandes SQL (ou
requetes plutot) ?! Dans ce cas, comment l'exécuter sous windev ?


exactement ensuite soit ut as un acces qui peux executer plusieurs requete
(mySQL4WD en version 2.002) ou alors prendre chaque ligne (du moins separé
par ; comme une requete et tu l'execute
ou encore envoyer le fichier en ligne de commande a mySQL

si j'utilise create table, la base MySQL va s'alourdir avec des données
dont on n'a pas forcement besoin. A moins de créer une autre base nommée
"sauvegarde" par exemple. C'est le principe ?


l'interet d'avoir le create table dans la sauvegarde est que tu peux
executer le script dans une base vide
ton fichier script peux avoir par exemple :

CREATE TABLE parametres (Code_ID CHAR(10) NOT NULL , Libelle CHAR(50)
,Texte CHAR(255) ,Numerique INTEGER ,Date DATETIME ,Heure TIME
,Param_ID CHAR(50) NOT NULL ,VDecimal DOUBLE );
CREATE INDEX IDX_parametres_Code_ID ON parametres(Code_ID);
CREATE INDEX IDX_parametres_Param_ID ON parametres(Param_ID);
DELETE FROM parametres;
INSERT INTO parametres
(Code_ID,Libelle,Texte,Numerique,Date,Heure,Param_ID,VDecimal) VALUES ('1' ,
'Taux TVA' , '' , 0 , '' , '' , 'TVA' , 5.5 );
INSERT INTO parametres
(Code_ID,Libelle,Texte,Numerique,Date,Heure,Param_ID,VDecimal) VALUES ('2' ,
'Taux TVA' , '' , 0 , '' , '' , 'TVA' , 19.6 );
INSERT INTO parametres
(Code_ID,Libelle,Texte,Numerique,Date,Heure,Param_ID,VDecimal) VALUES ('1' ,
'Type de matieres' , 'Poudre' , 0 , '' , '' , 'TYPEMATIERE' , 0 );
INSERT INTO parametres
(Code_ID,Libelle,Texte,Numerique,Date,Heure,Param_ID,VDecimal) VALUES ('2' ,
'Type de matieres' , 'Pastilles' , 0 , '' , '' , 'TYPEMATIERE' , 0 );

En fait, je voudrais pouvoir cumuler plusieurs clients dans ces tables;
pour créer une sauvegarde annuelle par exemple.


la tu peux puisque les lignes insert changeront

dans ce cas le script doit etre construit dynamiquement ?


oui et meme les inserts c'est la que ca devient compliqué, je sais en ligne
de commande mySQL que tu peux le faire aussi.


Encore merci



Avatar
I.G.LOG
C'est noté je vais essayer d'avancer comme ça.
Encore un grand merci pour tes conseils éclairés
Avatar
Firetox
>>oui et meme les inserts c'est la que ca devient compliqué, je sais en
ligne de commande mySQL que tu peux le faire aussi.





"I.G.LOG" a écrit dans le message de
news:49ecc324$0$17753$
C'est noté je vais essayer d'avancer comme ça.
Encore un grand merci pour tes conseils éclairés



si tu veux un exemple de code qui genere cela dans SQLManagerX tu a la
methode SQLdump
que j'utilise, l'avantage est que SQLMAnagerX le fait tout seul ensuite j'ai
une fenetre qui lit le fichier crée et qui execute les requetes qui se
trouvent dedans.

PS pour mySQL tu peux utiliser les insert multiple (plus rapide) ou tu peux
inserer plusieurs value pour l'insert
Insert into matable (macol,macol2) values (1,2),(2,3),(4,2) ......
tu peux envoyer comme ca une chaine de 64 Ko max mais 32 Ko est la taille
optimale (j'ai fait des test sur des taille de 4 kO a 64 Ko pour voir la
plus rapide. ce qui permet suivant la taille d'enregistrement d'envoyer 500
lignes ou plus en un seul insert

bon dev
@+
Avatar
I.G.LOG
>
si tu veux un exemple de code qui genere cela dans SQLManagerX tu a la
methode SQLdump
que j'utilise, l'avantage est que SQLMAnagerX le fait tout seul ensuite
j'ai une fenetre qui lit le fichier crée et qui execute les requetes qui
se trouvent dedans.

PS pour mySQL tu peux utiliser les insert multiple (plus rapide) ou tu
peux inserer plusieurs value pour l'insert
Insert into matable (macol,macol2) values (1,2),(2,3),(4,2) ......
tu peux envoyer comme ca une chaine de 64 Ko max mais 32 Ko est la taille
optimale (j'ai fait des test sur des taille de 4 kO a 64 Ko pour voir la
plus rapide. ce qui permet suivant la taille d'enregistrement d'envoyer
500 lignes ou plus en un seul insert

bon dev
@+



Je vais voir tout ça. Encore merci !!!
Avatar
Jerome PAULIN
I.G.LOG a écrit :
Bonjour,
Je voudrais implémenter dans mon appli un système d'archivage "sélectif" des
données. Par exemple permettre à l'utilisateur d'archiver tous les documents
d'un client antérieurs à une date donnée. A votre avis, quel est le meilleur
moyen pour y arriver ?




Bonjour,

Si c'est pour un problème de performance lors des recherches, tu peux
regarder du coté du partitionnement des tables (MySQL 5.1).
Le principe consiste à découper les données en "tranches" suivant
certaines clés, afin d'obtenir des meilleurs temps de réponse.
C'est totalement transparent du point de vue de l'utilisateur...

Si c'est juste "pour se faire plaisir", je partirai sur un système de
table d'archive avec une requete du genre (syntaxe à valider, je n'ai
pas ce qu'il faut sous la main pour cela) :

create table archive_latable_2007
select * from latable where annee 07;
delete from latable where annee 07;


pour restaurer les données :
insert into latable select * from archive_latable_2007


pour recuperer les noms des archives :
SELECT * FROM information_schema.TABLES where TABLE_NAME like
'archive_latable%'



gg
Avatar
I.G.LOG
>
create table archive_latable_2007
select * from latable where annee 07;
delete from latable where annee 07;


pour restaurer les données :
insert into latable select * from archive_latable_2007


pour recuperer les noms des archives :
SELECT * FROM information_schema.TABLES where TABLE_NAME like
'archive_latable%'



gg



Bonjour,
Oui c'est bien ce que je cherche à faire. Mais je voudrais éviter d'alourdir
la base avec des tables supplémentaires. J'aurais donc voulu ou générer des
fichiers autonomes ou constituer d'autres bases de données, annuelles par
exemple
Avatar
Jerome PAULIN
I.G.LOG a écrit :
create table archive_latable_2007
select * from latable where annee 07;
delete from latable where annee 07;


pour restaurer les données :
insert into latable select * from archive_latable_2007


pour recuperer les noms des archives :
SELECT * FROM information_schema.TABLES where TABLE_NAME like
'archive_latable%'



gg



Bonjour,
Oui c'est bien ce que je cherche à faire. Mais je voudrais éviter d'alourdir
la base avec des tables supplémentaires. J'aurais donc voulu ou générer des
fichiers autonomes ou constituer d'autres bases de données, annuelles par
exemple





Salut,

ce que tu peux faire, c'est creer une base db_archive (sur le meme
serveur que les données), et faire des requetes cross database :


create table db_archive.latable_2007
select * from latable where annee 07;

delete from latable where annee 07;

pour restaurer les données :
insert into latable select * from db_archive.latable_2007


gg
Avatar
I.G.LOG
>
Salut,

ce que tu peux faire, c'est creer une base db_archive (sur le meme serveur
que les données), et faire des requetes cross database :


create table db_archive.latable_2007
select * from latable where annee 07;

delete from latable where annee 07;

pour restaurer les données :
insert into latable select * from db_archive.latable_2007


gg



Bonjour
Oui c'est effectivement ce que je cherche à faire. Mais j'aurais voulu créer
une autre base de données (par ex. base2007) pour ne pas multiplier les
tables dans la base existante. Est ce que c'est possible par programmation ?
et dans ce cas, les requetes "create table db_archive.latable_2007 select *
from latable where annee 07" ne sont plus valide. Alors comment faire sans
passer par des fichiers textes ?
1 2