나는 mysql 데이터베이스에 의존하는 Rails 웹 애플리케이션을 가지고있다.mysqldump 파일에서 mysql 데이터베이스를 다시로드하고 읽기 요청의 무결성 보장
데이터베이스에 mysqldump
을 실행하고 위의 데이터베이스를 다시로드하는 스크립트가 있습니다.
mysqldump -uuser1 -ppassword1 --opt db1 > dumpfile
및
mysql -uuser2 -ppassword2 db2 < dumpfile
덤프 파일 (< 15메가바이트) 매우 작 :
명령은 무엇인가이다. 덤프 파일에서 데이터베이스를 다시로드하는 데 걸리는 시간은 150ms 미만입니다.
덤프 파일은 다음과 같은 섹션의 시리즈를 포함 :이 경우
--
-- 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 애플리케이션을 종료하면 이 아니라 옵션이이됩니다.)
데이터베이스를 다시로드하는 중에 사용자 웹 요청이 들어올 수 있습니다. 그렇다면 데이터베이스 읽기 요청의 무결성이 영향을 받으므로 (예 : 테이블이 비어 있음) 사용자가 오류 또는 예외를 얻을 수 있습니다. 어떻게 이것을 피합니까?
데이터베이스를 다시로드하는 동안 잘못된 읽기가 발생하지 않도록하는 방법이 있습니까? 트랜잭션을 사용하여 전체 데이터베이스를 잠그면 데이터베이스 재로드가 완료 될 때까지 이이 될 때까지 기다려야합니다. 내가 어떻게 그런 "읽기 안전"덤프 파일 (어떤 옵션을 고려해야 mysqldump와)을 생성하겠습니까?
감사합니다.
당신의 구성에 따라 다르 겠지만, 내가 일하는 곳에서 우리가 어떻게하는지 알려 드리겠습니다. 먼저 덤프에서 DB를로드하는 것이 나쁜 습관으로 간주됩니다. 로드 밸런서가 있으므로 다른 인스턴스에서 덤프를 가져 오는 동안 기본적으로 모든 트래픽을 단일 인스턴스로 전달합니다. 그런 다음 두 번째 인스턴스가 업데이트되는 동안 업데이트 된 인스턴스로 모든 트래픽을 보냅니다. 두 가지가 모두 업데이트되면 두 인스턴스간에 트래픽이 분리됩니다. –
코멘트 주셔서 감사합니다. 이 경우 데이터베이스는 매우 작습니다. 그래서 나는 아주 작은 시간 창문에 대해서만 경계 할 필요가있다. 또한이 작업은 배포 프로세스의 일부가 아닌 응용 프로그램의 일부입니다. 따라서 편집인은 언제든지이 이벤트를 실행할 수 있습니다. 수동으로 또는 스크립트를 통해로드 밸런서를 변경합니까? –
스크립트를 통해 변경합니다. 업데이트 도중 DB에 액세스하려고하면 문제가 발생하는지 확인 했습니까? 개인적으로이 질문에 대한 정답은 사용자가 UI에서 덤프를 트리거하지 못하게하는 것이지만 올바르게 인식하지 못하는 방법이있을 수 있습니다. –