首页 > 编程知识 正文

mysql无法导出文件问题,mysql数据库导入sql文件不成功解决办法!

时间:2023-12-29 13:17:00 阅读:330471 作者:VFJR

本文目录一览:

项目上 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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。