![c8a298b63de547175fb3effe8449d8eb.png](https://i-blog.csdnimg.cn/blog_migrate/8b119cf3491ab5ad98febf3503ac7493.jpeg)
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/stored-programs-logging.html
二进制日志包含有关修改数据库内容的SQL语句的信息。 该信息以描述修改的“事件”的形式存储。 二进制日志有两个重要目的:
- 对于复制,二进制日志在主复制服务器上用作要发送到从属服务器的语句的记录。 主服务器将其二进制日志中包含的事件发送到其从属服务器,这些服务器执行这些事件以对主服务器进行相同的数据更改。
- 某些数据恢复操作需要使用二进制日志。 还原备份文件后,将重新执行备份后记录的二进制日志中的事件。 这些事件使数据库从备份更新到时间点。
但是,如果在语句级别进行日志记录,则存储的程序(存储过程和函数,触发器和事件)存在某些二进制日志记录问题:
- 在某些情况下,语句可能会影响主服务器和从服务器上的不同行集。
- 在从属服务器上执行的复制语句由从属SQL线程处理(具有最高权限)。 程序可以在主服务器和从服务器上遵循不同的执行路径,因此用户可以编写包含危险语句的例程,该例程将仅在从服务器上执行,并由具有完全权限的线程处理。
- 如果修改数据的存储程序是不确定的,则它不可重复。 这可能导致主站和从站上的数据不同,或导致还原的数据与原始数据不同。
通常,当SQL语句级别(基于语句的二进制日志记录)发生二进制日志记录时,会导致此处描述的问题。 如果使用基于行的二进制日志记录,则日志包含由于执行SQL语句而对各个行所做的更改。 执行例程或触发器时,将记录行更改,而不是进行更改的语句。 对于存储过程,这意味着不记录CALL语句。 对于存储的函数,将记录函数内的行更改,而不是函数调用。 对于触发器,将记录触发器所做的行更改。 在slave端,只能看到行更改,而不是存储的程序调用。
混合格式二进制日志记录(binlog_format = MIXED)使用基于语句的二进制日志记录,除了一些基于行的二进制日志记录才能够产生正确结果的情况除外。 对于混合格式,当存储的函数,存储过程,触发器,事件或预准备语句包含对基于语句的二进制日志记录不安全的任何内容时,整个语句将标记为不安全并以行格式记录。 用于创建和删除过程,函数,触发器和事件的语句始终是安全的,并以语句格式记录。
在MySQL中使用存储函数的