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

简介:

当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,如需转载请自行联系原作者

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
8月前
|
存储 运维 监控
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
|
3月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
144 6
|
3月前
|
JSON 缓存 测试技术
程序出错瞎找?教你写“会说话”的错误日志,秒定位原因
错误日志是排查问题的“导航地图”。本文详解错误三大来源:参数非法、交互故障、逻辑疏漏,并分享写好日志的6大原则——完整、具体、直接、集成经验、格式统一、突出关键字,助你快速定位问题,提升系统可维护性。
331 0
|
7月前
|
存储 数据可视化 开发工具
【Application Insights】Application Insights存储的Function App的日志存在"Operation Link" 为空的情况
在将 Azure Functions 升级到 .NET 8 和 Isolated Worker 模式后,Application Insights 的请求日志中 `operation_Link` 字段为空,导致分布式追踪无法正常关联。解决方法包括:确保引用正确的 SDK 包(如 `Microsoft.Azure.Functions.Worker.ApplicationInsights`),正确配置 Application Insights 服务,移除默认日志过滤规则,并使用最新依赖包以支持分布式追踪。通过这些步骤,可恢复端到端事务视图的可视化效果。
177 10
|
10月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
843 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
存储 分布式计算 资源调度
通过日志聚合将作业日志存储在HDFS中
如何通过配置Hadoop的日志聚合功能,将作业日志存储在HDFS中以实现长期保留,并详细说明了相关配置参数和访问日志的方法。
293 1
通过日志聚合将作业日志存储在HDFS中
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
289 4
|
存储 消息中间件 大数据
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
207 1
|
存储 消息中间件 大数据
大数据-68 Kafka 高级特性 物理存储 日志存储概述
大数据-68 Kafka 高级特性 物理存储 日志存储概述
132 1
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
173 1

热门文章

最新文章