MySqlBackup.NET - C#、VB.NET、ASP.NET 的 MySQL 备份解决方案
一个在 .NET 中导出和导入 MySQL 数据库的工具
- 下载 MySqlBackup.NET_v2.3.5_.zip (2021 年 9 月 22 日)
可用链接:
- https://github.com/MySqlBackupNET/MySqlBackup.Net
- ASP.NET 在线演示: http://mysqlbackup.somee.com
- ohloh.net - https://www.ohloh.net/p/MySqlBackupNET
- 通过 NuGet 安装
PM> Install-Package MySqlBackup.NET
https://nuget.net.cn/packages/MySqlBackup.NET/PM> Install-Package MySqlBackup.Net.DevartExpress
https://nuget.net.cn/packages/MySqlBackup.Net.DevartExpress/PM> Install-Package MySqlBackup.NET.MySqlConnector
https://nuget.net.cn/packages/MySqlBackup.NET.MysqlConnector/
目录
1. 引言
本文介绍了一个可以在 C# 或 VB.NET 中备份/恢复 MySQL 数据库的工具(DLL)以及一些使用示例代码。它是 MySqlDump
的替代方案。
开发此工具的另一个好处是,我们无需依赖 MySqlDump.exe 和 MySql.exe 这两个小程序来执行备份和恢复任务。我们可以更好地控制输出结果。
备份 MySQL 数据库最常见的方法是使用 MySqlDump.exe 和 MySQL 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),并具备至少能够执行四种基本操作 SELECT
、INSERT
、UPDATE
、DELETE
的知识。如果您不熟悉,可以阅读有关 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. 历史
- 2021 年 9 月 22 日,v2.3.5 发布
- 查看完整的更改日志