Mysql vertabanı (sql) otomatik yedek alsın (hazır betik) [databaseler günlük yedeklenir] 1

Mysql veritabanı uygulamasını kullanan yöneticiler ve site sahipleri için çok önemli bir durum vardır. Buda vertabanlarının yedeklenmesi, çünkü sistemin bütün yükünü üzerinde tutan, verileri saklayan, can damarlarından biridir hatda en önemlisidir. Mysql üzerinde kaybedeceğiniz veriler, geri dönüşü olmayan bir duruma sokabilir sizi. Bu sebeple bu konumuzda hazırladığım hazır betik ile, hergün yada belirleyeceğiniz saatlerde otomatik mysql yedeği aldıracağız. Böylece oluşacak sorunlarda geriye dönük yedeklerle çalışma yada sistemi kurtarma çalışmaları yapabileceksiniz.

Hazır betiğin yetenekleri:

  • Uygulama centos sunucularda test edildi.
  • Sistemde bulunan bütün databaseleri ayrı ayrı sql formatında yedek alır.
  • Günlük yedek alınan sql dosyalarını zip şeklinde de oluşturarak ayrı bir yerde kaydeder.
  • Hergün alınan yedekleri tarih klasörlerinde saklar, ileride sorun olursa en sağlam veritabanına ulaşabilirsiniz.
  • Yedeklenen dosyaları otomatik farklı bir sunucuya gönderebilirsiniz (rsync). Bu ayarı betik içerisinden aktif edebilirsiniz.
  • Hergünün yedekleri ayrı ayrı klasörlenir.
  • Bir kere croncob a görev ekleyerek unutuyorsunuz, gerisini hergün kendisi hallediyor.
  • Sunucunuzda sshpass uygulamasının kurulu olması gereklidir.

Yardımcı olabileceğini düşündüğüm alınan mysql yedeklerinin tekrar geri yüklenmesi, yedek alınması konusunuda öneriyorum sizlere…

Örnek yedeklenen alan ve klasörler:

Mysql yedekleme hazir betik sonuclari 1024x435 Mysql veritabanı (sql) otomatik yedek alsın (hazır betik) [databaseler günlük yedeklenir] Bash/Shell programlama Centos Cron Job MariaDB MYSQL  Sql yedekleme Sql rsync RSYNC mysql zip yedekleme Mysql yedekleme Mysql yedek Mysql sql Mysql rsync Crontab cronjob
Mysql yedekleme hazir betik sonuclari sql yedekler klasoru Mysql veritabanı (sql) otomatik yedek alsın (hazır betik) [databaseler günlük yedeklenir] Bash/Shell programlama Centos Cron Job MariaDB MYSQL  Sql yedekleme Sql rsync RSYNC mysql zip yedekleme Mysql yedekleme Mysql yedek Mysql sql Mysql rsync Crontab cronjob

Betiğimizi hazırlayalım:

Aşağıdaki komutu ssh panelinden çalıştırın.

nano mysql_guncelle.sh

Açılan alana aşağıdaki betiği yapıştırın [kopyalayın ve mausun sağ tuşu ile ekrana tıklayın] (Öncesinde bir düzenleme programına yapıştırın ve gerekli alanları kendinize göre düzenleyin)

#!/bin/sh
# kuaza.com
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "******** KUAZA.COM *********"
echo "******** KUAZA.COM *********"
echo "******** KUAZA.COM *********"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"


#
# Cronjop ile her gun duzenli araliklarla yedek almasini saglayin. Asagidaki satir gunde 1 kere (gece saat 01:01) yedek almanizi saglar.
#
# crontab -e
# i harfine basarak yazim moduna gecin.
# asagidaki satiri kopyalayin ve en alt satira ekleyin
# 1 1 * * * sh /root/mysql_yedekle.sh
# esc basin ve yazim modundan cikin
# :wq yazip enter yapin 
#

# Sadece asagidaki 3 alani duzenlemeniz yeterli. Sadece sifreyi duzenlesenizde yeterli olacaktir.
mysql_kullanici_adi="MYSQL_KULLANICI_ADI"
mysqlsifreniz="MYSQL_KULLANICI_SIFRESI"

mysql_ana_yedek_klasoru="/home/mysql_yedek" # degistirmesenizde olur. :)
mysql_sql_yedek_klasoru_ismi="sql_yedekler" # degistirmesenizde olur. :)



#karsi yedekleme sunucusu ayarlari
#Bu kismi kullanmak istemiyorsaniz "yedek_sunucu_ip" alanini bos birakin..
yedek_sunucu_ip="" # SUNUCU IP SI YADA BOS BIRAKIN (KULLANMAYACAKSANIZ)
yedek_sunucu_kullanici="root"
yedek_sunucu_sifresi="YEDEK_SUNUCU_SIFRESI"
yedek_sunucu_yuklenecek_yer="/home/"


mysql_sql_yedek_klasoru="$mysql_ana_yedek_klasoru/$mysql_sql_yedek_klasoru_ismi"
tarih=`date +"%d.%m.%Y"`
zaman=`date +"%d.%m.%Y-%T"`

echo "home dizininde $mysql_sql_yedek_klasoru klasoru var mi."
if [ -d $mysql_sql_yedek_klasoru ]; then
echo "home dizininde $mysql_sql_yedek_klasoru klasoru var."
else
echo "home dizininde $mysql_sql_yedek_klasoru klasoru yok ama simdi olusturuyorum."

	if [ -d $mysql_ana_yedek_klasoru ]; then
		mkdir $mysql_sql_yedek_klasoru
		echo "mysql_yedek ve sql_yedek klasorleri olusturuldu."
	else
		mkdir $mysql_ana_yedek_klasoru
		mkdir $mysql_sql_yedek_klasoru
		echo "sql_yedek klasoru olusturuldu."
	fi
fi

# tarih klasoru olustururuz. Boylece her gun alinan yedekler ayni klasorde depolanir.
if [ -d $mysql_sql_yedek_klasoru/$tarih ]; then
rm -rf $mysql_sql_yedek_klasoru/$tarih/*
echo
else
 mkdir $mysql_sql_yedek_klasoru/$tarih
fi

echo
echo "sql yedek almaya basliyor"

find /var/lib/mysql/ -type d | cut -d. -f1 | cut -d/ -f5 > $mysql_sql_yedek_klasoru/$tarih/list
_db="$(gawk -F: '{ print $1 }' $mysql_sql_yedek_klasoru/$tarih/list)"
for u in $_db
do

sshpass -p $mysqlsifreniz mysqldump -u $mysql_kullanici_adi -p$1 ${u} > $mysql_sql_yedek_klasoru/$tarih/$zaman-${u}.sql
echo "HAZIR > $mysql_sql_yedek_klasoru/$tarih/$zaman-${u}"
done

tar cvzf $mysql_ana_yedek_klasoru/$zaman-mysql.tar.gz $mysql_sql_yedek_klasoru/$tarih

echo "TUM VERI TABANLARI YEDEKLENDI"
echo "DOSYA YOLU : $mysql_ana_yedek_klasoru/$zaman-mysql.tar.gz"

if [ -z $yedek_sunucu_ip ]; then
echo "Yedekleme aktif edilmedigi icin ayri bir sunucuya gonderilmedi."
else
	echo ""
	echo ""

	echo "Simdi mysql yedeklerini, belirledigmiz yedek sunucuya gonderiyoruz (rsync)"
	ssh-keyscan -t rsa $yedek_sunucu_ip >> ~/.ssh/known_hosts
	sshpass -p $yedek_sunucu_sifresi rsync -avzu -t -l $mysql_ana_yedek_klasoru [email protected]$yedek_sunucu_ip:$yedek_sunucu_yuklenecek_yer

	echo "......."
	echo "......."
	echo "Yedekleme islemide bitti.."
	echo "......."
	echo "......."
fi

echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "******** KUAZA.COM *********"
echo "******** KUAZA.COM *********"
echo "******** KUAZA.COM *********"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"
echo "****************************"


# Yararlandigim bir kac kaynak:
## http://www.r10.net/1070713614-post4.html

Duzenleyeceginiz alanlar:

  1. mysql_kullanici_adi=”MYSQL_KULLANICI_ADI
  2. mysqlsifreniz=”MYSQL_KULLANICI_SIFRESI
  3. yedek_sunucu_ip=”SUNUCU_IP” # SUNUCU IP SI YADA BOS BIRAKIN (KULLANMAYACAKSANIZ)
  4. yedek_sunucu_kullanici=”root
  5. yedek_sunucu_sifresi=”YEDEK_SUNUCU_SIFRESI
  6. yedek_sunucu_yuklenecek_yer=”/home/” (Duzenlemenize gerek olmayabilir)

Sonrasında nano uygulamasından çıkın: ctrl + x, y + enter

Eğer elle çalıştıracak olursanız ayarlarınızda sorun yoksa yedekleriniz alınacaktır. Ancak crontab a bir görev ekleyerek her gün belirlediğiniz saatlerde veritabanının hepsini yedek almasını sağlayabilirsiniz.

Crontab için görev ekleme

Aşağıdaki komutu ssh terminalinde çalıştırın:

crontab -e

Sonrasında yazı moduna geçmek için i harfine basın

En altına gerekerek aşağıdaki kodu aynen yapıştırın:

1 1 * * * sh /root/mysql_yedekle.sh

Sonrasında esc ye basarak yazım modundan çıkın ve aşağıdaki karakterleri yazıp enter yapın:

:wq

Bu kadar, crontab a eklediğimiz bu görev ile her gece saat 01:01 de mysql veritabanınızdaki bütün sql leri yedek alacak, ayarladıysanız farklı bir sunucuyada bu yedekleri gönderecektir. Crontab calışma zamanını değiştirebilirsiniz, böylece istediğiniz saatde yada her saat, dakikada yedek alarak sizi bu dertden kurtaracaktır. Crontab hakkında daha fazla bilgiye buradan ulaşabilirsiniz.

Şuanda bu uygulamayı sunucularımda kullanıyorum. Bir kaç kere başıma geldiği için veritabanı ve sql kayıplarının ne kadar kötü olduğunu biliyorum. Umarım böyle birşey sizlerinde basına gelmez ama her ihtimale karşı bu tarz bir yedekleme ile sql yedeklerinizi ayrı bir sunucuya taşıyarak riski en aza indirebilirsiniz.

Uyarı: Yedekler günlük alındığı için bellir bir süre sonra diskinizde fazla yer yoksa yer sorunu oluşabilir. Bu yüzden belli aralıklarla 5-6 günden eski yedeklerinizi silebilirsiniz. Yada yedeklemeyi ayrı bir sunucuya yapıyorsanız crontab ile belirli zaman aralıklarında mysql_yedek klasörünün içerisini temizletebilirsiniz.

Karşılaştığınız sorunlarda yorum yaparsanız ivedilikle geri dönüş yapılacaktır.

CEVAP VER

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.