Calm Hill My Random Thoughts

MySQL Database Backup to S3

Data များလာတာနဲ့ တန်ဖိုးဆိုတာက တက်လာတဲ့အမျိုး System ဆိုတာက ဘယ်လောက် ကောင်းအောင်လုပ်ထားထား တစ်ချိန်ချိန်တော့ Fail ဖြစ်တတ်တဲ့ သဘောရှိတော့ Data မပျောက်အောင် Backup လုပ်တာလည်း အရေးကြီးတဲ့အလုပ်ပဲ။ အရေးကြီးပေမယ့် ကိုယ်တိုင်ကတော့ စိတ်ပေါက်မှလုပ်ဖြစ်တယ်။ Blog ကတော့ ကိုယ့်ဟာကိုယ် အားလို့ရေးတာဖြစ်ပေမယ့် အချိန်ကြာလာတာနဲ့အမျှ ရေးထားတာက များများလာတော့ ကိုယ်ဘာရေးမိမှန်းလည်း မမှတ်မိတော့တာအမှန်ပဲ။ အရင်တုံးက ရွှေ့လိုက်ပြောင်းလိုက်နဲ့ တစ်ချို့ရေးထားတာတွေ အပြည့်အစုံမရှိတော့တာ ပြန်ဖတ်မိရင် အတော်လေးနှမျောမိတယ် ပြန်ဖြည့်ရေးဖို့စဉ်းစားလည်း ကိုယ်ဘာရေးခဲ့မိမှန်း အသေအချာ စဉ်းစားလို့မရတော့ဘူး။

ခက်ခက်ခဲခဲအလုပ် မဟုတ်ပေမယ့် ပျင်းနေတာနဲ့ အချိန်ဆွဲနေတာ တရုတ်နှစ်ကူး ရုံးဆက်တိုက်ပိတ်မှပဲ လုပ်ဖြစ်တော့တယ်။ Cloud ပေါ်မှာပဲနေ Cloud ပေါ်မှာပဲ သေမှာလားဆိုသလိုပဲ Backup ကို S3 ထဲကိုလုပ်ဖို့ပဲ စီစဉ်ရတယ် MySQL ကို Dump လုပ်တာက အရင်ကတည်းက လုပ်နေကျအလုပ်ဆိုတော့ Script တွေက ရှိပြီးသားပါ။ S3 ပေါ်ကို Upload လုပ်ဖို့ကလည်း AWS Developer Tools မှာ ရေးပြီးသား Tools အတော်များများရှိတယ် ကိုယ့်ဟာကိုယ်ရေးချင်လည်း Language အတော်များများအတွက် API တွေရှိပြီးသားပါ ပရိုဂရမ်မာပီသစွာပဲ ပျင်းတဲ့အတွက် ရှိပြီးသားထဲက S3cmd ကိုပဲသုံးဖို့လုပ်ပါတယ်။

S3cmd ကို Install လုပ်တာက ခက်ခက်ခဲခဲ မဟုတ်ပါဘူး အလွယ်ဆုံးနည်းက ကိုယ်သုံးမယ့် Linux အပေါ်မူတည်ပြီး Package တွေရှိတယ် အဲဒါမှမဟုတ်လည်း S3cmd ရဲ့ Git Repository ကနေ Clone လုပ်ယူပြီး Install လုပ်ရင်လည်းရတယ်။ Install လုပ်ပြီးရင် ပထမဆုံးအကြိမ်မှာတော့ AWS ကို Access လုပ်ဖို့ Access Key နဲ့ Secret Access Key ကို Configure လုပ်ပေးဖို့လိုမယ် ပြီးရင်တော့သုံးလို့ရပါပြီ။

s3cmd --configure

ပုံမှန် MySQL Backup Script ကို S3 Upload နဲ့ အောက်မှပြထားသလို နည်းနည်းဖြည့်ရေးလိုက်ရင် S3 ပေါ်ကို Backup လုပ်လို့ရပြီ။ Backup Frequency ကတော့ ကိုယ်လုပ်ချင်တဲ့ အပေါ်မူတည်ပြီးတော့ Crontab ထဲကနေ Script ကိုခေါ်ရင် Automated Backup တစ်ခုတော့ရပြီ။ Script ထဲက Filename က တစ်ရက်ချင်းအတွက်ပဲ Date နဲ့ပေးထားတော့ နာရီပိုင်း မိနစ်ပိုင်းနဲ့ လုပ်ချင်ရင်တော့ Filename မှာ နည်းနည်းထပ်ဖြည့်ပေါ့။

#!/bin/sh

user="username"
password="password"
bucket="s3://bucketname/"
temp="/tmp/"

databases=`mysql --user=$user --password=$password -e "SHOW DATABASES;" | grep -v "\Database\|information_schema\|performance_schema\|mysql\|test"`

for database in $databases
do
        file=${database}_`date +%Y-%m-%d`.sql.gz
        mysqldump --user=$user --password=$password $database | gzip > $temp$file
        s3cmd put $temp$file $bucket$file
        rm $temp$file
        echo Backup Success: $database
done