Openstack mariadb 복구

beomjin·2025년 6월 18일

openstack을 사용하는 환경의 db는 mariadb를 사용하고있다.
mariadb의 고가용성을 위하여 galera cluster를 채택하여 구성이 되어있는데, database의 문제가 발생하여 데이터가 유실된 경우 백업 된 db파일에서 복구하는 방법에 대하여 기술해보았다.

우선 kubernetes위에 openstack이 올라가있는 환경으로 전체 db를 백업하는 형식으로 되어있다.

전체 db를 다시 들이부어도 되지만, openstack compoent별로 분리해서 넣어보자.

$ sed -n '/^-- Current Database: `cinder`/,/^-- Current Database: `/p' os_mariadb-server-2_.sql > cinder.sql
$ sed -n '/^-- Current Database: `glance`/,/^-- Current Database: `/p' os_mariadb-server-2_.sql > glance.sql
$ sed -n '/^-- Current Database: `keystone`/,/^-- Current Database: `/p' os_mariadb-server-2_.sql > keystone.sql
$ sed -n '/^-- Current Database: `horizon`/,/^-- Current Database: `/p' os_mariadb-server-2_.sql > horizon.sql
$ sed -n '/^-- Current Database: `nova`/,/^-- Current Database: `/p' os_mariadb-server-2_.sql > nova.sql
$ sed -n '/^-- Current Database: `nova_api`/,/^-- Current Database: `/p' os_mariadb-server-2_01.sql > nova_api.sql
$ sed -n '/^-- Current Database: `nova_cell0`/,/^-- Current Database: `/p' os_mariadb-server-2_01.sql > nova_cell0.sql
$ sed -n '/^-- Current Database: `placement`/,/^-- Current Database: `/p' os_mariadb-server-2_01.sql > placement.sql

sed 명령어로 각 compoent별로 분리

이후 vi 편집툴을 이용하여 내용을 다듬는 과정이 필요하다.

$ vi cinder.sql
...
UNLOCK TABLES;
 
--
-- Dumping routines for database 'cinder'
--
 
+- --
+- -- Current Database: `glance`
+- -- Current Database: `cinder`
+- --
 
+- USE `cinder`;
 
+- --
+- -- Current Database: `glance`
  • 로 되어있는 부분은 필요없는 부분이다. 우리는 dumping routines for databases 까지만 필요하다.

현 상태로 바로 복구에 들어가게되면

$ mysql -u root -p < nova.sql
Enter password:
ERROR 1451 (23000) at line 110: Cannot delete or update a parent row: a foreign key constraint fails

ERROR 1451 (23000) at line 110: Cannot delete or update a parent row: a foreign key constraint fails 에러가 발생한다.

관련된 내용을 찾아보니
Ref :: https://devpouch.tistory.com/116

외래 키 문제로 보인다.

sed -i '1i SET foreign_key_checks = 0;' nova.sql
echo "SET foreign_key_checks = 1;" >> nova.sql

각 sql파일별로 외래 키를 제거해준다.

이후 아래와 같이 복구를 하게되면

$ mysql -u root -p < nova.sql
Enter password:

정상적으로 sql에 들어간 쿼리문이 동작하는 것을 볼 수 있다.

0개의 댓글