【问题标题】:Timeout expired in Mysql backup - C#Mysql备份中超时已过期 - C#
【发布时间】:2016-12-09 18:25:46
【问题描述】:

我构建了一个应用程序来从服务器备份我的 MYSQL 数据库,日复一日,数据库变得比以前大,有时会触发错误(从我的角度来看):

消息:超时已过期。在操作完成之前超时时间已过或服务器没有响应。 完整:MySql.Data.MySqlClient.MySqlException (0x80004005):超时已过期。在操作完成之前超时时间已过或服务器没有响应。 ---> System.TimeoutException: IO 操作超时 在 MySql.Data.MySqlClient.TimedStream.StopTimer() 在 MySql.Data.MySqlClient.TimedStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 计数) 在 System.IO.BufferedStream.Read(字节 [] 数组,Int32 偏移量,Int32 计数) 在 MySql.Data.MySqlClient.MySqlStream.ReadFully(流流,字节 [] 缓冲区,Int32 偏移量,Int32 计数) 在 MySql.Data.MySqlClient.MySqlStream.LoadPacket() 在 MySql.Data.MySqlClient.MySqlStream.ReadPacket() 在 MySql.Data.MySqlClient.NativeDriver.FetchDataRow(Int32 statementId,Int32 列) 在 MySql.Data.MySqlClient.Driver.FetchDataRow(Int32 statementId,Int32 列) 在 MySql.Data.MySqlClient.ResultSet.GetNextRow() 在 MySql.Data.MySqlClient.ResultSet.NextRow(CommandBehavior 行为) 在 MySql.Data.MySqlClient.MySqlDataReader.Read() 在 MySql.Data.MySqlClient.ExceptionInterceptor.Throw(异常异常) 在 MySql.Data.MySqlClient.MySqlConnection.Throw(异常前) 在 MySql.Data.MySqlClient.MySqlConnection.HandleTimeoutOrThreadAbort(异常前) 在 MySql.Data.MySqlClient.MySqlDataReader.Read() 在 MySql.Data.MySqlClient.MySqlBackup.Export_RowsData(字符串表名,字符串 selectSQL) 在 MySql.Data.MySqlClient.MySqlBackup.Export_Rows(字符串表名,字符串 selectSQL) 在 MySql.Data.MySqlClient.MySqlBackup.Export_TableRows() 在 MySql.Data.MySqlClient.MySqlBackup.ExportStart() 在 MySql.Data.MySqlClient.MySqlBackup.ExportToFile(字符串文件路径) 在 MYSQL_Auto_Backup.Form1.Backup() 中的 c:\Users\Belal\Documents\Visual Studio 2012\Projects\MYSQL Auto Backup\MYSQL Auto Backup\Form1.cs:line 132

代码:

// Backup...
            DateTime Time = DateTime.Now;
            year = Time.Year;
            month = Time.Month;
            day = Time.Day;
            hour = Time.Hour;
            minute = Time.Minute;
            second = Time.Second;
            millisecond = Time.Millisecond;

            //Save file to Path with the current date as a filename
            string path;
            path = txb_Path.Text + year + "-" + month + "-" + day + "--" + hour + "-" + minute + "-" + second + ".sql";
            file = path;
            using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                using (MySqlCommand cmd = new MySqlCommand())
                {
                    using (MySqlBackup mb = new MySqlBackup(cmd))
                    {
                        cmd.Connection = conn;
                        conn.Open();
                        mb.ExportToFile(file);
                        conn.Close();
                    }
                }
            }

【问题讨论】:

    标签: c# mysql connection-timeout


    【解决方案1】:

    您可以使用“CommandTimeout”属性更改超时。

    您可能还需要考虑许多其他备份方法(例如,通过数据库的管理工具)。例如,请参阅以下内容:
    https://dev.mysql.com/doc/mysql-enterprise-backup/3.11/en/meb-scheduled-backups.html

    另一个小问题。对于以下行:

    string path;
    path = txb_Path.Text + year + "-" + month + "-" + day + "--" + hour + "-" + minute + "-" + second + ".sql";
    file = path;
    

    为什么不做类似的事情

    file = String.Format("{0}{1}-{2}-3--{4}-{5}...", txb_Path.Text, year, month...);
    

    在 .NET 中,您所做的字符串连接实际上相当昂贵,因为 .NET 字符串是不可变的。

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 2019-03-03
      • 1970-01-01
      • 2011-03-29
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多