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:
1 parent
fa464bc20d
commit
8b13c5b3c8
5 files changed
+51
No files matched your search
@@ -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
|
||||
|
||||
@@ -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,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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user