mysqldump e compatibilità | Amministrazione, Gestione, Backup

Topic: Pubblico - Composto da 6 Posts di 3 Utenti.

29 Agosto, 2008 16:15 #1
losciuto
Utente

losciuto
Registrato: Aug, 2008
Posts: 12
Offline

Ciao a tutti,

 spero che qualcuno mi dia una dritta non troppo scontata quale disinstallare una versione o installarne due allo stesso tempo.

Antefatto:

ho installata la versione  5.0.51a-3ubuntu5.1 di MySQL e vorrei con mysqldump (ver. 10.11) esportare alcune tabelle di un database per importare il tutto su una versione di MySQL 4.0.27-standard-log del mio provvider.

Le operazioni avvengono automaticamente perche' lo dovrebbe fare qualcuno che non ha idea (ne il tempo per imparare) dell'uso di phpMyadmin o altri tools. Diciamo che dovrebbe avvenire col solo click di un tasto.

La difficoltà:

con un file batch uso mysqldump:

mysqldump  e—add-drop-table -u root—password=xxxx—result-file=/root/Scrivania/xxxx.sql database—tables products products_description categories categories_description products_to_categories manufacturers manufacturers_info specials

 tutto va per il verso giusto fino a quando da phpmyadmin del provvider non cerco di importare il file .sql.

il quale alla fine mi da il seguente errore:

query SQL:

 SET

1saved_cs_client =
1character_set_client ;&lt;br /&gt;&lt;br /&gt;Messaggio di MySQL:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;#1193 - Unknown system variable &amp;#39;character_set_client&amp;#39;&lt;br /&gt;&lt;br /&gt;questo perche&amp;#39; nel file .sql ho le seguenti righe contrassegnate con <--------------- QUESTA:&lt;br /&gt;&lt;br /&gt;DROP TABLE IF EXISTS `categories`;&lt;br /&gt;SET @saved_cs_client&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =
@character_set_client; <---QUESTA
SET character_set_client = utf8; <
-------- QUESTA
CREATE TABLE `categories` (
  `categories_id` int(11) NOT NULL auto_increment,
  `categories_image` varchar(64) default NULL,
  `parent_id` int(11) NOT NULL default '0',
  `sort_order` int(3) default NULL,
  `date_added` datetime default NULL,
  `last_modified` datetime default NULL,
  `sub_category` int(4) NOT NULL default '0',
  `sub_description` varchar(30) default NULL,
  `parent_id_c` char(3) NOT NULL default '0',
  PRIMARY KEY  (`categories_id`),
  KEY `idx_categories_parent_id` (`parent_id`)
) TYPE=MyISAM AUTO_INCREMENT=16754;
SET character_set_client = @saved_cs_client;       <--QUESTA

 Se tolgo a manina le righ, l'import va a buon fine.

Qualcuno mi sa dare una qualche info su come (quale opzione di mysqldump) possa eliminare queste righe.

Ho gia' fatto diverse prove con—compatible=mysql40 oppure mysql323, ma niente di fatto.

Ho anche cercato nei forum, ma nulla. Probabilmente danno per scontato l'utilizzo di mysqldump della versione 4.0, ma come accennato sopra non ho voglia di installare anche la versione 4.0 di MySQL.

Qualche anima pia e' disponibile?

A presto.

30 Agosto, 2008 11:32 #2
Sante Caserio
Moderatore

Sante Caserio
Registrato: Jul, 2008
Posts: 99
Offline

Ma sono molte queste righe, per non poterle togliere a manina? :)

 Comunque credo che l'opzione sia—skip-set-charset …prova un po'. Altrimenti ti consiglio di fare uno script che elimini le righe contenenti 'character_set_client'.

Ultima modifica 11 Luglio, 2010 01:15 di root

01 Settembre, 2008 08:55 #3
losciuto
Utente

losciuto
Registrato: Aug, 2008
Posts: 12
Offline
Sante Caserio ha detto:

Ma sono molte queste righe, per non poterle togliere a manina? :)

 Comunque credo che l'opzione sia—skip-set-charset …prova un po'. Altrimenti ti consiglio di fare uno script che elimini le righe contenenti 'character_set_client'.


Sì, purtroppo sono tre righe per ogni tabella e le tabelle possono essere n.

Ho anche provato con—skip-set-charset, ma toglie solo queste righe:

/!40101 SET

1OLD_CHARACTER_SET_CLIENT=
@CHARACTER_SET_CLIENT */;
/
!40101 SET
1OLD_CHARACTER_SET_RESULTS=
@CHARACTER_SET_RESULTS /;
/
!40101 SET
1OLD_COLLATION_CONNECTION=
@COLLATION_CONNECTION /;
/
!40101 SET NAMES utf8 */;

 

lasciando inalterate quelle in questione. :(

 

Fare lo script era l'ultima cosa che volevo. Fare il parse di file da 5 Mb non è certo il massimo della praticità e velocità. 

Sicuro che non c'e' altra strada?

Ultima modifica 11 Luglio, 2010 01:15 di root

01 Settembre, 2008 10:23 #4
losciuto
Utente

losciuto
Registrato: Aug, 2008
Posts: 12
Offline

Bhe! Ho risolto con lo script in PHP.

<?php
// stringhe da ricercare
$primastr = "SET

1saved_cs_client&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =
@character_set_client;";
$secondastr = "SET character_set_client = utf8;";
$terzastr = "SET character_set_client = @saved_cs_client;";

// dati su i file
$rfilename = 'c:\www\database\armeriagino.sql';
$wfilename = 'c:\www\database\armeriagino_1.sql';

$rhandle = @fopen($rfilename, "r" );
$whandle = @fopen($wfilename, "w" );

// loop centrale
if ($rhandle && $whandle) {
   while (!feof($rhandle)) {
          
        // lettura file e decodifica utf8
       $line = fgets($rhandle, 4096);

       // se non trova le stringhe indicate scrive il file
       if ((strncasecmp(trim($primastr),trim($line), strlen($primastr)) != 0) &&
             (strncasecmp(trim($secondastr),trim($line), strlen($secondastr)) != 0) &&
             (strncasecmp(trim($terzastr),trim($line), strlen($terzastr)) != 0)
             ) {
             
               fputs($whandle, $line);

       }
       $line = '';
   }
   // chiusura dei file
   fclose($rhandle);
   fclose($whandle);
} else {

    // errori sulla gestione dei file in lettura e scrittura
    if (!rhandle) die ('non posso aprire il file: ' . $rfilename . ' in lettura' );
    if (!whandle) die ('non posso aprire il file: ' . $wfilename . ' in scrittura' );
}

?>

rimane il fato che se si trova un parametro opportuno per mysqldump, vi rimango grato per l'eternità :-P

Ultima modifica 11 Luglio, 2010 01:15 di root

01 Settembre, 2008 10:30 #5
losciuto
Utente

losciuto
Registrato: Aug, 2008
Posts: 12
Offline

Sia per le stringhe ricercate che per i file potete cambiarli a vostro piacimento.

C'e' un errore nei commenti: non ho piu' fatto la decodifica in utf8. Per la quale basta la seguente riga:

$line = utf8_encode(fgets($rhandle, 4096));

oppure 

fputs($whandle, utf8_encode($line));

N.B.: nei post manca la possibilita' di un'anteprima.

 

a presto.

02 Settembre, 2008 09:07 #6
root
Amministratore

root
Registrato: Jul, 2008
Posts: 60
Offline

Ciao Losciuto,

Beh in effetti per affrontare il tuo problema la scelta migliore è quella di passare per una strada applicativa, infatti le soluzioni da DBA o da sistemista possono risultare meno comode per chi, come hai detto "non ha idea (ne il tempo per imparare) dell'uso di phpMyadmin o altri tools".

Scrivere uno script di migrazione, è spesso una strategia vincente, sia esso scritto in php, in perl o in qualsiasi altro linguaggio.

Ti ringrazio cmq a nome di tutto lo Staff per la partecipazione alla nostra appena nata community.

root

Condividi su:

Loggati o Registrati per replicare