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 TABLESiEVENTdo 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.
Bashmysqldump -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.
Bashmysqldump -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.
Bashmysqldump -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
Bashchmod 600 ~/.my.cnf
4. Import zrzutu
Najpierw utwórz docelową bazę z nowoczesnym zestawem znaków, a potem wczytaj plik.
Bashmysql -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.
Bashapt 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.
Bashmysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'
Baza DBNAME musi już istnieć na serwerze docelowym.
✅ Weryfikacja wyniku
Bashgzip -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:
Bashsed -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!