Сделайте копии базы данных MySql из веб-API ASP .Net Core 3.0 - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть .Net Core 3.0 Web Api, размещенный в «Службе приложений Azure». У меня также есть сервер базы данных MySql 5.7, размещенный в «Базе данных Azure для MySql».

В моем веб-API мне нужно создать службу, которая создает копии одной из баз данных на MySql Server. Эти копии будут находиться на том же сервере, что и оригинал, но, очевидно, будут иметь разные имена.

Я создал сценарий Sql, который при запуске, например, в Workbench, создает базу данных (включая представления, функции и хранимые процедуры). ). Однако, когда я пытаюсь запустить это из моего Web API, вот так (я создал конечную точку, к которой я могу обратиться сейчас - в конечном итоге это будет служба):

[Route("api/[controller]")]
[ApiController]
public class SchemasController : ControllerBase
{
    private readonly DbContext _context;

    public SchemasController(DbContext context)
    {
        _context = context;
    }

    [HttpPost]
    public async Task<ActionResult> PostSchema(SchemaDto schemaDto)
    {
        string script = System.IO.File.ReadAllText("CreateSchema.sql");
        script = script.Replace("[SCHEMA_NAME]", schemaDto.SchemaName);

        using (System.Data.Common.DbCommand command = _context.Database.GetDbConnection().CreateCommand())
        {
            command.CommandText = script;
            await _context.Database.OpenConnectionAsync();
            int rowsAffected = await command.ExecuteNonQueryAsync();
            await _context.Database.CloseConnectionAsync();
        };

        return Ok();
    }
}

Это выдает эту ошибку:

MySql.Data.MySqlClient.MySqlException (0x80004005): в синтаксисе SQL имеется ошибка;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'DELIMITER $$ USE testcopy $$ CREATE DEFINER = propworx @ % PROCEDURE `customer' в строке 5

У меня раньше была эта проблема при попытке выполнить sql-запросы в .Net с DELIMETER $$ в нем. Я мог бы, вероятно, удалить все вещи, связанные с DELIMETER, и это могло бы работать. Но я подумал, что, возможно, лучшим решением было бы создать дамп оригинала, а затем восстановить его как копию. Преимущество такого подхода состоит в том, что в случае изменения основной базы данных мне не нужно заново создавать новый файл сценария SQL.

Проблема в том, что я просто не знаю, как поступитьэто с учетом того, что мой API находится в «Службе приложений Azure», а MySql Server - в «Базе данных Azure для MySql Server». Тогда как на локальном ПК с Windows я делал бы что-то подобное из командной строки:

cd C:\Program Files\MySQL\MySQL Server 5.7\bin
mysqldump.exe –e –u[username] -p[password] -h[hostname] [databasename] > C:\backup.sql
mysql –u[username] -p[password] -h[hostname] [databasename] < C:\backup.sql

Смогу ли я что-то сделать в Azure?

...