如何在开启了log-bin的MySQL Server中创建FUNCTION

在MySQL主从复制机器的master的数据库中创建function,报出如下错误:

Error Code: 1418. 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)

原来是因为在主从复制的两台MySQL服务器中开启了二进制日志选项log-bin,slave会从master复制数据,而一些操作,比如function所得的结果在master和slave上可能不同,所以存在潜在的安全隐患。因此,在默认情况下回阻止function的创建。

有两种办法来解决这一问题

1.将log_bin_trust_function_creators参数设置为ON,这样一来开启了log-bin的MySQL Server便可以随意创建function。这里存在潜在的数据安全问题,除非明确的知道创建的function在master和slave上的行为完全一致。

设置该参数可以用动态的方式或者指定该参数来启动数据库服务器或者修改配置文件后重启服务器。需注意的是,动态设置的方式会在服务器重启后失效。

mysql> show variables like ‘log_bin_trust_function_creators‘;

mysql> set global log_bin_trust_function_creators=1;

另外如果是在master上创建函数,想通过主从复制的方式将函数复制到slave上则也需在开启了log-bin的slave中设置上述变量的值为ON(变量的设置不会从master复制到slave上,这点需要注意),否则主从复制会报错。

2.明确指明函数的类型

1 DETERMINISTIC 不确定的

2 NO SQL 没有SQl语句,当然也不会修改数据

3 READS SQL DATA 只是读取数据,当然也不会修改数据

比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...

这样一来相当于明确的告知MySQL服务器这个函数不会修改数据,因此可以在开启了log-bin的服务器上安全的创建并被复制到开启了log-bin的slave上。

时间: 2024-08-01 17:32:43

如何在开启了log-bin的MySQL Server中创建FUNCTION的相关文章

如何在Mysql数据库中创建Oracle数据库scott的几张表格

我们先来看看Oracle中scott用户几张表的数据结构: ============================================================== 以下操作在Oracle数据库进行(如果需要) ============================================================== 创建表格: CREATE TABLE dept ( deptno INT PRIMARY KEY, dname VARCHAR(14), lo

在MySQL数据库中创建一个完整的表

1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器) use t1; //t1是数据库名 如图所示: 2.在此数据库中建立数据库表 2.1 先建立表结构(可以理解为表的列名,也就是字段名)在实际生产过程中,表结构是需要经过精心设计的. 通用的语法格式为: 1 CREATE TABLE table_name (column_name column_type); 举例如下: 1 create table tb3( 2 id smallint unsigned auto_increment p

检查所有PostgreSQL服务器所有数据库schema下所有表大小并统一整理到MySQL数据库中

目前开发环境共有40台左右PostgreSQL数据库服务器,现在将这些数据库服务器所有数据库的所有schema由脚本统一收集并写入MySQL数据库中,可以做个定时任务,每隔一段时间运行一次,实时收集数据 在MySQL数据库中创建元数据表 mysql> desc t_postgres_instance; +-------------------+--------------------------------------+------+-----+-------------------+-----

hive0.13.1安装-mysql server作为hive的metastore

hive0.13.1在hadoop2.4.1伪分布式部署上安装过程 环境:redhat enterprice 6.5 +hadoop2.4.1+hive0.13.1+mysql单节点伪分布式部署 相关网址: hive官网安装指导:https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-InstallingHivefromaStableRelease hive之metastore的三种保存方式:h

Mac下Mysql启动异常["ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"]

在mac下使用brew安装mysql,之前没有使用过,今天启动的时候发现启动不了 huijundeMacBook-Pro:bin huijunzhang$ mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 查看mysql的安装位置: huijundeMacBook-Pro:bin huijunzhang$ which mysql /usr/local

MySQL数据中分级分组显示数据

前面已经有了SqlServer数据分级分组显示数据了.今天又来做一个MySQL数据库中的分级分组显示,SqlServer中用到了递归,这里为了简单就直接把根的数据显示为0 ,而不用递归了. 在MySQL数据库中创建数据表: CREATE TABLE `categories` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类id' , `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_gene

怎样用MySQL创建function

以前使用SQL SERVER的时候经常用function,对一些数据的处理比较方便,现在数据库转移到mysql上以后,同样也希望能保留相同的功能,庆幸的是mysql也支持function,现来分享下在mysql中怎样创建function 工具/原料 MySQL MySQL Workbench 方法/步骤 1在MySQL中创建function的写法和SQL SERVER还是有区别的,先看一下在MySQL中正确的写法是什么样,在这个function中目的是返回根据传进年龄参数计算出同龄人有多少,并将

mysql数据库数据能不能导入到sql server中

当然可以了. 一.为 MySQL安装ODBC驱动 下载MySQL ODBC Connector,下载:http://dev.mysql.com/downloads/connector 从控制面板-管理工具,打开你的 数据源(ODBC),选 系统DNS ,点添加.   在 创建新数据源对话框中,选择MySQL ODBC 5.1 Driver ,点完成. 完成后会出现MySQL 链接对话框,添加你的 MySQL 数据库账号信息,并确认"root"账号是否有全部的权限,如果你安装MySQL

mysql开启general log的方法

因为为了性能考虑,一般general log不会开启.slow log可以定位一些有性能问题的sql,而general log会记录所有的SQL. mysql5.0版本,如果要开启slow log.general log,需要重启,从MySQL5.1.6版开始,general query log和slow query log开始支持写到文件或者数据库表两种方式,并且日志的开启,输出方式的修改,都可以在Global级别动态修改. [email protected](none) 09:40:33>s