复制数据库表时脚本卡住了 - Mysql - PHP

时间:2012-12-26 16:39:48

标签: php mysql database duplicates copy

作为我prev问题的后续问题,我决定这样做。

我使用下面的代码来复制数据库表,但有时如果表大小很大,脚本会挂起,页面会一直等待,当我比较两个表中的行数时,我会发现类似于此的内容

  

原始表数:855057
   备份表数:855022

那么为什么它在执行插入时卡住了? 请记住,在大多数情况下,两个计数实际上都相同,但即使它完成重复,它仍会挂起!

这是我的代码:

//duplicate tables structure 
 $query = "CREATE TABLE $this->dbName.`$newTableName` LIKE $this->dbName.`$oldTable`";
    ..
    ..

//duplicate tables data
  $query = "INSERT INTO $this->dbName.`$newTableName` SELECT * FROM $this->dbName.`$oldTable`";
    ..
    ..

PS。我从我的localhost运行复制脚本到位于远程服务器的备份数据库。

2 个答案:

答案 0 :(得分:1)

您将需要通过运行show full processlist来检查查询是否仍在运行。 您还必须记住,如果表引擎是innodb,则还会创建撤消日志,以防中断,事务将不得不回滚。

答案 1 :(得分:1)

使用LOCK TABLES

// duplicate tables structure 
$query = "CREATE TABLE $this->dbName.`$newTableName` LIKE $this->dbName.`$oldTable`";

// lock source and target table
$query = "LOCK TABLES $this->dbName.`$newTableName` WRITE, $this->dbName.`$oldTable` AS source WRITE";

// duplicate tables data
$query = "INSERT INTO $this->dbName.`$newTableName` SELECT * FROM $this->dbName.`$oldTable` AS source";

// unlock
$query = "UNLOCK TABLES";