Backup MySQL dengan Mudah

Kita telah membincangkan bagaimana untuk menjalankan proses backup fail dan backup mysql melalui artikel-artikel sebelum ini:

Kali ini, kita akan gabungkan keduanya bagi memudahkan proses automasi backup ini.

Merujuk kepada Tip Linux #3, kita sudah boleh backup fail-fail Web Server yang terletak di /var/www/html.

Tetapi ini tidak memadai kerana kita belum backup mysql database bagi web server tersebut.

Oleh itu, login ke Web server dan bina direktori dan script ringkas seperti berikut:

1. Dengan privilege ‘root’, bina direktori di mana kita hendak letak script:

sudo mkdir -p /var/datalead/script

2. Bina direktori atau lokasi bagi database yang hendak kita backup:

sudo mkdir -p /var/datalead/backup

3. Bina script berikut:

cd /var/datalead/script
vi mysqlbackup.pl

Masukkan kandungan:

#!/usr/bin/perl
# Perform a mysqldump on all the databases specified in db.conf file
use warnings;
use File::Basename;
# example config file
# You may use a comment to bypass any database that you don't want to backup
# # Unwanted_DB (commented - will not be backed up)
# twtr
# cbgc
# set the directory where you will keep the backup files

# make sure that the directory exists
$backup_folder = '/var/datalead/backup';

my $config_file = dirname($0) . "/db.conf";
# retrieve a list of the databases from the config file
my @databases = removeComments(getFileContents($config_file));

# change to the directory of the backup files.
chdir($backup_folder) or die("Cannot go to folder '$backup_folder'");

# grab the local time variables
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon++;
#Zero padding
$mday = '0'.$mday if ($mday<10);
$mon = '0'.$mon if ($mon<10);
$hour = "0$hour" if $hour < 10;
$min = "0$min" if $min < 10;

# create the name of the backup folder that will contain all of the backup files
my $folder = "$year-$mon-$mday-$hour$min";
mkdir($folder) or die("Cannot create a folder called '$folder'");

# backup each database contained in the @databases array
foreach my $database (@databases) {
   next if ($database eq '');
   chomp($database);
   my $table = '';

   if(index($database,' ')+1) {
      my @parts = split(' ',$database);
      $database = $parts[0];
      $table = $parts[1];
   }

   print "Backing up $database ... ";
   my $file = $database;
   $file .= '_' . $table if($table ne '');
   $file .= ".sql";

   # perform a mysqldump on each database
   # change the path of mysqldump to match your system's location
   # make sure that you change the root password to match the correct password
   
   
   `/usr/bin/mysqldump -R --triggers -u root --password="password#susah!NakTeka" $database $table > $folder/$file`;
   `/bin/tar cvfz $folder-$file.tar.gz $folder/$file`;
   `rm -rf $folder`;
   
   you may comment out this print statement if you don't want to see this information
   print "Done\n\n";
   exit;
}

# this subroutine simply creates an array of the list of the databases
sub getFileContents {
        my $file = shift;
        open (FILE,$file) || die("Can't open '$file': $!");
        my @lines=<FILE>;
        close(FILE);
        return @lines;
}

# remove any commented tables from the @lines array
sub removeComments {
        my @lines = @_;
        @cleaned = grep(!/^\s*#/, @lines); #Remove Comments
        @cleaned = grep(!/^\s*$/, @cleaned); #Remove Empty lines
        return @cleaned;
}

Script ringkas ini menggunakan ‘perl’, menjalankan arahan ‘mysqldump’ dengan output nama fail mengandungi tarikh dan masa backup dijalankan.

Tukar file permission:

sudo chmod +x mysqlbackup.pl

Bina juga fail konfigurasi dalam direktori yang sama dengan nama “db.conf“.  Kandungan fail ini adalah nama database yang hendak kita backup.

Contoh:

sudo vi db.conf

Kandungan:

wordpress
nazri_db
mysql

4. Masukkan ke dalam crontab

sudo crontab -e

Masukkan:

0 23 * * * /var/datalead/script/mysqlbackup.pl > /dev/null 2>&1 &

Ok done.  Ini akan backup database yang kita define dalam fail “db.conf” pada jam 11:00 p.m. Database yang telah kita backup akan disimpan dalam direktori /var/datalead/backup.

Ini adalah contoh pada server yang saya pasang (saya hanya define “db_nazri_wp” dalam fail “db.conf”):

root@vps1:/var/datalead/backup# ls -la
total 4072
drwxr-xr-x 2 root root 4096 Aug 10 23:00 .
drwxr-xr-x 4 root root 4096 Jul 8 15:42 ..
-rw-r--r-- 1 root root 387577 Aug 2 22:00 2015-08-02-2200-db_nazri_wp.sql.tar.gz
-rw-r--r-- 1 root root 387915 Aug 2 23:00 2015-08-02-2300-db_nazri_wp.sql.tar.gz
-rw-r--r-- 1 root root 389153 Aug 3 23:00 2015-08-03-2300-db_nazri_wp.sql.tar.gz
-rw-r--r-- 1 root root 390510 Aug 4 23:00 2015-08-04-2300-db_nazri_wp.sql.tar.gz
-rw-r--r-- 1 root root 391827 Aug 5 23:00 2015-08-05-2300-db_nazri_wp.sql.tar.gz

5. Sekarang kita login pula ke backup server.

Merujuk kepada artikel Tip Linux #3, edit kembali fail “backup-server.sh” dengan fail asal:

#!/bin/sh 
rsync -avz -delete -e "ssh -i /home/salin/.ssh/id_rsa" salin@192.168.0.20:/var/www/html /var/backup/webserver/
cd /home/salin/bin
vi backup-server.sh

Tambah pula direktori MySQL yang hendak kita backup juga:

#!/bin/sh 
rsync -avz -delete -e "ssh -i /home/salin/.ssh/id_rsa" salin@192.168.0.20:/var/www/html /var/backup/webserver/
rsync -avz -delete -e "ssh -i /home/salin/.ssh/id_rsa" salin@192.168.0.20:/var/datalead/backup /var/backup/mysql/

Jangan lupa untuk bina direktori untuk backup database:

sudo mkdir -p /var/backup/mysql
sudo chown salin.salin /var/backup/mysql -R

Sekarang selesai sudah proses backup kita.  Kini fail web kita akan melalui proses backup dan disimpan di /var/backup/webserver dan backup MySQL pula akan disimpan di /var/backup/mysql.  Kita boleh ubah di mana jua lokasi yang direktori yang digemari!  Selamat mencuba!

Leave a Reply

Your email address will not be published. Required fields are marked *