Popraviti MySQL na Linux serveru, započnite provjerom statusa usluge i zapisnika pogrešaka, a zatim riješite uobičajene pogreške poput prostora na disku, oštećenih tablica, problema s dozvolama ili sukoba portova. Ponovno pokrenite uslugu nakon svake promjene.
Koristite systemctl, journalctl, mysqlcheck i prilagodbe konfiguracije za sigurno vraćanje dostupnosti i performansi.
Ako se pitate kako popraviti MySQL na Linux serverskim okruženjima (Ubuntu, Debian, CentOS, Rocky, AlmaLinux), ovaj vodič vas vodi kroz provjereni, korak-po-korak tijek rada za rješavanje problema.
Kao viši tehnički SEO pisac sadržaja u YouStablePodijelit ću praktične metode za administratore sustava koje funkcioniraju u stvarnom produkcijskom hostingu, prilagođene su početnicima, tehnički su točne i optimizirane za rangiranje.
Prije nego što počnete: Ključne činjenice i sigurnost
- Uvijek napravite sigurnosnu kopiju prije većih promjena: uređivanja konfiguracije, nadogradnje, operacije popravka.
- Upoznajte svoj motor: MySQL u odnosu na MariaDB. Naredbe su slične, nazivi servisa se razlikuju.
- Imajte root ili sudo pristup. Koristite probni poslužitelj kad god je to moguće.
Brza dijagnoza: Utvrdite točan problem
Prvo, potvrdite je li MySQL je instaliran i koji okus koristite (Oracle MySQL ili MariaDB). Zatim odmah dobijte status, zapisnike i osnovne provjere resursa.
# Identify service name (varies by distro)
systemctl status mysql # Debian/Ubuntu (MySQL)
systemctl status mariadb # RHEL/CentOS/Rocky/Alma (MariaDB)
systemctl status mysqld # Some installations
# View recent logs
journalctl -u mysql -n 200 --no-pager
journalctl -u mariadb -n 200 --no-pager
# Classic log files
sudo tail -n 200 /var/log/mysql/error.log
sudo tail -n 200 /var/log/mysqld.log
# Check resources and port usage
df -h # Disk space
free -m # Memory
ss -ltnp | grep 3306 # Is port 3306 taken?
lsof -i :3306 # Which process uses 3306?Korak-po-korak rješenja za uobičajene probleme MySQL Pitanja
Korak 1: Usluga se ne pokreće: Status, zapisnici i brza rješenja
Najviše "MySQL problemi s "neće se pokrenuti" prate seKako riješiti probleme s mrežnom povezivošću na namjenskim poslužiteljimak na disk, dozvole, oštećene tablice ili sukobi portova. Prođite kroz ovo redom.
# Try a clean restart and check status
sudo systemctl daemon-reload
sudo systemctl restart mysql || sudo systemctl restart mariadb
sudo systemctl status mysql -l --no-pager- Disk pun: Ako df pokazuje 100% iskorištenosti, oslobodite prostor uklanjanjem starih logova, rotiranjem logova ili premještanjem arhiva.
- Ostaci PID-a/utičnice: Uklonite zastarjele datoteke, a zatim ponovno pokrenite.
# Example cleanup (paths vary by distro)
sudo rm -f /var/run/mysqld/mysqld.pid /var/run/mysqld/mysqld.sock
sudo mkdir -p /var/run/mysqld && sudo chown mysql:mysql /var/run/mysqld- Problemi s dozvolama: Osigurajte MySQL posjeduje svoj podatkovni direktorij.
sudo chown -R mysql:mysql /var/lib/mysql
sudo find /var/lib/mysql -type d -exec chmod 750 {} \;
sudo find /var/lib/mysql -type f -exec chmod 640 {} \;- Sukob porta: Ako neki drugi proces koristi 3306, zaustavite ga ili promijenite MySQLport u my.cnf, a zatim ponovno pokrenite.
# Example config paths
sudo nano /etc/mysql/my.cnf # Debian/Ubuntu
sudo nano /etc/my.cnf # RHEL/CentOS/Rocky/Alma
# In [mysqld] section:
port=3307Korak 2: Ispravljanje oštećenja InnoDB-a i petlji rušenja
InnoDB je otporan, ali nagli gubitak napajanja ili puni diskovi mogu oštetiti tablične prostore. Zapisnik pogrešaka često spominje „InnoDB: oštećenje“ ili „neusklađenost kontrolnog zbroja stranice“.
- Pokušajte siguran početak: ukloni zapisnike ponovnog izvršavanja (InnoDB će ih ponovno izraditi).
sudo systemctl stop mysql
sudo mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0.bak 2>/dev/null
sudo mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile1.bak 2>/dev/null
sudo systemctl start mysqlIf MySQL Ako i dalje ne uspijeva, upotrijebite InnoDB force recovery kako biste ga pokrenuli dovoljno dugo da se izvade podaci. Koristite najnižu razinu koja radi i uklonite je nakon toga.
# In my.cnf under [mysqld]
innodb_force_recovery=1 # Try 1..6 cautiously
# Then:
sudo systemctl restart mysql
# Dump critical databases
mysqldump --single-transaction --hex-blob --routines --triggers -u root -p mydb > mydb.sql
# Remove force_recovery and restore from backup or reimport dumps
# Finally:
sudo systemctl restart mysqlKorak 3: Popravak MyISAM tablica (starije ili nišne upotrebe)
MyISAM tablice mogu se popraviti pomoću mysqlcheck ili myisamchk. Zaustavite uslugu prije popravaka na razini datotečnog sustava.
# Online repair attempt (server running)
mysqlcheck -u root -p --repair --optimize --all-databases
# Offline repair (server stopped)
sudo systemctl stop mysql
sudo myisamchk -r /var/lib/mysql/DB_NAME/*.MYI
sudo systemctl start mysqlKorak 4: Resetirajte izgubljeni MySQL Korijen Lozinka
Koristite tablice za preskakanje odobrenja kako biste privremeno zaobišli autentifikaciju. Ograničite pristup poslužitelju dok to radite.
sudo systemctl stop mysql
# Start manually without grants (one-time)
sudo mysqld_safe --skip-grant-tables --skip-networking &
# In another shell, set a new password
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword!';
-- or (older versions)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPassword!');
# Kill safe server and start normally
sudo pkill -f mysqld_safe
sudo systemctl start mysqlKorak 5: Autentifikacija, povezivanje, zaštitni zid i SELinux/AppArmor
- Adresa za povezivanje: Samo za lokalni pristup, zadržite 127.0.0.1. Za udaljeni pristup koristite 0.0.0.0 i osigurajte ga s korisnicima, SSLi zaštitni zid.
# my.cnf
[mysqld]
bind-address=0.0.0.0
# Firewall example (UFW)
sudo ufw allow 3306/tcp- SELinux (baziran na RHEL-u):
# Allow MySQL to listen remotely
sudo setsebool -P mysql_connect_any 1
# If using a custom data dir
sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
sudo restorecon -Rv /data/mysql- AppArmor (Debian/Ubuntu): Prilagodite profile ako koristite direktorij podataka koji nije zadani.
sudo nano /etc/apparmor.d/usr.sbin.mysqld
# Add new data dir paths, then:
sudo systemctl reload apparmorKorak 6: Ispravljanje performansi: spori upiti i pogrešna konfiguracija
- Omogući i pregledaj zapisnik sporih upita:
# my.cnf
[mysqld]
slow_query_log=1
long_query_time=1
slow_query_log_file=/var/log/mysql/slow.log
sudo systemctl restart mysql
pt-query-digest /var/log/mysql/slow.log # Percona tool (optional)- Podesite međuspremnike tipki (primjeri, prilagodite na RAM):
[mysqld]
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
innodb_flush_log_at_trx_commit=1
max_connections=200
query_cache_type=0 # Disable on modern versions- Isprazni i optimiziraj:
mysqlcheck -u root -p --optimize --all-databases
mysql -e "SHOW PROCESSLIST;" -uroot -p
mysql -e "SHOW ENGINE INNODB STATUS\G" -uroot -pOgraničenja hardvera su važna. Ako je memorije malo, smanjite innodb_buffer_pool_size ili dodajte swap kao privremenu mjeru, a zatim skalirajte poslužitelj.
Korak 7: Zamke nadogradnje/smanjenja verzije i neusklađenost verzija
- Nakon nadogradnje glavnih verzija, pokrenite mysql_upgrade (ili ugrađenu rutinu nadogradnje na novijim izdanjima).
- Provjerite kompatibilnost dodataka i autentifikacije (npr. caching_sha2_password vs mysql_native_password).
mysql_upgrade -u root -p
# Newer versions may auto-run equivalent tasks at startupKorak 8: Sigurnosne kopije i vraćanja (logička vs. fizička)
- Logički (mysqldump): Prijenosno, sporije na velikim skupovima podataka.
- Fizički (Percona XtraBackup/LVM): Brzo, odlično za velike skupove podataka i PITR.
# Full logical backup
mysqldump --single-transaction --routines --triggers --events --all-databases -u root -p | gzip > full-$(date +%F).sql.gz
# Restore
gunzip -c full-2025-01-01.sql.gz | mysql -u root -pUobičajeni scenariji popravka i što učiniti
- Disk je 100% pun: Očisti zapisnike, premjesti binarne zapisnike, povećati veličinu volumena, a zatim ponovno pokrenite MySQL.
- Ne mogu se povezati na daljinu: Ažurirajte adresu povezivanja, stvorite odgovarajuće korisnike s obrascima hosta, otvorite vatrozid, provjerite sigurnosne grupe u oblaku.
- visok CPU or RAM: Istražite spore upite, nedostajuće indekse, visoku konkurentnost; podesite skup međuspremnika i ograničenja povezivanja.
- Tablice označene kao srušene: Koristite mysqlcheck ili myisamchk; razmislite o migraciji na InnoDB radi trajnosti.
- Nasumična ponovna pokretanja: Provjerite zapisnike kernela (dmesg), OOM kills, hardver i napajanje. Omogućite pravila ponovnog pokretanja systemd-a.
Najbolje prakse za sigurnost, stabilnost i prevenciju
- Automatizirajte sigurnosne kopije i mjesečna testiranja vraćanja.
- Omogući nadzor diska, memorije, CPU, U/I i MySQL mjerenja.
- Zadržati MySQL paketi ažurirani nakon testiranja u fazi pripravnosti.
- Koristi najmanje privilegija korisnici baze podataka i SSL za daljinski pristup.
- Dokumentirajte svoju my.cnf datoteku, držite je u kontroli verzija i komentirajte promjene.
Cheat Sheet za osnovne naredbe
# Service control
sudo systemctl status mysql
sudo systemctl restart mysql
sudo systemctl status mariadb
sudo systemctl restart mariadb
# Logs
journalctl -u mysql -f
tail -f /var/log/mysql/error.log
# Health and repair
mysqladmin ping -uroot -p
mysqlcheck -uroot -p --all-databases
mysql -e "SHOW VARIABLES LIKE 'version';" -uroot -p
# Connections and ports
ss -ltnp | grep 3306
ufw allow 3306/tcp # or firewall-cmd --add-service=mysql --permanent && firewall-cmd --reloadFAQ
1. Kako popraviti “MySQL "usluga se nije uspjela pokrenuti" na Ubuntuu ili Debianu?
Pokrenite systemctl status mysql i provjerite journalctl -u mysql za točnu grešku. Uobičajena rješenja uključuju oslobađanje prostora na disku, ispravljanje vlasništva nad /var/lib/mysql, uklanjanje zastarjelih PID/socket datoteka i rješavanje sukoba portova. Nakon promjena, ponovno pokrenite računalo. MySQL i ponovno provjerite zapisnike.
2. Što trebam učiniti ako MySQL Je li port 3306 već u upotrebi?
Identificirajte proces pomoću ss -ltnp ili lsof -i :3306. Zaustavite konfliktnu uslugu ili je promijenite. MySQLport u my.cnf (npr. 3307), a zatim ažurirajte vatrozidove i konfiguracije aplikacija u skladu s tim. Ponovno pokrenite MySQL i provjerite povezanost.
3. Kako se mogu oporaviti od oštećenja InnoDB-a bez gubitka podataka?
Pokušajte ponovno pokrenuti nakon brisanja datoteka ib_logfile. Ako to ne uspije, omogućite innodb_force_recovery na najnižu vrijednost koja dopušta pokretanje, napravite dump baze podataka s mysqldump, uklonite postavku force, ponovno izgradite instancu i ponovno uvezite. Uvijek održavajte provjerene sigurnosne kopije radi sigurnosti.
4. Zašto se ne mogu povezati s MySQL udaljeno s drugog servera?
Provjerite adresu povezivanja (0.0.0.0 za udaljeni uređaj), provjerite je li korisnik kreiran s ispravnim hostom (npr. 'app'@'10.%'), dopustite port 3306 na vatrozidu i sigurnosnim grupama u oblaku te potvrdite da nema SELinux/AppArmor ograničenja. Testirajte s mysql -h SERVER_IP -u USER -p.
5. Je li MariaDB drugačija od MySQL prilikom rješavanja problema?
Osnovni koraci su gotovo identični. Glavne razlike su nazivi paketa i usluga (mariadb vs mysql/mysqld), značajke specifične za verziju i zadane postavke konfiguracije. Analiza zapisnika, systemctl, journalctl i mysqlcheck primjenjuju se na oba.
Zaključak
Dakle, ako MySQL Ako vaš Linux poslužitelj odjednom prestane raditi, što biste prvo trebali učiniti? Odgovor je jednostavan, nemojte nagađati, počnite s provjerom zapisnika, statusa usluge i osnovnih resursa poput prostora na disku i memorije. Većina problema dolazi od uobičajenih problema poput punog diska, pogrešaka dozvola, oštećenih tablica ili sukoba portova. Nakon što utvrdite pravi uzrok, ispravljanje MySQL postaje puno lakše i kontroliranije.
I nakon što sve ponovno radi, zapitajte se kako to možete izbjeći sljedeći put? Redovito izrađujte sigurnosne kopije, pratite svoj poslužitelj, koristite ispravne konfiguracije i izbjegavajte nepotrebne promjene bez testiranja. Stabilno MySQL Postavljanje nije samo ispravljanje grešaka kada se dogode, već održavanje sustava u kojem su problemi rijetki, a čak i ako se dogode, već točno znate kako ih riješiti.