這個 Perl Script 使用 mysqldump 備份 MySQL, 可以放到 crontab 自動執行。
程式需要按需要修改, 以下是需要修改的選項:
$db_username: mysql 使用者名稱
$db_password: mysql 密碼
$db_host: mysql server 位置
$mysqldump: mysqldump 位置
$backup_dir: 儲存備份檔的目錄
$rotate: 保留備份數量
@backup_db: 需要備份的資料庫, 以新行或空格分隔, all-databases 會備份全部資料庫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#!/usr/bin/perl ############################################################################### # Name: mysql_backup.pl # Author: Sam Tang (http://www.phpini.com/) # Last modified: 08-May-2015 # Purpose: auto backup mysql database with perl and mysqldump ############################################################################### use strict; use warnings; use File::Copy; use File::Basename; use File::Path; no warnings 'numeric'; # disable Argument "XXX" isn't numeric warning ##### configure of our mysql my $db_username = "root"; ### mysql username my $db_password = "db_password"; ### mysql password my $db_host = "localhost"; ### mysql host my $mysqldump = "/usr/bin/mysqldump"; ### path of mysqldump my $backup_dir = "/path/to/backup/"; ### directory for store backup files my $rotate = 7; ### number of backup copy save ##### backup databases here, all-databases = backup all databases my @backup_db = qw( mysql test ); ##### make sure backup directory is writable if (! -w $backup_dir) { print "Error: backup directory $backup_dir not writable\n"; exit; } ##### create temporary directory save newest backup if (! mkdir $backup_dir."mysql-backup.0/") { print "Error: create temporary directory fail\n"; exit; } ##### backup file with date my ($sec, $min, $hour, $day, $mth, $year) = localtime(time); $year += 1900; my $backup_name = "$backup_dir/mysql-backup.0/" . $year . "-" . sprintf("%02d", $mth+1) . "-" . sprintf("%02d", $day); my $mysqldump_command; ##### create backup with mysqldump for my $backup_db (@backup_db) { if ($backup_db eq "all-databases") { $mysqldump_command = "$mysqldump -u $db_username " . "-h $db_host -p$db_password --all-databases > " . "$backup_name.all-databases.sql"; } else { $mysqldump_command = "$mysqldump -u $db_username " . "-h $db_host -p$db_password $backup_db > " . "$backup_name.$backup_db.sql"; } system($mysqldump_command); } ##### delete the oldest backup if (-d "$backup_dir/mysql-backup.$rotate") { rmtree "$backup_dir/mysql-backup.$rotate"; } ##### backup directory rotate for (my $i=$rotate; $i>0; $i--) { my $less_i = $i - 1; move("$backup_dir/mysql-backup.".$less_i, "$backup_dir/mysql-backup.".$i); } |