MySQLデータベースのログ管理、バックアップ、およびリカバリ

MySQLデータベースのログ管理、バックアップ、およびリカバリ

1つは、MySQLログ管理です。

MySQL的日志默认保存位置为/usr/local/mysql/data

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


systemctl restart mysql

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),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启

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          #设置执行超过5秒的语句会被记录,缺省时为10秒

ここに画像の説明を挿入します
ここに画像の説明を挿入します

mysql -u root -p
show variables like 'general%';    #查看通用查询日志是否开启
show variables like 'log_bin%';     #查看二进制日志是否开启
show variables like '%slow%';    #查看慢查询日功能是否开启
show variables like ' long_query_time';    #查看慢查询时间设置
set global slow_query_log=ON;    #在数据库中设置开启慢查询的方法


xxx%	以slow开头的字段
%xxx	以slow结尾的字段
%xxx% 	只要出现slow字段的都会显示出来
xxx		精准查询

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

第二に、データバックアップの重要性

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

2.1データ損失の理由

1.プログラムエラー
2.人的操作エラー
3.操作エラー
4.ディスク障害
5.災害(火災、地震など)および盗難

3、データベースバックアップの分類

3.1物理的および論理的な観点から

バックアップはに分けることができます

物理バックアップ:データベースオペレーティングシステムの物理ファイル(データファイル、ログファイルなど)の
バックアップ論理バックアップ:データベース論理コンポーネント(テーブルやその他のデータベースオブジェクトなど)のバックアップ

3.1.1物理バックアップ方法

コールドバックアップ(オフラインバックアップ):データベースが閉じているときに実行されます。
ホットバックアップ(オンラインバックアップ):データベースは実行中であり、データベースのログファイルに依存します。
ウォームバックアップ:データベースはテーブルをロックします(書き込み可能ではありませんが読み取り可能) 。バックアップ操作

3.2データベースバックアップ戦略の観点から

バックアップはに分けることができます

完全バックアップ:毎回データベースの完全バックアップを作成します。
差分バックアップ:最後の完全バックアップ以降に変更されたファイルをバックアップします。
増分バックアップ:最後の完全バックアップまたは増分バックアップ後に変更されたファイルのみバックアップされます。バックアップ

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

1.物理冷备
バックアップ中にデータベースが閉じられ、データベースファイルが直接パッケージ化されます。
バックアップ速度が速く、リカバリも最も簡単です。

2. 专用备份工具mydump或mysqlhotcopy
mysqldumpで一般的に使用される論理バックアップツールある
mysqlhotcopyにバックアップMyISAMテーブルとARCHIVEテーブルしかありません。

3.启用二进制日志进行增量备份
増分バックアップの場合、バイナリログを更新する必要があります

4.第三方工具备份
無料のMySQLホットバックアップソフトウェアPerconaXtraBackup

5、MySQLの完全バックアップ

これは、データベース全体、データベース構造、およびファイル構造
のバックアップであり、バックアップの完了時にデータベースを保存します。これ
は、差分バックアップと増分バックアップの基礎です。

5.1利点

バックアップとリカバリのシンプルで便利な操作

5.2デメリット

データの重複が
多く、バックアップスペースを大量に消費し、
バックアップとリカバリに時間がかかります

5.3データベースの完全バックアップ分類

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

MySQLデータベース
閉じるtarコマンドを使用して、データベースフォルダを直接パッケージ化し
、既存のMySQLディレクトリ直接置き換えます。

5.3.2mysqldumpのバックアップとリカバリ

MySQL独自のバックアップツールを使用すると、MySQLのバックアップが容易になります。
指定したライブラリとテーブルをSQLスクリプトとしてエクスポートできます。
コマンドmysqlを使用して、バックアップデータをインポートします。

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

use xyw;
create table if not exists info1 (
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 info1 values(1,'user1','male','running');
insert into info1 values(2,'user2','female','singing');

ここに画像の説明を挿入します

6.1MySQLの完全バックアップ

InnoDBストレージエンジンのデータベースは、ディスク上に3つのファイルとして保存されます。db.opt (表属性文件)、表名. frm(表结构文件)、表名.ibd (表数据文件)。

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

systemctl stop mysqld
yum -y install xz    (一种压缩工具,详单与gzip,bz2)
#压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
#解压恢复
tar Jxvf /opt/mysql_all_2020-02-09.tar.xz -C /usr/local/mysql/data

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

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

mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql     #导出的就是数据库脚本文件
例:
mysqldump -u root -p --databases xyw > /opt/xyw.sql
mysqldump -u root -p --databases mysql xyw > /opt/mysql-xyw.sql

ここに画像の説明を挿入します

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

mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql

ここに画像の説明を挿入します

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

mysqldump -u root -p[密码]库名[表名1] [表名2] ... > /备份路径/备份文件名.sql
例:
mysqldump -u root -p [-d] xyw abc info > /opt/abc_info.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d”选项,说明表数据也进行备份

ここに画像の説明を挿入します

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

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

ここに画像の説明を挿入します

6.2MySQLの完全バックアップとリカバリ

systemctl start mysqld

(1)データベースを復元する

mysql -u root -p -e 'drop database xyw;'
#“-e”选项,用于指定连接MySQL后执行的命令,命令执行完后自动退出
mysql -u root -p -e ' SHOW DATABASES;'

mysql -u root -p < /opt/xyw.sql
mysql -u root -p -e 'SHOW DATABASES;'

ここに画像の説明を挿入します

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

mysqldump -u root -pabc123 xyw abc info > /opt/abc_info.sql

mysql -u root -p -e 'drop table xyw.abc;'
mysql -u root -p -e 'show tables from xyw;'

mysql -u root -p xyw < /opt/abc_info.sql
mysql -u root -p -e 'show tables from xyw;'

ここに画像の説明を挿入します

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

7.1MySQL増分バックアップ

7.1.1バイナリログ機能をオンにする

vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED    #可选,指定二进制日志(binlog)的记录格式为MIXED
server-id = 1

没听到#二进制日志(binlog)有3种不同的记录格式: STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

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

ここに画像の説明を挿入します
ここに画像の説明を挿入します

7.1.2データベースまたはテーブルの完全バックアップを毎週実行できます

mysqldump -u root -p xyw info > /opt/xyw_info_$(date +%F).sql
mysqldump -u root -p --all-databases xyw > /opt/xyw_$(date +%F).sql

ここに画像の説明を挿入します

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

mysqladmin -u root -p flush-logs

ここに画像の説明を挿入します

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

use xyw;
insert into info1 values(3,'user3','male','game');
insert into info1 values(4,'user4','female','reading');

ここに画像の説明を挿入します

7.1.5新しいバイナリログファイルを再度生成します(たとえば、mysql -bin.000003)

mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.00002文件中,之后数据库数据再发生变化则保存在mysq1--bin.00003文件中

7.1.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:显示详细内容

ここに画像の説明を挿入します
ここに画像の説明を挿入します

7.2MySQLインクリメンタルリカバリ

7.2.1一般的な回復

(1)失われたデータと変更されたデータの回復手順をシミュレートします

use xyw;
delete from info where id=3;
delete from info where id=4;

mysqlbinlog --no-defaults /opt/mysql-bin.000011 | mysql -u root -p

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

(2)失われたすべてのデータの回復手順をシミュレートします

use xyw;
drop table info1;

mysql -u root -p xyw < /opt/xyw_2021-02-10.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

ここに画像の説明を挿入します
ここに画像の説明を挿入します

7.2.2ブレークポイントの回復

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

例:
# at 302

#201122 16:41:16
插入了"user3"的用户数据
# at 623
#201122 16:41:24
插入了"user4"的用户数据

ここに画像の説明を挿入します

(1)場所に基づいて復元する

#仅恢复到操作ID为“623"之前的数据,即不恢复“user4"的数据
mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p
#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p

(2)特定の時点に基づく回復

#仅恢复到16:41:24 之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p
#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults--start-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p

特定のSQLステートメントの前にすべてのデータ
を復元する場合は、このステートメントのロケーションノードまたは時点で停止します特定のSQLステートメントとその後のすべてのデータを復元する場合は、ステートメントのロケーションノードまたは時点から開始します。

おすすめ

転載: blog.csdn.net/IvyXYW/article/details/113773189