2011-12-09 7 views
5

Tôi cần một tập lệnh tự động sao lưu Cơ sở dữ liệu MySql. Tôi biết có rất nhiều bài viết và các kịch bản hiện có về chủ đề này nhưng đây là nơi tôi khác nhau.Tự động sao lưu cơ sở dữ liệu MySQL trên máy chủ Linux

  1. Tập lệnh cần chạy trên máy lưu trữ cơ sở dữ liệu MySql (Đây là máy linux).
  2. Các bản sao lưu phải được lưu vào cùng một máy chủ mà cơ sở dữ liệu đang bật.
  3. Cần thực hiện sao lưu sau mỗi 30 phút.
  4. Khi bản sao lưu cũ hơn một tuần, nó sẽ bị xóa trừ khi nó là bản sao lưu đầu tiên được tạo trong tuần đó. trong số các bản sao lưu này sao lưu_1_12_2010_0-00_Mon.db, backup_1_12_2010_0-30_Mon.db, backup_1_12_2010_1-00_Mon.db ... backup_7_12_2010_23-30_Sun.db v.v. chỉ sao lưu_1_12_2010_0-00_Mon.db được lưu giữ.

Bất cứ ai cũng có bất kỳ điều gì tương tự hoặc bất kỳ ý tưởng nào để bắt đầu từ đâu?

+11

** KHÔNG BAO GIỜ ** sao lưu địa điểm trong máy sản xuất. Nếu máy chủ sản xuất của bạn chết, bạn sao lưu cũng biến mất. – ajreal

Trả lời

7

Làm khá giống với nhiều người.

  1. Tập lệnh cần chạy trên máy lưu trữ cơ sở dữ liệu MySql (Đây là máy linux).
    => Tạo tập lệnh bash hoặc perl cục bộ (hoặc bất kỳ thứ gì) "myscript" trên máy này "A"

  2. Sao lưu phải được lưu vào cùng một máy chủ mà cơ sở dữ liệu đang bật.
    => trong tập lệnh "myscript", bạn chỉ có thể sử dụng mysqldump. Từ bản sao lưu cục bộ, bạn có thể tạo tarball mà bạn gửi qua scp tới máy từ xa của bạn. Cuối cùng, bạn có thể đặt tập lệnh sao lưu của mình vào crontab (crontab -e).

Một số gợi ý và chức năng để giúp bạn bắt đầu như tôi sẽ không gửi toàn bộ kịch bản của tôi, nó không làm đầy đủ các thủ thuật nhưng không xa:

#!/bin/sh 
... 
MYSQLDUMP="$(which mysqldump)" 
FILE="$LOCAL_TARBALLS/$TARBALL/mysqldump_$db-$SNAPSHOT_DATE.sql" 
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db > $FILE && $GZIP $GZ_COMPRESSION_LEVEL $FILE 

function create_tarball() 
{ 
local tarball_dir=$1 
tar -zpcvf $tarball_dir"_"$SNAPSHOT_DATE".tar.gz" $tarball_dir >/dev/null 
return $? 
} 

function send_tarball() 
{ 
local PROTOCOLE_="2" 
local IPV_="4" 
local PRESERVE_="p" 
local COMPRESSED_="C" 
local PORT="-P $DESTINATION_PORT" 
local EXECMODE="B" 

local SRC=$1 
local DESTINATION_DIR=$2 
local DESTINATION_HOST=$DESTINATION_USER"@"$DESTINATION_MACHINE":"$DESTINATION_DIR 

local COMMAND="scp -$PROTOCOLE_$IPV_$PRESERVE_$COMPRESSED_$EXECMODE $PORT $SRC $DESTINATION_HOST &" 

echo "remote copy command: "$COMMAND 
[[ $REMOTE_COPY_ACTIVATED = "Yes" ]] && eval $COMMAND 

} 

Sau đó, để xóa các tập tin cũ hơn "ngày", bạn có thể xem người đàn ông tìm thấy và tập trung vào các tùy chọn mtimemới hơn.

Chỉnh sửa: như đã nói ở trên, không có sự quan tâm đặc biệt nào khi thực hiện sao lưu cục bộ ngoại trừ tệp temproray để có thể gửi tarball dễ dàng và xóa nó khi được gửi.

6

Bạn có thể làm hầu hết những điều này với một cronjob một dòng thiết lập để chạy mỗi 30 phút:

mysqldump -u<user> -p<pass> <database> > /path/to/dumps/db.$(date +%a.%H:%M).dump 

này sẽ tạo ra một cơ sở dữ liệu đổ mỗi 30 phút, và mỗi tuần nó sẽ bắt đầu ghi đè trước các bãi chứa của tuần.

Sau đó, có một cronjob khác chạy mỗi tuần một lần sao chép bản mới nhất vào một vị trí riêng biệt nơi bạn giữ ảnh chụp nhanh.

13

trả lời: Một cron

Mô tả:

Hãy thử tạo một tập tin với something.sh này:

#!/bin/sh 
mysqldump -u root -p pwd --opt db1.sql > /respaldosql/db1.sql 
mysqldump -u root -p pwd --opt db2.sql > /respaldosql/db2.sql 
cd /home/youuser/backupsql/ 
tar -zcvf backupsql_$(date +%d%m%y).tgz *.sql 
find -name '*.tgz' -type f -mtime +2 -exec rm -f {} \; 

Cho phép đầy đủ đến tập tin

chmod 700 mysqlrespaldo.sh 

hoặc

sudo chmod 700 something.sh 

và sau đó tạo một cron với

crontab -e 

thiết lập nó như

**0 1 * * *** /home/youruser/coolscripts/something.sh 

Hãy nhớ rằng những con số hoặc '*' nhân vật có cấu trúc này:

Minutes (range 0-59) 
Hours (0-23) 
Day of month (1-31) 
Month (1-12) 
Day of the week (0-6 being 0=Domingo) 
Absolute path to script or program to run 
+3

Tôi thực sự sẽ thả tập lệnh (hoặc một liên kết tượng trưng vào nó) trong một thư mục /etc/cron.daily nếu distro của bạn hỗ trợ nó thay vì thêm một dòng vào crontab chính. – Nick

+0

@Nick Đây là +1 dành cho bạn. – Alfabravo

5

Tạo một kịch bản shell như hình dưới đây:

#!/bin/bash 
mysqldump -u username -p'password' dbname > /my_dir/db_$(date+%m-%d-%Y_%H-%M-%S).sql 
find /mydir -mtime +10 -type f -delete 

Thay tên người dùng, mật khẩu và thư mục sao lưu của bạn (my_dir). Lưu nó trong một thư mục (shell_dir) như filename.sh

Schedule nó để chạy hàng ngày sử dụng crontab -e thích:

30 8 * * * /shell_dir/filename.sh 

này sẽ chạy hàng ngày lúc 8:30 AM và sao lưu cơ sở dữ liệu. Nó cũng xóa bản sao lưu cũ hơn 10 ngày. Nếu bạn không muốn làm điều đó chỉ cần xóa dòng cuối cùng từ kịch bản.

1

Tùy chọn của tôi là dành cho AutoMySQLBackup đi kèm với Debian. Nó thực sự dễ dàng và tạo ra các bản sao lưu hàng ngày, có thể được cấu hình. Ngoài ra, nó lưu trữ trên hàng tuần và sau đó một bản sao lưu hàng tháng là tốt.

Tôi đã chạy ứng dụng này một lúc và rất dễ cấu hình và sử dụng!