fix(dump): pass --column-statistics=0 for MySQL 8 mysqldump on MariaDB

When the server is MariaDB but only MySQL 8's mysqldump is installed
(e.g. dockware/web), the dump aborted with "Unknown table
'COLUMN_STATISTICS' in information_schema (1109)".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
haylanandClaude Bot committed 2026-11-02 23:29:43 +01:00
1 parent fa464bc20d
commit 8b13c5b3c8
5 files changed
+51

No files matched your search

+14
View File
@@ -6,6 +6,7 @@ use AeonDumpManager\Service\Exception\DumpBinaryNotFoundException;
use Doctrine\DBAL\Connection;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\Process\ExecutableFinder;
use Symfony\Component\Process\Process;
/**
* Picks mariadb-dump/mysqldump depending on what the configured DB connection
@@ -38,6 +39,19 @@ class DumpBinaryLocator
throw DumpBinaryNotFoundException::create($binaryNames);
}
/**
* @return list<string> client-specific flags for the located binary
*/
public function extraArguments(string $binary): array
{
$version = new Process([$binary, '--version']);
$version->run();
return MySqlVariant::needsColumnStatisticsOff($version->getOutput(), $this->isMariaDb())
? ['--column-statistics=0']
: [];
}
private function isMariaDb(): bool
{
// Connection::getServerVersion() is private in the DBAL version this
+1
View File
@@ -173,6 +173,7 @@ class DumpService
$binary,
'--single-transaction',
'--quick',
...$this->dumpBinaryLocator->extraArguments($binary),
'-h', (string) ($params['host'] ?? '127.0.0.1'),
'-P', (string) ($params['port'] ?? 3306),
'-u', (string) ($params['user'] ?? 'root'),
+14
View File
@@ -14,4 +14,18 @@ class MySqlVariant
{
return stripos($serverVersion, 'mariadb') !== false;
}
/**
* MySQL 8+ mysqldump queries information_schema.COLUMN_STATISTICS, which
* MariaDB lacks (error 1109); --column-statistics=0 skips it. MariaDB's own
* client (version string contains "MariaDB") and MySQL < 8 don't know the flag.
*/
public static function needsColumnStatisticsOff(string $clientVersion, bool $serverIsMariaDb): bool
{
return $serverIsMariaDb
&& !self::isMariaDb($clientVersion)
// MySQL < 8 prints "Ver 10.13 Distrib 5.7.x": the Distrib number is the real version.
&& (preg_match('/Distrib (\d+)\./', $clientVersion, $m) === 1 || preg_match('/\bVer (\d+)\./', $clientVersion, $m) === 1)
&& (int) $m[1] >= 8;
}
}