fix(dump): pass --column-statistics=0 for MySQL 8 mysqldump on MariaDB, release as 0.0.7 #17

Merged
haylan merged 2 commits from fix/0.0.7-column-statistics into main 2026-11-02 22:39:42 +00:00
6 changed files with 52 additions and 1 deletions
Showing only changes of commit 6b7ba3bc47 - Show all commits

No files matched your search

+6
View File
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.0.7] - 2026-11-02
### Fixed
- Creating a dump failed on MariaDB when only MySQL 8's `mysqldump` was installed (`Unknown table 'COLUMN_STATISTICS'`); it now passes `--column-statistics=0` in that case.
## [0.0.6] - 2026-10-04 ## [0.0.6] - 2026-10-04
### Changed ### Changed
+1 -1
View File
@@ -3,7 +3,7 @@
"description": "Export database dumps for Shopware 6 environments.", "description": "Export database dumps for Shopware 6 environments.",
"type": "shopware-platform-plugin", "type": "shopware-platform-plugin",
"license": "MIT", "license": "MIT",
"version": "0.0.6", "version": "0.0.7",
"keywords": [ "keywords": [
"shopware", "shopware",
"shopware6", "shopware6",
+14
View File
@@ -6,6 +6,7 @@ use AeonDumpManager\Service\Exception\DumpBinaryNotFoundException;
use Doctrine\DBAL\Connection; use Doctrine\DBAL\Connection;
use Shopware\Core\System\SystemConfig\SystemConfigService; use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\Process\ExecutableFinder; use Symfony\Component\Process\ExecutableFinder;
use Symfony\Component\Process\Process;
/** /**
* Picks mariadb-dump/mysqldump depending on what the configured DB connection * Picks mariadb-dump/mysqldump depending on what the configured DB connection
@@ -38,6 +39,19 @@ class DumpBinaryLocator
throw DumpBinaryNotFoundException::create($binaryNames); 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 private function isMariaDb(): bool
{ {
// Connection::getServerVersion() is private in the DBAL version this // Connection::getServerVersion() is private in the DBAL version this
+1
View File
@@ -173,6 +173,7 @@ class DumpService
$binary, $binary,
'--single-transaction', '--single-transaction',
'--quick', '--quick',
...$this->dumpBinaryLocator->extraArguments($binary),
'-h', (string) ($params['host'] ?? '127.0.0.1'), '-h', (string) ($params['host'] ?? '127.0.0.1'),
'-P', (string) ($params['port'] ?? 3306), '-P', (string) ($params['port'] ?? 3306),
'-u', (string) ($params['user'] ?? 'root'), '-u', (string) ($params['user'] ?? 'root'),
+14
View File
@@ -14,4 +14,18 @@ class MySqlVariant
{ {
return stripos($serverVersion, 'mariadb') !== false; 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;
}
} }
+16
View File
@@ -21,4 +21,20 @@ class MySqlVariantTest extends TestCase
yield 'mariadb without legacy prefix' => ['10.11.2-MariaDB', true]; yield 'mariadb without legacy prefix' => ['10.11.2-MariaDB', true];
yield 'mariadb lowercase' => ['10.11.2-mariadb', true]; yield 'mariadb lowercase' => ['10.11.2-mariadb', true];
} }
#[DataProvider('columnStatisticsProvider')]
public function testNeedsColumnStatisticsOff(string $clientVersion, bool $serverIsMariaDb, bool $expected): void
{
self::assertSame($expected, MySqlVariant::needsColumnStatisticsOff($clientVersion, $serverIsMariaDb));
}
public static function columnStatisticsProvider(): iterable
{
$mysql8 = 'mysqldump Ver 8.0.46-0ubuntu0.24.04.4 for Linux on x86_64 ((Ubuntu))';
yield 'mysql 8 client, mariadb server' => [$mysql8, true, true];
yield 'mysql 8 client, mysql server' => [$mysql8, false, false];
yield 'mysql 5.7 client, mariadb server' => ['mysqldump Ver 10.13 Distrib 5.7.44, for Linux (x86_64)', true, false];
yield 'mariadb client, mariadb server' => ['mariadb-dump from 11.4.2-MariaDB, client 10.19 for debian-linux-gnu (x86_64)', true, false];
yield 'mariadb legacy mysqldump name' => ['mysqldump Ver 10.19 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)', true, false];
}
} }