ruby-on-rails - 从 mysqldump 文件重新加载 mysql 数据库并确保读取请求的完整性

标签 ruby-on-rails mysql

我有一个依赖于 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/

相关文章:

jquery - 在jquery中访问rails params hash

ruby-on-rails - 如何在 localhost/<my_port> 上运行 Rails 3 应用程序?

ruby-on-rails - AJAX 更新 Rails 3 中的待办事项列表

ruby-on-rails - 查找在 Rails 中没有帖子的用户

PHP 和 MySQL - 加载数据本地问题

mysql - Plone + SqlAlchemy + MySql 中未提交的事务

ruby-on-rails - Ruby on Rails 4 : How to authenticate to Azure AD from Rails Application?

Mysql 从第二列获取前 3 个值,然后转到第 1 列的下一个值

php - 如何将两个 MySQL 行合并为一个并使用 PHP 在表中显示它们?

mysql - 我们可以在 show 语句中使用像 concat() group_concat() 这样的函数吗?