Cambiare la basedir di MySQL

18 agosto 2009

Dopo vari tentativi finalmente sono riuscito a spostare la directory contenente i dati di MySQL.

Questo è utile quando abbiamo bisogno di uno spazio più grande per una base dati molto grossa.
I passi che ho effettuato sono questi:

  1. Fermare il server MySQL
    /etc/init.d/mysql stop
  2. creare una directory che conterrà i dati, io ho creato
    /home/mysql/data
  3. cambiare il proprietario di tale directory con
    sudo chown -R mysql:mysql /home/mysql/data
  4. copiare i dati dalla vecchia datadir alla nuova, senza i vari file di log (ib_arch_log_0000000000, ib_logfile0, ib_logfile1, ecc…) ATTENZIONE: ibdata1 va copiato perché è utilizzato dall’engine InnoDB, io ho copiato anche mysql_upgrade_info e debian-5.0.flag
  5. editare il file /etc/mysql/my.cnf e camibare la riga
    datadir = /var/lib/mysql
    in
    datadir = /home/mysql/data;
  6. editare il file/etc/apparmor.d/usr.sbin.mysqld e aggiungere le righe
    /home/mysql/data/ r,
    /home/mysql/data/** rwk,
    io le ho aggiunte subito dopo
    /var/lib/mysql/** rwk,
  7. eseguire il comando
    sudo /etc/init.d/apparmor restart
  8. eseguire il comando
    sudo /etc/init.d/mysql start

e finalmente dovrebbe apparire la dicitura:

* Starting MySQL database server mysqld                                   [OK]
* Checking for corrupt, not cleanly closed and upgrade needing tables.

Mantenere comunque una copia dei vecchi dati per sicurezza, bisognerebbe anche controllare per un po’ di giorni che la nuova configurazione funzioni correttamente.

Annunci

Come far ripartire MySQL su Ubuntu/Debian

18 agosto 2009

Il comando per fermare e far ripartire il server MySQL è:

> /etc/init.d/mysql restart

Il comando per fermarlo solamente è:

> /etc/init.d/mysql stop

Mentre il comando per farlo partire è:

> /etc/init.d/mysql start

Importare un file CSV in MySQL

17 agosto 2009

Per importare dati da un file csv (Comma Separated Values) a una tabella Mysql, dobbiamo far uso della query SQL

LOAD DATA LOCAL INFILE 'nome_file_csv' INTO TABLE nome_tabella
   FIELDS TERMINATED BY ";" LINES TERMINATED BY "\r\n" IGNORE 1 LINES;

L’opzione FIELDS TERMINATED BY “;” indica il carattere separatore tra un campo e l’altro, LINES TERMINATED BY “\r\n” indica come viene indicato l'”a capo” nel file, solitamente se proviene da ambiente Windows si usa “\r\n”, se proviene da sistemi Unix like si usa “\n”, IGNORE 1 LINES indica quante righe de saltare prima di inserire i dati, in questo caso una perché si suppone che in testa ci siano i nomi dei campi.

Facciamo un esempio di file .csv e un esempio di tabella mysql.

Supponiamo che il file csv sia composto da 3 campi: nome, cognome, indirizzo:

“nome”;”cognome”;”indirizzo”
“gino”;”gini”;”via dei platani 8″
“luigi”;”rossi”;”via dei pini 3″

La tabella potrebbe essere del tipo:

CREATE TABLE anagrafica (
id int(3) NOT NULL auto_increment PRIMARY KEY,
nome varchar(100) default NULL,
cognome varchar(150) default NULL,
indirizzo varchar(150) default NULL
)ENGINE=MyISAM;

Se vogliamo far uso di uno script PHP che carica i dati dal file csv “dati.csv” dovrà essere:

<?
// Dichiaro le variabili per la connessione al database
$server="nome_server";
$user="nome_user";
$passwd="password";
$database="nome_DB";

// Mi connetto al server Mysql e seleziono il DB da usare
$db = @mysql_connect($server, $user, $passwd);
@mysql_select_db($database);

// Creo una variabile con il file CSV Mda importare
$CSV_file = "dati.csv";

// Eseguo la query per l'importazione
mysql_query("LOAD DATA LOCAL INFILE '" . $CSV_file . "' INTO TABLE mia_tabella
 FIELDS TERMINATED BY ";" LINES TERMINATED BY "\\r\\n" IGNORE 1 LINES;');

// Chiudo la connessione al DB
mysql_close($db);
?>