65.9K
CodeProject 正在变化。 阅读更多。
Home

MySqlBackup.NET - C#、VB.NET、ASP.NET 的 MySQL 备份解决方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (127投票s)

2012 年 8 月 14 日

公共领域

8分钟阅读

viewsIcon

961562

downloadIcon

38304

一个在 .NET 中导出和导入 MySQL 数据库的工具

可用链接:

目录

  1. 引言
  2. 功能与依赖项
  3. 背景
  4. 基本用法
  5. ASP.NET 使用示例
  6. 更多指南和示例
  7. 历史

1. 引言

本文介绍了一个可以在 C# 或 VB.NET 中备份/恢复 MySQL 数据库的工具(DLL)以及一些使用示例代码。它是 MySqlDump 的替代方案。

开发此工具的另一个好处是,我们无需依赖 MySqlDump.exeMySql.exe 这两个小程序来执行备份和恢复任务。我们可以更好地控制输出结果。

备份 MySQL 数据库最常见的方法是使用 MySqlDump.exeMySQL Workbench

MySQL Workbench 对开发者来说很好,但是,对于客户端或最终用户来说,推荐的方法是预设所有参数,让他们只需要知道按下“备份”大按钮即可完成所有操作。使用 MySQL Workbench 作为备份工具不适合客户端或最终用户。

另一方面,MySqlDump.exe 不能用于 Web 应用程序。由于大多数 Web 主机提供商禁止使用该程序,因此 MySqlBackup.NET 在构建基于 Web(ASP.NET/Web Services)的备份工具方面将非常有用。

2. 功能与依赖项

特点

  • 备份和恢复 MySQL 数据库
  • 可在任何 .NET 语言中使用
  • 导出/导入到/从 MemoryStream
  • 条件行导出(过滤表或行)
  • 导出和导入任务均提供进度报告
  • 能够以不同的模式导出行(Insert、Insert Ignore、Replace、On Duplicate Key Update、Update)
  • 可直接在 ASP.NET 或 Web 服务中使用

先决条件/依赖项

MySqlBackup.NET 依赖以下组件才能工作。

选项 1:MySql.Data (Connector/NET)

  • MySQL dot net Connector/Net (MySql.Data.DLL)
  • 为了编译或使用 MySqlBackup.NET,必须在项目中添加此 DLL 的引用。
  • MySql.Data.DLL 由 Oracle Corporation 开发,在 GPL License (https://gnu.ac.cn/licenses/old-licenses/gpl-2.0.html) 下授权。
  • MySql.Data.DLL

选项 2:Devart Express (dotConnect)

  • Devart dotConnect for MySQL Express
  • 为了编译或使用 MySqlBackup.NET,必须在项目中添加此 DLL 的引用。
  • 有关许可协议,请参阅: https://www.devart.com/dotconnect/mysql/licensing-faq.html
  • Devart.Data.DLL
  • Devart.Data.MySql.DLL

选项 3:MySqlConnector (MIT)

  • MySqlConnector:.NET 的高性能 MySQL 库
  • 为了编译或使用 MySqlBackup.NET,必须在项目中添加此 DLL 的引用。
  • 项目 URL: https://github.com/mysql-net/MySqlConnector
  • 在 MIT 许可下授权
  • MySqlConnector.DLL

3. 背景

本文假设您已经熟悉 MySQL dot net connector (MySql.Data.dll),并具备至少能够执行四种基本操作 SELECTINSERTUPDATEDELETE 的知识。如果您不熟悉,可以阅读有关 C# 连接 MySQL 的教程和解释,网址为:[https://codeproject.org.cn/Articles/43438/Connect-C-to-MySQL]。

4. 基本用法

在编写 MySqlBackup.NET 代码之前,请添加此 using 语句

using MySql.Data.MySqlClient; 

简单导出示例

string constring = "server=localhost;user=root;pwd=qwerty;database=test;";
string file = "C:\\backup.sql";
using (MySqlConnection conn = new MySqlConnection(constring))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        using (MySqlBackup mb = new MySqlBackup(cmd))
        {
            cmd.Connection = conn;
            conn.Open();
            mb.ExportToFile(file);
            conn.Close();
        }
    }
}

简单导入示例

string constring = "server=localhost;user=root;pwd=qwerty;database=test;";
string file = "C:\\backup.sql";
using (MySqlConnection conn = new MySqlConnection(constring))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        using (MySqlBackup mb = new MySqlBackup(cmd))
        {
            cmd.Connection = conn;
            conn.Open();
            mb.ImportFromFile(file);
            conn.Close();
        }
    }
}

以上示例将使用默认选项导出和导入 MySQL 数据库。有些选项可以修改导出和导入的行为。这些选项定义在

  • MySqlBackup.ExportInfo
  • MySqlBackup.ImportInfo

自定义 export 行为示例

  • 创建新数据库
  • 仅导出表结构
  • 不导出数据行

示例代码

string constring = "server=localhost;user=root;pwd=1234;database=test1;";
string file = "Y:\\backup.sql";
using (MySqlConnection conn = new MySqlConnection(constring))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        using (MySqlBackup mb = new MySqlBackup(cmd))
        {
            cmd.Connection = conn;
            conn.Open();
            mb.ExportInfo.AddCreateDatabase = true;
            mb.ExportInfo.ExportTableStructure = true;
            mb.ExportInfo.ExportRows = false;
            mb.ExportToFile(file);
        }
    }
}

ExportInfo 选项列表

ExportInfo.GetDocumentHeaders(cmd)
  • 返回: List<string>
  • 默认值:在测试应用程序中演示
  • 获取文档头部的列表
ExportInfo.SetDocumentHeaders(List<string>)
  • 设置文档头部
ExportInfo.GetDocumentFooters()
  • 返回: List<string>
  • 默认值:在测试应用程序中演示
  • 获取文档尾部
ExportInfo.SetDocumentFooters(List<string>)
  • 设置文档头部
ExportInfo.ExcludeTables - List<string>
  • 默认值:空列表
  • 获取或设置将从导出中排除的表(黑名单)。这些表的行也不会被导出。
ExportInfo.TablesToBeExportedList - List<string>
  • 默认值:空列表
  • 获取或设置将要导出的表的列表。如果为空,则导出所有表。
ExportInfo.TablesToBeExportedDic - Dictionary<string, string>
  • 默认值:空字典
  • 获取或设置将使用自定义 SELECT 语句导出的表
  • 如果为空或空,则导出所有表和行
  • 键 = 表名。值 = 自定义 SELECT 语句
  • 示例 1: SELECT * FROM product WHERE category = 1;
  • 示例 2: SELECT name,description FROM product;
ExportInfo.RecordDumpTime - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应在转储文件中记录转储时间
ExportInfo.AddCreateDatabase - bool
  • 默认值: false
  • 获取或设置一个值,指示是否应在转储文件中添加“CREATE DATABASE”的 SQL 语句。
ExportInfo.AddDropDatabase - bool
  • 默认值: false
  • 获取或设置一个值,指示是否应在转储文件中添加“DROP DATABASE”的 SQL 语句
ExportInfo.ExportTableStructure - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出表结构(CREATE TABLE)。
ExportInfo.AddDropTable - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应将“DROP TABLE”的 SQL 语句添加到转储文件中
ExportInfo.ResetAutoIncrement - bool
  • 默认值: false
  • 获取或设置一个值,指示是否应将每个表的 auto-increment 值重置为 1
ExportInfo.ExportRows - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出行。
ExportInfo.MaxSqlLength - int
  • 默认值: 5 * 1024 * 1024 (5MB)
  • 获取或设置将多个 INSERT 语句合并为单个 SQL 的最大长度
  • 默认值为 5MB。
  • 仅当 RowsExportMode = "INSERT" 或 "INSERTIGNORE" 或 "REPLACE" 时适用
  • 如果 RowsExportMode = ONDUPLICATEKEYUPDATE 或 UPDATE,则忽略此值
ExportInfo.ExportProcedures - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出存储过程
ExportInfo.ExportFunctions - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出存储函数
ExportInfo.ExportTriggers - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出存储触发器
ExportInfo.ExportViews - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出存储视图
ExportInfo.ExportEvents - bool
  • 默认值: true
  • 获取或设置一个值,指示是否应导出存储事件
ExportInfo.IntervalForProgressReport - int
  • 默认值: 100
  • 获取或设置一个值,指示 ExportProgressChanged 事件触发的时间间隔(以毫秒为单位)
ExportInfo.ScriptsDelimiter - string
  • 默认值: |
  • 获取或设置用于导出过程、函数、事件和触发器的分隔符
ExportInfo.ExportRoutinesWithoutDefiner - bool
  • 默认值: true
  • 获取或设置一个值,指示导出的脚本(过程、函数、事件、触发器、事件)是否应排除 DEFINER
ExportInfo.RowsExportMode - enum RowsDataExportMode
  • 默认值: Insert
  • 获取或设置一个 enum 值,指示如何导出每个表的行
  • INSERT = 默认选项。推荐导出到新数据库时使用。如果主键已存在,则过程将中止。
  • INSERT IGNORE = 如果主键已存在,则跳过
  • REPLACE = 如果主键已存在,则删除该行并插入新数据
  • OnDuplicateKeyUpdate = 如果主键已存在,则更新该行。如果所有字段都是主键,则更改为 INSERT IGNORE
  • UPDATE = 如果主键不存在,则跳过,如果所有字段都是主键,则不导出任何行。
ExportInfo.WrapWithinTransaction - bool
  • 默认值: false
  • 获取或设置一个值,指示是否应将行转储包装在事务中。
  • 建议当使用 RowsExportMode = "INSERT" 或 "INSERTIGNORE" 或 "REPLACE" 时将此值设置为 FALSE,否则为 TRUE
ExportInfo.TextEncoding - System.Text.Encoding
  • 默认值: UTF8Encoding(false)
  • 获取或设置一个值,指示用于导出转储的编码。 
ExportInfo.BlobExportMode - enum BlobDataExportMode
  • 默认值: BlobDataExportMode.HexString
  • 获取或设置一个 enum 值,指示 BLOB 的导出方式。
  • BinaryChar = char 格式
  • 注意:目前不建议将 BLOB 导出为 Binary Char。导出到 BinaryChar 将引发异常,以警告开发人员此功能仅用于开发和调试目的。阅读更多:https://github.com/MySqlBackupNET/MySqlBackup.Net/issues/47
ExportInfo.BlobExportModeForBinaryStringAllow - bool
  • 默认值: false
  • 如果您希望帮助调试、修复或开发将 BLOB 导出为二进制字符格式(BlobExportMode=BinaryChar)的功能,请将此值设置为 true
ExportInfo.GetTotalRowsMode - enum GetTotalRowsMethod
  • 默认值: InformationSchema
  • 获取或设置一个值,指示获取总行数的方法
  • 此功能在开发进度条时非常有用
  • InformationSchema = 快速,但近似值
  • SelectCount = 缓慢但准确
  • Skip = 跳过获取总行数。如果您不进行任何进度报告,请使用此选项。
ExportInfo.EnableComment - Boolean
  • 默认值: True
  • 获取或设置一个值,指示是否应将注释包含在转储内容中。

ImportInfo 选项列表

ImportInfo.IntervalForProgressReport - int
  • 默认值: 100
  • 获取或设置一个值,指示 ExportProgressChanged 事件触发的时间间隔(以毫秒为单位)
ImportInfo.IgnoreSqlError - bool
  • 默认值: false
  • 获取或设置一个值,指示是否应忽略导入过程中发生的 SQL 错误
ImportInfo.ErrorLogFile - string
  • 默认值: string.empty
  • 获取或设置用于记录错误消息的文件路径

5. ASP.NET 使用示例

导出示例代码。下面的代码将内容导出到 MemoryStream,然后直接传输以供下载。

using System.IO;

string connstr = "server=localhost;user=root;pwd=1234;database=test;";
MemoryStream ms = new MemoryStream();
using (MySqlConnection conn = new MySqlConnection(connstr))
{
    MySqlCommand cmd = new MySqlCommand();
    MySqlBackup mb = new MySqlBackup(cmd);
    cmd.Connection = conn;
    conn.Open();
    mb.ExportToMemoryStream(ms);
}
Response.ContentType = "text/plain";
Response.AppendHeader("Content-Disposition", "attachment; filename=backup.sql");
Response.BinaryWrite(ms.ToArray());
Response.End();

上传和导入示例代码

string connstr = "server=localhost;user=root;pwd=1234;database=test;";
byte[] ba = FileUpload1.FileBytes;
MemoryStream ms = new MemoryStream(ba);
using (MySqlConnection conn = new MySqlConnection(connstr))
{
    MySqlCommand cmd = new MySqlCommand();
    MySqlBackup mb = new MySqlBackup(cmd);
    cmd.Connection = conn;
    conn.Open();
    mb.ExportToMemoryStream(ms);
}
Header.Controls.Add(new LiteralControl
     ("<script type=\"text/javascript\">alert('ok');</script>"));

6. 更多指南和示例

更多指南和示例可在项目站点的文档中找到
https://github.com/MySqlBackupNET/MySqlBackup.Net

以下是一些指南。

7. 历史

© . All rights reserved.