Čemu služe izvršne datoteke u MySQL bin direktorijumu?
U ovom poglavlju ubacujemo jedan malo opušteniji sadržaj — o izvršnim datotekama u bin direktorijumu koje nastanu nakon uspešne instalacije MySQL-a, i čemu one zapravo služe.

Na mojoj mašini je macOS okruženje, pa su izvršne datoteke koje trenutno vidim prikazane na gornjoj slici. Pod Windowsom vidite datoteke sa ekstenzijom exe, ali im je funkcija ista.
mysql
MySQL je arhitektura klijent-server. Kada klijent želi da se poveže na MySQL server, potrebno je izvršiti datoteku mysql, o čemu smo već govorili pri instalaciji MySQL-a.
Ako je MySQL već dodat u PATH promenljivu okruženja, god god otvorili terminal, dovoljno je izvršiti mysql -uroot -p da biste se povezali na MySQL server; inače u bin direktorijumu izvršavate ./mysql -uroot -p ili mysql -uroot -p (na macOS-u).
Pod Windowsom, u cmd-u se prvo prebacite u bin direktorijum, a zatim izvršite mysql -uroot -p.
Zašto je to tako, već smo ranije objasnili, pa nećemo ponavljati.
Ovde ćemo navesti nekoliko napomena nakon povezivanja na MySQL server — jedna prilično detaljna pitanja.
Završni znak komande
Nakon unosa SQL naredbe potrebno je dodati znak završetka komande ;, jer u suprotnom MySQL server smatra da SQL naredba nije potpuno uneta i čeka dok ne unesete ;.

Osim ;, možete koristiti i \g ili \G kao znak završetka komande. Razlika je sledeća:
;: izvršava sve SQL naredbe odjednom;\g: isto kao prethodno;\G: izvršava sve SQL naredbe odjednom i rezultate prikazuje uspravno (po kolonama); ako upit vraća veći broj kolona, ovaj završni znak čini rezultat mnogo preglednijim.

Slobodno prelamanje redova
Prilikom unosa SQL naredbe možete proizvoljno prelamati redove — ne morate voditi računa o tome gde prelamate; sve dok je logika SQL naredbe ispravna, MySQL server će smatrati da ste uneli jednu celovitu SQL naredbu.

Izvršavanje više SQL naredbi odjednom
U jednom redu možete izvršiti više SQL naredbi — dovoljno ih je razdvojiti sa ;. To je veoma pogodno za grupno izvršavanje SQL naredbi.
Na primer, sledeća SQL naredba odjednom izvršava dve naredbe.
show databases; use mysql;
Odustajanje od izvršavanja SQL naredbe
Ako ste uneli SQL naredbu, a onda ipak ne želite da je izvršite, možete uneti \c da odustanete.
Kada pogrešno unesete SQL, a ne da vam se briše i popravlja, možete upotrebiti \c da odustanete od izvršavanja.

SQL naredbe ne razlikuju velika i mala slova
MySQL podrazumevano ne vodi računa o veličini slova komandi, odnosno možete slobodno menjati velika i mala slova — MySQL server će to tretirati isto.

Ipak, u praksi se ključne reči SQL naredbi obično pišu velikim slovima, dok se imena tabela, imena polja i sl. pišu malim, čime SQL postaje pregledniji.
Naravno, to je samo dogovor, a ne strogo pravilo.
Navodnici za stringove
U SQL naredbama se za literale stringova mogu koristiti jednostruki ili dvostruki navodnici.

Preporučuje se upotreba jednostrukih navodnika, jer MySQL u režimu ANSI_QUOTES dodeljuje dvostrukim navodnicima drugo, posebno značenje.

Da biste proverili da li je MySQL u režimu ANSI_QUOTES, možete izvršiti show variables like 'sql_mode';.

Vidimo da podrazumevano nije uključen.
Jednostruke i dvostruke navodnike koristimo za definisanje stringova, a znak „backtick" ` za definisanje identifikatora, npr. imena tabela, imena polja i sl.

Dodajmo ANSI_QUOTES u sql_mode:
set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES';
Zatim izvršimo sledeću SQL naredbu:
SELECT `title`,"short_title" FROM `article`;Vidimo da se i dvostruki navodnici tretiraju kao identifikatori — efekat je isti kao kod znaka „backtick" `.

Prekid veze sa MySQL-om
U stanju aktivne veze sa MySQL-om možete upotrebiti exit, quit, \q ili Ctrl + D da biste prekinuli vezu.

Kao što vidimo, dodavanje u sql_mode odnosilo se samo na trenutnu sesiju veze, pa nakon prekida i ponovnog povezivanja sql_mode ponovo postaje podrazumevani.
mysqldump
mysqldump je veoma praktičan alat za rezervnu kopiju MySQL baze, kojim se kreira SQL dump datoteka na nivou jedne ili više MySQL baza, uključujući strukturu tabela i podatke. Veoma je važan za rezervne kopije, migracije ili oporavak podataka.
Sintaksa za kreiranje rezervne kopije cele baze je:
mysqldump -u [username] -p[password] [database_name] > [filename].sql-u: navodi korisničko ime;-p: navodi lozinku; ako se lozinka ne unese, sistem će nakon pokretanja komande tražiti njen unos;database_name: navodi bazu koja se rezerviše;filename: navodi ime datoteke rezervne kopije.
Na primer, da napravim rezervnu kopiju cele baze praktičnog projekta Jishupai, mogu koristiti sledeću komandu:
mysqldump -uroot -p pai_coding > pai_coding.sqlNakon toga napravimo i arhivu:
gzip pai_coding.sql
Moguće je rezervisati i pojedinačne tabele — na primer, da rezervišem tabelu article:
mysqldump -uroot -p pai_coding article > article.sqlDovoljno je nakon imena baze dodati ime tabele.
Može se rezervisati i više baza — na primer, baze pai_coding i test:
mysqldump -uroot -p --databases pai_coding test > pai_coding_test.sqlParametrom --databases, iza kojeg slede imena baza razdvojena razmacima.
Za rezervisanje svih baza koristi se parametar --all-databases.
U produkcionom okruženju, radi sprečavanja gubitka podataka, možemo napisati skriptu i pomoću cron izraza automatski izvršavati te operacije rezervisanja u pozadini.
Napišimo jednostavnu skriptu za rezervnu kopiju:
#!/bin/bash
# Postavljanje MySQL korisničkog imena, lozinke, imena baze i direktorijuma za rezervne kopije
MYSQL_USER="your_username"
MYSQL_PASSWORD="your_password"
DATABASE_NAME="your_database_name"
BACKUP_DIR="/path/to/your/backup/directory"
# Generisanje imena datoteke rezervne kopije, sa datumom
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/$DATABASE_NAME_$DATE.sql"
# Kreiranje rezervne kopije pomoću mysqldump
mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD $DATABASE_NAME > $BACKUP_FILE
# Provera da li je rezervisanje uspelo
if [ $? -eq 0 ]; then
echo "Rezervna kopija baze uspešna: $BACKUP_FILE"
else
echo "Greška pri rezervisanju!"
fiSačuvajmo gornju skriptu kao backup.sh, a zatim joj dodelimo dozvolu za izvršavanje:
chmod +x backup.shZatim izvršimo skriptu:
./backup.sh
U redu, otvorimo crontab:
crontab -eDodajmo jedan red:
0 3 * * * /path/to/your/backup.shNa taj način će se operacija rezervisanja izvršavati svakog dana u tri sata ujutru. Neću to dalje demonstrirati.
Kada je baza velika, mysqldump može potrošiti dosta vremena i resursa sistema, pa je bolje rezervisanje obavljati u periodima kada baza nije opterećena — npr. u dva ili tri sata ujutru.
Za vrlo velike baze može se koristiti parametar --single-transaction, čime se izbegava zaključavanje tabela, ali se zahteva da pogon baze bude InnoDB.
mysqladmin
Kada se iza mysql doda admin, to označava alatku za administraciju MySQL-a, koja služi za izvršavanje administrativnih operacija — npr. kreiranje baze, brisanje baze, uvid u status MySQL servera i sl.
Na primer, da vidim status MySQL servera:
mysqladmin -uroot -p status
Na primer, ponovno učitavanje tabela ovlašćenja, ispiranje log datoteka i sl.:
mysqladmin -uroot -p flush-privileges
mysqladmin -uroot -p reload
mysqladmin -uroot -p flush-logs- flush-privileges i reload imaju isti efekat.
- flush-logs ispira log datoteke.
Na primer, da kreiram bazu:
mysqladmin -uroot -p create testNa primer, da obrišem bazu:
mysqladmin -uroot -p drop testU automatizacionim skriptama se često koristi mysqladmin za izvršavanje administrativnih operacija.
mysqlcheck
mysqlcheck je komandnolinijski alat koji dolazi uz MySQL, a služi za proveru, popravku, analizu i optimizaciju tabela baze — veoma je koristan za održavanje baze i optimizaciju performansi.
Na primer, da proverim sve tabele u bazi:
mysqlcheck -uroot -p --check your_database_name
mysqlimport
mysqlimport služi za uvoz podataka iz tekstualnih datoteka u tabele baze i veoma je pogodan za grupni uvoz podataka. Na primer, imam CSV datoteku koju želim da uvezem u tabelu:
mysqlimport -uroot -p --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by='\n' your_database_name your_table_name.csv--fields-terminated-by: navodi razdvajač između polja;--fields-enclosed-by: navodi znak koji obuhvata polja;--lines-terminated-by: navodi znak kraja reda.your_table_name.csv: navodi datoteku koja se uvozi.your_database_name: navodi bazu u koju se uvozi.
Hajde da kreiramo CSV datoteku:
echo "1, 'Java', 'Java is the best language', '2022-02-05 19:30:00'" > article.csv
echo "2, 'Python', 'Python is the best language', '2022-02-05 19:30:00'" >> article.csv
echo "3, 'Go', 'Go is the best language', '2022-02-05 19:30:00'" >> article.csvZatim kreirajmo jednu tabelu:
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Zatim uvezimo:
mysqlimport -uroot -p --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by='\n' pai_coding article.csvPojavila se greška --secure-file-priv:

Možemo prvo pogledati vrednost parametra --secure-file-priv:
show variables like 'secure_file_priv';
Vrednost je null, što znači da MySQL nije ograničio direktorijum za uvoz datoteka. Dovoljno je dodati parametar --local:
mysqlimport -uroot -p --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by='\n' --local pai_coding article.csv
U redu, uvoz je uspeo.

mysqlshow
mysqlshow prikazuje informacije o bazama, tabelama i kolonama na MySQL serveru.
Na primer, da vidim sve tabele u bazi:
mysqlshow -uroot -p your_database_name
Na primer, da vidim sve kolone u tabeli:
mysqlshow -uroot -p your_database_name your_table_name
Na primer, da vidim informacije o indeksima tabele:
mysqlshow -uroot -p --keys your_database_name your_table_name
Pri postavljanju nove aplikacije ili migraciji baze pomoću mysqlshow možete brzo proveriti da li ciljna baza već postoji.
mysqlbinlog
mysqlbinlog služi za uvid u sadržaj binarnih log datoteka MySQL-a, a može se koristiti za oporavak podataka, uvid u izmene podataka i sl. Binarni log je važna odlika MySQL servera koja beleži sve „događaje" izmena nad bazom — poput kreiranja tabela, ubacivanja, ažuriranja i brisanja podataka.
Ako dođe do gubitka ili oštećenja podataka, pomoću mysqlbinlog mogu se pregledati i oporaviti izmene napravljene od poslednje rezervne kopije.
Na primer, da pregledam sadržaj binarne log datoteke:
mysqlbinlog -uroot -p /path/to/your/binlog.000001Uslov je da je vođenje binarnog loga prethodno uključeno.
Pretpostavimo da želite da pregledate i oporavite sve izmene u bazi od juče u 22:00 do danas u 02:00 — možete upotrebiti opcije --start-datetime i --stop-datetime mysqlbinlog-a da filtrirate događaje u tom vremenskom opsegu:
mysqlbinlog --start-datetime="YYYY-MM-DD 22:00:00" \
--stop-datetime="YYYY-MM-DD 02:00:00" \
/path/to/binlog-file > /path/to/output.sqlO ovome ćemo detaljnije govoriti kada budemo obrađivali binlog.
Ostalo
U bin direktorijumu postoji još nekoliko izvršnih datoteka, poput mysqlslap, mysql_upgrade, mysqld_safe, mysql_secure_installation, mysqlpump, mysql_config, mysql_tzinfo_to_sql itd. Nećemo ih sve odjednom obraditi — kada naiđemo na one koje vrede detaljnijeg objašnjenja, vratićemo se i dopunili ovaj deo.
Za sada, evo jednostavne tabele:
| Izvršna datoteka | Namena |
|---|---|
| mysqlslap | Simulira više klijenata koji istovremeno pristupaju MySQL serveru; koristi se za testiranje performansi MySQL servera. |
| mysql_upgrade | Služi za nadogradnju MySQL baze. |
| mysqld_safe | Demon za pokretanje MySQL servera. |
| mysql_secure_installation | Izvršava niz bezbednosnih radnji kojima se povećava bezbednost instalacije MySQL-a. Obuhvata postavljanje root lozinke, brisanje anonimnih korisnika, onemogućavanje udaljenog root prijavljivanja i sl. |
| mysqlpump | Alat za rezervne kopije MySQL-a, sličan mysqldump-u, ali podržava paralelno rezervisanje, što omogućava brže rezervisanje velikih baza. |
| mysql_config | Skripta koja daje MySQL opcije potrebne za kompilaciju i povezivanje klijentskih aplikacija. |
| mysql_tzinfo_to_sql | Učitava informacije o vremenskim zonama u MySQL server. |
Zaključak
Zbirno, izvršne datoteke u bin direktorijumu pružaju sveobuhvatnu podršku za instalaciju, pokretanje, upravljanje i održavanje MySQL-a.
