1.1 . 开启 binlog
我将使用docker演示,配置和配置位置都是一样的,没啥区别。
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
在其中,server-id 是服务器的唯一标识符,log_bin 是binlog文件的路径和名称。你可以根据需要更改这些值。
(2)保存更改后的配置文件,并重新启动MySQL服务,使更改生效。
(3)确认binlog已经成功开启,可以使用以下命令登录MySQL并执行:
SHOW MASTER STATUS;
如果输出类似如下信息,则表示binlog已经成功开启:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | test | |
+------------------+----------+--------------+------------
或者以下命令:可以看到log_bin的状态是ON
show variables like 'log_bin%';
mysql> show variables like 'log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
5 rows in set (0.00 sec)
#这个参数用来启用binlog,并指定了binlog的文件名前缀。在这个例子中,binlog文件会以 dx_logbin 开头命名。binlog文件记录了数据库的所有更改操作,包括增删改等。
log-bin=adx_logbin
#这个参数指定了单个binlog文件的最大大小,单位是字节。当binlog文件大小达到这个值时,MySQL会自动创建一个新的binlog文件来继续记录日志。
max_binlog_size=104857600
#这个参数指定了binlog文件的过期时间,单位是天。超过指定天数的binlog文件会被自动删除。这个设置有助于控制磁盘空间的使用。
expire_logs_days=7
#这个参数用来指定需要记录binlog的数据库名称。在这个例子中,adx_db 是需要记录binlog的数据库,
#binlog-do-db=adx_db
#这个参数用来指定不需要记录binlog的数据库名称。在这个例子中,javaboy_no_db 是不需要记录binlog的数据库,但是由于前面有#注释了,所以实际上是被注释掉了,不会生效。
#binlog-ignore-db=javaboy_no_db
#这个参数用来控制binlog的写入方式。当设置为0时,表示不强制立即将binlog日志写入磁盘。这样会提高性能,但在数据库宕机时可能会丢失一部分数据。
sync_binlog=0
#这个参数指定了MySQL服务器的唯一标识符。在复制和多主模式下,每个服务器都需要有一个唯一的ID来标识自己。
server-id=1
docker restart mysql

log_bin_basename: /var/lib/mysql/adx_logbin
这个配置指定了二进制日志文件的基本名字为adx_logbin,不包括文件扩展名。实际的二进制日志文件会以这个基本名字开头,后面紧跟一个数字标识,再加上文件扩展名(通常是.log)。例如,可能生成的二进制日志文件包括adx_logbin.000001、adx_logbin.000002等。
这个设置意味着生成的二进制日志文件将以adx_logbin作为基本名字。
log_bin_index: /var/lib/mysql/adx_logbin.index
这个配置指定了二进制日志索引文件的名字为二进制日志索引文件记录了所有的二进制日志文件名字及其对应的位置信息,通常以.index作为文件扩展名。通过这个索引文件,MySQL可以快速地定位到各个二进制日志文件,并进行相应的操作,比如数据库恢复、复制等。

show master logs;
用于查看当前主服务器的二进制日志(binlog)信息。执行这个命令可以获取以下信息,File:当前正在写入的二进制日志文件名,Position:在当前二进制日志文件中的位置,即已经写入的字节数。
show master status;
flush logs

reset master
执行 RESET MASTER; 可以确保清除所有的旧的日志文件,防止日志文件过多占用磁盘空间,并从头开始记录新的二进制日志事件。

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
该命令用于显示指定二进制日志文件中的二进制日志事件。这个命令可以提供对二进制日志中存储的操作和更改的详细信息。
下面是各参数的含义:
IN ‘log_name‘: 可选参数,指定要查看的特定二进制日志文件名。
FROM pos: 可选参数,指定从日志文件中的特定位置开始显示日志事件。
LIMIT [offset,] row_count: 可选参数,限制要显示的日志事件的数量,并可以设置偏移量。
show binlog events in 'adx_logbin.000001';

mysqldump -uroot -p --flush-logs --lock-tables -B student2>/root/student2.bak.sql
mysqldump: 这是用于备份数据库的命令。
-uroot: 表示使用 root 用户身份连接到数据库进行备份。
-p: 是一个选项,表示在输入密码之前会提示用户输入密码。
--flush-logs: 这个选项表示在备份完成后将刷新日志文件,确保备份过程中的日志都被记录下来。
--lock-tables: 这个选项表示在备份时对数据库表进行锁定,以确保备份的一致性。
-B student2: 表示备份名为 student2 的数据库。
> /root/student2.sql: 这部分表示将备份内容导出到 /root 目录下的 student2.sql 文件中。
可以通过cat命令查看导出的sql,老铁没毛病。


show binlog events in 'adx_logbin.000002';

mysqlbinlog /var/lib/mysql/adx_logbin.000002 --stop-position=1403 --database=student2 | mysql -uroot -p
mysqlbinlog: 是用于解析 MySQL 二进制日志文件的工具。通过这个命令,你可以查看和分析二进制日志中的内容。
/var/lib/mysql/adx_logbin.000002: 这是指定的二进制日志文件路径,即要解析的二进制日志文件。
--stop-position=1403: 这个选项指定了解析二进制日志文件时要停止的位置。在这种情况下,命令会解析从文件开头到指定位置(1403)之间的内容。
--database=student2: 这个选项指定了只解析属于数据库 'student2' 的相关操作。这意味着命令只会处理涉及 'student2' 数据库的内容。
|: 这是管道符号,用于将 mysqlbinlog 命令的输出传递给后面的 mysql 命令。
mysql -uroot -p: 这是执行实际恢复操作的部分。它使用 mysql 命令以 root 用户身份连接到 MySQL 数据库,并执行从 mysqlbinlog 命令得到的结果。
mysqlbinlog: 是用于解析 MySQL 二进制日志文件的工具。通过这个命令,你可以查看和分析二进制日志中的内容。
/var/lib/mysql/adx_logbin.000002: 这是指定的二进制日志文件路径,即要解析的二进制日志文件。
--stop-position=1403: 这个选项指定了解析二进制日志文件时要停止的位置。在这种情况下,命令会解析从文件开头到指定位置(1403)之间的内容。
--database=student2: 这个选项指定了只解析属于数据库 'student2' 的相关操作。这意味着命令只会处理涉及 'student2' 数据库的内容。
|: 这是管道符号,用于将 mysqlbinlog 命令的输出传递给后面的 mysql 命令。
mysql -uroot -p: 这是执行实际恢复操作的部分。它使用 mysql 命令以 root 用户身份连接到 MySQL 数据库,并执行从 mysqlbinlog 命令得到的结果。

事务执行过程中,日志信息会先被写入到binlog cache,事务提交的时候,binlog cache中的数据会被写入到操作系统内核的page cache中(write())。
sync_binlog参数的值决定了什么时候page cache中的binlog刷新到磁盘的binlog文件中。
sync_binlog值为0(默认值)时,刷盘操作fsync()由操作系统自行决定
sync_binlog值为1时,binlog在写入到page cache后马上被刷新到磁盘
sync_binlog值N(N>1)时,表示page cache中的binlog在积累了N个事务的操作后才刷新到磁盘
update tb_student A set A.age='19' where A.name=' 张三 ';
执行器负责具体的执行,会调用存储引擎接口,通过主键索引树获取id=1这一行记录:
如果id = 1这一行所在的数据页在缓冲池中,直接返回给执行器更新;
如果id = 1这一行所在的数据页不在缓冲池中,就将数据页从磁盘读入缓冲池,再返回记录给执行器;
执行器得到记录后,会看一下更新后的记录与更新前的记录是否一样:
如果一样则不进行后序更新流程;
如果不一样,就将更新前后的记录都当做参数传给InnoDB层,让它执行真正的更新操作
开启事务,InnoDB层更新记录前,先将更新前的列的旧值记录在undo log中,生成的undo log会写入缓冲池的Undo页面,同时,因为修改了Undo页面,也会记录对应的redo log
InnoDB层开始更新记录,会先更新缓冲池中的数据页(标记其为脏页),接着记录修改的信息到redo log中为了减少磁盘IO,不会立即将脏页写入磁盘,而是由一个后台线程在合适的时机将脏页刷新到磁盘。(WAL技术)。Mysql的写操作不是立刻写入磁盘,而是先写到redo log,然后在合适的时机再将修改的行数据写到磁盘。至此,一条记录更新完了
更新完,记录对应的bin log到bin log cache中
事务提交,将binlog cache中的数据写入到操作系统内核的page cache中,由操作系统决定何时刷盘。(sync_binlog值为默认值0时)执行器负责具体的执行,会调用存储引擎接口,通过主键索引树获取id=1这一行记录:
如果id = 1这一行所在的数据页在缓冲池中,直接返回给执行器更新;
如果id = 1这一行所在的数据页不在缓冲池中,就将数据页从磁盘读入缓冲池,再返回记录给执行器;
执行器得到记录后,会看一下更新后的记录与更新前的记录是否一样:
如果一样则不进行后序更新流程;
如果不一样,就将更新前后的记录都当做参数传给InnoDB层,让它执行真正的更新操作
开启事务,InnoDB层更新记录前,先将更新前的列的旧值记录在undo log中,生成的undo log会写入缓冲池的Undo页面,同时,因为修改了Undo页面,也会记录对应的redo log
InnoDB层开始更新记录,会先更新缓冲池中的数据页(标记其为脏页),接着记录修改的信息到redo log中。为了减少磁盘IO,不会立即将脏页写入磁盘,而是由一个后台线程在合适的时机将脏页刷新到磁盘。(WAL技术)。Mysql的写操作不是立刻写入磁盘,而是先写到redo log,然后在合适的时机再将修改的行数据写到磁盘。
至此,一条记录更新完了
更新完,记录对应的bin log到bin log cache中
事务提交,将binlog cache中的数据写入到操作系统内核的page cache中,由操作系统决定何时刷盘。(sync_binlog值为默认值0时)
2.4、两阶段提交
我们假设mysql分别在下面的A、B时刻发生异常重启:

三、基于docker实现主从复制
很早之前我已经分享过,如何实现主从复制,感兴趣兄弟们可以参考实践一下。
—THE END—

原文始发于微信公众号(程序员恰恰):Mysql之Binlog入门到应用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/248980.html