web-dev-qa-db-ja.com

Linuxサーバー上のMySQLデータベースを自動的にバックアップします

MySqlデータベースのバックアップを自動的に作成するスクリプトが必要です。このトピックに関する投稿やスクリプトがすでにたくさんあることは知っていますが、ここが私の違いです。

  1. スクリプトは、MySqlデータベースをホストしているマシン(Linuxマシン)で実行する必要があります。
  2. バックアップは、データベースが存在するのと同じサーバーに保存する必要があります。
  3. 30分ごとにバックアップを作成する必要があります。
  4. バックアップが1週間より古い場合、その週に作成された最初のバックアップでない限り、バックアップは削除されます。つまり、これらのバックアップのうち、backup_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などのbackup_1_12_2010_0-00_Mon.dbのみが保持されます。

誰かが似たようなものやどこから始めるべきアイデアがありますか?

10
Jared

多くの人とほとんど同じことをしています。

  1. スクリプトは、MySqlデータベースをホストしているマシン(Linuxマシン)で実行する必要があります。
    =>このマシン「A」でローカルbashまたはPerlスクリプト(またはその他)「myscript」を作成します

  2. バックアップは、データベースが存在するのと同じサーバーに保存する必要があります。
    =>スクリプト "myscript"では、mysqldumpを使用できます。ローカルバックアップから、scpを介してリモートマシンに送信するtarballを作成できます。最後に、バックアップスクリプトをcrontab(crontab -e)に入れることができます。

スクリプト全体を投稿しないので、始めるためのヒントと関数がいくつかあります。スクリプト全体ではうまくいきませんが、それほど遠くはありません。

#!/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

}

次に、「日付」より古いファイルを削除するには、man findを調べて、mtimeおよびnewerオプションに焦点を当てます。

編集:前述のように、tarballを簡単に送信し、送信時に削除できるようにするtemprorayファイルを除いて、ローカルバックアップを実行することに特に関心はありません。

8
hornetbzz

回答:cron

説明

これを使用してsomething.shファイルを作成してみてください。

 #!/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 {} \;

ファイルに適切な権限を与える

 chmod 700 mysqlrespaldo.sh

または

 Sudo chmod 700 something.sh

次に、でcronを作成します

 crontab -e

次のように設定します

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

数字または「*」文字は次の構造を持っていることに注意してください。

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
18
Alfabravo

これのほとんどは、30分ごとに実行するように設定された1行のcronジョブで実行できます。

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

これにより、30分ごとにデータベースダンプが作成され、毎週、前週のダンプの上書きが開始されます。

次に、スナップショットを保持している別の場所に最新のダンプをコピーする、週に1回実行される別のcronジョブを用意します。

7
pgl

以下のようなシェルスクリプトを作成します。

#!/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

ユーザー名、パスワード、およびバックアップディレクトリ(my_dir)を置き換えます。それをfilename.shとしてディレクトリ(Shell_dir)に保存します

次のようなcrontab-eを使用して、毎日実行するようにスケジュールします。

30 8 * * * /Shell_dir/filename.sh

これは毎日午前8時30分に実行され、データベースをバックアップします。また、10日以上経過したバックアップも削除されます。それをしたくない場合は、スクリプトから最後の行を削除してください。

7
Ankit Singhania

私の好みは AutoMySQLBackup これはDebianに付属しています。それは本当に簡単で、構成可能な毎日のバックアップを作成します。また、毎週、その後は毎月1回のバックアップで保存されます。

私はこれをしばらく実行していましたが、構成と使用は非常に簡単です!

1
shaneonabike

このオープンソースツール、matiri、 https://github.com/AAFC-MBB/matiri を検討してください。これは、Sqlite3のメタデータを使用した同時mysqlバックアップスクリプトです。機能(あなたが求めていた以上のもの...):

  • マルチサーバー:複数のMySQLサーバーは、同じ物理サーバーに配置されているか、別々の物理サーバーに配置されているかに関係なくサポートされます。
  • 並列:バックアップするサーバー上の各データベースは、個別に並列に実行されます(同時実行設定可能:デフォルト:3)
  • 圧縮:各データベースのバックアップは圧縮されています
  • チェックサム:保存されている各圧縮バックアップファイルのSHA256とすべてのファイルのアーカイブ
  • アーカイブ:すべてのデータベースバックアップが1つのファイルにtar化されました
  • 記録:Sqlite3データベースに保存されているバックアップ情報

完全開示:元のマティリ作者。

0
ggg