本文目录一览:
- 1、Navicat导出mysql数据库时出错怎么解决?
- 2、Mysql无法导出
- 3、求助啊、、、mysql导出文本文件出错了 error 1 (hy000): Can't creat
- 4、mysql怎么导出数据
- 5、MySQL数据库导出与导入及常见错误解决
- 6、求助:为什么 mysql8.0版本在my.ini中修改了secure_file_priv,重启服务之后,还是无法导出啊
Navicat导出mysql数据库时出错怎么解决?
项目上 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. 由开发库还原到项目现场,账号权限等有所不同。
处理方式:
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无法导出
你没有重定向输出的目标文件。
如果没有指定目标文件,mysqldump默认将结果print出来。
mysqldump -h localhost -u root -p test backup.sql
求助啊、、、mysql导出文本文件出错了 error 1 (hy000): Can't creat
出现该问题的原因一般都是向没有权限的文件或是目录写东西,然后报错个人总结
解决方法如下 以select .... into file
为例
1 select ..... into outfile '/tmp/target.txt'
2使用数据库目录
select ..... into outfile
'/var/lib/mysql/target.txt'
root:@localhost[mytest]select * from me into
outfile '/var/lib/mysql/target.txt' ;
Query OK, 3 rows affected (0.00
sec)
3 使用默认目录
root:@localhost[mytest]select * from me into
outfile 'target.txt';
Query OK, 3 rows affected (0.00 sec)
4
我们给出我们的分析思路:
首先我们以用户ububu login :
目录的权限是:
ubutu@ubutu-desktop:~$ mkdir
test
ubutu@ubutu-desktop:~$ ls -lai test
总计 8
16423 drwxr-xr-x 2
ubutu ubutu 4096 2010-03-24 19:59 .
8177 drwxr-xr-x 77 ubutu ubutu 4096
2010-03-24 19:59 ..
login mysql
(注意杂mysql中我们是以root用户登录的)
root:@localhost[mytest]select * from me into
outfile '/home/ubutu/test/a.txt';
ERROR 1 (HY000): Can't create/write to file
'/home/ubutu/test/a.txt' (Errcode:
13)
报错:
我们修改目录的权限:
oot@ubutu-desktop:/home/ubutu# chown -R mysql:mysql
test/
root@ubutu-desktop:/home/ubutu# ls -lai test
总计 8
16423
drwxr-xr-x 2 mysql mysql 4096 2010-03-24 19:59 .
8177 drwxr-xr-x 77 ubutu
ubutu 4096 2010-03-24 19:59
..
在继续执行:错误依旧:
我们继续修改:
root@ubutu-desktop:/home/ubutu# chmod a+wx
test/
root@ubutu-desktop:/home/ubutu# ls -lai test
总计 8
16423
drwxrwxrwx 2 mysql mysql 4096 2010-03-24 19:59 .
8177 drwxr-xr-x 77 ubutu
ubutu 4096 2010-03-24 19:59
..
错误仍在继续:
接着我们尝试用操作系统帐户登录:
root@ubutu-desktop:~# mysql
root:@localhost[mytest]select * from me into outfile
'/home/ubutu/test/a.txt'
- ;
ERROR 1 (HY000): Can't create/write to
file '/home/ubutu/test/a.txt' (Errcode:
13)
仍是同样的错误,无语了。为了查找错误的原因,我们从上面成功的例子我们看看那文件的权限:
root@ubutu-desktop:/var/lib/mysql#
ls -lai target.txt
2510 -rw-rw-rw- 1 root root 6 2010-03-24 20:07
target.txt(123使用操作系统的一般用户登录,但是mysql的root用户操作得到的结果)
我们看到文件的拳限是:root
,可是面我们使用chmod a+wx 仍然不行,问题处在那呢?难道是selinux ?
然后我们在/etc/apparmor
里面发现了这个:
capability setuid,
network tcp,
/etc/hosts.allow
r,
/etc/hosts.deny r,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/
r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld
mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err
rw,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/
r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid
w,
/var/run/mysqld/mysqld.sock w,
}
网上一搜,发现:
AppArmor attempts to
protect processes on the server or desktop from security threats. AppArmor
enforces limits on what processes can access on the system. It attempts to
restrict processes to those resources that the process requires to function
only. AppArmor will not only define the system resources a program can access ,
it will also determine the privileges with which it can access those resources.
To protect applications you will need to set up a security profile for each
application that you want to protect.
AppArmor has it's history connected to
the Linux Security Modules and the SELinux project that was developed by the
National Security Agency. Both SELinux and AppArmor use these modules developed
with security in mind.
ubuntu :
Default enforcement
By default in a
new installation of the following services is done with AppArmor profiles
enforced:
* cups
* bind
* mysql
* slapd (Open
LDAP)
修改后的:
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30
2007
#include tunables/global
/usr/sbin/mysqld {
#include
abstractions/base
#include
abstractions/nameservice
#include
abstractions/user-tmp
#include abstractions/mysql
#include
abstractions/winbind
capability dac_override,
capability
sys_resource,
capability setgid,
capability setuid,
network
tcp,
/etc/hosts.allow r,
/etc/hosts.deny r,
/etc/mysql/*.pem
r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf
r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log
rw,
/var/log/mysql.err rw,
/var/lib/mysql/ r,
/var/lib/mysql/**
rwk,
/var/ r,
/var/**
rwk,
/var/log/mysql/ r,
/var/log/mysql/*
rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock
w,
}
然后执行命令:
root:@localhost[mytest]select * from me into outfile
'/var/data/target.txt';
Query OK, 3 rows affected (0.00
sec)解决,该情况同样使用于你想将现在的数据目录执行更换,而出现的权限问题,即
自定义数据目录。
写的有点乱,边实验边总结哈
mysql怎么导出数据
1、 mysqldump命令备份数据
在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump,首先我们简单了解一下mysqldump命令用法:
#MySQLdump常用
mysqldump -u root -p --databases 数据库1 数据库2 xxx.sql
2、 mysqldump常用操作实例
2.1备份全部数据库的数据和结构
mysqldump -uroot -p123456 -A /data/mysqlDump/mydb.sql
2.2备份全部数据库的结构(加 -d 参数)
mysqldump -uroot -p123456 -A -d /data/mysqlDump/mydb.sql
2.3 备份全部数据库的数据(加 -t 参数)
mysqldump -uroot -p123456 -A -t /data/mysqlDump/mydb.sql
2.4 备份单个数据库的数据和结构(,数据库名mydb)
mysqldump -uroot-p123456 mydb /data/mysqlDump/mydb.sql
2.5 备份单个数据库的结构
mysqldump -uroot -p123456 mydb -d /data/mysqlDump/mydb.sql
2.6 备份单个数据库的数据
mysqldump -uroot -p123456 mydb -t /data/mysqlDump/mydb.sql2
2.7 备份多个表的数据和结构(数据,结构的单独备份方法与上同)
mysqldump -uroot -p123456 mydb t1 t2 /data/mysqlDump/mydb.sql
2.8 一次备份多个数据库
mysqldump -uroot -p123456 --databases db1 db2 /data/mysqlDump/mydb.sql
MySQL数据库导出与导入及常见错误解决
MySQL数据库导出与导入的过程中将会发生众多不可预知的错误,本文整理了一些常见错误及相应的解决方法,遇到类似情况的朋友可以参考下,希望对大家有所帮助
MySQL命令行导出数据库:
1,进入MySQL目录下的bin文件夹:cd
MySQL中到bin文件夹的目录
如我输入的命令行:cd
C:Program
FilesMySQLMySQL
Server
4.1bin
(或者直接将windows的环境变量path中添加该目录)
2,导出数据库:mysqldump
-u
用户名
-p
数据库名
导出的文件名
如我输入的命令行:mysqldump
-u
root
-p
jluibmclub
d:
jluibmclub
.sql
(输入后会让你输入进入MySQL的密码)
(如果导出单张表的话在数据库名后面输入表名即可)
在用命令做数据库备份过程在cmd命令框中输入C:/mysql/binmysqldump
-uroot
-p
jluibmclub
d:
jluibmclub
.sql
;
报错信息:mysqldump:
Got
error:
1049:
Unknown
database
'
jluibmclub
;'
when
selecting
the
database
,识别不了
jluibmclub
这个数据库。
但是我在:
mysql
show
databases;
显示:
+---------------+
|
Database
|
+---------------+
|
jpa
|
+---------------+
mysqluse
jpa;
显示:
Database
changed
其原因很简单,只要记住一点。没进入mysql环境不算执行sql语句,所以不用在其后加入逗号(“;”)。
如果进入mysql环境mysql
,则输入的语句属于sql语句了,在其最后一定要加上逗号(“;”)。
3、会看到文件news.sql自动生成到d盘下文件,如果不指定盘符默认在bin目录下。
命令行导入数据库:
1,进入MySQL:mysql
-u
用户名
-p
如我输入的命令行:mysql
-u
root
-p
(输入同样后会让你输入MySQL的密码)
2,在MySQL-Front中新建你要建的数据库,这时是空数据库,如新建一个名为news的目标数据库
3,输入:mysqluse
目标数据库名
如我输入的命令行:mysqluse
news;
4,导入文件:mysqlsource
导入的文件名;
如我输入的命令行:mysqlsource
news.sql(如果在bin目录下用相对路径名,如果在其他目录下用绝对目录名);
MySQL备份和还原,都是利用mysqldump、mysql和source命令来完成的。
1.Win32下MySQL的备份与还原
求助:为什么 mysql8.0版本在my.ini中修改了secure_file_priv,重启服务之后,还是无法导出啊
打开my.cnf 或 my.ini,加入以下语句后重启mysql实例
添加配置到[mysqld]下面配置块、限制mysqld 不允许导入|导出
secure_file_priv=NULL
没有指定具体值时,表示不对mysqld 的导入|导出做限制
secure_file_priv
限制mysqld 的导入|导出只能发生在/tmp/目录下
secure_file_priv=/tmp/
通过RPM包或YUM安装的默认一般为
secure_file_priv="/var/lib/mysql-files/"
当secure_file_priv的值为右单斜杠时任意有权限的目录
secure_file_priv="/"
因此问题的排查可以两步:
show global variables like 'secure_file_priv'; 检查生效路径指向哪里
该路径对于启动mysqld服务进程的用户mysql/root等是否有读写权限
当然首先需要确认mysqld究竟从哪个my.cnf配置文件读取的参数:
mysql --help | egrep '/my\.cnf|\.my\.cnf' | xargs ls -l