Blog · strony www

Duplicator Pro wywala się na MariaDB – fix na błąd „SESSION variable read-only”

2026-08-03

Kiedy Duplicator odmawia posłuszeństwa

Wgrywam lokalnie backup produkcyjnej strony WordPress przez Duplicator Pro. Backup ma 60 GB (baza + media). Instalator się uruchamia, wygląda dobrze, klika Next – i wywala się na etapie DB Install z komunikatem:

EXCEPTION ERROR: SESSION variable 'max_allowed_packet'
is read-only. Use SET GLOBAL to assign the value
FILE: .../dup-installer/classes/database/class.db.php[633]

Google pełen zapytań „jak to naprawić”. Odpowiedzi nie ma sensownej.

Powód jest konkretny: Duplicator Pro 4.0.5.3 (i wcześniejsze) próbuje na starcie sesji ustawić SET SESSION max_allowed_packet, żeby móc importować duże pojedyncze rekordy z bazy. Od wersji MariaDB 10.5 ta zmienna jest oznaczona jako read-only na poziomie sesji – można ją zmienić tylko globalnie, jako administrator z odpowiednimi uprawnieniami.

Duplicator o tym nie wie i próbuje ustawić i tak. MariaDB rzuca wyjątek. Instalator staje w miejscu.

Trzy rzeczy do zrobienia

1. Zwiększ max_allowed_packet globalnie w konfigu MariaDB

Skoro nie da się tego ustawić per sesja, ustaw raz na globalnym poziomie w konfiguracji serwera. Na XAMPP edytuj plik:

c:/xampp/mysql/bin/my.ini

W sekcji [mysqld] dodaj (albo znajdź i zmień):

[mysqld]
max_allowed_packet = 256M

Restart MySQL w panelu XAMPP. Od teraz każda sesja ma wystarczająco duży packet i Duplicator nie musi tego zmieniać per sesja.

Weryfikacja że zadziałało: otwórz phpMyAdmin (localhost/phpmyadmin) → zakładka SQL i wklej:

SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';

Powinieneś zobaczyć wartość 268435456 (to jest 256M w bajtach). Jeśli dalej pokazuje niską wartość (np. 16777216 = 16M), znaczy że restart MySQL nie zaskoczył – sprawdź czy plik my.ini który edytowałeś to naprawdę ten używany przez działającą instancję XAMPP.

2. Zakomentuj problematyczne linie w Duplicator

Nawet z globalną konfiguracją Duplicator dalej PRÓBUJE ustawić to per sesja – i dalej dostaje błąd. Trzeba go zniechęcić do próbowania.

Otwórz plik:

dup-installer/ctrls/classes/class.ctrl.dbinstall.php

Znajdź linie (u mnie 565-566, u Was mogą być nieco inne w zależności od wersji Duplicator):

DUPX_DB::mysqli_query($this->dbh, "SET GLOBAL max_allowed_packet = ...");
DUPX_DB::mysqli_query($this->dbh, "SET max_allowed_packet = ...");

Zakomentuj obie:

// WYLACZONE - MariaDB 10.5+ blokuje SET SESSION max_allowed_packet.
// DUPX_DB::mysqli_query($this->dbh, "SET GLOBAL max_allowed_packet = ...");
// DUPX_DB::mysqli_query($this->dbh, "SET max_allowed_packet = ...");

Zapisz plik. Uruchom installer od nowa.

3. Bonus: wyłącz display_errors w PHP

Jeśli używasz XAMPP z PHP 8.1 lub nowszym, dodatkowo Duplicator może wywalać się na tzw. deprecation warnings. PHP wypluwa warningi PRZED wysłaniem HTML-a, przez co response instalatora zamiast czystego JSON-a albo HTML-a zawiera na początku tekstową kupę warning-ów. Instalator się na tym dławi.

Otwórz plik konfiguracji PHP:

c:/xampp/php/php.ini

Znajdź linię display_errors i ustaw na Off:

display_errors = Off

Restart Apache w panelu XAMPP. Warningi wciąż lecą do logów (bo tam trafiają zawsze), ale przestają zanieczyszczać output HTTP.

Rozwiązanie długoterminowe

Powyższe to obejścia. Prawdziwe rozwiązanie to:

  • Zaktualizować Duplicator Pro do wersji 4.5+ – nowsze wersje wiedzą już o MariaDB 10.5 i nie próbują SET SESSION max_allowed_packet. Jeśli masz licencję, po prostu update.
  • Zaktualizować konsystentnie serwer, na którym stoi backup źródłowy – żeby ekstrakty produkcyjne były robione z nowszą wersją Duplicator, która generuje nowsze installery.

Ale jeśli akurat teraz masz siedzieć z 60-gigowym backupem i produkcyjny serwer jest na starym Duplicator, a Ty musisz to lokalnie postawić w godzinę – powyższe trzy kroki działają.

Dlaczego to się w ogóle dzieje

MariaDB 10.5 (październik 2020) wprowadziła zaostrzenie polityki security. Zmienne systemowe, które mogłyby wpłynąć na zachowanie serwera per sesja – takie jak max_allowed_packet – zostały oznaczone jako „GLOBAL only”. Sesja może je odczytać, ale nie może zmienić.

To jest sensowne z punktu widzenia bezpieczeństwa – inaczej zwykły user MySQL mógłby ustawić sobie 4 GB packet size i przeciążyć serwer. Ale to psuje starsze narzędzia, które zakładały że SET SESSION zawsze zadziała.

Duplicator to jedno z takich narzędzi. WP-CLI też miał ten sam problem przez chwilę. Wiele skryptów migracyjnych bazujących na mysqldump miało tak samo.

Podsumowanie

Trzy plikowe zmiany rozwiązują sprawę:

  1. my.ini – max_allowed_packet globalnie, restart MySQL
  2. class.ctrl.dbinstall.php – zakomentować 2 linie SET SESSION, zapisać
  3. php.ini – display_errors Off, restart Apache

Jeśli szukasz teraz o północy tego dokładnie błędu przed jutrzejszym deadlinem – masz już wszystkie 3 fixy do skopiowania i wklejenia.

Wróć do wszystkich wpisów

Masz projekt do omówienia?

Napisz, o co chodzi - nie musi być technicznie, od tego jestem ja. Odezwę się i powiem wprost, czy i jak mogę pomóc.