二进制日志与存储程序 注意事项

简介:

当binlog记录存储程序(存储过程,存储函数,触发器,事件)的时候,可能存在一下问题:
statement复制模式下:
1、一条语句在master和slave上会影响不同的记录。
2、Slave端的SQL线程在执行statement的时候,具有所有的权限(不做权限检查)
可能某个存储过程在master和slave端执行效果不一致:
比如:

delimiter $$
create FUNCTION magic()
return char(64)
SQL SECURITY INVOKER
BEGIN
DECLARE result char(6);
If @@server_id <> 1 Then
select what into result from secret.agents limit 1;
return result;
else
return 'I am magic!';
end if;
end$$


类似这种情况的,如果不改变复制模式,可以考虑使用SQL SECURITY DEFINNER关键字来加强下防线。
3、存储程序所修改的数据是不确定的,这种情况是不利于复制的,可能引擎master和slave的不一致。

如果我们采用row模式进行复制,就不会出现上述问题,它只会记录受变化的表的行记录信息。
像存储过程 call 语句是不会被记录的,存储函数所产生的结果会被记录而不是调用函数的语句。对于触发器也是记录它所做的行记录的改变。

下面的这些 规则只适用于存储函数,不适用于其他存储程序
1、为了能创建和修改一个存储函数,必须拥有super 、create routine、alter routine权限。
2、创建的存储函数必须明确指出它所做的修改是 deterministic 或者它不会修改数据。
声明的时候需要有一下几个关键字:DETERMINISTIC ,NO SQL,READS SQL DATA。否则会有下面的提示:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,
or READS SQL DATA in its declaration and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators
variable)


下面这个是可以的:

CREATE FUNCTION f1(i INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
RETURN i;
END;


下面这个使用UUID函数,所以是 not deterministic

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
BEGIN
RETURN UUID();
END;

 

一个函数的本质评估是基于“诚信”的创造者,MySQL 对于 书写了 deterministic的语句但是产生不确定的情况是不做检查的。

如果我们不使用 deterministric的话,我们必须使用row复制模式或者是mixed模式来保证主从复制的一致性。

默认情况下,只有super权限来定义存储函数,设置变量:log-bin-trust-function-creators 选项来 允许其他用户定义自己的function。

以上的这些讨论,同样适用于trigger,但trigger并没有deterministic关键字。
 






本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1071546,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
27天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
|
2月前
|
存储 JSON 缓存
十行代码让日志存储降低80%
十行代码让日志存储降低80%
59 2
|
1月前
|
存储 数据库
ALTER MATERIALIZED VIEW LOG :语句来更改现有物化视图日志的存储特征或类型。
`ALTER MATERIALIZED VIEW LOG` 语句用于修改已有的物化视图日志的存储属性或类型。配合示例中的动画图像(由于格式限制无法显示),该语句帮助优化数据库的性能和管理。
44 0
|
7月前
|
存储 JSON 缓存
十行代码让日志存储降低80%
日志是系统中熵增最快的一个模块,它承载了业务野蛮生长过程中的所有副产品。本文介绍了一个日志治理案例,围绕降本和提效两大主题,取得一定成效,分享给所有渴望造物乐趣的同学。
53976 23
十行代码让日志存储降低80%
|
1月前
|
存储 网络安全
在云效中,如果你看不到错误日志,可能是因为错误日志没有被正确地输出或者存储
【2月更文挑战第24天】在云效中,如果你看不到错误日志,可能是因为错误日志没有被正确地输出或者存储
15 2
|
4月前
|
SQL 存储 关系型数据库
②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志
②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志
79 0
|
4月前
|
SQL 存储 关系型数据库
认真学习MySQL中的二进制日志(binlog)与中继日志(Relay log)
认真学习MySQL中的二进制日志(binlog)与中继日志(Relay log)
104 0
|
4月前
|
存储 SQL 监控
从 Elasticsearch 到 SelectDB,观测云实现日志存储与分析的 10 倍性价比提升
SelectDB 助力观测云完成日志数据存储和分析架构升级,实现整体性价比 10 倍提升,为日志存储和分析场景服务提供强大动力。
|
5月前
|
存储 数据采集 监控
从存储统一到数据融合,SLS在可观测场景的思考和行动
介绍SLS在可观测数据融合分析的一系列技术升级,融合Trace、全栈监控、Continuous Profiling、移动端监控等功能,帮助大家更快速地构筑全栈、自动化的观测能力。
127615 52
|
6月前
实际案例分析 - 根据应用程序日志的记录,反查出哪一行 ABAP 代码产生的这条日志试读版
实际案例分析 - 根据应用程序日志的记录,反查出哪一行 ABAP 代码产生的这条日志试读版
70 0

热门文章

最新文章