我有一个依赖于mysql数据库的Rails Web应用程序。
有一个脚本在另一个数据库上运行mysqldump
并重新加载上面的数据库。
命令类似于:
mysqldump -uuser1 -ppassword1 --opt db1 > dumpfile
和
mysql -uuser2 -ppassword2 db2 < dumpfile
转储文件非常小(<15MB)。从转储文件重新加载数据库的时间不到150毫秒。
转储文件包含一系列如下所示的部分:
--
-- Table structure for table `some_table`
--
DROP TABLE IF EXISTS `some_table`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `some_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `some_table`
--
LOCK TABLES `some_table` WRITE;
/*!40000 ALTER TABLE `some_table` DISABLE KEYS */;
INSERT INTO `some_table` VALUES (1,...);
/*!40000 ALTER TABLE `some_table` ENABLE KEYS */;
UNLOCK TABLES;
当发生这种情况时,Rails应用程序正在运行。 (假设在重新加载数据库之前关闭Rails应用程序是而不是选项。)
在重新加载数据库时,可能会有用户Web请求进入。如果是这样,数据库读取请求的完整性将受到影响(例如,表是空的),因此用户将收到错误或异常。你怎么避免这个?
有没有办法确保在重新加载数据库时不会发生错误读取?例如,使用事务,锁定整个数据库,以便读取请求等待直到数据库重新加载完成?我如何生成这样一个“读安全”转储文件(我应该考虑使用mysqldump的任何选项)?
谢谢。
答案 0 :(得分:0)
任何作为加载转储文件的一部分启动的事务都将由create table语句隐式提交(对于MySQL中的大多数DDL语句都是如此)。
看起来好像调用FLUSH TABLES WITH READ LOCK
获取全局锁定,这可能就是您所需要的。