免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3966 | 回复: 11
打印 上一主题 下一主题

load data infile '...' into table ...的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-08 14:39 |只看该作者 |倒序浏览
今天在实验load data infile '...' into table ..的时候遇到了一个十分奇怪的问题。请各位达人来回答一下。
是这样的,我以mysql用户运行的一个mysqld服务器,然后以root@localhost的身份登录mysql(注:是数据库里面的root,不是os的root),然后执行了上述load data语句,结果在/tmp文件夹下面创建了一个临时文件,这本来是正常的,但是奇怪的是这个临时文件的属主竟然是root(是os的root,不是数据库的root)!很奇怪的问题。我的os是Linux 2.4的,mysql是5.0。

论坛徽章:
0
2 [报告]
发表于 2008-07-08 18:36 |只看该作者
你mysqld是以root用户运行的??

论坛徽章:
0
3 [报告]
发表于 2008-07-08 19:10 |只看该作者
原帖由 7islands 于 2008-7-8 18:36 发表
你mysqld是以root用户运行的??

不是啊,我说了是以mysql用户,普通用户运行的。

论坛徽章:
0
4 [报告]
发表于 2008-07-08 20:20 |只看该作者
刚才测试了下,没发现load的时候mysqld需要创建临时文件。  

论坛徽章:
0
5 [报告]
发表于 2008-07-08 20:51 |只看该作者
原帖由 7islands 于 2008-7-8 20:20 发表
刚才测试了下,没发现load的时候mysqld需要创建临时文件。  


启用mysql复制的话,会有这个临时文件的

论坛徽章:
0
6 [报告]
发表于 2008-07-09 10:06 |只看该作者

回复 #5 yejr 的帖子

晚上回家重新看看了,好像还是没有啊
1. strace   -otrace mysqld --user=mysql   ;  grep   open trace ;grep  creat trace ;  grep  unlink trace 都没有找到有创建临时文件。
2. mysqld --debug=f,my_open,my_delete,my_creat:t,/tmp/mysqld.trace   看输出也没有找到
3.在代码里 sql/sql_load.cc -> mysql_load()  里好像也没有发现,不过没有看的很仔细。

我的5.0.60的企业版。 测试的load文件很小。

什么时候才会创建临时文件,能详细的说说吗?   谢谢!  

论坛徽章:
0
7 [报告]
发表于 2008-07-09 10:44 |只看该作者
原帖由 7islands 于 2008-7-9 10:06 发表
晚上回家重新看看了,好像还是没有啊
1. strace   -otrace mysqld --user=mysql   ;  grep   open trace ;grep  creat trace ;  grep  unlink trace 都没有找到有创建临时文件。
2. mysqld --debug=f,my_open ...


文件很小的话,mysql复制一用完,就删掉了,你可以搞个while死循环,一直查看是否产生临时文件了,应该能看到。

论坛徽章:
0
8 [报告]
发表于 2008-07-09 12:18 |只看该作者
原帖由 7islands 于 2008-7-9 10:06 发表
晚上回家重新看看了,好像还是没有啊
1. strace   -otrace mysqld --user=mysql   ;  grep   open trace ;grep  creat trace ;  grep  unlink trace 都没有找到有创建临时文件。
2. mysqld --debug=f,my_open ...



在文档说了,只要开启了bin log就会出现临时文件。

Starting from MySQL 4.0.14, the binary log does contain the data, so mysqlbinlog can produce output that reproduces the LOAD DATA INFILE operation without the original data file. mysqlbinlog copies the data to a temporary file and writes a LOAD DATA LOCAL INFILE  statement that refers to the file. The default location of the directory where these files are written is system-specific.

你开启bin log,然后执行load data,然后用mysqlbinlog进去看一下就知道了。

论坛徽章:
0
9 [报告]
发表于 2008-07-09 12:19 |只看该作者
原帖由 yejr 于 2008-7-8 20:51 发表


启用mysql复制的话,会有这个临时文件的



开启复制的原因是使用了bin log,所以会产生临时文件。

论坛徽章:
0
10 [报告]
发表于 2008-07-09 13:25 |只看该作者
    终于搞定了!

结论: load data infile 的时候mysql 是不产生临时文件的, mysql把load的数据写到bin-log中。  

Q: 为什么能看到/tmp 下的临时文件和mysqlbinlog中的 load data local infile '/tmp/xxx' 呢?

A: 原来是mysqlbinlog搞的鬼。 :em11:   它会转换bin-log的格式,临时生成临时文件。

最后,可以问答楼主的问题:
因为你以root权限执行mysqlbiinlog的,所以在/tmp目录下生成的临时文件是root用户的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP