您的位置:首页 > 数据库 > MySQL

mysql修改用户名密码和Load Data Local Infile的权限及用户自定义函数方法

2014-09-26 22:26 639 查看

mysql修改用户名密码

1.直接在数据库中修改记录

mysql> use mysql

mysql> update user set password = password(”new_password”) where user = “user_name

”;

mysql> flush privileges;

其实这种方法就是更新一条数据库记录,与普通update语句不同的是,密码加密存储,需用

password()函数来生成,另一个不同点是需要刷新权限表。

2.在数据库中运行set password

mysql> set password for user_name = password(”new_password”);

mysql> flush privileges;

同第一种方法,也要刷新权限表

3.直接在shell环境运行mysqladmin

> mysqladmin -u user_name -p password “new_password”

> mysqladmin flush-privileges

这个方法我试了几次,每次都能将密码记录修改掉,但是每次修改后都无法登录,即使重启数

据库也无济于事。所以建议不要采用本方法修改用户密码,尤其是root密码。

4.

grant all privileges on db.table to
user_name@localhost identified by “your_pwd”;

用户名密码的生效不必用flush privileges刷新

注:

db.table: db表示授权哪个库,table是相应库里的表。可以用*.*表示所有库所有表。注意,如

果想表示某个库的所有表,必须用db_name.*,后面的”.*”不可省略,否则权限将无法赋予。

user_name@localhost: user_name表示用户名,localhost表示该用户只能在本地访问该库,可

以用%表示从任何地方访问该库,也可以用111.11.22.33来表示地址

your_pwd: 给用户设置的密码



mysql用户自定义函数实例与部分问题解决方法

一、查看创建函数的功能是否开启:

mysql> show variables like '%func%';

+-----------------------------------------+-------+

| Variable_name | Value |

+-----------------------------------------+-------+

| log_bin_trust_function_creators | ON |

+-----------------------------------------+-------+

1 row in set (0.02 sec)

二、如果Value处值为OFF,则需将其开启。

mysql> set global log_bin_trust_function_creators=1;

use app02

delimiter //

mysql>DROP FUNCTION IF EXISTS `testhanshu`;

CREATE FUNCTION `testhanshu`(`tustate` int)

RETURNS varchar(2000)

BEGIN

declare oneAddr varchar(200) default '';

declare allAddr varchar(2000) default '';

DECLARE done INT DEFAULT FALSE;

declare curl CURSOR for select utruename from tsys_user where ustate = tustate;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

open curl;

REPEAT

FETCH curl INTO oneAddr;

IF NOT done THEN

set oneAddr = CONCAT(oneAddr, ';');

set allAddr = CONCAT(allAddr, oneAddr);

END IF;

UNTIL done END REPEAT;

close curl;

RETURN allAddr;

END;

mysql>select testhanshu(1);

在使用MySql自己定义的函数时,出现错误java.sql.SQLException: 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)

解决办法有三种:

1. 登录MySql客户端,执行: SET GLOBAL log_bin_trust_function_creators = 1;

2.在登录MySQL服务器是,在服务启动时加上 “--log-bin-trust-function-creators=1 ”参数

并设置为1。

3.在my.ini(my.cnf)中的[mysqld]区段中加上 log-bin-trust-function-creators=1。



MySQL数据导入导出工具mysqlimport

1.mysqlimport的语法介绍:

mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的

工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件

(text file)导入到你指定的数据库和表中。比方说我们要从文件Customers.txt中把数据导入

到数据库Meet_A_Geek中的表Custermers中:

mysqlimport Meet_A_Geek Customers.txt

注意:这里Customers.txt是我们要导入数据的文本文件, 而Meet_A_Geek是我们要操作的数

据库, 数据库中的表名是Customers,这里文本文件的数据格式必须与Customers表中的记录

格式一致,否则mysqlimport命令将会出错。

其中表的名字是导入文件的第一个句号(.)前面文件字符串,另外一个例子:

mysqlimport Meet_A_Geek Cus.to.mers.txt

那么我们将把文件中的内容导入到数据库Meet_A_Geek 中的Cus表中。

上面的例子中,都只用到两个参数,并没有用到更多的选项,下面介绍mysqlimport的选项

2.mysqlimport的常用选项介绍:

选项 功能

-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息

-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据

-i or --ignore mysqlimport跳过或者忽略那些有相同唯一

关键字的行, 导入文件中的数据将被忽略。

-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和

更新受到影响。

-r or -replace 这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。

--fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以

双引号括起。 默认的情况下数据是没有被字符括起的。

--fields-terminated- by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔

符是句号。您可以用此选项指定数据之间的分隔符。 默认的分隔符是跳格符(Tab)

--lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。

默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的

字符: 一个新行或者一个回车。

mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等



3.例子:导入一个以逗号为分隔符的文件

文件中行的记录格式是这样的:

"1", "ORD89876", "1 Dozen Roses", "19991226"

我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中, 我们

使用这个命令:

bin/mysqlimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt

这个命令可能看起来很不爽,不过当你熟悉了之后,这是非常简单的。第一部分,

bin/mysqlimport,告诉操作系统你要运行的命令是mysql/bin目录下的mysqlimport,选项p是要

求输入密码,这样就要求你在改动数据库之前输入密码,操作起来会更安全。 我们用了r选项

是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数

据。我们表单中的数据不是最新的,需要用文件中的数据去更新,因而就用r这个选项,替代

数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表,这样就阻止了用户在我

们更新表的时候对表进行查询或者更改的操作。

批处理导入文件,从sql文件导入数据到数据库中 ,批处理是一种非交互式运行mysql程序的方

法,如同您在mysql中使用的命令一样,你仍然将使用这些命令。

为了实现批处理,您重定向一个文件到mysql程序中,首先我们需要一个文本文件,这个文本

文件包含有与我们在mysql中输入的命令相同的文本。 //www.w3sky.com

比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以

取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾):

USE Meet_A_Geek;

INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block");

INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton");

INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons");

注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。 上面的USE命令选择

数据库,INSERT命令插入数据。

下面我们要把上面的文件导入到数据库中,导入之前要确认数据库已经在运行,即是mysqld进

程(或者说服务,Windows NT下面称为”服务“,unix下面为”进程“)已经在运行。

然后运行下面的命令:

bin/mysql –p < /home/mark/New_Data.sql

接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库

中。

命令行中使用LOAD DATA INFILE 从文件中导入数据到数据库:

现在您可能会问自己,"究竟为什么我要输入所有的这些SQL语句到文件中,然后通过程序运行

它们呢?” 这样看起来好像需要大量的工作。很好,你这样想很可能就对了。但是假如你有从

所有这些命令中产生的log记录呢?现在这样就很棒,嗯,大多数数据库都会自动产生数据库

中的事件记录的log。而大部分log都包含有用过的原始的SQL命令。因此,如果您不能从您现

在的数据库中导出数据到新的mysql数据库中使用,那么您可以使用log和mysql的批处理特性

,来快速且方便地导入您地数据。当然,这样就省去了打字的麻烦。

LOAD DATA INFILE

这是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与mysqlimport非常

相似,但这个方法可以在mysql命令行中使用。也就是说您可以在所有使用API的程序中使用这

个命令。使用这种方法,您就可以在应用程序中导入您想要导入的数据。 使用这个命令之前

,mysqld进程(服务)必须已经在运行。

启动mysql命令行:

bin/mysql –p

按提示输入密码,成功进入mysql命令行之后,输入下面的命令:

USE Meet_A_Geek;

LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders;

简单的讲,这样将会把文件data.sql中的内容导入到表Orders中,如mysqlimport工具一样,这

个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务

器中,您可以使用下面的命令:

LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE Orders;

上面的LOCAL参数表示文件是本地的文件,服务器是您所登陆的服务器。 这样就省去了使用

ftp来上传文件到服务器,MySQL替你完成了. 您也可以设置插入语句的优先级,如果您要把它

标记为低优先级(LOW_PRIORITY),那么MySQL将会等到没有其他人读这个表的时候,才把

插入数据。可以使用如下的命令:

LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders;

您也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键值。替代重复的

键值的语法:

LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders;

上面的句子看起来有点笨拙,但却把关键字放在了让您的剖析器可以理解的地方。 //from

www.w3sky.com

下面的一对选项描述了文件的记录格式,这些选项也是在mysqlimport工具中可以用的。他们

在这里看起来有点不同。首先,要用到FIELDS关键字,如果用到这个关键字,MySQL剖析器希

望看到至少有下面的一个选项:

TERMINATED BY character

ENCLOSED BY character

ESCAPED BY character

这些关键字与它们的参数跟mysqlimport中的用法是一样的. The TERMINATED BY 描述字段的

分隔符,默认情况下是tab字符(\t)

ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段。

ESCAPED BY 描述的转义字符。默认的是反些杠(backslash:\ ).

下面仍然使用前面的mysqlimport命令的例子,用LOAD DATA INFILE语句把同样的文件导入到

数据库中:

LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS

TERMINATED BY ',' ENCLOSED BY '"';

LOAD DATA INFILE语句中有一个mysqlimport工具中没有特点:

LOAD DATA INFILE 可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导

入的时候,这个特点就很重要。比方说,我们要从Access数据库升级到MySQL数据库的时候,

需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。

这个时候,我们的Access数据库中的数据仍然是可用的,但是因为这些数据的栏目(field)与

MySQL中的不再匹配,因此而无法再使用mysqlimport工具。尽管如此,我们仍然可以使用

LOAD DATA INFILE,下面的例子显示了如何向指定的栏目(field)中导入数据:

LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date,

Customer_ID);

如您所见,我们可以指定需要的栏目(fields)。这些指定的字段依然是以括号括起,由逗号

分隔的,如果您遗漏了其中任何一个,MySQL将会提醒您

导出数据的方法:Methods of Exporting Data

您可以看到MySQL有很多可以导入数据的方法,然而这些只是数据传输中的一半。另外的一般

是从MySQL数据库中导出数据。有许多的原因我们需要导出数据。一个重要的原因是用于备份

数据库。数据的造价常常是昂贵的,需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地

丢失;另外一个原因是,也许您希望导出数据来共享。 在这个信息技术不断成长的世界中,

共享数据变得越来越常见。

比方说Macmillan USA维护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之

间共享,这样他们就知道哪些书将会很快出版。医院越来越走向采用无纸病历记录,这样这些

病历可以随时跟着你。世界变得越来越小,信息也被共享得越来越多。有很多中导出数据得方

法,它们都跟导入数据很相似。因为,毕竟,这些都只是一种透视得方式。从数据库导出的数

据就是从另一端导入的数据。这里我们并不讨论其他的数据库各种各样的导出数据的方法,您

将学会如何用MySQL来实现数据导出。

使用mysqldump:

(mysqldump命令位于mysql/bin/目录中)

mysqldump工具很多方面类似相反作用的工具mysqlimport。它们有一些同样的选项。但

mysqldump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件

包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解

释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且

从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西

都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导

回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。

因此,如果您像装载整个数据库Meet_A_Geek的内容到一个文件中,可以使用下面的命令:

bin/mysqldump –p Meet_A_Geek > MeetAGeek_Dump_File.txt

这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库

Meet_A_Geek中的表Orders中的整个内容导出到一个文件,可以使用下面的命令:

bin/mysqldump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt

这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这

样的目的,可以使用类似于下面的命令:

bin/mysqldump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt

mysqldump工具有大量的选项,部分选项如下:

选项/Option 作用/Action Performed

--add-drop-table

这个选项将会在每一个表的前面加上DROP TABLE IF

EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首

先检查表是否存在,存在就删除

--add-locks

这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK

TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作

-c or - complete_insert

这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出

导另外一个数据库时这个选项很有用。

--delayed-insert 在INSERT命令中加入DELAY选项

-F or -flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.

-f or -force 使用这个选项,即使有错误发生,仍然继续导出

--full 这个选项把附加信息也加到CREATE TABLE的语句中

-l or -lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。

-t or -no-create- info

这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要

DDL(数据库定义语句)时很方便。

-d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。

在您只需要DDL语句时,可以使用这个选项。

--opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。

-q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的

时候就写入导文件中。

-T path or -tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,

另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路

径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。

-w "WHERE Clause" or -where = "Where clause "

如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。

假定您需要为一个表单中要用到的帐号建立一个文件,经理要看今年(2004年)所有的订单(

Orders),它们并不对DDL感兴趣,并且需要文件有逗号分隔,因为这样就很容易导入到Excel

中。 为了完成这个人物,您可以使用下面的句子:

bin/mysqldump –p –where "Order_Date >='2000-01-01'"

–tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders

这将会得到您想要的结果。

schema:模式

The set of statements, expressed in data definition language, that completely describe the

structure of a data base. 一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库

的结构。

SELECT INTO OUTFILE :

如果您觉得mysqldump工具不够酷,就使用SELECT INTO OUTFILE吧, MySQL同样提供一个跟

LOAD DATA INFILE命令有相反作用的命令,这就是SELECT INTO OUTFILE 命令,这两个命令

有很多的相似之处。首先,它们有所有的选项几乎相同。现在您需要完成前面用mysqldump完

成的功能,可以依照下面的步骤进行操作:

1. 确保mysqld进程(服务)已经在运行

2. cd /usr/local/mysql

3. bin/mysqladmin ping ;// 如果这个句子通不过,可以用这个:mysqladmin -u root -p ping

mysqladmin ping用于检测mysqld的状态,is alive说明正在运行,出错则可能需要用户名和密

码。

4. 启动MySQL 监听程序.

5. bin/mysql –p Meet_A_Geek;// 进入mysql命令行,并且打开数据库Meet_A_Geek,需要输

入密码

6. 在命令行中,输入一下命令:

SELECT * INTO OUTFILE '/home/mark/Orders.txt'

FIELDS

TERMINATED BY = ','

FROM Orders

WHERE Order_Date >= '2000-01-01'

在你按了Return(回车)之后,文件就创建了。这个句子就像一个规则的SELECT语句,只是

把想屏幕的输出重定向到了文件中。这意味这您可以使用JOIN来实现多表的高级查询。这个特

点也可以被用作一个报表产生器。

比方说,您可以组合这一章中讨论的方法来产生一个非常有趣的查询,试试这个:

在mysql目录建立一个名为Report_G.rpt 的文本文件,加入下面的行:

USE Meet_A_Geek;

INSERT INTO Customers (Customer_ID, Last_Name, First_Name)

VALUES (NULL, "Kinnard", "Vicky");

INSERT INTO Customers (Customer_ID, Last_Name, First_Name)

VALUES (NULL, "Kinnard", "Steven");

INSERT INTO Customers (Customer_ID, Last_Name, First_Name)

VALUES (NULL, "Brown", "Sam");

SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt'

FROM Customers WHERE Customer_ID > 1;

然后确认 mysql进程在运行,并且您在mysql目录中, 输入下面的命令:

bin/mysql < Report_G.rpt检查您命名作为输出的文件,这个文件将会包含所有您在Customers

表中输入的顾客的姓。 如您所见,您可以使用今天学到的导入/导出(import/export)的方法

来帮助得到报表。

通过mysqlimport定时将远程文本文件导入mysql

本文件存放在服务器a上,且文本文件的命名方式为yyyymmddhh,每小时导入24小时前生成

的文件,而mysql安装在b上

首先在a上,从现有的文本文件截取所需的列(使用cut命令),然后传输到b。

b这台服务器既不能连接ftp服务器,也不能与其他机器配置用户等价性,因此向它传输文件只

能使用scp,为了避免人机交互输入密码,采用了autoexpect命令

[root@justin]# autoexpect scp /var/www/data/info.txtroot@b:/var/lib/mysql/market

autoexpect started, file is script.exp

root@b'spassword:

生成script.exp

[root@justin]# more generate_mysql_info.sh

#!/bin/bash

folder=/var/www/data/

#get the past time value

date1=`date --date='24 hour ago' +%Y%m%d%H`

cat "$folder""$date1" | cut -d '"' -f 19,20,21,31,32,33,34,35,36,37,41,42,43,61,62,63,64 | cut

-d ',' -f 2,4,5,6,8,10 > info.txt

cd $folder

./script.exp

[root@justin]# crontab -l | grep generate

#generate and scp the info.txt to b for testing

30 * * * * sh /var/www/data/generate_mysql_info.sh >>

/var/www/data/generate_mysql_info.log 2>&1

传输到64之后,然后调用mysqlimport导入mysql

字段中包含中文,数据库采用utf8字符集,为避免乱码,mysql建表语句后面加上 DEFAULT

CHARSET=utf8

[root@db market]# more import_into_mysql.sh

#!/bin/bash

cd /var/lib/mysql/market

mysqlimport --user=root --password=******* --fields-enclosed-by='"' --fields-terminated-

by=',' --default-character-set='utf8' market info.txt

[root@db market]# crontab -l

#import the info.txt into market.info

50 * * * * sh /var/lib/mysql/market/import_into_mysql.sh >>

/var/lib/mysql/market/import_into_mysql.log 2>&1

至此job完成



Mysql详解load data infile

mysql有一个高效导入方法,那就是load data infile 下面来看案例说明

基本语法:

load data [low_priority] [local] infile 'file_name txt' [replace | ignore]

into table tbl_name

[fields

[terminated by't']

[OPTIONALLY] enclosed by '']

[escaped by'\' ]]

[lines terminated by'n']

[ignore number lines]

[(col_name, )]

load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,

mysqld进程(服务)必须已经在运行。为了安全原因,当读取位于服务器上的文本文件时,文

件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用load data infile,

在服务器主机上你必须有file的权限。

1 如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把插

入数据。可以使用如下的命令:

load data low_priority infile "/home/mark/data sql" into table Orders;

2 如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上



3 replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行

将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输

入。如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分

被忽略。例如:

load data low_priority infile "/home/mark/data sql" replace into table Orders;

4 分隔符

(1) fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL剖析器希望看到

至少有下面的一个选项:

terminated by分隔符:意思是以什么字符作为分隔符

enclosed by字段括起字符

escaped by转义字符

terminated by描述字段的分隔符,默认情况下是tab字符(\t)

enclosed by描述的是字段的括起字符。

escaped by描述的转义字符。默认的是反斜杠(backslash:\ )

例如:load data infile "/home/mark/Orders txt" replace into table Orders fields terminated

by',' enclosed by '"';

(2)lines 关键字指定了每条记录的分隔符默认为'\n'即为换行符

如果两个字段都指定了那fields必须在lines之前。如果不指定fields关键字缺省值与如果你这样

写的相同:fields terminated by'\t' enclosed by ’ '' ‘ escaped by'\\'

如果你不指定一个lines子句,缺省值与如果你这样写的相同:lines terminated by'\n'

例如:load data infile "/jiaoben/load.txt" replace into table test fields terminated by ',' lines

terminated by '/n';

5 load data infile可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导入

的时候,,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。

比方说,我们要从Access数据库升级到MySQL数据库的时候

下面的例子显示了如何向指定的栏目(field)中导入数据:

load data infile "/home/Order txt" into table Orders(Order_Number, Order_Date,

Customer_ID);

6 当在服务器主机上寻找文件时,服务器使用下列规则:

(1)如果给出一个绝对路径名,服务器使用该路径名。

(2)如果给出一个有一个或多个前置部件的相对路径名,服务器相对服务器的数据目录搜索

文件。

(3)如果给出一个没有前置部件的一个文件名,服务器在当前数据库的数据库目录寻找文件



例如: /myfile txt”给出的文件是从服务器的数据目录读取,而作为“myfile txt”给出的一个文件

是从当前数据库的数据库目录下读取。

注意:字段中的空值用\N表示

我的文章一般浅显易懂,不会搞那么深入让大家很难理解。(其实我水平也不咋样)

LOAD DATA INFILE 一直被认为是MySQL很强大的一个数据导入工具,因为他速度非常的快。

不过有几个问题一定要注意

1、编码。

2、灵活导入导出。

我来举两个例子说明一下。

一、关于编码

我们的示例文本文件:

"我爱你","20","相貌平常,经常耍流氓!哈哈"

"李奎","21","相貌平常,经常耍流氓!哈哈"

"王二米","20","相貌平常,经常耍流氓!哈哈"

"老三","24","很强"

"老四","34","XXXXX"

"老五","52","***%*¥*¥*¥*¥"

"小猫","45","中间省略。。。"

"小狗","12","就会叫"

"小妹","21","PP的很"

"小坏蛋","52","表里不一"

"上帝他爷","96","非常英俊"

"MM来了","10","。。。"

"歌颂党","20","社会主义好"

"人民好","20","的确是好"

"老高","10","学习很好"

"斜三","60","眼睛斜了"

"中华之子","100","威武的不行了"

"大米","63","我爱吃"

"苹果","15","好吃"

我们的示例表结构:

+-------+--------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

---------------------------------------------------------+

| Table | Create Table

|

+-------+--------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

---------------------------------------------------------+

| t0 | CREATE TABLE `t0` (

`id` bigint(20) unsigned NOT NULL auto_increment,

`name` char(20) NOT NULL,

`age` tinyint(3) unsigned NOT NULL,

`description` text NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `idx_name` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

+-------+--------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

---------------------------------------------------------+

1 row in set (0.00 sec)

我们把这个文本文件从WINDOWS 下COPY到LINUX下看看

mysql> load data infile '/tmp/t0.txt' ignore into table t0 character set gbk fields terminated

by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);

Query OK, 19 rows affected (0.01 sec)

Records: 19 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t0;

+----+----------+-----+----------------------------+

| id | name | age | description |

+----+----------+-----+----------------------------+

| 1 | 我爱你 | 20 | 相貌平常,经常耍流氓!哈哈 |

| 2 | 李奎 | 21 | 相貌平常,经常耍流氓!哈哈 |

| 3 | 王二米 | 20 | 相貌平常,经常耍流氓!哈哈 |

| 4 | 老三 | 24 | 很强 |

| 5 | 老四 | 34 | XXXXX |

| 6 | 老五 | 52 | ***%*¥*¥*¥*¥ |

| 7 | 小猫 | 45 | 中间省略。。。 |

| 8 | 小狗 | 12 | 就会叫 |

| 9 | 小妹 | 21 | PP的很 |

| 10 | 小坏蛋 | 52 | 表里不一 |

| 11 | 上帝他爷 | 96 | 非常英俊 |

| 12 | MM来了 | 10 | 。。。 |

| 13 | 歌颂党 | 20 | 社会主义好 |

| 14 | 人民好 | 20 | 的确是好 |

| 15 | 老高 | 10 | 学习很好 |

| 16 | 斜三 | 60 | 眼睛斜了 |

| 17 | 中华之子 | 100 | 威武的不行了 |

| 18 | 大米 | 63 | 我爱吃 |

| 19 | 苹果 | 15 | 好吃 |

+----+----------+-----+----------------------------+

19 rows in set (0.00 sec)

我来说明一下相关的参数

关于我的导入语句,我现在直说两个,其他的参考手册。

character set gbk;

这个字符集一定要写,要不然就会乱码或者只导入一部分数据。

ignore into table

因为name 列加了唯一索引,加这个是为了避免重复数据插入报错。

加入我们再次运行这个导入语句就会发现

Query OK, 0 rows affected (0.00 sec)

Records: 19 Deleted: 0 Skipped: 19 Warnings: 0

没有任何值导入,因为里面已经有了相同的值。

这里也可以用replace into table

MySQL会把相同的先干掉,再插入新的值。

mysql> load data infile '/tmp/t0.txt' replace into table t0 character set gbk fields terminated

by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);

Query OK, 38 rows affected (0.00 sec)

Records: 19 Deleted: 19 Skipped: 0 Warnings: 0

mysql> select * from t0;

+----+----------+-----+----------------------------+

| id | name | age | description |

+----+----------+-----+----------------------------+

| 20 | 我爱你 | 20 | 相貌平常,经常耍流氓!哈哈 |

| 21 | 李奎 | 21 | 相貌平常,经常耍流氓!哈哈 |

| 22 | 王二米 | 20 | 相貌平常,经常耍流氓!哈哈 |

| 23 | 老三 | 24 | 很强 |

| 24 | 老四 | 34 | XXXXX |

| 25 | 老五 | 52 | ***%*¥*¥*¥*¥ |

| 26 | 小猫 | 45 | 中间省略。。。 |

| 27 | 小狗 | 12 | 就会叫 |

| 28 | 小妹 | 21 | PP的很 |

| 29 | 小坏蛋 | 52 | 表里不一 |

| 30 | 上帝他爷 | 96 | 非常英俊 |

| 31 | MM来了 | 10 | 。。。 |

| 32 | 歌颂党 | 20 | 社会主义好 |

| 33 | 人民好 | 20 | 的确是好 |

| 34 | 老高 | 10 | 学习很好 |

| 35 | 斜三 | 60 | 眼睛斜了 |

| 36 | 中华之子 | 100 | 威武的不行了 |

| 37 | 大米 | 63 | 我爱吃 |

| 38 | 苹果 | 15 | 好吃 |

+----+----------+-----+----------------------------+

19 rows in set (0.00 sec)

(`name`,`age`,`description`);

这些也就是具体的表属性了,指明这个就可以导入想要的数据。

2、关于灵活性,其实也就是一个记录功能

如果想在导入的时候记录一下导入的具体时间怎么办?

我们来看看

先加一个时间属性记录导入时间。

mysql> alter table t0 add update_time timestamp not null;

Query OK, 19 rows affected (0.00 sec)

Records: 19 Duplicates: 0 Warnings: 0

干掉唯一索引

mysql> alter table t0 drop index idx_name;

Query OK, 19 rows affected (0.00 sec)

Records: 19 Duplicates: 0 Warnings: 0

mysql> load data infile '/tmp/t0.txt' into table t0 character set gbk fields terminated by ','

enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`) set

update_time=current_timestamp;

Query OK, 19 rows affected (0.00 sec)

Records: 19 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t0;

+----+----------+-----+----------------------------+---------------------+

| id | name | age | description | update_time |

+----+----------+-----+----------------------------+---------------------+

| 20 | 我爱你 | 20 | 相貌平常,经常耍流氓!哈哈 | 0000-00-00 00:00:00 |

…………

| 24 | 老四 | 34 | XXXXX | 0000-00-00 00:00:00 |

| 25 | 老五 | 52 | ***%*¥*¥*¥*¥ | 0000-00-00 00:00:00 |

…………

| 35 | 斜三 | 60 | 眼睛斜了 | 0000-00-00 00:00:00 |

| 36 | 中华之子 | 100 | 威武的不行了 | 0000-00-00 00:00:00 |

…………

| 60 | 王二米 | 20 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 |

…………

| 68 | 上帝他爷 | 96 | 非常英俊 | 2008-06-30 14:58:37 |

| 69 | MM来了 | 10 | 。。。 | 2008-06-30 14:58:37 |

…………

| 75 | 大米 | 63 | 我爱吃 | 2008-06-30 14:58:37 |

| 76 | 苹果 | 15 | 好吃 | 2008-06-30 14:58:37 |

+----+----------+-----+----------------------------+---------------------+

38 rows in set (0.00 sec)

新导入的19条记录时间被记录了下来。

只是之前的数据库没有记录,不过现在不需要这些重复数据了。

干掉他就可以了

mysql> alter table t0 order by id desc;

Query OK, 38 rows affected (0.01 sec)

Records: 38 Duplicates: 0 Warnings: 0

mysql> alter ignore table t0 add unique index idx_name (`name`);

Query OK, 38 rows affected (0.00 sec)

Records: 38 Duplicates: 19 Warnings: 0

mysql> alter table t0 order by id asc;

Query OK, 19 rows affected (0.01 sec)

Records: 19 Duplicates: 0 Warnings: 0

mysql> select * from t0;

+----+----------+-----+----------------------------+---------------------+

| id | name | age | description | update_time |

+----+----------+-----+----------------------------+---------------------+

| 58 | 我爱你 | 20 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 |

| 59 | 李奎 | 21 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 |

| 60 | 王二米 | 20 | 相貌平常,经常耍流氓!哈哈 | 2008-06-30 14:58:37 |

| 61 | 老三 | 24 | 很强 | 2008-06-30 14:58:37 |

| 62 | 老四 | 34 | XXXXX | 2008-06-30 14:58:37 |

| 63 | 老五 | 52 | ***%*¥*¥*¥*¥ | 2008-06-30 14:58:37 |

| 64 | 小猫 | 45 | 中间省略。。。 | 2008-06-30 14:58:37 |

| 65 | 小狗 | 12 | 就会叫 | 2008-06-30 14:58:37 |

| 66 | 小妹 | 21 | PP的很 | 2008-06-30 14:58:37 |

| 67 | 小坏蛋 | 52 | 表里不一 | 2008-06-30 14:58:37 |

| 68 | 上帝他爷 | 96 | 非常英俊 | 2008-06-30 14:58:37 |

| 69 | MM来了 | 10 | 。。。 | 2008-06-30 14:58:37 |

| 70 | 歌颂党 | 20 | 社会主义好 | 2008-06-30 14:58:37 |

| 71 | 人民好 | 20 | 的确是好 | 2008-06-30 14:58:37 |

| 72 | 老高 | 10 | 学习很好 | 2008-06-30 14:58:37 |

| 73 | 斜三 | 60 | 眼睛斜了 | 2008-06-30 14:58:37 |

| 74 | 中华之子 | 100 | 威武的不行了 | 2008-06-30 14:58:37 |

| 75 | 大米 | 63 | 我爱吃 | 2008-06-30 14:58:37 |

| 76 | 苹果 | 15 | 好吃 | 2008-06-30 14:58:37 |

+----+----------+-----+----------------------------+---------------------+

19 rows in set (0.00 sec)

现在是达到了目的了,为啥中途要干掉唯一索引呢?因为set 语法 再有IGNORE 的时候会忽略

掉。

导入csv数据时,Load Data Local Infile的权限问题

把数据从csv文件导入到mysql中,查看了一下mysql的导入命令:load data infile,其命令格式如下:

LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE ''file_name.txt'' [REPLACE | IGNORE]

INTO TABLE table_name

[FIELDS

[TERMINATED BY ''\t'']

[OPTIONALLY] ENCLOSED BY '''']

[ESCAPED BY ''\\'' ]]

[LINES TERMINATED BY ''\n'']

[IGNORE number LINES]

[(col_name,...)]

由于是本地主机,不在mysql服务器上,因此使用Local选项,但是总是会报错:“The used command is not allowed with this MySQL version”。

查了些资料才发现Load Data的权限不对,有两种方法可以解决:

1、通过在/etc/mysql/my.cnf文件中添加local-infile = 1来修改权限是的可以加载本地文件。当然也可以通过local-infile = 0来禁止掉。修改my.cnf后必须重启mysql。

2、通过启动时,>mysql -uroot -ppassword --local-infile = [0|1] 来修改权限。

MYSQL LOAD DATA LOCAL INFILE 支持问题

执行报错:ERROR 1148 (42000): The used command is not allowed with this MySQL version

解决方法:

先进入MYSQL检查一下版本号:5.1或者以上的都支持。

mysql> select version()

1.由于MYSQL编译安装时默认不允许执行这个命令。

1)安装时加上 --enable-local-infile 参数就可以了执行了。

./configure --prefix=/usr/local/mysql --enable-local-infile

make

make install

2.可以在执行命中加上--local-infile=1 参数即可解决。

如:/usr/local/mysql/bin/mysql -uroot -h192.168.0.2 -proot databaseName --local-infile=1 -e "LOAD DATA LOCAL INFILE 'data.txt' into table test(name,sex) "

[注:

-uroot:登录数据库用户名

-h192.168.0.2:登录数据库密码

-proot:数据库端口,当为默认端口3306时,可省略

databaseName:数据库名

]

*****************************************************************************************************

mysql load data infile 文件没有找到(can't get file stat)

使用mysql 的时候用到了load data infile 的命令,为什么用这个命令和命令怎么用不解释,参考手册已经很详细了,只说出现的问题。

1.被处理的文件需要严谨的文件格式。

2.路径问题,注意windows 下\\和linux 下/的区别。

3.权限问题,主要针对linux,其实也是程序处理linux文件都要考虑的问题。

4.安全问题,重点,我就为了解决这个问题搞了两天,网络上,就把文档上的东西贴上去完事,说的太模糊而且也不容易懂。

比如主机A上装了MYSQL,待处理文件F在A上,在A上用程序处理load data infile 是没有问题的。事情往往比想象的困难,现在主机B来了,需要用程序把B上的文件用程序处理 load data infile到A中的数据库中,如果不加任何处理的话是不能成功的,当你运行程序的时候,会给出找不到文件的错误提示。你会很奇怪明明文件就在那里怎么能找不到呢?

且看文档中的内容:

如果指定了LOCAL,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。

· 如果LOCAL没有被指定,则文件必须位于服务器主机上,并且被服务器直接读取。

当在服务器主机上为文件定位时,服务器使用以下规则:

· 如果给定了一个绝对的路径名称,则服务器使用此路径名称。

· 如果给定了带有一个或多个引导组件的相对路径名称,则服务器会搜索相对于服务器数据目录的文件。

· 如果给定了一个不带引导组件的文件名称,则服务器会在默认数据库的数据库目录中寻找文件。

注意,这些规则意味着名为./myfile.txt的文件会从服务器数据目录中被读取,而名为myfile.txt的同样的文件会从默认数据库的数据库目录中读取。例如,下面的LOAD DATA语句会从db1数据库目录中读取文件data.txt,因为db1是当前数据库。即使语句明确把文件载入到db2数据库中的表里,也会从db1目录中读取。

mysql> USE db1;

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

注意,使用正斜杠指定Windows路径名称,而不是使用反斜杠。如果您使用反斜杠,您必须使用两个。

出于安全原因,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。另外,要对服务器文件使用LOAD DATA INFILE,您必须拥有FILE权限。

上面说的很多,刚开始看不好懂,简要说明下,就是说如果使用load data infile 命令加载文件的时候,不管你文件在哪里它只加载装了mysql 的机器上的本地文件,因此想上面说的 调用B机器上的程序处理load data infile 的命令的时候,A机器接收到这个命令就会从A机器上找这个文件,因此file not found exception 也是理所当然的,对数据来说它就是没有知道文件嘛。

说了这么多那怎么办呢,当然有办法——使用local关键字,即load data local infile

说到 local关键字,需要再解释下。

上面的文档也说如果指定了local,会从客户端(B)读取到(A)机器之后再进行处理。--local-infile 属性是用来控制这条命令的。

默认情况下是可以使用这条命令的,主要是为了跟MySQL 3.23.48 和以前的版本兼容,如果要禁止使用的话,使用--local-infile=0 选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL 命令

如果LOAD DATA LOCAL INFILE 在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:

ERROR 1148: The used command is not allowed with this MySQL version



查看MySQL系统变量的命令

mysql> SHOW VARIABLES;

+---------------------------------+-------------------------------------------+

| Variable_name | Value |

+---------------------------------+-------------------------------------------+

| auto_increment_increment | 1 |

| auto_increment_offset | 1 |

| automatic_sp_privileges | ON |

| back_log | 50 |

| basedir | /home/jon/bin/mysql/ |

| binlog_cache_size | 32768 |

| bulk_insert_buffer_size | 8388608 |

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | latin1 |

| character_set_results | latin1 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /home/jon/bin/mysql/share/mysql/charsets/ |

| collation_connection | latin1_swedish_ci |

| collation_database | latin1_swedish_ci |

| collation_server | latin1_swedish_ci |

| completion_type | 0 |

| concurrent_insert | 1 |

| connect_timeout | 5 |

| datadir | /home/jon/bin/mysql/var/ |

| date_format | %Y-%m-%d |

| datetime_format | %Y-%m-%d %H:%i:%s |

| default_week_format | 0 |

| delay_key_write | ON |

| delayed_insert_limit | 100 |

| delayed_insert_timeout | 300 |

| delayed_queue_size | 1000 |

| div_precision_increment | 4 |

| engine_condition_pushdown | OFF |

| expire_logs_days | 0 |

| flush | OFF |

| flush_time | 0 |

| ft_boolean_syntax | + -><()~*:""&| |

| ft_max_word_len | 84 |

| ft_min_word_len | 4 |

| ft_query_expansion_limit | 20 |

| ft_stopword_file | (built-in) |

| group_concat_max_len | 1024 |

| have_archive | YES |

| have_bdb | NO |

| have_blackhole_engine | YES |

| have_compress | YES |

| have_crypt | YES |

| have_csv | YES |

| have_example_engine | NO |

| have_federated_engine | NO |

| have_geometry | YES |

| have_innodb | YES |

| have_isam | NO |

| have_ndbcluster | DISABLED |

| have_openssl | NO |

| have_partition_engine | YES |

| have_query_cache | YES |

| have_raid | NO |

| have_rtree_keys | YES |

| have_symlink | YES |

| init_connect | |

| init_file | |

| init_slave | |

| innodb_additional_mem_pool_size | 1048576 |

| innodb_autoextend_increment | 8 |

| innodb_buffer_pool_awe_mem_mb | 0 |

| innodb_buffer_pool_size | 8388608 |

| innodb_checksums | ON |

| innodb_commit_concurrency | 0 |

| innodb_concurrency_tickets | 500 |

| innodb_data_file_path | ibdata1:10M:autoextend |

| innodb_data_home_dir | |

| innodb_doublewrite | ON |

| innodb_fast_shutdown | 1 |

| innodb_file_io_threads | 4 |

| innodb_file_per_table | OFF |

| innodb_flush_log_at_trx_commit | 1 |

| innodb_flush_method | |

| innodb_force_recovery | 0 |

| innodb_lock_wait_timeout | 50 |

| innodb_locks_unsafe_for_binlog | OFF |

| innodb_log_arch_dir | |

| innodb_log_archive | OFF |

| innodb_log_buffer_size | 1048576 |

| innodb_log_file_size | 5242880 |

| innodb_log_files_in_group | 2 |

| innodb_log_group_home_dir | ./ |

| innodb_max_dirty_pages_pct | 90 |

| innodb_max_purge_lag | 0 |

| innodb_mirrored_log_groups | 1 |

| innodb_open_files | 300 |

| innodb_support_xa | ON |

| innodb_sync_spin_loops | 20 |

| innodb_table_locks | ON |

| innodb_thread_concurrency | 20 |

| innodb_thread_sleep_delay | 10000 |

| interactive_timeout | 28800 |

| join_buffer_size | 131072 |

| key_buffer_size | 8388600 |

| key_cache_age_threshold | 300 |

| key_cache_block_size | 1024 |

| key_cache_division_limit | 100 |

| language | /home/jon/bin/mysql/share/mysql/english/ |

| large_files_support | ON |

| large_page_size | 0 |

| large_pages | OFF |

| license | GPL |

| local_infile | ON |

| locked_in_memory | OFF |

| log | ON |

| log_bin | ON |

| log_bin_trust_routine_creators | OFF |

| log_error | /home/jon/bin/mysql/var/master1.err |

| log_slave_updates | OFF |

| log_slow_queries | OFF |

| log_warnings | 1 |

| long_query_time | 10 |

| low_priority_updates | OFF |

| lower_case_file_system | OFF |

| lower_case_table_names | 0 |

| max_allowed_packet | 1048576 |

| max_binlog_cache_size | 4294967295 |

| max_binlog_size | 1073741824 |

| max_connect_errors | 10 |

| max_connections | 100 |

| max_delayed_threads | 20 |

| max_error_count | 64 |

| max_heap_table_size | 16777216 |

| max_insert_delayed_threads | 20 |

| max_join_size | 4294967295 |

| max_length_for_sort_data | 1024 |

| max_relay_log_size | 0 |

| max_seeks_for_key | 4294967295 |

| max_sort_length | 1024 |

| max_tmp_tables | 32 |

| max_user_connections | 0 |

| max_write_lock_count | 4294967295 |

| multi_range_count | 256 |

| myisam_data_pointer_size | 6 |

| myisam_max_sort_file_size | 2147483647 |

| myisam_recover_options | OFF |

| myisam_repair_threads | 1 |

| myisam_sort_buffer_size | 8388608 |

| ndb_autoincrement_prefetch_sz | 32 |

| ndb_cache_check_time | 0 |

| ndb_force_send | ON |

| ndb_index_stat_cache_entries | 32 |

| ndb_index_stat_enable | ON |

| ndb_index_stat_update_freq | 20 |

| ndb_use_exact_count | ON |

| ndb_use_transactions | ON |

| net_buffer_length | 16384 |

| net_read_timeout | 30 |

| net_retry_count | 10 |

| net_write_timeout | 60 |

| new | OFF |

| old_alter_table | OFF |

| old_passwords | OFF |

| open_files_limit | 1024 |

| optimizer_prune_level | 1 |

| optimizer_search_depth | 62 |

| pid_file | /home/jon/bin/mysql/var/hostname.pid1 |

| port | 3306 |

| preload_buffer_size | 32768 |

| protocol_version | 10 |

| query_alloc_block_size | 8192 |

| query_cache_limit | 1048576 |

| query_cache_min_res_unit | 4096 |

| query_cache_size | 0 |

| query_cache_type | ON |

| query_cache_wlock_invalidate | OFF |

| query_prealloc_size | 8192 |

| range_alloc_block_size | 2048 |

| read_buffer_size | 131072 |

| read_only | OFF |

| read_rnd_buffer_size | 262144 |

| relay_log_purge | ON |

| relay_log_space_limit | 0 |

| rpl_recovery_rank | 0 |

| secure_auth | OFF |

| server_id | 1 |

| skip_external_locking | ON |

| skip_networking | OFF |

| skip_show_database | OFF |

| slave_compressed_protocol | OFF |

| slave_load_tmpdir | /tmp/ |

| slave_net_timeout | 3600 |

| slave_skip_errors | OFF |

| slave_transaction_retries | 10 |

| slow_launch_time | 2 |

| socket | /tmp/mysql.sock |

| sort_buffer_size | 2097144 |

| sql_mode | |

| sql_notes | ON |

| sql_warnings | ON |

| storage_engine | MyISAM |

| sync_binlog | 0 |

| sync_frm | ON |

| sync_replication | 0 |

| sync_replication_slave_id | 0 |

| sync_replication_timeout | 10 |

| system_time_zone | EST |

| table_cache | 64 |

| table_lock_wait_timeout | 50 |

| table_type | MyISAM |

| thread_cache_size | 0 |

| thread_stack | 196608 |

| time_format | %H:%i:%s |

| time_zone | SYSTEM |

| timed_mutexes | OFF |

| tmp_table_size | 33554432 |

| tmpdir | |

| transaction_alloc_block_size | 8192 |

| transaction_prealloc_size | 4096 |

| tx_isolation | REPEATABLE-READ |

| updatable_views_with_limit | YES |

| version | 5.1.2-alpha-log |

| version_comment | Source distribution |

| version_compile_machine | i686 |

| version_compile_os | suse-linux |

| wait_timeout | 28800 |

+---------------------------------+-------------------------------------------+

218 rows in set (0.03 sec)

Win下Mysql根治ERROR 1045 (28000): Access denied for user的方法(绝对有效)

针对ERROR 1045 (28000): Access denied for user这个错误,网上大部分的办法是这样的:

1.停止Mysql服务

2.用mysqld -nt --skip-grant-tables方式启动(或者把my.ini里加一行-skip-grant-tables)

3.mysql -uroot直接进去

4.update user set password = password('newpass') where user = 'root';

5.结束mysqld -nt进程(或者去掉my.ini里的-skip-grant-tables)

6.启动Mysql服务

但是,这样做完之后,当你重启电脑后进入mysql却发现又出现ERROR 1045 (28000)了,用新修改的密码也进不了,这是为什么呢?

其实很简单,这是是一个数据路径的问题。

在Win平台下,Mysql的程序目录和数据目录默认是分开的,比如Mysql安装在 X:\Programs Files\Mysql 下,那么它的数据则存放在 X:\Programs Data\Mysql\Data 下,并且my.ini里的datadir默认也是 X:\Programs Data\Mysql\Data 这样一来用-skip-grant-tables强制修改密码就有问题了,因为用 -skip-grant-tables 修改后的用户数据被放在了 X:\Programs Files\Mysql\Data
下面

以Mysql5.6为例,比如程序安装在F:\Programs Files\Mysql\Mysql Server 5.6\下,数据文件存放在F:\Programs Data\Mysql\Mysql Server 5.6\下,正常情况下,数据的修改只会影响F:\Programs Data\Mysql\Mysql Server 5.6\Data里的文件,但是如果你用 -skip-grant-tables 修改了用户表user的话,修改后的数据则放在了 F:\Programs Files\Mysql\Mysql
Server 5.6\Data 里面(比如新修改的root密码),而F:\Programs Data\Mysql\Mysql Server 5.6\Data 里的用户信息根本没变,这样你下次用新修改的密码登录的时候自然还会出错,因此在update user set password = password('newpass') where user = 'root';之后,一定要把F:\Programs Files\Mysql\Mysql Server 5.6\Data\Mysql,F:\Programs Files\Mysql\Mysql
Server 5.6\Data\performance_schema 这两个数据库文件夹 覆盖到 F:\Programs Data\Mysql\Mysql Server 5.6\Data 里面去,然后再启动mysql,问题就解决了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: