6

約 1.7GB の MySQL データベースがあります。通常、mysqldump を使用してバックアップしますが、これには約 2 分かかります。ただし、次の質問に対する答えを知りたいです。

  1. mysqldump はデータベースへの読み取りおよび/または書き込み操作をブロックしますか? 実際のシナリオでは、バックアップ中にユーザーがデータベースを使用するのをブロックしたくないからです。

  2. データベース全体を、たとえば 1 週間に 1 回だけバックアップするのが理想的ですが、中間の日には、他のテーブルが変更されないため、1 つのテーブルのみをバックアップする必要があります。これを達成する方法はありますか?

  3. mysqlhotcopy はこれらの目的のためのより良い代替手段ですか?

4

6 に答える 6

3

セットアップに mysql スレーブを追加すると、本番データベースをロックすることなく一貫したバックアップを取得できます。

スレーブを追加すると、変更のバイナリ ログも得られます。ダンプは、ダンプを取得した時点のデータベースのスナップショットです。バイナリ ログには、データを変更したすべてのステートメントとタイムスタンプが含まれています。

1 日の途中で障害が発生し、バックアップを 1 日 1 回だけ取っている場合は、半日分の作業を失ったことになります。バイナリ ログと mysqldump を使用すると、前日から復元し、ログを障害点まで「再生」できます。

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

LVM ディスクを備えた Linux サーバーまたは VSS を備えた Windows サーバーで MySQL を実行している場合は、Zamandaを確認してください。ディスク上のデータのバイナリ差分を取るため、データベースのテキスト ダンプよりも読み取りと復元がはるかに高速です。

于 2009-08-29T00:51:09.717 に答える
3

1) mysqldump は、要求された場合にのみブロックします (--lock-tables、--lock-all-tables、--single-transaction のいずれか)。ただし、バックアップの一貫性が必要な場合は、mysqldump(--single-transaction または --lock-all-tables を使用して) ブロックする必要があります。そうしないと、一貫性のないデータベース スナップショットが取得される可能性があります。注: --single-transaction は InnoDB でのみ機能します。

2) 確かに、データベース名の後にバックアップしたいテーブルを列挙するだけです:

mysqldump OPTIONS DATABASE TABLE1 TABLE2 ...

または、不要なテーブルを除外できます。

mysqldump ... --ignore-table=TABLE1 --ignore-table=TABLE2 .. DATABASE

したがって、データベース全体のダンプを週に 1 回実行し、変化するテーブルのみを 1 日 1 回バックアップできます。

3) mysqlhotcopy は MyISAM テーブルでのみ動作し、ほとんどのアプリケーションでは InnoDB を使用する方が適切です。innodb テーブルのホットバックアップ用の商用ツール (かなり高価) があります。最近、この目的のための新しいオープンソースのものもあります - Xtrabackup

また、プロセスを自動化するには、astrails-safeを使用できます。mysqldump によるデータベースのバックアップと tar によるファイルシステムをサポートしています。+暗号化 +S3 へのアップロード +その他多くの機能。xtrabackup のサポートはまだありませんが、必要な場合は簡単に追加できます。

于 2009-08-23T11:20:27.423 に答える
2
  1. いいえ、 --lock-tables を使用してテーブルをロックするように指定できますが、デフォルトではそうではありません
  2. テーブルを指定しない場合、DB 全体がバックアップされます。または、テーブルのリストを指定できます。

    mysqldump [オプション] db_name [テーブル]

  3. 申し訳ありませんが、使用していませんが、1.7GB よりも大きいものから小さいものまで、多数の MySQL DB を実行しており、すべてのバックアップに mysqldump を使用しています。

于 2009-08-18T08:08:06.077 に答える
0

Maatkit ダンプが役立つ場合があります。

http://www.maatkit.org/doc/mk-parallel-dump.htmlhttp://www.maatkit.org/doc/mk-parallel-dump.html

于 2009-09-27T10:47:27.470 に答える
0

mysql と PHP の場合、これを試してください。これにより、n 日後にファイルも削除されます。

$dbhost = 'localhost';
$dbuser = 'xxxxx';
$dbpass = 'xxxxx';
$dbname = 'database1';  
$folder = 'backups/';  // Name of folder you want to place the file
$filename = $dbname . date("Y-m-d-H-i-s") . ".sql";
$remove_days = 7; // Number of days that the file will stay on the server



$command="mysqldump --host=$dbhost --user=$dbuser --password=$dbpass $dbname > $folder$filename";
system($command);

$files = (glob("$folder"."*.sql"));

    foreach($files as $file) {
        if(is_file($file)
        && time() - filemtime($file) >= $remove_days*24*60*60) { // 2 days =  2*24*60*60
            unlink($file);
            echo "$file removed \n";
        } else { echo "$file was last modified: " . date ("F d Y H:i:s.", filemtime($file)) . "\n"; }
    }
于 2013-05-19T15:06:14.707 に答える