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ę:
- my.ini – max_allowed_packet globalnie, restart MySQL
- class.ctrl.dbinstall.php – zakomentować 2 linie SET SESSION, zapisać
- 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.



