日志
qt+mysql下3种恢复sql数据方法比较
2012-12-25 22:33
环境:windows7+qt4.8.1+mysql5.5
目的:mysql数据服务器运行在U盘上(免安装),利用mysql.exe恢复(通过mysqldump)备份的*.sql数据文件,有早间会失败。于是想通过SQL语句恢复。有三种方法,即一是通过仍然调用mysql.exe恢复,二是通过QFile,一次性读取全部*.sql文件,再执行query.exe(),三是逐行读取,语句加工后再query.exe()。各运行10次,结果为 第一次,分别用手工记录10次,mysql.exe计175秒,逐行读取读取计170秒,读取all计178秒。 第二次,让程序自动循环10次,mysql.exe计197秒,逐行读取读取计196秒,读取all计198秒。 结果:逐行读取最优。 bool MainWindow::myRestore(QString DBName){ bool ok = true; int total =0; for (int n=0; n<10; n++) { QTime time1 = QTime::currentTime(); //2012.12.24,用mysql命令恢复数据,用时30秒,自已每行每行读取,恢复数据费时46秒。 //从模板恢复 //bool ok = true; QSqlQuery query; query.exec("SET @bl=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;"); QString program = "mysql"; QStringList arguments; if (QSqlDatabase::database().password()!="") arguments << "-p" + QSqlDatabase::database().password(); arguments << "-u" << QSqlDatabase::database().userName() << "-h" <<QSqlDatabase::database().hostName() << "--database" << QSqlDatabase::database().databaseName(); QProcess *mysql_Process = new QProcess; mysql_Process->setStandardInputFile(DBName); mysql_Process->start(program, arguments); ok= mysql_Process->waitForFinished(); query.exec("SET FOREIGN_KEY_CHECKS=@bl;");/* QSqlQuery query; QSqlError error; QSqlDatabase::database().transaction(); //事务 QString sql = "SET @bl=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;"; if (!query.exec(sql)) error = query.lastError(); QFile file(DBName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); in.setCodec("UTF-8"); //sql = in.readAll(); //与下句为读取所有 //if (!query.exec(sql)) error = query.lastError(); QString line; do { line = in.readLine().simplified(); if (!line.isEmpty() && !line.startsWith("--") && !line.startsWith("/*") ) { if (sql.endsWith(";")) { if (!query.exec(sql)) error = query.lastError(); sql = line; } else { sql += line; } } } while (!line.isNull()); //通过事务,真正试写入 if (error.type() == QSqlError::NoError) { sql = "SET FOREIGN_KEY_CHECKS=@bl;"; query.exec(sql); QSqlDatabase::database().commit(); } else { QApplication::beep(); QSqlDatabase::database().rollback(); ok = false; } } else { ok = false; }*/ QTime time2 = QTime::currentTime(); int s = (time2.minute() -time1.minute())*60 + time2.second() -time1.second(); total += s; } QMessageBox::warning(0,"uuu",QString::number(total)); return ok;} |
下一篇: 请教快捷键优先级?