4

这是我上一个问题的后续问题。

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

原始表数: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`";
    ..
    ..

附言。我从本地主机运行复制脚本到位于远程服务器中的备份数据库。

4

2 回答 2

2

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

于 2012-12-26T21:13:31.787 回答
1

使用锁表

// 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";
于 2012-12-26T21:41:35.610 回答