記事のディレクトリ
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
useSCHOOL
/ !/;
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
useSCHOOL
/ !/;
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