インクリメンタルバイナリログに基づいて、MySQLは任意の場所にデータベースを復元します
1、基本原理
すべての操作は、各操作のバイナリログデータベースMySQLは、ログから抽出することにより、需要に応じたとき、あなたはオペレータのエラーの適切な場所や時間を見つけることができ、ログに完全に記録を持っており、この位置のようになりますこれは、エクスポートされたSQLデータベースが再度実行するようになります、データは、所望の結果に復元されるプロセスは、次に、このアプローチは、任意の場所や時間を回復するために実装することができます。
このモデルは、雪の中を歩くようなものです、のような、レコードのすべてのステップは、自分の期待を行くためのステップまたはステップが存在しない場合は、ログ内のその間違ったステップ、その後、雪を見つけることができます再塗装フラット、ノー足跡は、この時間は、再びその下に、雪の中を歩く自分自身の願いを満たすすべてのレコードを介してログインすることによって見つけることができ、あなたは、エラー前の位置までのすべての行く裏を達成することができますそのような雪のように長方形の一枚下の図のようにステップ、:
私たちはステップ10に到着したとき、彼は間違っているを発見したとき、場所が外部この期待の、今回は雪で再被覆することができる。この雪、前回のログ記録によると、再び9を介して第1のステップ1を取り、その後、彼らは上に移動することができます。
2、実験的試験
ここで私たちは、この時、このテストでは、私は、新しいデータベースのテストを作成するバイナリログをオンにし、テスト・データベースのテストT1テーブルを追加し、実際のテストを行うには、CentOSのmysqlの上で私たちをインストールフルバックアップ、およびログを更新し、その後、私はいくつかのテーブルt1のテストレコードを追加し、モックが誤用のすべてのレコードを削除いたします。最後に、私は、ログ機能を使用します誤用する前にすべてのデータを復元します。
2.1環境と初期化
オペレーティングシステム:CentOSの7.2、データベースシステム:maridb-サーバー5.5.64
データベースのインストール
yumをmariadb-サーバmariadb#は、システムにインストールインストール
systemctl開始mariadb.serviceの#スタートデータベースサービス
mysql_secure_installation#は、データベースの初期化ウィザードが起動する
ようにするために、位に次の設定オプションを他のコンピュータ上のアクセスデータベースは、あなたが任意のホストのルートへのアクセス権を割り当てることができます
mysql -uroot #进入数据库
MariaDB [(none)]> grant all on *.* to root@'%' ; #给root用户分配访问权限MariaDB [(none)]> flush privileges; #刷新权限
データベースの構成は、な/etc/my.cnf修正バイナリログをオンに
vi /etc/my.cnf ##添加如下行
log-bin=cl_bin ##开启二进制日志功能
#如下为可选的配置,可配可不配,这里我不配置
#设置日志格式
#binlog_format = mixed
#设置binlog清理时间
#expire_logs_days = 7
#binlog每个日志文件大小max_binlog_size = 100m
#binlog缓存大小
#binlog_cache_size = 4m
#最大binlog缓存大小
#max_binlog_cache_size = 512m
完成以上配置后,重新启动数据库
systemctl restart mariadb.service #启动数据库服务
データベースのテストを作成し、テーブルt1を追加
mysql -uroot #进入数据库
MariaDB [(none)]> show variables like 'log_bin';
#查询数据库的二进制功能是否已经开启#如果顺利,应该显示如下的内容:#log_bin | ON
#下面创建数据库
MariaDB [(none)]> create database test default charset=utf8;
#下面创建表t1
MariaDB [(none)]> use test;
MariaDB [test]> create table t1(id int not null auto_increment,k varchar(20) default null,v varchar(50) default null , primary key (id)) default charset=utf8;
:上記の手順の完了は、次のようにされたデータ構造を見ることができます
。この時間は、我々は後で復元バックアップのためのベンチマークとして、データベースの完全バックアップを行うことができます
mysqldump -uroot test > test_bak_20191227.sql #备份数据库
mysqldump -uroot --all-databases > mysql_bak_20191227.sql #备份全部,以防万一,这里可选操作,与实验相关不大
mysqladmin -uroot flush-logs #刷新数据库日志
#或者以下面的方式刷新数据库日志
mysql -urootMariaDB [test]>flush logs; #刷新日志
MariaDB [test]> show binary logs;#显示日志列表
ログリストは、あなたがcl_bin.000008を次のように新しいログファイルが生成されるはずです時:
我々はのログcl_bin.000008とcl_bin.000007の内容を見て
MariaDB [テスト]> binlogのイベントを示して 「cl_bin.000008」内を、
MariaDBは、[テスト]> binlogのイベントを示して 「cl_bin.000007」内を、
それが注目される、我々はリフレッシュした後、ログcl_bin.000007の、cl_bin.000008新しいログで詳細を含むデータベースを作成しました。
最後に、私は、テーブルT1のテストデータベースにいくつかのデータを挿入しました
MariaDB [none]> use test; #空表
MariaDB [test]> select * from t1; #空表
MariaDB [test]> insert into t1(k,v) values('test-k-01','test-value-001'); #插入演示数据
MariaDB [test]> insert into t1(k,v) values('test-k-02','test-value-002'); #插入演示数据
MariaDB [test]> insert into t1(k,v) values('test-k-03','test-value-003'); #插入演示数据
2.2誤用
ここでは、誤用をシミュレートすることができます
mysql -uroot #进入数据库
MariaDB [test]> delete from t1; #这是一个误操作,清空了t1表的所有数据
以前のデータの悪用に2.2復帰
以下の操作が誤って復元するすべてのレコードを削除する前に、データテーブルのすべてを達成することです。
最初のステップは、あなたがデータベースの完全バックアップを使用することができます上記を復元するためにフルバックアップを行う、あなたは完全なデータベース・バックアップのテストを使用することができましょう。
mysql -uroot < mysql_bak_20191227.bak #使用数据库全备份#使用test的全备份
mysql -urootMariaDB [(none)]> use test;
MariaDB [test]> source test_bak_20191227.sql
ただ、初期化データ構造を完成するために、のように回復フルバックアップした後、それが私たちの以前のデータのこの時点で、結論付けることができるが、プレゼンテーションデータに挿入され、当然のT1テーブルが空です。
第二段階、回復ログは、
最初にすべての、私は、どのような最新のログの内容に誤りの場所を見つけるために、そのステップを見ることができます。
MariaDB [test]> show binlog events in 'cl_bin.000008';
操作のこのマークの最初のステップは、1039年、赤、私はちょうど誤用をやったこと、そして、1039年のように、この位置ログからのログを抽出し、データベースに再導入することができます。
ログを抽出する必要があるため今、私は、MySQL、すでにlog_bin設定項目を言っていた、我々はファイルの名前をcl_binするために、次のMySQLデータディレクトリに言うことですcl_bin設定、あり、どこにログインするために知っておく必要があり、ログを抽出するために始めましたそれはデータベースを見てすることが可能であるデータディレクトリ
我々はデータディレクトリ/ var / libに/ mysqlの中で見てきた、そしてあなたは、このディレクトリを入力することができます
cd /var/lib/mysql/
mysqlbinlog --stop-position=1039 cl_bin.000008 > recovery.sql; #这一步最关键,
1039年の手順はrecovery.sqlするログファイルを抽出する
データrecovery.sqlを復元するには、このファイルを使用し、最後に
mysql -uroot < recovery.sql;mysql -uroot #再次登录数据库
MariaDB [(none)]> use test; #使用test
MariaDB [test]> select * from t1; #查看结果
私たちは完了です。!!