Mysql .Data и Azure Mysql ошибка 'Таблица' mysql .pro c 'не существует' - PullRequest
0 голосов
/ 06 марта 2020

Когда я пытаюсь выполнить хранимую процедуру на сервере Azure MySQL версии 8.0.15, используя следующий код, я получаю сообщение об ошибке «Таблица» mysql .pro c «не существует». Эта ошибка не происходит со старыми версиями. какой-то поиск говорит, что нужно использовать MySQL_upgrade, но я не могу заставить его работать против azure MySQL. Как мне преодолеть эту ошибку? Все работает нормально, когда я подключаюсь к локальной MySQL версии, которая совпадает с azure hosted.

Пример кода

static async Task Main(string[] args)
    {
        var builder = new MySqlConnectionStringBuilder
        {
            Server = "myserver.mysql.database.azure.com",
            Database = "mydb",
            UserID = "myserver@myserver",
            Password = "password",
            SslMode = MySqlSslMode.Prefered,
        };

        using (var conn = new MySqlConnection(builder.ConnectionString))
        {
            Console.WriteLine("Opening connection");
            await conn.OpenAsync();

            using (var command = conn.CreateCommand())
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "prc_myprocedure";

                var reader = await command.ExecuteReaderAsync(CommandBehavior.Default);
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetValue(0));
                }
            }

            Console.WriteLine("Closing connection");
        }

        Console.WriteLine("Press RETURN to exit");
        Console.ReadLine();
    }
}

Полная ошибка:

Unhandled exception. MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'mysql.proc' doesn't exist
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.SchemaProvider.GetProcedures(String[] restrictions)
   at MySql.Data.MySqlClient.ISSchemaProvider.GetProcedures(String[] restrictions)
   at MySql.Data.MySqlClient.ISSchemaProvider.GetSchemaInternal(String collection, String[] restrictions)
   at MySql.Data.MySqlClient.SchemaProvider.GetSchema(String collection, String[] restrictions)
   at MySql.Data.MySqlClient.MySqlConnection.GetSchemaCollection(String collectionName, String[] restrictionValues)
   at MySql.Data.MySqlClient.ProcedureCache.GetProcData(MySqlConnection connection, String spName)
   at MySql.Data.MySqlClient.ProcedureCache.AddNew(MySqlConnection connection, String spName)
   at MySql.Data.MySqlClient.ProcedureCache.GetProcedure(MySqlConnection conn, String spName, String cacheKey)
   at MySql.Data.MySqlClient.StoredProcedure.GetParameters(String procName)
   at MySql.Data.MySqlClient.StoredProcedure.CheckParameters(String spName)
   at MySql.Data.MySqlClient.StoredProcedure.Resolve(Boolean preparing)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at AzureMySqlExample.MySqlUpdate.Main(String[] args) in C:\Users\sammo\source\repos\ConsoleApp1\Program.cs:line 31
   at AzureMySqlExample.MySqlUpdate.<Main>(String[] args)

1 Ответ

0 голосов
/ 01 мая 2020

ВЫПУСК: Вы получаете сообщение об ошибке ниже, потому что, когда вы начинаете подключение к Azure MySQL, шлюз Azure MySQL сначала отправит обратно пакет приветствия со значением по умолчанию версия сервера "5.6.42.0 MySQL Сервер совместной работы (GPL)". Это заставляет драйвер MySQL .Data обрабатывать версию сервера как 5.6. Но на самом деле это 8.0, а в MySQL 8.0 таблица mysql .pro c больше не существует.

Обходной путь: Вы можете использовать Proxy SQL, чтобы исправить выпуск версии:

  1. Настройка прокси SQL для Azure MySQL https://techcommunity.microsoft.com/t5/Azure-Database-for-MySQL/Load-balance-read-replicas-using-ProxySQL-in-Azure-Database-for/ba-p/880042

  2. Обновление версия сервера в ProxySQL При подключении к Proxy SQL с учетной записью администратора выполните следующие команды:

a. mysql –u admin –padmin -h 127.0.0.1 -P 6032

b. ОБНОВЛЕНИЕ global_variables SET variable_value = '' WHERE variable_name = 'mysql -server_version';

c. загрузить mysql переменные во время выполнения;

d. сохранить mysql переменную на диск;

...