Mysqldump - upotreba zamjenskih znakova

Pronašli ste ili sami napravili CMS sustav za potrebe vaše ustanove, instalirali i pustili u pogon. Jedan dio korisnika Vas zamoli da isti takav CMS postavite i za potrebe katedre ili predmeta. Budući da praktički imate već sve gotovo, odlučite rabiti zajedničku bazu (primjerice "fakultet") i zadržati iste nazive tablica (onako kako je u samom CMS-u predefinriano). Kako bi mogli koristiti istu bazu i zadržati iste tablice neophodno je koristiti prefiks ispred imena tablice, te malo dotjerati kôd kako bi se koristile tablice sa prefiksom.

Tipičan naziv tablice je primjerice "user", pa se možete odlučiti dodati prefiks "web1", što će na kraju izlgedati ovako: "web1_user".

Za primjer, pretpostavimo da Vaš CMS ima 15 tablica koje su kreirane u bazi "fakultet". Svakom novom instalacijom CMS-a u istoj bazi broj tablica se povećava, te u slučaju da ste podigli četiri CMS sustava za različite kolegije ili katedre imat ćete 60 tablica u bazi.

Prilikom kreiranja rezervne kopije pomoću mysqldump obuhvatili bi cijelu bazu "fakultet" i svih 60 tablica, te napravili kopiju za 4 CMS sustava u jednom potezu.

No, "problem" se javlja kad morate raditi izmjene samo za jedan od instaliranih CMS-ova, a da ne ugrozite podatke i funkcionalnost ostalih CMS-ova. Najjednostavnije rješenje je eksportiranje smao tablica na kojima želite raditi izmjene, te vraćanje istih nazad u bazu.

To možemo obaviti tako da koristimo zamjenske znakove (wildcards) kod odabira prefiksa tablica koje želimo eksportirati. Pravi problem je što mysqldump ne radi sa zamjenskim znacima, no i za to postoji rješenje. Prijavimo se na mysql bazu, te napravimo sljedeće:

mysql> USE fakultet; // odabiremo bazu
Database changed

mysql> show tables; // prikaz svih tablica, primjećujemo 60 tablica +-----------------------+ | Tables_in_fakultet | +-----------------------+ | web1_addons | | web1_groups | | ........ | | web2_addons | | .......... | | web3_addons | | .......... | +-----------------------+ 60 rows in set (0.00 sec)

u primjeru vidimo prefikse tablica (web1, web2,...) koje možemo iskoristiti za eksport.

U naredbenoj liniji mysql-a iskoristit ćemo SQL operator "LIKE":

mysql> show tables like "web1%"; // tablice s prefiksom web1
+----------------------------+
| Tables_in_fakultet (web1%) |
+----------------------------+
| web1_addons                |
| web1_groups                |
| ...........                |
| web1_mod_captcha           |
| web1_users                 |
+----------------------------+
15 rows in set (0.00 sec)

Iz primjera je vidljivo što sve moramo iskoristiti te ukomponirati sa mysqldump naredbom.

Krenimo korak po korak. U naredbenoj liniji prvo istestiramo cijelu proceduru (primjetite opciju "-e" koji nalaže izvršavanje SQL naredbe):

server# mysql fakultet -u korisnik -plozinka -e ' show tables like "web1%" '
+----------------------------+ | Tables_in_fakultet (web1%) | +----------------------------+ | web1_addons | | web1_groups | | web1_mod_captcha | |......... | | web1_users | +----------------------------+

Ono što moramo izbaciti su okomite i vodoravne linije u Tables_in, tu koristimo grep -v.

server# mysql fakultet -u root -plozinka -e \
'show tables like "web1%"' | grep -v Tables_in

web1_addons
web1_groups
web1_mod_captcha_control
.........
web1_users

Kompletan ovaj rezultat (listu) trebamo sad proslijediti naredbi mysqldump i to pomoću naredbe xargs i naravno sve to eksportirati u datoteku.

server# mysql fakultet -u korisnik -plozinka -e \
'show tables like "web1%"' | grep -v Tables_in \
| xargs mysqldump --opt fakultet -u korisnik -p lozinka > kopija.sql

i svih 15 tablica sa prefiksom "web1" je eksportiranu u datoteku kopija.sql.

Bilo bi zgodno napraviti jednu skriptu da se izbjegne pisanje kompletne sintakse:

#!/bin/bash
echo -n "unesi ime baze "
read baza
echo -n "unesi korisnika "
read korisnik
echo -n "unesi zaporku "
read lozinka
echo -n "unesi prefix tablice "
read pref
echo -n "naziv datoteke "
read datoteka
mysql $baza -u$korisnik -p$lozinka -e 'show tables like "'$pref%'"' | \
grep -v Tables_in | xargs mysqldump --opt $baza -u $korisnik \
-p$lozinka > $datoteka
echo ""
echo "EXPORT BAZE $baza sa tablicama $pref ZAVRSEN"
echo ""
exit 0

I to je to. Datatoteku nastalu nakon eksporta baze sada možete staviti na drugi server, promijeniti što god hoćete u dump datoteci, te vratiti u staru bazu ili jednostavno sačuvati kao backup na DVD-u ili nekom drugom mediju poput USB sticka.

Zdravko Rašić 

Kuharice: 
Kategorije: 
Vote: 
4.5
Vaša ocjena: Nema Average: 4.5 (2 votes)