作为我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运行复制脚本到位于远程服务器的备份数据库。
答案 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";