프로덕션 서버에서 MySQL 데이터베이스를 복원하면 데이터베이스가 손상됩니다.

프로덕션 서버에서 MySQL 데이터베이스를 복원하면 데이터베이스가 손상됩니다.

우리는 mysqldump 파일을 복원하려고 할 때 MySQL 데이터베이스가 손상되는 시나리오를 여러 번 경험했습니다. 우리는 몇 년 동안 배치 스크립트를 통해 동일한 절차를 문제 없이 사용해 왔으며 최근 몇 달 동안 문제가 발생하기 시작했습니다.

우리는 MySQL 서버 버전 5.7.18-0ubuntu0.16.04.1(Ubuntu 16.04.2 LTS)을 실행 중이며 ~350K 레코드(결합)가 있는 두 개의 MyISAM 테이블을 복원하고 있습니다.

다음 cmd 스크립트를 사용하여 내부 테이블을 백업하고 원격 데이터베이스 서버로 복원합니다.

"%mysql_path%\mysqldump.exe" --user=root --password="%PWD%" --host=%source% ourdbname --tables table1 table2 | "%mysql_path%\mysql.exe" -uroot --password="%PWD%" --host=%dbtarget% -C ourdbname

%%변수가 더 큰 배치 스크립트의 일부로 제공되는 경우 . 기본적으로 우리는 원격 서버에서 복원하기 위해 덤프 출력을 mysql.exe로 파이프합니다. 스크립트는 Windows 10 시스템에서 실행되지만 원본 및 대상 데이터베이스는 모두 Linux에 있습니다.

복원 부분은 데이터베이스가 손상되어 DB 서버 CPU 사용량이 코어당 100%까지 급증하는 부분입니다. 이 문제를 해결하기 위해 찾은 유일한 방법은 mysql 프로세스를 종료하고 .frm, .MYD, .MYI파일을 삭제한 다음 mysql을 시작하고 테이블을 로컬로 복원하는 것입니다(mysqldump 파일을 서버에 scp하여 복원한 후 복원).

우리는 웹사이트에 활성 트래픽이 있을 때만 데이터베이스가 손상된다는 것을 발견했습니다. 따라서 사이트를 중단하고(JDBC를 통해 연결되는 Java를 실행하는 별도의 서버) 스크립트를 실행한 다음 사이트를 다시 온라인으로 가져오면 100% 작동합니다. 분명히 이것은 이상적인 것은 아니지만 지금 우리가 할 수 있는 유일한 방법입니다.

이 문제의 원인은 무엇입니까? 프런트 엔드 서버를 중단하지 않고도 이 문제를 해결하는 방법에 대한 제안이 있습니까?

답변1

귀하의 사이트에 대한 데이터베이스 엔진으로 MyISAM을 사용하고 있는 것 같습니다. InnoDB를 사용하는 것이 좋습니다. 여러 면에서 더 좋습니다.

그러나 여기서 가장 큰 문제는 백업이 데이터베이스에 기록되는 동시에 웹 애플리케이션이 데이터베이스에 기록할 가능성이 높다는 것입니다. 실제 테이블 스키마에 따라 이는 온갖 종류의 나쁜 영향을 미칠 수 있습니다. MyISAM을 사용하면 제대로 작동할 수 있습니다. 왜냐하면 제가 올바르게 기억한다면 MyISAM에는 행 수준 잠금이 없기 때문입니다.

따라서 InnoDB를 사용하면 도움이 될 수 있지만 그렇지 않을 수도 있습니다. 유일한 안전한 옵션은 단순히 프런트 엔드 서버를 중지하는 것입니다. 또 다른 옵션은 들어오는 데이터를 데이터베이스에 안전하게 쓰는 원격 애플리케이션용 API를 만드는 것입니다.

관련 정보