PHP.ee
 php.ee   linuxator.com   whee 
29.07.10 / 21:55
  Artiklid
  » Algajaile
  » Andmebaasid
  » Varia
  » Graafika
  » Advanced
Logi sisse:
< nimi
< pass
Unustasid passi?
Kas eelistad võimalusel PHP koodi objektorienteeritult kirjutada?
 Jah, see teeb töö lihtsamaks
 Jah, see on lihtsalt lahe
 Nii ja naa, ei tunne erilist võitu
 Ei, mõttetu ajakulu
 Ei oska objektorienteeritult progeda
Tulemused
Liitu listiga!
Telli PHP uudiskiri
Nimi:
Email
MySQL-i klient MySqlDump
Montez

Mis on MySqlDump ? Tegemist on MySQL-i utiili, või kliendiga mis installeeritakse samaaegselt MySQL-i installeerimisega. Mysqldump on kasulik eelkõige andmete liigutamiseks eri andmebaasiserverite vahel, kuid sobib suurepäraselt ka andmetest tagavarakoopiate tegemiseks.

Mida MySqlDump teeb? Lühidalt öeldes loeb ta andmebaasi(de)s olevad tabelid tagasi algosadeks ja kirjutab need siis tekstifaili. Siinkohal oleks vist segase jutu illustreerimiseks asjakohane üks näide.

TEEME VARBAD MÄRJAKS



Oletame et meil on vaja luua mingi andmebaas, pangem talle nimeks näiteks test. SQL-i lause selle loomiseks oleks:

mysql>CREATE DATABASE test;

Kuna meil mõistus päris õige koha peal pole, siis mingitel arusaamatutel asjaoludel loome võrdlemisi mõttetu tabeli kus säilitatakse ees- (fname) ja perekonnanime(lname) ning võtmeks (PRIMARY KEY) on auto_increment väli traditsioonilise nimega id. Tabel ise võiks välja näha näiteks selline:

mysql>CREATE TABLE tabel (
id TINYINT not null AUTO_INCREMENT,
fname CHAR (50) not null , lname CHAR (50) not null ,
PRIMARY KEY (id));


Et tabel ilma andmeteta on vähemalt nagu Kati ilma karuta siis sisestame sinna igaks juhuks midagi, no näiteks Madis Maamesilase ja Juhan Juurika nimed, SQL selle teostamiseks näeb välja järgmine:

mysql>INSERT INTO tabel (id, fname, lname) VALUES (0, 'Madis', 'Maamesilane');
mysql>INSERT INTO tabel (id, fname, lname) VALUES (0, 'Juhan', 'Juurikas') ;


Kõik on ilus ja tore, ise oleme hirmus rahul, aga korraga tekib vajadus liigutada kogu andmebaas serverist A serverisse B. Loomulikult võiks andmebaasi serveris B uuesti luua, aga kui tabeleid on kümneid ja ridasid (kümneid)tuhandeid? Võibolla on aga üldse vaja kõik MySQL serveris leiduvad andmed üle viia hoopis teise masinasse? Just siin tuleb appi MySqlDump-i

No nii, aga näide? Meie eelpool loodud andmebaasi test "dumpimiseks" tekstifaili tuleks käsurealt (promptis) teostada järgmine protseduur:

Windows platvormil:


C:\mysql\bin>mysqldump -u root -h localhost -p test > c:\minukataloog\koopia.sql
**********


Unix/Linux platvormil:


[kasutaja@server kasutaja]$ mysqldump -u root -p -h localhost test > /home/minukataloog/koopia.sql
Enter password:*********


Mis toimub? Pole hullu harutame lahti. Esimene osa peaks olema arusaadav ka võhikule.

  • Mysqldump --- programmi (utiili, kliendi - kuidas soovite) nimi,

  • -u kasutaja -h localhost -p --- tavapärane mysql-I sisselogimisprotseduur,



edasi?

andmebaas > c:\minukataloog\koopia.sql


  • test --- andmebaasi nimi mida kopeeritakse,

  • > --- suund ehk kas tehaks faili koopiat või loetakse seda andmebaasi sisse,

  • c:\minukataloog\koopia.sql --- teekond dumpfailini ja dumpfaili nimi.



kui sellist faili veel pole siis see luuakse MysqlDump-I poolt, faili võib kirjutada kasvõi desktopi ning samuti pole mingit vahet kas faili laiend on *.sql, *.txt või *.vanaema.


  • ********* --- mis see siis nüüd on? Arva ära :=)


Põhimõttelist vahet mis platvormil MySqlDump-i kasutada ei ole, tulemus on sama. Erinevus on vaid kaldkriipsude suunas ja teekonna (path) määratlemisel ning tuleneb failisüsteemide erinevusest. Siit ka MySqlDump-i üks tugevaimaid külgi - võime liigutada andmebaase eri platvormide vahel. Näiteks võite kogu andmestiku oma lokaalses win masinas sisestada ja pärast selle kõik linuxi serverisse ümber tõsta. Kuidas ? Vaatame nüüd kuidas protseduur teistpidi välja näeb.

Selleks et kogu eelnevast jutust pisut selgemat aimu saada vaatame korra milline näeb välja meie äsjaloodud dumpfail (koopia.sql). Avades faili suvalise tekstöötlejaga avaneb meile järgmine pilt:


Enter password: # MySQL dump 8.16
#
# Host: localhost Database: test
#--------------------------------------------------------
# Server version    3.23.44-nt

#
# Table structure for table 'tabel'
#

CREATE TABLE tabel (
id tinyint(4) NOT NULL auto_increment,
fname char(50) NOT NULL default '',
lname char(50) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

#
# Dumping data for table 'tabel'
#

INSERT INTO tabel VALUES (1,'Madis','Maamesilane');
INSERT INTO tabel VALUES (2,'Juhan','Juurikas');


Teadupärast on # sql-is kommentaari tähiseks, MySqlDump-i kirjutab lihtsalt, nagu üks tõsine tööriist kunagi, lisaks SQL-ile ka asjakohased ääremärkused (kui tihti oled sina mõelnud oma vanu koode lahti harutades - miks kuradi pärast ma ühtegi kommentaari vahele ei kirjutanud…? ).

Nüüd peaks asja olemus juba selgemaid piirjooni omama, igaüks kellel SQL-ist nägemus on, saab aru et nende käskude abil moodustub samasugune andmebaas nagu me selle artikli alguses käsurel käskhaaval lõime. Ainus mis pisut segadust võib tekitada on TYPE=MyISAM sellest ei tasu aga lasta ennast heidutada tegemist on tabeli tüübiga, kui see ka ära kustutada ei juhtu midagi kuna kõigis uuemates MySql-I versioonides on MyISAM ka default tabelitüübiks. Kuidas aga seda tekstifaili (teise)serverisse tagasi lugeda? Asume asja kallale.

Windows platvormil:

C:\mysql\bin>mysql -u root -h localhost -p test < c:\minukataloog\koopia.sql
**********


Unix/Linux platvormil:

[kasutaja@server kasutaja]$ mysql -u root -p -h localhost test < /home/minukataloog/koopia.sql
Enter password:*********


Üsna sarnane, kas pole? Tähelepanu tasuks pöörata kahele nüansile:


  1. --- enam ei alga käsk mysqldump-iga vaid mysql-iga, põhjus lihtne - nüüd ei soovi me mitte MySqlDumpi abil tabelid SQL-I käsklusteks jagada, vaid tahame et mysql dumpfailis asuvatest käskudest uuesti tabeli kokku paneks.


  2. --- nool on vahetanud suunda. Seda samal lihtsal põhjusel et me ei saada andmeid enam mitte välja, vaid üritame neid failist mysql-i serverisse sisse lugeda.



NB! Üks kala siiski asja juures on, nimelt tuleb win platvormil enne dumpfaili uuesti sisselugemist kustutada dumpfaili esimene rida. Mingil arusaamatul põhjusel tahab MySql windowsi peal vastuseks reale Enter password: # MySQL dump 8.16 anda errori.

HÜPPAME PEA EES VETTE



Nüüd kus oleme dumpimise põhiolemuse rõõmsalt selgeks teinud, on aeg võtta ette andmete dumpimise süvaõpe. Mida siis kõike saab MySqlDump-i abil teha? Kui andmete dumpfailist serverisse lugemine on oma põhiolemuselt sama, siis dumpfaili loomisel on võimalusi ja variatsioone päris palju. Kuivõrd MySqlDump-i unix/linux ja windows platvormil kasutamise erinevused on juba kuuldud muusika siis jätkame siinkohal ühega. Kuna lokaalses masinas olen ka mina (koos paljude saatusekaaslastega) billi ori siis saab selleks siinkohal win.

Olgu põhiline siis veelkord ära toodud:

C:\mysql\bin>mysqldump -u root -h localhost -p test > c:\minukataloog\koopia.sql

Edasistes näidetes opereerime ainult osaga sellest lausest kuna kordamine võib küll olla tarkuse ema, kuid mõtetu dubleerimine pole seda mitte. Seetõttu kärbime ja muudame lauset pisut ja jätkame baasilt:

andmebaas > c:\dumpfile.sql

Nonii. Mis saab siis kui me tahame dumpida mitu andmebaasi korraga?

--databases andmebaas1 andmebaas2 > c:\dumpfail.sql

Aga kui on vajadus kogu andmebaasiserver ümber kolida?

--A > c:\dumpfail.sql

Kui soovime ainult tabelistruktuuri…

--no-data andmebaas > c:\dumpfail.sql

…või hoopis ainult andmeid

--no-create-info andmebaas > c:\dumpfail.sql

kui me teame et andmebaasis kuhu me andmeid "siirdame" võib olla sama nimega tabeleid (näiteks mingi varasem versioon meie tööst), aga meid nende tabelite saatus ei huvita siis võime lisada dumpfaili DROP TABLE IF EXISTS lause (lisatakse iga CREATE TABLE lause ette):

--add-drop-table andmebaas > c:\dumpfile.sql

tingimusi saab omavahel kombineerida, põhiloogika on siin järgimine:

tingimus1 tingimus2 andmebaas1 andmebaas2 > dumpfile.sql

näiteks mida teeb järgmine käskude ja tingimuste kombinatsioon…

--add-drop-table -no-data db1 db2 > c:\dumpfile.sql


  • loob c:\ kettale tekstifaili dumpfail.sql ;

  • kirjutab sinna sisse SQL- laused mis on vajalikud andmebaaside db1 ja db2 ning nendes sisalduvate tabelistruktuuride loomiseks. (tingimus -no-data tähendab seda et tabelites sisalduvaid andmeid dumpfaili INSERT INTO lausetena ei kirjutata);

  • Lisab iga CREATE TABLE tabelinimi; lause ette lause DROP TABLE IF EXISTS tabelinimi; (errorite vältimiseks kuna mysql ei saa luua tabelit mis juba eksisteerib, teisisõnu kui sellise nimega tabel on juba olemas siis see kustutatakse).


Voila! Natukene jälle targem. Kõigist MySqlDumpis kasutada olevatest võimalustest saab täpse ülevaate ( Ära arvasid!) loomulikult manuaalist aadressil :
http://www.mysql.com/doc/m/y/mysqldump.html



LÕPETUSEKS



Palju nendest asjadest saab ära teha ka prompti ronimata kasutades phpMyAdmin-i , ometi on kasulik oma arsenali selles artiklis toodud teadmistega täiendada. Nimelt on phpMyAdmin siiski veebipõhine mysql-i klient, mis seab asjale omad piirid. Eks sa proovi üle veebibrauseri teha dumpfaili andmebaasist milles on näiteks kümme tabelit , igaühes 10000 rida ja 10 lahtrit, vaata mida server ja brauser sulle selle peale räägivad. Ma ükskord huvi pärast proovisin u. 3000-ga ja midagi head sellest ei tulnud. Samas MySqlDump-i kasutades mingeid probleeme ei esinenud.

Vastukaja ja kommentaare oodates
Montez

Artikli kommentaarid

O