データベース論理バックアップとはどのようなバックアップですか?
データベースが使用のためにデータを返すとき、データベースは、私たちが当初設計し予期していた特定の論理関連付け形式で、物理ストレージにデータを 1 つずつ表示することは誰もが知っています。データベースソフトのレベルでは、データベースソフトが設計した特定の形式に従って一定の処理を行った上で保存されます。
データベース論理バックアップとは、バックアップ ソフトウェアが、当初設計した論理関係に従ってデータベースの論理構造オブジェクトを単位として使用し、目的を達成するために、事前定義された論理関連付け形式に従って関連するテキスト ファイルを 1 つずつ生成することを意味します。バックアップが目的。
一般的に使用される論理バックアップ
論理バックアップは、中小規模のシステムで最も簡単で最も一般的に使用されるバックアップ方法であると言えます。 MySQL で一般的に使用される論理バックアップには、主に 2 つのタイプがあります。1 つは、現在のデータベース内のデータを完全に再現できる INSERT ステートメントを生成するもので、もう 1 つは、データを論理バックアップ ソフトウェアに渡してデータベース テーブル データを特定するものです。文字ごとに区切ってテキストファイルに記録します。
1. INSERT ステートメントのバックアップを生成する
どちらの論理バックアップにも独自の長所と短所があり、対象とする使用シナリオが少し異なります。まず、INSERT ステートメントを生成する論理バックアップを見てみましょう。
MySQL データベースでは、通常、MySQL データベース ソフトウェア独自のツール プログラムで mysqldump を使用して、INSERT ステートメントを要求する論理バックアップ ファイルを実現します。使用法は基本的に次のとおりです:
定義とデータのダンプ mysql データベースまたはテーブル
使用法: mysqldump [OPTIONS] データベース [テーブル]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump の使用は比較的簡単なので、必要な情報のほとんどは「mysqldump --help」を実行することで取得できます。ここでは、MySQL データベースのいくつかの概念と原則を組み合わせて、データベースの論理バックアップを実行するために mysqldump を使用するときにどのような技術があるのか、また何に注意する必要があるのかについて説明したいと思います。
データベースを使用するほとんどのソフトウェアや Web サイトでは、時々シャットダウンしてサービスの提供を停止する代わりに、データベースが可能な限り最高の可用性を提供できることを望んでいることは誰もが知っています。データベースがサービスを提供できなくなると、システムはデータにアクセスして一部の動的な機能を提供できなくなるためです。したがって、ほとんどのシステムでは、バックアップのたびにシャットダウンすることは受け入れられない可能性がありますが、mysqldump プログラムの実装原則は、指定したパラメーター情報とデータベース内のシステム テーブル情報を使用してテーブルを 1 つずつ作成することです。データを取得し、INSERT ステートメントを生成してバックアップ ファイルに書き込みます。これにより、システムの通常の動作中にデータ変更リクエストが実行され続ける可能性があり、mysqldump によってバックアップされたデータに不整合が生じる可能性があります。つまり、バックアップ データは同じ時点に存在しない可能性があり、整合性の制約さえ満たさない可能性があります。このようなバックアップ セットは、一部のシステムでは大きな問題にならない場合がありますが、データの一貫性と整合性について厳しい要件がある一部のシステムでは、これは大きな問題であり、完全に無効なバックアップ セットとなります。
そのようなシナリオではどうすればよいでしょうか?データベース内のデータに一貫性を持たせたい場合、それを実現できる状況は 2 つだけであることがわかっています。
まず、すべてのデータが同時に取り出されます。
次に、データベース内のデータは静的な状態になります。
最初の状況については、誰もが考えているはずです、これは可能ですか?どう考えても、テーブルが 2 つ以上ある限り、どのようにプログラムを書いても、昨夜同時に同じ番号を取得することは不可能です。確かに、従来の方法ではデータを取得する時点をまったく同じにすることはできませんが、同じトランザクション内で、データベースは読み取られるデータが同じ時点であることを保証できることを忘れないでください。したがって、Innodb や BDB などのトランザクションをサポートするストレージ エンジンの場合、同じトランザクションでバックアップ プロセス全体を制御して、バックアップ データの一貫性と整合性を実現できます。また、mysqldump プログラムは、関連するパラメータ オプションも提供します。この機能は「--single-transaction」オプションによってサポートされます。これはデータベースの通常のサービスには影響しません。
2 番目のケースでは、誰もが最初に考えるのは、バックアップが必要なテーブルをロックして、読み取りのみを許可し、書き込みを許可しないことだと思います。はい、それが本当に私たちにできるすべてです。データベースはバックアップ プロセス中にデータ クエリ サービスのみを提供し、書き込みサービスをロックするという妥協的な方法しか使用できません。これにより、データは一時的に変更されない一貫した状態になり、mysqldump がバックアップ プロセスを完了するのを待ちます。バックアップを実行し、書き込みロックを解除し、完全なサービスを再開します。 mysqldump プログラム自体も、実行前にテーブルをロックし、実行後に自動的にロックを解放する「--lock-tables」や「--lock-all-tables」などの関連オプションも提供します。ここで注意すべき点は、「--lock-tables」はダンプする必要があるすべてのテーブルを一度にロックするのではなく、データベース内の複数の異なるテーブルをダンプする必要がある場合に一度に 1 つのデータベース テーブルのみをロックすることです。 , データの一貫した整合性を確保するには、「--lock-all-tables」を使用する必要があります。
mysqldump を通じて INSERT ステートメントの論理バックアップ ファイルを生成する場合、「--master-data[=value]」という非常に便利なオプションを使用できます。 「--master-data=1」を追加すると、mysqldump は MySQL が現在使用している binlog ログの名前と場所をダンプ ファイルに記録します。これを使用するだけの場合は、CHANGE_MASTER ステートメントの形式で記録されます。 「- -master-data」または「--masterdata=2」の場合、CHANGE_MASTER ステートメントはコメントの形式で存在します。このオプションは、スレーブのオンライン構築を実装する場合に非常に役立ちます。スレーブがオンラインで構築されていない場合でも、場合によっては、回復プロセス中にバックアップ バイナリを通じてさらなる回復操作を実行できます。
一部のシナリオでは、いくつかの特別なデータを他のデータベースにエクスポートするだけですが、最初に一時テーブルを構築する必要はありません。mysqldump プログラムの "--where" を使用することもできます。 " ですが、テーブルを 1 つだけダンプする場合にのみ使用できます。実際、上記のヒントに加えて、mysqldump には、データベース構造作成スクリプトのみをダンプする「--no-data」の使用や、「--no」の使用など、さまざまなシナリオで誰もが使用できる他の多くの便利なオプションも用意されています。 - createinfo」は、ダンプ ファイルなどにテーブル構造を作成するコマンドを削除します。興味のある読者は、mysqldump プログラムの使用方法の詳細を読んで、自分でテストしてください。
2. 特定の形式でプレーン テキスト バックアップ データ ファイルのバックアップを生成する
INSERT コマンドを生成して論理バックアップを生成することに加えて、別の方法を使用してデータベース内のデータを特定の区切り文字で区切って記録することもできます。テキスト ファイルを使用して論理バックアップの効果を実現します。このようなバックアップ データは、INSERT コマンド ファイルと比較して、必要な記憶領域が小さく、データ形式が明確で、編集が容易です。ただし、複数のテーブルのバックアップ データを同じバックアップ ファイル内に存在させることができないことと、データベース構造を再構築するコマンドがないことが欠点です。バックアップ セットには複数のファイルが必要で、私たちへの影響はファイルの増加によるメンテナンスと回復のコストの増加にすぎませんが、これらは基本的にいくつかの簡単なスクリプトを書くことで実現できます
それでは、一般的にどのような方法を使用して生成することができますか?バックアップ セット ファイルに関しては、実際には MySQL も対応する機能を実装しています。
MySQL では、カスタマイズ可能な区切り文字を含むプレーンテキストのバックアップ ファイルを取得するには、通常、次の 2 つの方法が使用されます。
1. SELECT ... TO OUTFILE FROM ... コマンドを実行することにより、
は SQL ステートメントを通じて特定のデータを指定された形式でテキスト ファイルに出力するように設計された MySQL の SELECT 構文を提供します。エクスポートされたファイルをそのままデータベースに簡単にインポートするための実用的なツールと関連コマンドも提供します。それはまさにバックアップに必要なものではないでしょうか?
このコマンドには、次のような注意が必要なパラメーターがいくつかあります。
「FIELDS ESCAPED BY ['name']」は、文字エスケープ関数を実装し、SQL ステートメントでエスケープする必要がある文字をエスケープします。 「OPTIONALLY」を使用しない場合、「OPTIONALLY」を使用すると、数値型を含むすべてのタイプのデータが「ラップ」されます。数値型データは指定された文字で「ラップ」されません。
「FIELDS TERMINATED BY」を通じて各 2 つのフィールド間の区切り文字を設定できます。
「LINES TERMINATED BY」は、各レコードの末尾に追加する必要がある文字を MySQL 出力ファイルに伝えます。
例:
350024,24,"D","abcd"
350025,25,"A","abcd"
... ...
2. mysqldump を介してエクスポートする
おそらく、mysqldump がエクスポートできることは誰もが知っています。データベース内のデータは、INSERT ステートメントの形式で関連するバックアップ ファイルを生成します。実際、mysqldump は、INSERT ステートメントの生成に加えて、上記の「SELECT ... TOOUTFILE FROM ...」によって実装される関数も実装できます。データベース構造に対応する関連する作成スクリプトを生成します。
例:
root@sky:~# ls -l /tmp/mysqldump
total 0
root@sky:~# mysqldump -uroot -T/tmp/mysqldump test test_outfile --fieldsenclosed-by= " --fields-terminated-by=,
root@sky:~# ls -l /tmp/mysqldump
total 8
-rw-r--r-- 1 root root 1346 2008-10-14 22 : 18 test_outfile.sql
-rw-rw-rw- 1 mysql mysql 2521 2008-10-14 22:18 test_outfile.txt
root@sky:~# cat /tmp/mysqldump/test_outfile.txt
350021, 21 ,"A","abcd"
350022,22,"B","abcd"
350023,23,"C","abcd"
350024,24,"D","abcd"
350025 ,25,"A","abcd"
... ...
root@sky:~# cat /tmp/mysqldump/test_outfile.sql
-- MySQL ダンプ 10.11
---- ホスト : localhost データベース: test
------------------------------------------ -- ------------- サーバーバージョン 5.0.51a-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@ CHARACTER_SET_RESULTS * /;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; !40103 SET TIME_ZONE='+00:00' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES , SQL_NOTES =0 */;
---- テーブル `test_outfile` のテーブル構造
--DROP TABLE IF EXISTS `test_outfile`;
SET @saved_cs_client = @@character_set_client;
SET Character_set_client = utf8;
CREATE TABLE `test_outfile` (
`id` int(11) NOT NULL デフォルト '0',
`t_id` int(11) デフォルト NULL,
`a` char(1) デフォルト NULL,
` MID` VARCHAR (32) デフォルト Null
) エンジン = Myisam デフォルト Charset = UTF8;
Set Character_Client = @Saved_CS_Client; 40103 Set TimE_zon E =@OLD_TIME_ZONE */; 40101 SQL_MODE = @ OLD_SQL_MODE */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CON =@OLD_COLLATION_CONNECTION */;
/ *!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- ダンプは 2008-10-14 14:18:23 に完了しました
この出力構造は、バックアップとして使用するのに非常に適しています。複数のテーブルをダンプする必要がある場合は、テーブルごとに 2 つの対応するファイルが生成されます。
上記は、Mysql データ バックアップの論理バックアップの内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。