我有一个依赖于 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 的任何选项)?
谢谢。
最佳答案
作为加载转储文件的一部分而启动的任何事务都将由创建表语句隐式提交(对于 MySQL 中的大多数 DDL 语句都是如此)。
看起来确实像打电话 FLUSH TABLES WITH READ LOCK
获取全局锁,这可能正是您所需要的。
关于ruby-on-rails - 从 mysqldump 文件重新加载 mysql 数据库并确保读取请求的完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708255/