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=; 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 

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!

Write a Comment

view all comments

*

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