Polski

Eksport i import bazy MySQL/MariaDB na serwerze VPS z Linuksem

2 min
Hosting VPS/VDS

Przeniesienie strony, odtworzenie kopii zapasowej czy sklonowanie środowiska testowego sprowadza się do dwóch operacji: zrzutu bazy do pliku i ponownego jej wczytania. Na VPS Linux Infrawire obie wykonasz kilkoma poleceniami, bez interfejsu webowego. Ten poradnik obejmuje spójne zrzuty, kompresję, duże pliki, kodowanie znaków oraz bezpośredni transfer między serwerami.

📋 Wymagania wstępne

  • Serwer VPS z Linuksem (Ubuntu 24.04 lub Debian 12) i dostępem SSH jako root (adres IP i hasło roota znajdziesz w panelu klienta)
  • Zainstalowany MySQL lub MariaDB, albo przynajmniej klient (apt install mariadb-client)
  • Użytkownik bazy z uprawnieniami SELECT, SHOW VIEW, TRIGGER, LOCK TABLES i EVENT do eksportowanej bazy
  • Wystarczająco dużo wolnego miejsca na dysku: sprawdź poleceniem df -h

1. Eksport bazy za pomocą mysqldump

Dla tabel InnoDB (domyślny silnik) opcja --single-transaction tworzy spójną migawkę bez blokowania tabel, więc Twoja strona działa normalnie podczas zrzutu.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

W nowszych wersjach MariaDB to samo narzędzie występuje też pod nazwą mariadb-dump, z identycznymi opcjami.

2. Procedury, wyzwalacze i zdarzenia

Wyzwalacze są eksportowane domyślnie, ale procedury składowane, funkcje i zaplanowane zdarzenia trzeba dodać jawnie. Wymuszenie zestawu znaków pozwala uniknąć problemów z polskimi znakami i emoji.

Bash
mysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql

Przydatne warianty:

Bash
# Tylko struktura, bez wierszy mysqldump -u USER -p --no-data DBNAME > schema.sql # Kilka baz, z instrukcjami CREATE DATABASE mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Wszystkie bazy na serwerze mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql

3. Kompresja zrzutu za pomocą gzip

Tekst SQL kompresuje się bardzo dobrze. Przekieruj wynik prosto do gzip, aby nieskompresowany plik nigdy nie trafił na dysk.

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

Aby nie wpisywać hasła za każdym razem (i nie ujawniać go w wyniku ps), zapisz je w ~/.my.cnf:

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. Import zrzutu

Najpierw utwórz docelową bazę z nowoczesnym zestawem znaków, a potem wczytaj plik.

Bash
mysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # Ze skompresowanego pliku gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME

Uwaga: domyślnie zrzut zawiera DROP TABLE IF EXISTS, więc import do istniejącej bazy zastępuje tabele o tych samych nazwach. Najpierw zrób kopię miejsca docelowego.

5. Obsługa dużych plików

Przy zrzutach liczących gigabajty uruchom import w tmux, aby zerwanie połączenia SSH go nie przerwało, i użyj pv, by widzieć postęp.

Bash
apt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME

Odłącz się skrótem Ctrl+B, a potem D, i wróć później poleceniem tmux attach -t import.

6. Bezpośredni transfer na inny serwer przez SSH

Plik pośredni nie jest potrzebny: zrzut przepływa zaszyfrowanym potokiem SSH i jest wczytywany na miejscu. Dane logowania są odczytywane z ~/.my.cnf (lub z lokalnego gniazda dla roota) po obu stronach.

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

Baza DBNAME musi już istnieć na serwerze docelowym.

✅ Weryfikacja wyniku

Bash
gzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"

Porównaj liczbę wierszy w kilku kluczowych tabelach między źródłem a miejscem docelowym.

🔧 Rozwiązywanie problemów

ERROR 1045 Access denied : błędny użytkownik lub hasło albo użytkownik nie ma uprawnień z tego hosta. Najpierw sprawdź polecenie mysql -u USER -p.

ERROR 2006 MySQL server has gone away : wiersz lub zapytanie przekracza max_allowed_packet. Zwiększ tę wartość po stronie serwera w sekcji [mysqld] konfiguracji i zrestartuj usługę albo przekaż klientowi --max-allowed-packet=512M.

Krzaczki zamiast polskich znaków po imporcie : plik odczytano w złym zestawie znaków. Eksportuj z --default-character-set=utf8mb4 i importuj z tą samą opcją.

ERROR 1227 lub błędy DEFINER : zrzut odwołuje się do użytkownika, którego nie ma na serwerze docelowym. Usuń tę klauzulę podczas importu:

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 Twoje bazy danych można teraz łatwo archiwizować, przywracać i przenosić między serwerami!

Bądź na bieżąco z najnowszymi ofertami, zniżkami i promocjami specjalnymi.

Zobacz promocje

Używamy plików cookie

Używamy plików cookie analitycznych, aby ulepszać nasz serwis. Nie sprzedajemy danych stronom trzecim. Więcej w polityce prywatności.