세상 살기 참 어렵습니다. 잘 둔 친구 하나로 만족할 수 있을까요? 믿는 도끼는 발등을 찍으라고 있는 법입니다. 우리는 언제나 최악에 대비해야겠죠.
우리 DB 서버도 마찬가지입니다. 잘 둔 DB 서버 하나 두 서버 부럽지 않기는 개뿔 돈이 허락하면 두 서버가 좋습니다. 그래서 메인 서버가 날아가도 그 마음 고이 담아 간직할 수 있는 백업 서버를 설정해보도록 합시다. 뭘로요? MySQL로요. 어떻게? 세상에서 제일 쉽게.
우리의 친구 Ubuntu 22.04
버전에서 진행해보도록 하겠습니다. 다른 Linux 버전도 크게 다르지 않습니다.
sudo apt update
초기 설정이라면 우리의 친구 sudo apt update
해주시고
sudo apt install mysql-server
MySQL을 설치해 봅시다.
sudo mysql -u root
설치가 잘 되었는지 확인도 해봅시다.
sudo timedatectl set-timezone Asia/Seoul
우리는 백업 서버에서 메인 서버의 스키마와 데이터를 가져올 겁니다.
CREAT USER {backup_user}@'{ip}' identified by '{password}';
GRANT ALL PRIVILEGES ON {database_name}.{table_name} to '{backup_user}'@'{ip}';
FLUSH PRIVILEGES;
{}사이에는 자신에게 해당하는 값을 올리면 됩니다. 유저를 생성하고, 권한을 부여하는 과정입니다.
메인 서버에 잘 접근할 수 있는지 테스트 해봅시다.
mysql -h {main_server_ip} -u {backup_user} -p
잘 접근할 수 없다면 메인 서버의 bind 설정이 잘 열려있는지 확인해봅시다.
mysqldump -u backup_db -p review_duck -h ${ip} > /home/ubuntu/db_backup/${backup_file}
sudo mysql -h localhost -u root review_duck < /home/ubuntu/db_backup/${backup_file}
운영중인 DB를 일일이 돌며 백업시켜주는 건 너무 귀찮고 비효율적이기 때문에 스크립트를 만들어 자동으로 실행시켜줍시다. 주기적인 동작을 위해 crontab을 사용하고, 지정된 시각마다 작성한 스크립트를 실행시켜보겠습니다.
#!/bin/sh
echo "starting db backup"
day="$(date +'%F_%H')"
db_backup_file="mydb_${day}.sql"
mysqldump -u backup_db -p'duck' review_duck -h ${ip} > /home/ubuntu/db_backup/${db_backup_file}
echo "db backup complete"
sudo chmod +x /home/ubuntu/db_backup/${db_backup_file}
sudo mysql -h localhost -u root review_duck < /home/ubuntu/db_backup/${db_backup_file}
계속 쌓이는 백업 파일을 주기적으로 삭제해줄 코드를 추가해도 좋습니다.
sudo chmod +x db_backup.sh
sudo crontab -e
0 0 * * * sudo /home/ubuntu/db_backup/db_backup.sh > /dev/null 2>&1
0분 0시(자정)마다 해당 스크립트를 실행하는 코드