利用Mysqldump备份和迁移,我想很多人都用过,具体参数不介绍了,这里主要讲.NET调用Mysqldump进行备份和.NET调用Mysql.exe进行导入数据。

这里使用的是5.1版的Mysqldump.exe和Mysql.exe(5.5版的用过,没测试成功)

如果是B/S程序,需要在webconfig配置成模拟超级管理方式登录

<system.web>
<identity impersonate="true" userName="administrator" password="" /><!--模拟超级管理员登录-->
</system.web>

因为要解决导入时视图嵌视图会报错的情况,所以本案分成两步操作。

第一步:只迁移表结构、视图、存储过程、函数、事件等。(为何这里数据不一起导呢,因为到视图需要加上--extended-insert=false,这样导数据会很慢,所以分成两步导。)

        string strError = string.Empty;//执行cmd获取输出信息。
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;//获取输出流
//p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;//获取错误信息流 p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.CreateNoWindow = true; //除数据外,表结构、视图、存储过程、函数、事件全部导出
p.Start();
p.StandardInput.WriteLine("c:");
p.StandardInput.WriteLine("cd C:\\Program Files (x86)\\MySQL\\MySQL Server 5.1\\bin");
p.StandardInput.WriteLine("mysqldump -h 192.168.0.1 -P3306 -uroot -p123456 -q -d -R -E --skip-add-drop-table --default-character-set=utf8
          --extended-insert=false MysqlDBName > c:\MysqlDBNameNoData.sql");
//-q 快速读取,-d不导数据,-R存储存储过程和函数,--extended-insert=false 逐行执行(视图嵌视图时需要用到),-E 导出事件,--add-drop-tables 删除表,--skip-add-drop-table不删除表
p.StandardInput.WriteLine("exit");
p.BeginOutputReadLine();
strError = p.StandardError.ReadToEnd();
p.WaitForExit();
if (!string.IsNullOrWhiteSpace(strError))//执行失败则跳出
{
return ;
} //去除DEFINER(如果数据库在不同的服务器,很可能会有权限问题,将权限这部分代码替换掉)
StreamReader sr = new StreamReader(storeDBnoDataPath);
Regex rg3 = new Regex("DEFINER=`.{1,50}`@`%`");//如果用户名比较长,这里可以设置的更长一些,但不要过度长,否则会替换掉需要的数据
string sql = sr.ReadToEnd();
sr.Close();
string strOutput = rg3.Replace(sql, ""); StreamWriter sw = new StreamWriter(storeDBnoDataPath, false, System.Text.Encoding.UTF8);
sw.Write(strOutput);
sw.Close(); //除数据外,表结构、视图、存储过程、函数、事件全部导入
p.Start();
p.StandardInput.WriteLine("c:");
p.StandardInput.WriteLine("cd C:\\Program Files (x86)\\MySQL\\MySQL Server 5.1\\bin");
p.StandardInput.WriteLine("mysql -h 192.168.0.2 -P3306 -uroot -p123456 MysqlDBName < c:\MysqlDBNameNoData.sql");
p.StandardInput.WriteLine("exit");
strError = p.StandardError.ReadToEnd();
p.WaitForExit();
if (!string.IsNullOrWhiteSpace(strError))//执行失败则跳出
{
return ;
}

第二部:导数据。(为了使导入数据比较快,不用加上--extended-insert=false)

 //只导出数据
p.Start();
p.StandardInput.WriteLine("c:");
p.StandardInput.WriteLine("cd C:\\Program Files (x86)\\MySQL\\MySQL Server 5.1\\bin");
p.StandardInput.WriteLine("mysqldump -h 192.168.0.1 -P3306 -uroot -p123456 -q --no-create-info --default-character-set=utf8 --skip-add-locks
            MysqlDBName < c:\MysqlDBNameOnlyData.sql“);//-q --no-create-info 只导出数据 --skip-add-locks 不添加表lock
p.StandardInput.WriteLine("exit");
strError = p.StandardError.ReadToEnd();
p.WaitForExit();
if (!string.IsNullOrWhiteSpace(strError))
{
return ;
} //导入数据
p.Start();
p.StandardInput.WriteLine("c:");
p.StandardInput.WriteLine("cd C:\\Program Files (x86)\\MySQL\\MySQL Server 5.1\\bin");
p.StandardInput.WriteLine("mysql -h 192.168.0.2 -P3306 -uroot -p123456 MysqlDBName < c:\MysqlDBNameOnlyData.sql“);
p.StandardInput.WriteLine("exit");
strError = p.StandardError.ReadToEnd();
p.WaitForExit();
if (!string.IsNullOrWhiteSpace(strError))
{
return ;
}
//关闭进程
p.Close();

Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)的更多相关文章

  1. Mysql备份迁移——MySqlBackup(.net)——(无法解决视图嵌视图报错)

    这里是利用MySqlBackup,可以再nuget中下载. 无法解决视图嵌视图报错的问题,只导表跟数据比较合适,如果有视图嵌视图,请参照Mysql备份迁移——Mysqldump(.NET调用Mysql ...

  2. MariaDB/MySQL备份和恢复(一):mysqldump工具用法详述

    本文目录:1.备份分类2.备份内容和备份工具3.mysqldump用法详述 3.1 语法选项 3.1.1 连接选项 3.1.2 筛选选项 3.1.3 DDL选项 3.1.4 字符集选项 3.1.5 复 ...

  3. MySQL备份迁移之mydumper

    简介 mydumper 是一款开源的 MySQL 逻辑备份工具,主要由 C 语言编写.与 MySQL 自带的 mysqldump 类似,但是 mydumper 更快更高效. mydumper 的一些优 ...

  4. MySQL在windows系统中修改datadir路径后无法启动问题,报错1067

    windows server2008下如何更改MySQL数据库的目录的帖子已经很多了,这里简单介绍一个步骤,如果不成功请先查看其它帖子. 更改默认的mysql数据库目录 将 C:\Documents ...

  5. MySQL 存储过程例子,不能在if else里面用begin end否则会报错Error Code : 1064!

    Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your My ...

  6. 不要在基类析构函数中调用纯虚函数,否则运行时会报错“pure virtual method called”

    如上. 这是因为:delete派生类对象时,先调用派生类的析构函数,然后再调用基类的析构函数:此时如果调用纯虚函数的话,派生类的对象已经被破坏了,所以会报错. http://www.cnblogs.c ...

  7. dataTable调用接口渲染数据,没有数据,报错

    当没有数据的时候,报错: 解决方法: 在后台那边处理一下,当没有数据的时候,令 data : ' ' 或者 data : [ ] 前端代码: var loading = layer.load(1, { ...

  8. docker-compose exec时 出现"fork/exec /proc/self/exe: no such file or directory" 报错

    问题:跟往常一样执行docker-compos exec redis sh时出现如下错误,而容器是运行状态中. # docker-compose exec redis sh rpc error: co ...

  9. Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...

随机推荐

  1. eventUtil

    var eventUtil = { // 添加句柄 addHandler: function(element, type, handler) { if(element.addEventListener ...

  2. Codeforces Round #380 (Div. 2) 解题报告

    第一次全程参加的CF比赛(虽然过了D题之后就开始干别的去了),人生第一次codeforces上分--(或许之前的比赛如果都参加全程也不会那么惨吧),终于回到了specialist的行列,感动~.虽然最 ...

  3. iOS开发资源整理【01】

    一.网站 Code4App         开发者常用库分享网站 GitHub        git是一个优秀的分布式版本控制系统 stackoverflow    技术在线问答网站 CocoaChi ...

  4. IOC-AOP

    IOC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如 ...

  5. 从erase()谈起

    面试中,因为我说自己熟悉C++,就问我一个问题,Vector<int>里, 想把元素为2的节点删除掉.该怎么做. 我已经很久没有用Vector了,但是只有硬着头皮想一下,第一个想起的是re ...

  6. 遇到tomcat端口被占用问题解决方案

    1) 启动Eclipse的Tomcat5.0时,报以下错误: 2)根据以上提示显示:Tomcat Server 的8080端口已经被占用.查看它被哪个占用,方法如下: 3)可以看到占用此端口的PID为 ...

  7. RBL开发笔记二

     17:13:55 2014-08-25 有以下几个点:  第一 :怎么在预处理阶段能够做到识别某个宏是否给定义了  这里就定义了一个SystemConfig.h 专门做这个事情  当然是需要make ...

  8. ARM compiler No such file or directory

    /********************************************************************************* * ARM compiler No ...

  9. ThreadPoolExecutor机制探索-我们到底能走多远系列(41)

    我们到底能走多远系列(41) 扯淡: 这一年过的不匆忙,也颇多感受,成长的路上难免弯路,这个世界上没人关心你有没有变强,只有自己时刻提醒自己,不要忘记最初出发的原因. 其实这个世界上比我们聪明的人无数 ...

  10. VHDL:信号、端口以及和Verilog的区别

    1.信号 信号是描述硬件系统的基本数据对象,它的性质类似于连接线.信号可以作为设计实 体中并行语句模块间的信息交流通道.      信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值(这决定于 ...