Kategoria: (MySQL) Autor: Gabrym Data 2 maj 2008

Tabela users jest ciekawym przykładem migracji danych.
Często stosowana w serwisach gromadzących dane o użytkownikach (sklepy internetowe, blogi,…).
Co jednak gdy tworzono ją w pospiechu nie do końca przewidując potrzebne naszego serwisu.
Pozostaje jak tylko przebudować tabele zachowując dane w odpowiedniej formie.
Obie tabele mieszczą się na różnych serwerach.
Na serwerze A jest stara, na B nowa (przebudowana).

Poniżej tabele users_old (serwer A):


CREATE TABLE `users_old` (
`id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`login` varchar(50) NOT NULL DEFAULT '',
`haslo` varchar(50) NOT NULL DEFAULT '',
`imie` varchar(60) NOT NULL DEFAULT '',
`wiek` varchar(60) NOT NULL DEFAULT '',
`miasto` varchar(60) NOT NULL DEFAULT '',
`mail` varchar(60) NOT NULL DEFAULT '',
`ip` varchar(15) NOT NULL DEFAULT '',
`data` date NOT NULL DEFAULT '0000-00-00',
`hobby` MEDIUMTEXT NOT NULL,
PRIMARY KEY  (`id`),
KEY `login` (`login`),
KEY `haslo` (`haslo`),
KEY `imie` (`imie`),
KEY `miasto` (`miasto`)
) ENGINE=InnoDB DEFAULT CHARACTER SET latin2;

Nowa tabela (serwer B):


CREATE TABLE `users_new` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`login` varchar(50) NOT NULL,
`pass` varchar(32) NOT NULL,  /* MD5 */
`email` varchar(50) DEFAULT NULL,
`deleted` TINYINT(1) DEFAULT FALSE,
`date_start`  date NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY  (`id`),
UNIQUE KEY  (`login`),
UNIQUE KEY  (`email`)
) ENGINE=InnoDB DEFAULT CHARACTER SET latin2;


Lista zmian które wprowadzamy:
- hasła będą przechowywane w postaci zaszyfrowanej,
- pola: imie, wiek, miasto, ip, hobby będą w innych tabelach o innych typach,
- pola login i mail mają być unikatowe (nie mogą się powtarzać),
- wprowadziliśmy pole deleted które będzie służyć do usuwania kont użytkowników.

Do wprowadzenia zmian użyjemy polecenia SELECT przekierowując wynik do pliku users.txt.

Składnia:


SELECT
id, login, md5(haslo) as pass, mail as email, 0 as deleted, data as date_start
INTO OUTFILE
'/tmp/users.txt'
FIELDS
TERMINATED BY 't'
ESCAPED BY ''
OPTIONALLY ENCLOSED BY '"'
LINES
TERMINATED BY 'n'
FROM
users_old;

md5(haslo) – ma za zadanie zapisać hasła w zaszyfrowanej postaci.

Przesyłamy plik users.txt miedzy serwerami.

scp -pr /tmp/users.txt  login@adres_serwera:/tmp/

Na serwerze B do tabeli users_new importujemy dane.


LOAD DATA INFILE '/tmp/users.txt'
REPLACE
INTO TABLE users_new
CHARACTER SET latin2
FIELDS
TERMINATED BY 't'
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY ''
LINES
TERMINATED BY 'n';

Przy dużej ilości danych może to chwilę potrwać.

Jeżeli nie otrzymalismy komunikatu o błędzie sprawdzamy czy wszystko się zgadza.

SELECT * FROM users_old;

+----+-------+-------+-------+------+---------+-------------------+------------+---------+-----------+
| 1 | user1 | pass1 | Karol | 22 | Warszawa | adres@mailowy.com | 192.168.100.1 | 2006-05-01 | Tenis |
| 2 | user2 | pass2 | Piotr | 20 | Pakość  | adres2@mailowy.com | 192.168.100.2 | 2006-05-02 | ...   |
+----+-------+-------+-------+------+---------+-------------------+------------+---------+-----------+


SELECT * FROM users_new;

+--+--------+---------------------------------------+-------------------------+---+-------------+
|  1 | user1 | 57210b12affe06adff6e54a93b1465aa | adres@mailowy.com    |  0 | 2006-05-01 |
|  2 | user2 | 259640f97af2b4379dd540ff4016654c   | adres2@mailowy.com |  0 | 2006-05-02 |
+--+--------+---------------------------------------+-------------------------+---+-------------+

Widać że pola się poprawnie zaimportowały.

Jeszcze na koniec zawartość pliku users.txt

1 "user1"  "57210b12af5e06ad2e6e54a93b1465aa" "adres@mailowy.com"  0  "2006-05-01"
2 "user2"  "259640f97ac2b4379dd540ff4016654c" "adres2@mailowy.com"  0  "2006-05-02"

Migracja powiodła się.

Komentarze dle tego wpisu zostały wyłączone.