#33537: Cloning test database fails with mysql-client 8.x and older mysql-server or mariadb-server -------------------------------------+------------------------------------- Reporter: Stephen Finucane | Owner: nobody Type: Bug | Status: new Component: Database layer | Version: 4.1 (models, ORM) | Severity: Normal | Resolution: Keywords: | Triage Stage: | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Stephen Finucane): Reproducing from #34083. I'm attempting to run tests in parallel using MariaDB. When running tests, all access to the additional databases fail. Scrolling back to the top, I see the following error messages: {{{ ❯ tox -e py38-django41 -- patchwork.tests.api.test_user patchwork.tests.api.test_event py38-django41 run-test-pre: PYTHONHASHSEED='631429049' py38-django41 run-test: commands[0] | python /home/patchwork/patchwork/manage.py test --noinput --parallel -v 2 --timing -- patchwork.tests.api.test_user patchwork.tests.api.test_event Found 25 test(s). Creating test database for alias 'default' ('test_patchwork')... Operations to perform: Synchronize unmigrated apps: django_filters, humanize, messages, rest_framework, staticfiles Apply all migrations: admin, auth, authtoken, contenttypes, patchwork, sessions, sites Synchronizing apps without migrations: Creating tables... Running deferred SQL... Running migrations: Applying contenttypes.0001_initial... OK ... {skipped} ... Applying sites.0002_alter_domain_unique... OK Cloning test database for alias 'default' ('test_patchwork')... mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'test_patchwork' AND TABLE_NAME = 'auth_group';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109) Cloning test database for alias 'default' ('test_patchwork')... mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'test_patchwork' AND TABLE_NAME = 'auth_group';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109) System check identified no issues (0 silenced). ... }}} The same issue happens on multiple Django versions. With a bit of hacking on the code in the tox venv, I was able to inspect the command that Django is actually executing: {{{ Dumping! cmd = mysqldump --user=patchwork --host=localhost --routines --events test_patchwork }}} Executing this locally, I see the same issue: {{{ ❯ MYSQL_PWD=password mysqldump --user=patchwork --host=localhost --routines --events patchwork -- MySQL dump 10.13 Distrib 8.0.30, for Linux (x86_64) -- -- Host: localhost Database: patchwork -- ------------------------------------------------------ -- Server version 5.5.5-10.5.16-MariaDB /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `auth_group` -- DROP TABLE IF EXISTS `auth_group`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `auth_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `auth_group` -- LOCK TABLES `auth_group` WRITE; /*!40000 ALTER TABLE `auth_group` DISABLE KEYS */; /*!40000 ALTER TABLE `auth_group` ENABLE KEYS */; UNLOCK TABLES; mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'patchwork' AND TABLE_NAME = 'auth_group';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109) ❯ echo $? 2 }}} I'm using Fedora 36 with the default packages: {{{ ❯ cat /etc/system-release Fedora release 36 (Thirty Six) ❯ sudo dnf list installed | grep mariadb mariadb-backup.x86_64 3:10.5.16-1.fc36 @updates mariadb-common.x86_64 3:10.5.16-1.fc36 @updates mariadb-connector-c.x86_64 3.2.7-1.fc36 @updates mariadb-connector-c-config.noarch 3.2.7-1.fc36 @updates mariadb-connector-c-devel.x86_64 3.2.7-1.fc36 @updates mariadb-connector-c-doc.noarch 3.2.7-1.fc36 @updates mariadb-cracklib-password-check.x86_64 3:10.5.16-1.fc36 @updates mariadb-devel.x86_64 3:10.5.16-1.fc36 @updates mariadb-errmsg.x86_64 3:10.5.16-1.fc36 @updates mariadb-gssapi-server.x86_64 3:10.5.16-1.fc36 @updates mariadb-server.x86_64 3:10.5.16-1.fc36 @updates mariadb-server-utils.x86_64 3:10.5.16-1.fc36 @updates ❯ sudo dnf list installed | grep mysql community-mysql.x86_64 8.0.30-2.fc36 @updates community-mysql-common.x86_64 8.0.30-2.fc36 @updates mysql-selinux.noarch 1.0.5-1.fc36 @updates }}} I had previously reported a similar issue using a combination of `mysql- client` with an older version of `mysql-server` or `mariadb-server`. This was reported as #33537. However, I'm now seeing the issue with the latest versions of both the server and client. As noted in the issue, I can work around this on the command line by adding the `--column-statistics=0` argument to `mysqldump`, however, there doesn't appear to be any mechanism to do this in Django. Alternatively, I can add the following to `my.cnf` (or equivalent): {{{ /etc/my.cnf.d/mysqldump.cnf [mysqldump] column-statistics=0 }}} There's a chance that someone has packaged something wrong in Fedora land and that I'm using an incompatible client and server combo (MySQL-derived client, MariaDB server). However, it's surprising that the tests proceeded to run despite the DB clone failing. As you can see above, `mysqldump` returned a non-zero exit code so there doesn't appear to be any reason Django couldn't have stopped immediately. I think it would make sense to fail fast at a minimum. If we wanted, we could also add the `--column- statistics=0` argument to our call to `mysqldump` (or provide a mechanism for users to do so), however, this isn't compatible with the 5.7.x version of `mysqldump` or the version provided by e.g. the `mariadb-client` package on Ubuntu) so this would have to be a version-specific check. -- Ticket URL: <https://code.djangoproject.com/ticket/33537#comment:4> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/01070183c6e7c449-932d17ef-0645-49b2-89c8-ff6eaa3e890b-000000%40eu-central-1.amazonses.com.