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`
현 상태로 바로 복구에 들어가게되면
$ 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에 들어간 쿼리문이 동작하는 것을 볼 수 있다.