MySQL ‘CREATE DATABASE IF NOT EXISTS’ ведет себя неправильно, когда база данных имеет оперативные соединения

#mysql #database #locking

#mysql #База данных #блокировка

Вопрос:

У нас есть некоторый код инициализации, который гарантирует, что все необходимые ресурсы на месте,
то есть: создает эти ресурсы (файлы, каталоги, базы данных, таблицы и т.д.), Если они отсутствуют, и ничего не делает в противном случае.

Но, когда база данных используется (т. Е. существует и уже имеет оперативные соединения), новое приложение, которое проходит через код инициализации, ожидает вечно.

Причина в том, что ‘CREATE DATABASE IF NOT EXISTS’ довольно глупо: он пытается владеть базой данных, хотя она существует и ничего не должно быть сделано.

Есть ли способ проверить, существует ли база данных уже, который не предполагает такой блокировки?

Ответ №1:

 SELECT EXISTS(
    SELECT 1
    FROM INFORMATION_SCHEMA.SCHEMATA
    WHERE SCHEMA_NAME = 'MyDatabaseName'
) AS e
  

Возвращает 1, если база данных существует (и пользователь, выполняющий запрос, имеет соответствующие привилегии, чтобы иметь возможность ее видеть, бла-бла-бла); 0 в противном случае

Ответ №2:

Просто предположим, что это так. Если этого не происходит, ваша система ужасно сломана. При попытке выполнения запросов будут обнаружены ошибки SQL.

Ответ №3:

Вы уверены? Есть ли у вас тестовый пример с воспроизводимой ошибкой? Если это так, пожалуйста, сообщите об этом как об ошибке.

Я, конечно, не вижу такого поведения, как описано.

Комментарии:

1. Странно: проблема существует, когда я использую C API (из C code), но не в python (используя MySQLdb).