Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)

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

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

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

第一步:只迁移表结构、视图、存储过程、函数、事件等。(为何这里数据不一起导呢,因为到视图需要加上--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();
时间: 2024-08-28 10:47:04

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

windows下mysql备份、还原,使用mysqldump

直接备份 mysqldump -u用户名 -p密码 -h 192.168.1.15 -c   --default-character-set=utf8 数据库名>xxx.sql 使用gzip压缩备份 mysqldump -u用户名 -p密码 -h 192.168.1.15 -c   --default-character-set=utf8 数据库名 | gzip >xxx.sql 直接还原 mysql -u用户名 -p密码 -c --default-character-set=utf8 -h1

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

这里是利用MySqlBackup,可以再nuget中下载. 无法解决视图嵌视图报错的问题,只导表跟数据比较合适,如果有视图嵌视图,请参照Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)http://www.cnblogs.com/pbys/p/4142367.html string constring = "server=192.168.0.1;port=3306;user=root; pwd=123456; database=te

高版本-&gt;低版本迁移,低版本客户端连接高版本数据库EXP导出报错EXP-00008,ORA-01455,EXP-00000

生产环境: 源数据库:RHEL + Oracle 11.2.0.3 目标数据库:HP-UX + Oracle 10.2.0.4 需求:迁移部分表  11.2.0.3-->10.2.0.4,若迁移范围内的有些表在目标库已经存在,则替换. 本次迁移数据量<1G. 初定方案:低版本的客户端连接到高版本数据库,用低版本导出,低版本导入. 1.采用初定方案,目标数据库所在服务器连接到源数据库,exp导出过程中报错. ZJCRNOPDB 36: sqlplus -version SQL*Plus: Rel

Mysql相关问题-----1045 Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)报错

MySQL 连接错误,使用Navicat连接MySQL出现错误:1045 Access denied for user 'root'@'localhost' (using password: YES) 解决方案: 1.编辑mysql配置文件my.ini 在mysql的安装目录下 ,在[mysqld]这个条目下加入 skip-grant-tables 保存退出后重启mysql [mysqld] #作用是跳过登录的验证 #skip-grant-tables port = 3306 basedir=C

07 : mysql备份恢复(1) - mysqldump命令使用

注意: mysql不同引擎备份方法不同.我们先来回忆一下和备份有关的知识点. 1.存储引擎(1)InnoDB(默认使用引擎,也是企业常用的) 热备 独立表空间(每个表一个表空间) redo:重做日志,用来前滚 undo:回滚日志,用来回滚(未提交的事务) 行级别锁,基于索引来实现的,GAP锁 支持事务.(2)MyISAM 温备 三个文件构成 表级锁 2.二进制日志(1)记录的是什么? DDL.DCL这些种类语句,记录的就是操作语句 DML:他记录的已提交的事务日志,并支持多种格式记录(row.s

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

windows server2008下如何更改MySQL数据库的目录的帖子已经很多了,这里简单介绍一个步骤,如果不成功请先查看其它帖子. 更改默认的mysql数据库目录 将 C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data 改到 D:\MysqlData 1. 建立文件夹 D:\MysqlData 2. 停止 mysql 服务,将 "C:\Documents and Settings\

MySQL备份恢复基础知识及MySQLdump讲解

数据库备份恢复知识要点: 时间轴备份类型分类: 完全备份:备份整个数据集 增量备份:上一次完全备份,或上一次增量备份以后变化的数据的备份(还原麻烦,节省空间) 差异备份:仅备份最近一次完全备份以来变化的数据(还原简单,空间消耗大) 什么是物理备份.逻辑备份: 物理备份:直接复制数据文件进行备份(有可能占用更多的空间,备份速度快,做热备较难) 逻辑备份:从数据库中导出数据"另存为"而进行的备份(从二进制转化为文本格式,有可能丢失精度,需要专门的协议客户端才能进行,和数据存储引擎无关.备份

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

在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份. 下面对这种备份方案详细说明下:1.MySQLdump增量备份配置执行增量备份的前提条件是MySQL打开binlog日志功能,在my.cnf中加入log-bin=/opt/Data/MySQL-bin"log-bin="后的字符串为日志记载目录,一般建议放在不同于MySQL数据目录的磁盘

MySQL数据库报错1045解决方法(navicat报错)

我在这里用到的MySQL可视化工具为Navicat,这个错误是这样说的:1045    Access denied for user 'root'@'localhost' (using password:YES) 这个意思是说:用户“root”@本地主机的访问被拒绝 查了很久,发现新的mysql8.0以上在my.ini下的[mysqlld]添加skip-grant-tables不能让任何用户都能访问数据库. 那么新的数据库怎么办呢? 1.管理员权限下运行cmd,关闭服务   net stop m