新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
项目上 MySQL 还原 SQL 备份经常会碰到一个错误如下,且通常出现在导入视图、函数、存储过程、事件等对象时,其根本原因就是因为导入时所用账号并不具有SUPER 权限,所以无法创建其他账号的所属对象。ERROR 1227 (42000) : Access denied; you need (at least one of) the SUPER privilege(s) for this operation常见场景:1. 还原 RDS 时经常出现,因为 RDS 不提供 SUPER 权限;2. 由开发库还原到项目现场,账号权限等有所不同。
创新互联主要从事成都做网站、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务乐清,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
处理方式:
1. 在原库中批量修改对象所有者为导入账号或修改 SQL SECURITY 为 Invoker;2. 使用 mysqldump 导出备份,然后将 SQL 文件中的对象所有者替换为导入账号。
二、问题原因我们先来看下为啥会出现这个报错,那就得说下 MySQL 中一个很特别的权限控制机制,像视图、函数、存储过程、触发器等这些数据对象会存在一个 DEFINER 和一个 SQL SECURITY 的属性,如下所示:
--视图定义CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW v_test
--函数定义CREATE DEFINER=`root`@`%` FUNCTION `f_test()` RETURNS varchar(100) SQL SECURITY DEFINER
--存储过程定义CREATE DEFINER=`root`@`%` PROCEDURE `p_test`() SQL SECURITY DEFINER
--触发器定义CREATE DEFINER=`root`@`%` trigger t_test
--事件定义CREATE DEFINER=`root`@`%` EVENT `e_test`
DEFINER:对象定义者,在创建对象时可以手动指定用户,不指定的话默认为当前连接用户;
SQL SECURITY:指明以谁的权限来执行该对象,有两个选项,一个为 DEFINER,一个为 INVOKER,默认情况下系统指定为 DEFINER;DEFINER:表示按定义者的权限来执行; INVOKER:表示按调用者的权限来执行。
如果导入账号具有 SUPER 权限,即使对象的所有者账号不存在,也可以导入成功,但是在查询对象时,如果对象的 SQL SECURITY 为 DEFINER,则会报账号不存在的报错。ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist
改写好处:1. 可以避免还原时遇到 DEFINER 报错相关问题;2. 根据输出信息知道备份是否正常进行,防止备份中遇到元数据锁无法获取然后一直卡住的情况。
可以通过mysql数据同步的方法来解决这个问题,具体做法如下:
在本地建一个与数据库同名的数据库。
2.选择navicat中连接服务器的数据库,在菜单栏选择工具--数据传输。
3.在弹出的的窗口中“源”部分就是你要导出的源数据库,“目标”就是本地的数据库,点击左下角全选后,再点击开始按钮。
4.点击确定。
5.点击关闭。
6.再来查看一下本地数据库,是不是数据和结构都已经导入到本地数据库中了呢。然后再从备份中导出.sql再导入到本地数据库中。
7.选择备份文件提取SQL。
8.开始提取。
这样我们就得到了备份转储的.sql文件,再将这个.sql文件导入到本地的数据库中,就不再提示有错误了。
转载:
wordpress官方的相关说明是只要在数据库支持utf8mb4的时候会把部分数据表的编码升级为utf8mb4,如果不支持就不会转化为utf8mb4编码(wordpress 4.4版本支持mysql 5.0+)。
解决方法:
方法一:替换编码
使用代码编辑器打开导出的sql数据文件;
先查找:
utf8mb4_unicode_ci
替换为:
utf8_general_ci
再查找
utf8mb4
替换为
utf8
注意:一定要按照上面的顺序进行替换,否则不能替换成功。
PS:博客吧通过该方法导入成功,暂时没有发现有问题,但还是要先备份好数据再进行操作。
方法二:把网站要用的mysql数据库升级到5.5.3以上版本。
解决方法如下:
1、首先,进入root。
2、然后,打开mysql.conf。
3、然后,在[mysqld]处添加:secure_file_priv=/tmp/mysqldata(此为自己想要保存数据的路径),最后,重启一下mysql,就可以正常导入导出了。
其他方法:一般我们建议在导出和导入数据的时候指定字段之间的分隔符,如指定分隔符为'|',则在空字段之间也有足够的提示:||
一、所以修改sql语句如下:
1、导出:select * from employees into outfile 'd:/file/employees.txt' fields terminated by '|';
2、导入:load data infile 'd:/file/employees.txt' replace into table employees fields terminated by '|' ;
1、原因:可能是/usr/local/mysql/mysql.pid文件没有写的权限;
解决方法 :给予权限,执行 “chmod 775 /usr/local/mysql/ -R” 然后重新启动mysqld。
2、原因:可能进程里已经存在mysql进程;
解决方法:用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9 进程号”杀死,然后重新启动mysqld。
3、原因:可能是第二次在机器上安装mysql,有残余数据影响了服务的启动;
解决方法:去mysql的数据目录/data看看,如果存在mysql-bin.index,就赶快把它删除掉吧,它就是罪魁祸首了。
4、原因:mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件,请打开这个文件查看在[mysqld]节下有没有指定数据目录(datadir);
解决方法:请在[mysqld]下设置这一行:datadir = /usr/local/mysql/data。
5、原因:skip-federated字段问题;
解决方法:检查一下/etc/my.cnf文件中有没有没被注释掉的skip-federated字段,如果有就立即注释掉吧。
6、原因:错误日志目录不存在;
解决方法:使用“chown” “chmod”命令赋予mysql所有者及权限。
7、原因:如果是centos系统,默认会开启selinux;
解决方法:关闭它,打开/etc/selinux/config,把SELINUX=enforcing改为SELINUX=disabled后存盘退出重启机器试试。
8、原因:log-bin路径错误;
解决方法:查看对应数据库下的error log,例如我的数据库为,/usr/local/mysql/var目录,其下的localhost.localdomain.err为错误日志,只要把其下的ib_logfile*删除即可,重启mysql即可。
一、Linux下MySQL的启动与停止
1、Mysql启动、停止、重启常用命令
a、启动方式
(1)使用 service 启动:
[root@localhost /]# service mysqld start (5.0版本是mysqld)
[root@szxdb etc]# service mysql start (5.5.7版本是mysql)
(2)使用 mysqld 脚本启动:
/etc/inint.d/mysqld start
(3)使用 safe_mysqld 启动:
safe_mysqld
b、停止方式
(1)使用 service 启动:service mysqld stop
(2)使用 mysqld 脚本启动:/etc/inint.d/mysqld stop
(3)mysqladmin shutdown
c、重启方式
(1)使用 service 启动:
service mysqld restart
service mysql restart (5.5.7版本命令)
(2)使用 mysqld 脚本启动:
/etc/init.d/mysqld restart