DETERMINISTIC、NO SQL 或 READS SQL DATA 在其声明和二进制日志记录已启用
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控制台执行:SET GLOBAL log_bin_trust_function_creators = 1;
方法二:将以下内容添加到 mysql.ini 配置文件中:log_bin_trust_function_creators = 1;
方法三:
- 创建存储函数时,必须声明它是确定性的或不修改数据。否则,数据恢复或复制可能不安全。
- 默认情况下,要接受 CREATE FUNCTION 语句,必须显式指定 DETERMINISTIC、NO SQL 或 READS SQL DATA 中的至少一个。否则会发生错误:
要解决此问题,请在 Return 和 Before Begin 语句之后添加以下行:
READS SQL DATA \n DETERMINISTICCREATE FUNCTION f2()RETURNS CHAR(36) CHARACTER SET utf8/*ADD HERE */READS SQL DATADETERMINISTICBEGIN
MySQL服 务启动后停止
Windows无法启动MySQL57服务(位于本地计算机上)错误1067:进程意外终止,
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止,
重启MySQL服务无效! 硬上进入MySQL也无效
不是办法的办法:
- 管理员权限进入到命令行、务必使用管理员权限进入到命令行,不然的话就会出现“发生系统错误 5。 拒绝访问。”这样的错误,如下图所示。
- 进入到bin目录,MySQL的安装默认路径是:C:\Program Files\MySQL\MySQL Server 5.7\bin
- 之后进行初始化data目录。如果在与bin目录同级的文件夹下没有data文件夹的话,则创建一个data空目录,名字务必为data。如果有该目录的话,记得要清空data目录下的所有初始文件
- 之后到bin目录下执行命令(管理员身份打开命令行窗口):mysqld –initialize,如下图所示。初始化大概需要20秒左右的时间,静观其变即可。
- 初始化完成后,重新启动服务就会成功了
- cmd登录数据库(命令为:mysql –u root -p)就可以顺利进入了,但是输入你之前的历史遗留的密码并不好使了,而且会报错,报错为:ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)
- 这是因为MySQL初始化之后,生成了一个初始密码,放在了data文件夹下以.err为后缀的文件夹下
- 此时,通过电脑自带的记事本打开文件,是不太行得通的,通过sublime text就可以顺利打开了,以“password”为搜索项,很快就定位到初始密码了,这个密码是随机生成的,而且相对复杂,可以直接复杂粘贴到命令行窗口。
- 将初始化密码进行复制,粘贴到MySQL登录的密码中去,此时可以看到,顺利进入到了MySQL。
- 但是直接输入MySQL的简单命令之后,发现并不能操作数据库,会提示报错:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement
- 这个报错的意思是告诉你重设密码,
- alter user ‘root’@’localhost’ identified by ‘123456’;,其中123456是重设的密码,
- 刷新权限:flush privileges;,尔后你就可以正常操作数据库了
找不到MySQL服务
一、添加MySQL服务
1. 进入 计算机服务项中(我的电脑 (右键)——>管理——>服务和应用程序——>查看有没有MySQL服务项),发现没有 MySQL 服务
2. 运行 ——> cmd ——> 进入MySQL的bin目录 ——>运行命令 mysqld.exe install
运行结果为 Service successfully installed.
3. 此时再查看计算机服务项,就有MySQL服务了
二、删除MySQL服务
运行cmd,进入MySQL的bin目录,先关闭mysql服务 net stop mysql,再运行 mysqld.exe —remove,就把计算机服务中的MySQL删除掉了,就不会有MySQL开机启动了!操作如图:user表没有password字段
这个是因为 mysql 的版本问题,是mysql 5.7版本出现的,具体是mysql 5.7.x 开始变化的我不知道
新的字段变更为authentication_string
修改密码的方式还是和原来一致的use mysql;update user set authentication_string=password("python") where user="root";1054 Unknown column ‘**‘ in ‘field list‘
我这里是把 “给 varchar 类型的属性赋的值” 加了双引号就好了
1. use \`mybatis\`;
2. create table \`user\`(
3. id int(20) not null,
4. name varchar(30) default null,
5. pwd varchar(30) default null
6. )engine\=innodb default charset\=UTF8MB4;
8. insert into user(id,name,pwd) values
9. (4,"sg2c","sss"),
10. (5,"ggg","dsi")
这样不报错,之前没加双引号的时候,比如第一个 user 我改成这样插入:(4,”sg2c”,sss) 会报 Error Code: 1054. Unknown column ‘sss’ in ‘field list。 但是如果把 sss 换成数字不加双引号也没事,这是为啥啊
https://blog.csdn.net/qq_38974638/article/details/105727433
select into from 提示 Undeclared variable
数据库表的复制与备份的方法
- select into from
- insert into select
select into from 和 insert into select 的区别和用法
原因:mysql 数据库是不支持 SELECT INTO FROM 这种语句的,但是经过研究是可以通过另外一种变通的方法解决这个问题的,下面就来说说解决这个错误的办法吧!
Create table Table2 (``Select * from Table1);
这种语句代替SELECT vale1, value2, value3 into Table2 from Table1;
下面看一个本人实际操作中的例子吧!Create table www.phpernote.com (``Select A.id,B.id as typeId,A.brand,A.quanpin,A.simple from brands as A,cartype as B where A.type=B.``name group by A.brand);
这个是关联两个表得出一个查询结果,然后将结果插入到一个新创建的表 www.phpernote.com 中。
3 - Error writing file ‘/tmp/MYP0G1B8’
问题描述:
今天一同事在 mysql 中执行 SQL 语句的时候, 报了 / tmp 空间不足的问题, 报错如下:
[SQL] SELECT f.prov as 字段 1, MAX( CASE f.flag_name WHEN ‘字段 1’ THEN f.num ELSE 0 END ) AS ‘字段 1’, MAX( CASE f.flag_name WHEN ‘店员量’ THEN f.num ELSE 0 END ) AS ‘字段 1’, MAX( CASE f.flag_name WHEN ‘字段 1’ THEN f.num ELSE 0 END ) AS ‘字段 1’ FROM
( SELECT ‘字段 1’ AS flag_name, ( SELECT b.AREA_NAME FROM sc_area b WHERE b.AREA_CODE = a.privinceCode ) AS prov, COUNT(DISTINCT a.storeID) AS num FROM promotion a WHERE DATE_FORMAT(a.pushTime, ‘%Y’) = ‘2018’GROUP BY a.privinceCode
UNION ALL SELECT ‘字段 1’ AS flag_name, ( SELECT b.AREA_NAME FROM sc_area b WHERE b.AREA_CODE = a.privinceCode ) AS prov, COUNT(DISTINCT a.staffID) AS num FROM promotion a WHERE DATE_FORMAT(a.pushTime, ‘%Y’) = ‘2018’ GROUP BY a.privinceCode
UNION ALL SELECT ‘字段 1’ AS flag_name, ( SELECT b.AREA_NAME FROM sc_area b WHERE b.AREA_CODE = a.privinceCode ) AS prov, COUNT(1) AS num FROM promotion a WHERE DATE_FORMAT(a.pushTime, ‘%Y’) = ‘2018’ AND a.pushSts = ‘1’ GROUP BY a.privinceCode
) AS f GROUP BY f.prov ;
[Err] 3 - Error writing file ‘/tmp/MYP0G1B8’ (Errcode: 28 - No space left on device)
故障分析:
通过以上的错误提示, 可以知道是在执行 SQL 的时候, 创建临时表进行排序的时候,/tmp 空间不足导致的.
故障处理:
1. 查看磁盘上 tmp 空间大小, 发现 / tmp 空间剩余 5.2GB
2. 与同事沟通, SQL 查询的表非常的打, 有 8G 大小, 所以明显是 tmp 空间大小不够用了
3. 无法扩展 / tmp 的大小, 所以就修改 mysql 中 tmpdir 的位置, 由于该参数是只读参数, 只能在 my.cnf 中修改, 重启生效
4. 创建临时目录, 并且修改权限
[root@testvm mnt]# mkdir mysql_tmp_dir
[root@testvm mnt]# ls mysql_tmp_dir
[root@testvm mnt]# chmod 777 mysql_tmp_dir/ #必须修改权限, 让启动 mysql 的账户是可读写的. 此处是在 root 下创建, 也可以切换到 mysql 用户下, 然后创建目录, 这样默认 mysql 就有读写权限了. [root@testvm mnt]# ls -ltr
total 4 drwxrwxrwx 2 root root 4096 Jul 5 17:49 mysql_tmp_dir
5. 修改 my.cnf
重启 mysql 实例
查看 tmpdir 变量值
mysql> show variables like ‘%tmpdir%’; +—————————-+——————————+
| Variable_name | Value |
+—————————-+——————————+
| innodb_tmpdir | |
| slave_load_tmpdir | /mnt/mysql_tmp_dir |
| tmpdir | /mnt/mysql_tmp_dir |
+—————————-+——————————+
3 rows in set (0.01 sec)
备注: tmpdir 变量已经修改生效了, 后续执行 SQL 过程中生成的临时文件都会存储在这个目录下了.
tmpdir 系统变量, 官方文档参考:

mysql 8.0 1114 Error, The table /tmp/#sql~~~ is full
遇到错误:刷新视图时,mysql 8.0 1114 Error, The table /tmp/#sql~~~ is full
错误原因:
解决方案:重新设置临时表空间大小
- 查看表空间:
show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');

- 设置临时表空间(设置为3G容量):
SET GLOBAL tmp_table_size=3147483648; - 重新打开客户端
- 查看表空间,设置成功
mysql 创建函数导致1418错误
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)这个函数定义中没有包含 deterministic,no sql 或者 read sql data 中的一种,并且 binlog 是开启的。
报错原因:
很显然是业务创建函数的时候触发了该错误,那为何会导致这种错误呢,这是由于 mysql 复制要保证主从数据的一致决定的,这些函数创建语句会被记录在 binlog 中,然后复制到 slave 执行。但是这些函数在 slave 上执行的时候有可能导致主从数据不一致,为了避免该问题,mysql 拒绝直接创建函数,创建函数失败,返回异常。那为何 mysql 会有这个机制,对于函数的创建又将如何处理?
在一些场景下,一条语句在分别在主从执行可能导致不同的结果,在 slave 执行复制语句是通过 sql 线程执行的,而 SQL 线程是有所有的权限,因此有可能出现一种情况就是,函数中有危险语句在 master 上执行并不会有问题,但是当 slave 的 SQL 线程权限不同的时候,就会执行到这些危险语句,从而导致主从数据不一致。如果一个函数更改数据的结果是不确定的,或者是不可重复的,也会导致主从数据不一致,或者导致更改的数据和原始数据不一致(这主要在备份恢复中出现)。
通常这些问题出现在复制是语句模式的情况下,如果使用的行模式,binlog 记录的是执行 SQL 语句影响到的具体的行(不是执行的 SQL 语句),当 routines 或者触发器执行,binlog 中记录的也是更改行信息,而不是影响行变更的 SQL 语句,对于存储过程也是一样,并不是记录 call 语句,也是记录更改的行记录。对于函数,日志记录的是函数更改的行记录,而不是函数调用语句。对于触发器,记录的是触发器更改之后的行记录。因此在 slave 这边,看的是变更之后的行记录,而不是这些子程序的调用语句。因此在行模式则不会导致主从不一致。
如果复制模式是混合模式,除非行模式能保证正确的结果,不然上面的结果记录到 binlog 采用的是语句模式。在混合模式下,当一个存储过程,函数,触发器,事件包含了对于语句模式不安全的 SQL,这些语句就会标记为不安全的并且采用行模式记录在 binlog。
解决方案:
在 mysql 中,下面有一些条件是对函数有效,对存储过程或者事件无效,或者没有开启 binlog 也是无效的:
1. 创建或者更改一个函数必须要有 super 权限
2. 创建一个函数,必须要定义为确定结果的或者是不更改数据的。否则,就会被认为是对复制或者数据恢复是不安全的,也就是报错 1418
默认情况下,要创建一个函数,**deterministic,no sql,reads sql data** 中三个属性中的一个必须被显示指定,这样就能确认函数对结果集的影响,否则就会报错 1418,函数创建不成功。
下面这个函数就是确定结果的,因此是可以创建成功的:
创建成功案例
CREATE FUNCTION f1(i INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
RETURN i;
END;
创建失败案例
CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
BEGIN
RETURN UUID();
END;
CREATE FUNCTION f3(p_id INT)
RETURNS INT
BEGIN
UPDATE t SET modtime = NOW() WHERE id = p_id;
RETURN ROW_COUNT();
END;
评估一个函数是否安全取决于创建者是否清晰的知道这点,mysql 并不会检查一个函数定义为确定结果但实际上产生了不确定的结果。在函数的定义中可以指定 deteministic 来显示的说明函数是安全的,但是在函数体中定义可以使用不安全的语句。
这种情况,mysql 会认为是安全的,可以创建函数,但实际上这种函数调用对主从数据可能导致不一致。
如果试图执行一个函数,若 binlog_format 设置为 statement 模式,这个函数属性必须要显示指定为 deterministic 才行执行,否则就会报错 1418 异常并且函数不会被执行。但是设置了 log_bin_trust_function_creators = 1, 则可以正常执行。
