【问题标题】:Script stuck during duplicating database table - Mysql - PHP复制数据库表期间脚本卡住 - Mysql - PHP
【发布时间】:2012-12-12 04:17:50
【问题描述】:

这是我的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。我从本地主机运行复制脚本到远程服务器中的备份数据库。

【问题讨论】:

  • 您可能会检查您是否在 php 日志中遇到任何错误。也可以在mysql中运行“show full processlist”查看是否还在运行查询。
  • 每台机器上的 MySQL 服务器版本是多少?
  • (在我的机器上 -> 5.5.16)(在服务器上它说 -> 5.0.77-log )我通过运行 mysql_get_server_info() 得到它

标签: php mysql database duplicates copy


【解决方案1】:

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

【讨论】:

  • 迟到的评论,感谢您的信息!
【解决方案2】:

使用锁表

// 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";

【讨论】:

  • 当我尝试从源表复制数据时出现此错误:(查询错误。查询:INSERT INTO db_name_here.badges_userstats_temp_015303_271212 SELECT * FROM db_name_here.badges_userstats_gw18_271212 错误:表'badges_userstats_temp_015303_271212 ' 没有被 LOCK TABLES 锁定)这是否意味着我需要锁定两个表!
  • 刚刚测试了代码,没有执行错误:D但是,会尝试看看复制过程是否不会挂起,如果是这样,我会在几天后回来并选择这个作为正确的回答。谢谢,非常感谢。
  • 还有一件事,为什么认为在复制数据之前锁定表是必要的?
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 2015-12-30
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
相关资源
最近更新 更多