この記事では、mysql に関する関連知識を提供します。主に binlog に関連する問題を紹介します。binlog は一般にアーカイブ ログと呼ばれます。binlog を使用して mysql を復元する方法を見てみましょう。 のデータは、皆様のお役に立てれば幸いです。
推奨学習: mysql 学習チュートリアル
MySQL はその気になれば復元できるという話をよく聞きます。 ~半月以内 どの状態でも1ヶ月以内。インターネット上には、データベースの削除や逃亡に関するジョークもたくさんあります。 。 。
そこで今日、ブラザー ソングは MySQL の binlog についてお話し、binlog を使用して MySQL のデータを復元する方法を段階的に説明したいと思います。このようにして、将来誤ってデータベースを削除した場合に備えて、 、走る必要はありません。途中です。
MySQL のより重要なログには、binlog (アーカイブ ログ)、REDO ログ (やり直しログ)、および UNDO ログが含まれます。したがって、この記事に関連する主なログは binlog です。他の 2 つのログは将来利用可能になります。 . 後ほど詳しくご紹介します。
binlog 中国語では一般にアーカイブ ログと呼ばれますが、Song Ge が以前に投稿した MySQL のマスター/スレーブ設定を見たことがあれば、このログに印象があるはずです。 MySQL マスターを構築するとき、Binlog はスレーブから分離できません (ポータル: MySQL8 マスター/スレーブ レプリケーションの落とし穴ガイド)。
Binlog は、ストレージ エンジンに付属するログではなく、MySQL Server レイヤーのログです。すべての DDL および DML (データ クエリ ステートメントを除く) ステートメントが記録され、次のようなイベントの形式で記録されます。
公式 MySQL ドキュメントによると、binlog を有効にした後は、約 1% のパフォーマンスの低下がありますが、これはまだ許容範囲内です。一般的に、binlog には 2 つの重要な使用シナリオがあります。
デモンストレーションの便宜上、Brother Song は Docker に MySQL をインストールしました。これを例として使用して、今日のデモンストレーションを開始しましょう。友達がまだ docker の使い方を知らない場合は、公式アカウントのバックグラウンドで docker に返信することができます (Brother Song が作成したチュートリアルがあります)。
まず、Docker に MySQL をインストールし、コンテナに入ります。次のコマンドを実行すると、binlog がオンになっているかどうかを確認できます:
#これは、OFF を意味しますbinlog クローズ状態でオンになっていないので、次に binlog をオンにします。
binlog を有効にすることには、主に、コンテナの /etc/mysql/mysql.conf.d
ディレクトリにある MySQL 構成ファイル mysqld.cnf の変更が含まれます。
この設定ファイルについては、次の変更を加えました:
# 这个参数表示启用 binlog 功能,并指定 binlog 的存储目录 log-bin=javaboy_logbin # 设置一个 binlog 文件的最大字节 # 设置最大 100MB max_binlog_size=104857600 # 设置了 binlog 文件的有效期(单位:天) expire_logs_days = 7 # binlog 日志只记录指定库的更新(配置主从复制的时候会用到) #binlog-do-db=javaboy_db # binlog 日志不记录指定库的更新(配置主从复制的时候会用到) #binlog-ignore-db=javaboy_no_db # 写缓存多少次,刷一次磁盘,默认 0 表示这个操作由操作系统根据自身负载自行决定多久写一次磁盘 # 1 表示每一条事务提交都会立即写磁盘,n 则表示 n 个事务提交才会写磁盘 sync_binlog=0 # 为当前服务取一个唯一的 id(MySQL5.7 之后需要配置) server-id=1
各設定の意味は、ソング兄弟の視線で説明されています。スクリーンショットは次のとおりです:
構成が完了したら、次のコマンドを実行して mysql コンテナを再起動します (mysql1 はコンテナの名前です):
docker restart mysql1
再起動後、再度実行します。 show variables like 'log_bin%';
binlog がオンになっていることがわかります。
log_bin 変数に加えて、注目に値する 2 つの変数名があります:
javaboy_logbin.xxx
,这个文件中将会用来记录所有的 DDL 和 DML 语句事件。javaboy_logbin.index
文件:可以看到,目前只有一个 logbin 文件。
接下来我们再来介绍几个常见的 binlog 操作命令。
通过如下方式我们可以查看 binlog 日志列表:
show master logs;
可以看到,我这里目前只有一个日志文件,文件名为 javaboy_logbin.000001
,File_size 表示这个文件占用的字节大小是 154。
这个命令我们在搭建 MySQL 主从的时候经常会用到,如下:
这个时候可以看到最新的 binlog 日志文件名称以及最后一个操作事件的 Position 值(这个值有啥用,我们后面会给大家详细介绍)。
正常来说,一个 binlog 写满之后,会自动切换到下一个 binlog 开始写,不过我们也可以执行一个 flush logs
命令来手动刷新 binlog,手动刷新 binlog 之后,就会产生一个新的 binlog 日志文件,接下来所有的 binlog 日志都将记录到新的文件中。如下:
由上图可以看到,我们刷新日志之后,再通过 show master logs
去查看日志,发现日志文件已经多了一个新产生的了,然后再通过 show master status
去查看最新的日志文件信息,发现也已经变为 javaboy_logbin.000002
。
reset master
可以重置 binlog 日志文件,让日志重新从 000001 开始记录,不过如果当前主机有一个或者多个从机在运行,那么该命令就运行不了(因为从机是通过 binlog 来实现数据库同步的,主机把 binlog 清空了,从机会报找不到 binlog 的错误)。
由于 binlog 是二进制日志文件,所以要是直接打开,那肯定是看不了的:
没有看到任何有用的信息。
为了查看 binlog,MySQL 为我们提供了两个官方工具,我们一个一个来看,首先是 mysqlbinlog
命令,如下:
虽然看起来乱糟糟的,不过仔细看着其实都有迹可循。因为我这里是一个新安装的数据库,里边只是创建了一个名为 javaboy 的库,然后创建了一个名为 user 的表加了两条数据,其他什么事情都没做,所以创建库的脚本我们其实能够从纷杂的文件中找到。
产生的日志文件中有一个 end_log_pos 是日志文件的 pos 点,这个将来在数据恢复的时候有用。
不过这种查看方式不够人性化,我们说 binlog 是按照事件来记录日志的,所以如果我们能够按照事件的方式查看日志,就会好很多,我们再来看看如下一个命令:
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
这个表示以事件的方式来查看 binlog,这里涉及到几个参数:
我们来看一个简单的例子:
show binlog events in 'javaboy_logbin.000001';
这下就清晰多了,我们可以看到之前的所有操作,例如:
好啦,有了前面的基础知识准备,接下来松哥来给大家手把手演示一个删库/恢复的场景。
我先来说说我这个数据库目前的情况。
这是一个新安装的数据库,里边我新建了一个数据库名为 javaboy,javaboy 库中新建了一张表名为 user,user 中有两条记录,如下:
现在假设我们定期(每周三凌晨三点)对数据库进行备份。
现在凌晨三点了,数据库自动备份开始了,我们通过如下命令将数据库备份成 SQL 脚本,如下:
mysqldump -uroot -p --flush-logs --lock-tables -B javaboy>/root/javaboy.bak.sql
这里有几个参数跟大家解释下:
--all-databases
或者 -A
代替 -B
表示导出所有的数据库。以上命令执行完成后,会在 /root 目录下生成一个 javaboy.bak.sql 文件,该文件就是备份的 sql 文件了。
这是星期三凌晨三点发生的事情。
接下来到了星期四早上,来上班了,一顿操作后,往数据库中又添加了两条操作,如下:
接下来,小 X 今天跟领导吵架了很不爽,决定删除跑路:
领导发现了大惊,当即要求立马恢复数据。这时候该你表现了。
首先,我们有星期三凌晨的备份文件,先用那个文件进行数据恢复:
恢复之后,现在到星期三早上凌晨三点的数据有了。
从星期三早上凌晨三点到星期四的数据现在没了。
这个时候我们就要借助于 binlog 来恢复了。大家还记得,我们星期三凌晨三点执行备份的时候,用了一个参数叫做 --flush-logs
,使用了该参数表示从备份那一刻起,新的 binlog 将产生在一个新的日志文件中,对于我们这里来说,新的 binlog 文件当然就是 javaboy_logbin.000002
了,我们去查看一下该文件:
show binlog events in 'javaboy_logbin.000002';
我这里生成的该文件比较长,我截取其中一部分:
可以看到,在 764-865 这个 Pos 中发生了删库跑路事件,那么我们只需要回放该文件将数据恢复到 764 这个位置即可。
由于 javaboy_logbin.000002
文件是在星期三凌晨三点备份之后产生的新文件,因此这个文件从起始到 764 这个 Pos 之间的操作,就是星期三凌晨三点到删库之前的操作了。
那么我们来看下通过 binlog 来恢复数据的命令:
mysqlbinlog /var/lib/mysql/javaboy_logbin.000002 --stop-position=764 --database=javaboy | mysql -uroot -p
那么这里涉及到两个参数:
另外还有一个我们这里没用到的参数叫做 --start-position
,这个表示起始的 Pos,不指定的话表示从头开始数据恢复。
好啦,弄完之后,再来查看数据库:
数据恢复啦~
注意:所有操作之前,记得该备份就备份(防止你操作错了又回不去),松哥为了省事上面省略了一些备份操作。
今日の記事は主に MySQL の binlog ログを友人と共有し、小さなケースを使って binlog を通じてデータベースの削除と回復を実現する方法を示します。興味のある友人は試してみてください (本番ライブラリでは試さないでください) ~
推奨学習: mysql チュートリアル
以上がMySQL binlog からデータを復元する方法を分析してみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。