MySQLログの管理、バックアップ、およびリカバリ(詳細な図の説明)

MySQLログ管理、バックアップ、およびリカバリ

準備オーケー

MySQLデータベースをインストールします

シェルスクリプトワンクリックデプロイメント-ソースコードはMySQLをコンパイルしてインストールします

MySQLログ管理

MySQLのデフォルトのログ保存場所は/ usr / local / mysql / dataです

ログを開くには、構成ファイルまたは
コマンドの2つの方法があります。コマンドを使用して開いているログを変更するのは一時的なものであり、サービスを閉じるか再起動すると閉じられます。

1つは、MySQLの常用対数の種類と開始

vim /etc/my.cnf
[mysqld]
......

1.エラーログ
MySQLの起動、停止、または実行時に発生するエラーメッセージを記録するために使用されます。デフォルトで有効になっています。

指定日志的保存位置和文件名
log-error=/usr/local/mysql/data/mysql_error.log					

2.一般的なクエリログ
MySQLのすべての接続とステートメントを記録するために使用され、デフォルトで閉じられます

general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

3.バイナリログ(binlog)
MySQLの起動、停止、または実行時に送信されるすべてのエラーメッセージを記録するために使用され、デフォルトで閉じられます

log-bin=mysql-bin				
log_bin=mysql-bin

4.遅いクエリログ
実行時間がlong_query_time秒を超えるすべてのステートメントを記録するために使用されます。最適化のために実行時間が長いクエリステートメントを見つけることができます。デフォルトは閉じています。

slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5	   		

systemctl restart mysqld    

ここに画像の説明を挿入
ここに画像の説明を挿入

2、ログステータスを表示します

1.一般的なクエリログが有効になっているかどうかを確認します

mysql -u root -p
show variables like 'general%';		

2.バイナリログがオンになっているかどうかを確認します

show variables like 'log_bin%';

3.遅いクエリ日機能が有効になっているかどうかを確認します

show variables like '%slow%';	

遅いクエリ時間の設定を表示する

show variables like 'long_query_time';

データベースで低速クエリを開始する方法を設定します

set global slow_query_log=ON;
该方法重启服务失效

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

MySQLのバックアップと復元

1.データバックアップの重要性

バックアップの主な目的はディザスタリカバリです。
本番環境では、データのセキュリティが最も重要です。
データの損失は深刻な結果をもたらす可能性があります


データ損失の理由
1.プログラムエラー
2.人的操作エラー
3.操作エラー
4.ディスク障害
5.災害(火災、地震、盗難など)


2つ目は、データベースバックアップの分類です。

1.物理的および論理的な観点から、バックアップは次のように分割できます。

1.物理バックアップ:データベースオペレーティングシステムの物理ファイル(データファイル、ログファイルなど)のバックアップ

物理バックアップ方法:
1。コールドバックアップ(オフラインバックアップ):データベースが閉じているときに実行されます
2.ホットバックアップ(オンラインバックアップ):データベースが実行されており、データベースのログファイルに依存します
3.ウォームバックアップ:データベースがロックされます(書き込み可能ではないが読み取り可能)状態のテーブルバックアップ操作

2.論理バックアップ:データベース論理コンポーネント(テーブルやその他のデータベースオブジェクトなど)のバックアップ


2.データベースのバックアップ戦略の観点から、バックアップは次のように分けることができます。

1.完全バックアップ:毎回データベースの完全バックアップを作成します

完全バックアップは、データベース全体、データベース構造、およびファイル構造のバックアップです。
保存されるのは、バックアップが完了したときのデータベースです。
これは、差分バックアップと増分バックアップの基礎です。
基礎に相当します。

2.差分バックアップ:最後の完全バックアップ以降に変更されたバックアップファイル

3.増分バックアップ:最後の完全バックアップまたは増分バックアップの後に変更されたファイルのみがバックアップされます


3つの一般的なバックアップ方法

1.物理的なコールドスタンバイ

データベースはバックアップ中に閉じられ、データベースファイルは直接パッケージ化されます。
バックアップ速度は速く、最も簡単な回復は
MySQLデータベース閉じることです
。tarコマンドを使用してデータベースフォルダを直接パッケージ化し
、既存のMySQLディレクトリ直接置き換えます。

2.専用のバックアップツールmydumpまたはmysqlhotcopy

mysqldump一般的に使用される論理バックアップツール
MySQLには、MySQLをバックアップできるバックアップツールが付属しています。
指定したライブラリとテーブルをSQLスクリプトとしてエクスポートできます。
コマンドmysqlを使用してバックアップデータをインポートします。

mysqlhotcopyにはバックアップmyisamとアーカイブテーブルしかありません

3.増分バックアップのバイナリログを開始します

増分バックアップの場合、バイナリログを更新する必要があります

4.サードパーティツールのバックアップ

無料のMySQLホットバックアップソフトウェアPerconaXtraBackup


4、MySQLの完全なバックアップとリカバリ

ラボ環境

ホスト オペレーティング・システム IPアドレス 必要なツール/ソフトウェア/インストールパッケージ
MySQL CentOS7 192.168.184.10 mysql-boost-5.7.20.tar.gz
mysql -u root -p
create database SCHOOL;
use SCHOOL;
create table if not exists CLASS1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id));

insert into CLASS1 values(1,'user1','male','running');
insert into CLASS1 values(2,'user2','female','singing');

set password = password('123123');

ここに画像の説明を挿入ここに画像の説明を挿入

MySQLの完全バックアップ

InnoDBストレージエンジンのデータベースは、db.opt(テーブル属性ファイル)、テーブル名.frm(テーブル構造ファイル)、テーブル名.ibd(テーブルデータファイル)の3つのファイルとしてディスクに保存されます。

1.1。物理的なコールドバックアップとリカバリ

systemctl stop mysqld
yum -y install xz

圧縮バックアップ

tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/

解凍して復元

tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/data

systemctl restart mysql

2.2。mysqldumpのバックアップとリカバリ
(1)1つ以上の完全なライブラリ(すべてのテーブルを含む)の完全バックアップ

mysqldump -u root -p [password] --databases library name 1 [libraryname2]…> / backup path / backup file name.sql#exportedはデータベーススクリプトファイルです

例:

mysqldump -uroot -p123123 --databases SCHOOL > /opt/SCHOOL.sql
mysqldump -uroot -p123123 --databases mysql SCHOOL > /opt/mysql-SCHOOL.sql

:

(2)MySQLサーバー内のすべてのライブラリを完全にバックアップします

mysqldump -u root -p [password] --all-databases> / backup path / backup file name.sql

例:

mysqldump -u root -p123123 --all-databases > /opt/all.sql

ここに画像の説明を挿入

(3)指定されたライブラリ内の一部のテーブルの完全バックアップ

mysqldump -u root -p [password]ライブラリ名[テーブル名1] [テーブル名2]…> / backup path / backup file name.sql

例:

mysqldump -uroot -p123123 SCHOOL CLASS1 > 	/opt/SCHOOL_CLASS1.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d”选项,说明表数据也进行备份

(4)バックアップファイルを表示する

grep -v "^--" /opt/SCHOOL_CLASS1.sql | grep -v "^/" | grep -v "^$"

ここに画像の説明を挿入


完全なバックアップとリカバリ

1.データベースを復元します

mysql -uroot -p123123 -e 'drop database SCHOOL;'

# "-E"オプション。MySQLに接続した後に実行するコマンドを指定するために使用されます。コマンドの実行後に自動的に終了します。

mysql -uroot -p123123 -e 'SHOW DATABASES;'

mysql -uroot -p123123 < /opt/SCHOOL.sql
mysql -uroot -p123123 -e 'SHOW DATABASES;'

ここに画像の説明を挿入

2.データテーブルを復元します
バックアップファイルにテーブルのバックアップのみが含まれ、作成されたライブラリのステートメントが含まれていない場合、インポート操作の実行時にライブラリ名を指定する必要があり、ターゲットライブラリが存在する必要があります。

mysql -uroot -p123123 -e 'drop table SCHOOL.CLASS1;'
mysql -uroot -p123123 -e 'show tables from SCHOOL;'

mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS1.sql
mysql -uroot -p123123 -e 'show tables from SCHOOL;'

ここに画像の説明を挿入

5、MySQLインクリメンタルバックアップとリカバリ

MySQL増分バックアップ

1.バイナリログ機能をオンにします

vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED				
server-id = 1

#Binlog(binlog)には、STATEMENT(SQLステートメントに基づく)、ROW(行に基づく)、MIXED(混合モード)の3つの異なるレコード形式があります。デフォルトの形式はSTATEMENTです。

systemctl restart mysqld
ls -l /usr/local/mysql/data/mysql-bin.*

ここに画像の説明を挿入

2.データベースまたはテーブルの完全バックアップを毎週

mysqldump -uroot -p123123 SCHOOL CLASS1 > /opt/SCHOOL_CLASS1_$(date +%F).sql
mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql

ここに画像の説明を挿入

3.増分バックアップ操作を毎日実行して、新しいバイナリログファイル(たとえば、mysql-bin.000002)を生成できます。

mysqladmin -uroot -p123123 flush-logs

ここに画像の説明を挿入

4.新しいデータを挿入して、データの増加または変更をシミュレートします

mysql -uroot -p123123
use SCHOOL;
insert into CLASS1 values(3,'user3','male','game');
insert into CLASS1 values(4,'user4','female','reading');

ここに画像の説明を挿入

5.新しいバイナリログファイルを再度生成します(例:mysql-bin.000003)

mysqladmin -uroot -p123123 flush-logs

#前のステップ4のデータベース操作はmysql-bin.000002ファイルに保存され、データベースデータはmysql-bin.000003ファイルで再度変更されます。
ここに画像の説明を挿入

6.バイナリログファイルの内容を表示します

cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

#-base64-output = decode-rows:64ビットのエンコードメカニズムを使用して、行をデコードして読み取ります
#-v:詳細なコンテンツを表示します

ここに画像の説明を挿入

ベギン
/ /;
#at 302
#2101290:39:12サーバーID1 end_log_pos 430 CRC320x2c164d0aクエリthread_id = 10 time = 0 error_code = 0
use SCHOOL/ /;
SET TIMESTAMP = 1611851952 / /;
CLASS1に値を挿入します(3、 'user3'、 'male'、 'game')
/ /;
#at 430
#2101290:39:12サーバーID1 end_log_pos 461 CRC32 0x225bb461 Xid = 76
コミット/ /;
#at 461
#2101290:39:13サーバーID1 end_log_pos 526 CRC32 0xe5abe22c Anonymous_GTID last_comd = 1 sequence_number = 2 rbr_only = no
SET @@ SESSION.GTID_NEXT = 'ANONYMOUS' / /;
#at 526
#2101290:39:13サーバーID1 end_log_pos 609 CRC320x2cfb793bクエリthread_id = 10 time = 0 error_code = 0
SET TIMESTAMP = 1611851953 / /;
ベギン
/ /;
#at 609
#2101290:39:13サーバーID1 end_log_pos 742 CRC320x7ea13a1aクエリthread_id = 10 time = 0 error_code = 0
SET TIMESTAMP = 1611851953 / /;
CLASS1に挿入values(4、 'user4'、 'female'、 'reading')
/ /;
#at 742
#2101290:39:13サーバーID1 end_log_pos 773 CRC32 0x11b21cd0 Xid = 77
コミット/ /;

MySQLの増分バックアップとリカバリ

1.一般的なリカバリ
(1)失われたデータと変更されたデータのリカバリ手順をシミュレートします

mysql -uroot -p123123
use SCHOOL;
delete from CLASS1 where id=3;
delete from CLASS1 where id=4;
select * from CLASS1;
quit

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

ここに画像の説明を挿入

2.失われたすべてのデータの回復手順をシミュレートします(基本的に同じですが、ログの日付に注意してください)

mysql -uroot -p123123
use SCHOOL;
drop table CLASS1;
quit

mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS1_2021-01-29.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

2.2。ブレークポイントの回復

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

同じ64ビットエンコーディングメカニズムを使用して、バイナリファイル000002の詳細を1行ずつデコードして読み取ります。

ベギン
/ /;

302で

#2101290:39:12サーバーID1 end_log_pos 430 CRC320x2c164d0aクエリthread_id = 10 time = 0 error_code = 0
use SCHOOL/ /;
SET TIMESTAMP = 1611851952 / /;
CLASS1に値を挿入します(3、 'user3'、 'male'、 'game')
/ /;

430で

#2101290:39:12サーバーID1 end_log_pos 461 CRC32 0x225bb461 Xid = 76
コミット/ /;

461で

#2101290:39:13サーバーID1 end_log_pos 526 CRC32 0xe5abe22c Anonymous_GTID last_comd = 1 sequence_number = 2 rbr_only = no
SET @@ SESSION.GTID_NEXT = 'ANONYMOUS' / /;

526で

#2101290:39:13サーバーID1 end_log_pos 609 CRC320x2cfb793bクエリthread_id = 10 time = 0 error_code = 0
SET TIMESTAMP = 1611851953 / /;
ベギン
/ /;

609で

#2101290:39:13サーバーID1 end_log_pos 742 CRC320x7ea13a1aクエリthread_id = 10 time = 0 error_code = 0
SET TIMESTAMP = 1611851953 / /;
CLASS1に挿入values(4、 'user4'、 'female'、 'reading')
/ /;

742で

#2101290:39:13サーバーID1 end_log_pos 773 CRC32 0x11b21cd0 Xid = 77
コミット/ /;

(1)ロケーションに基づく復元
#操作ID「609」より前のデータのみを復元します。つまり、「user4」のデータは復元されません。

mysqlbinlog --no-defaults --stop-position='609' /opt/mysql-bin.000002 | mysql -uroot -p

例:

mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"
mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS1;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"
mysqlbinlog --no-defaults --stop-position='609' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

ここに画像の説明を挿入

#「user4」のデータのみを回復し、「user3」のデータ回復をスキップし、609以降は4番目のレコードのみを回復します

例:

mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"
mysqlbinlog --no-defaults --start-position='609' /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

ここに画像の説明を挿入

(2)時点に基づく復元
#0:39:13より前のデータのみを復元します。つまり、「user4」のデータは復元しません。

例:先清空表CLASS1,方便实验

mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS1;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

mysqlbinlog --no-defaults --stop-datetime='2021-01-29 0:39:13' /opt/mysql-bin.000002 |mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

ここに画像の説明を挿入

#「user4」のデータのみを回復し、「user3」のデータ回復をスキップします(基本的に同じ)

mysqlbinlog --no-defaults --start-datetime='2021-01-29 0:39:13' /opt/mysql-bin.000002 |mysql -uroot -p

おすすめ

転載: blog.csdn.net/weixin_51432770/article/details/113346388
おすすめ