Rumah > Artikel > pangkalan data > Mari analisa cara memulihkan data daripada binlog MySQL
Artikel ini membawakan anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan isu yang berkaitan dengan binlog biasanya dipanggil log arkib. Mari kita lihat cara menggunakan binlog untuk memulihkan data dalam ,. Saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: tutorial pembelajaran mysql
Kita sering mendengar orang mengatakan bahawa selagi anda mahu, MySQL boleh dipulihkan hingga setengah bulan Malah mana-mana negeri dalam tempoh sebulan. Terdapat juga banyak jenaka di Internet tentang memadam pangkalan data dan melarikan diri. . .
Jadi hari ini Brother Song ingin bercakap dengan anda tentang binlog dalam MySQL, dan mengajar anda langkah demi langkah cara menggunakan binlog untuk memulihkan data dalam MySQL Dengan cara ini, jika anda secara tidak sengaja memadam pangkalan data pada masa hadapan , anda tidak perlu berlari.
Log yang lebih penting dalam MySQL termasuk binlog (log arkib), log buat semula (log semula) dan log buat asal yang berkaitan dengan artikel kami ialah binlog yang lain akan tersedia pada masa hadapan. Saya akan memperkenalkannya kepada anda secara terperinci kemudian.
binlog Kami biasanya memanggilnya log arkib dalam bahasa Cina Jika anda pernah melihat tetapan tuan-hamba MySQL yang disiarkan oleh Song Ge sebelum ini, anda sepatutnya mempunyai tanggapan log ini. Apabila kita membina induk MySQL, Binlog tidak dapat dipisahkan daripada hamba (Portal: panduan perangkap replikasi master-hamba MySQL8).
binlog ialah log lapisan Pelayan MySQL, bukan log yang disertakan dengan enjin storan Ia merekodkan semua pernyataan DDL dan DML (tidak termasuk pernyataan pertanyaan data), dan direkodkan dalam bentuk peristiwa, termasuk. penyataan. Masa pelaksanaan, dsb. harus diperhatikan:
Menurut dokumentasi MySQL rasmi, selepas menghidupkan binlog, akan terdapat kira-kira 1% kehilangan prestasi, tetapi ini masih boleh diterima secara amnya, binlog mempunyai dua senario penggunaan penting:
Untuk kemudahan demonstrasi, Brother Song memasang MySQL dalam Docker Mari kita gunakan ini sebagai contoh untuk memulakan demonstrasi hari ini. Jika rakan anda masih tidak tahu cara menggunakan docker, anda boleh membalas kepada docker di latar belakang akaun rasmi Terdapat tutorial yang ditulis oleh Brother Song.
Mula-mula kami memasang MySQL dalam docker, dan kemudian masukkan bekas Anda boleh menyemak sama ada binlog dihidupkan dengan menjalankan arahan berikut:
Ini OFF. bermakna binlog Ia dalam keadaan tertutup dan tidak dihidupkan Seterusnya kita hidupkan binlog.
Mendayakan binlog terutamanya melibatkan pengubahsuaian fail konfigurasi MySQL mysqld.cnf, yang terletak dalam direktori /etc/mysql/mysql.conf.d
bekas.
Untuk fail konfigurasi ini, kami telah membuat pengubahsuaian berikut:
# 这个参数表示启用 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
Maksud setiap konfigurasi telah dijelaskan oleh Brother Song semasa menonton. Tangkapan skrin adalah seperti berikut:
Selepas konfigurasi selesai, laksanakan arahan berikut untuk memulakan semula bekas mysql (mysql1 ialah nama bekas saya di sini):
docker restart mysql1
Selepas dimulakan semula, Laksanakan show variables like 'log_bin%';
sekali lagi dan anda akan melihat bahawa binlog telah didayakan.
Selain pembolehubah log_bin, terdapat dua nama pembolehubah yang patut diberi perhatian:
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,不指定的话表示从头开始数据恢复。
好啦,弄完之后,再来查看数据库:
数据恢复啦~
注意:所有操作之前,记得该备份就备份(防止你操作错了又回不去),松哥为了省事上面省略了一些备份操作。
Baiklah, artikel hari ini terutamanya berkongsi binlog MySQL dengan rakan-rakan, dan menggunakan kes kecil untuk menunjukkan cara mencapai pemadaman dan pemulihan pangkalan data melalui binlog. Ok, kawan-kawan yang berminat boleh mencubanya (jangan cuba di perpustakaan produksi)~
Pembelajaran yang disyorkan: tutorial mysql
Atas ialah kandungan terperinci Mari analisa cara memulihkan data daripada binlog MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!