Unable to use slave's temporary directory /tmp - Can't create/write to file '/tmp/SQL_LOAD-' (Errcode: 17)

这个错误时在Mysql主从配置产生的,最后找到这个Mysql的一个bug

http://bugs.mysql.com/bug.php?id=62055

bug的主要原因是:打开文件的函数中指定打开模式时,如果O_CREAT和O_EXCL同时指定,那么当文件存在时会导致打开文件出错,这个使用方法本来也没有什么错误,但是当使用Mysql主从备份机制,在一台服务器上安装多个mysqld实例时,就会出问题,代码在Mysql源码中/sql/slave.cc文件中,Mysql5.1.68是在2904行

/*
  Check the temporary directory used by commands like
  LOAD DATA INFILE.
 */
static
int check_temp_dir(char* tmp_file)
{
  int fd;
  MY_DIR *dirp;
  char tmp_dir[FN_REFLEN];
  size_t tmp_dir_size;

  DBUG_ENTER("check_temp_dir");

  /*
    Get the directory from the temporary file.
  */
  dirname_part(tmp_dir, tmp_file, &tmp_dir_size);

  /*
    Check if the directory exists.
   */
  if (!(dirp=my_dir(tmp_dir,MYF(MY_WME))))
    DBUG_RETURN(1);
  my_dirend(dirp);

  /*
    Check permissions to create a file.
   */
  if ((fd= my_create(tmp_file, CREATE_MODE,
                     O_WRONLY | O_BINARY | O_EXCL | O_NOFOLLOW,
                     MYF(MY_WME))) < 0)
  DBUG_RETURN(1);

  /*
    Clean up.
   */
  my_close(fd, MYF(0));
  my_delete(tmp_file, MYF(0));

  DBUG_RETURN(0);
}

上面红色的是调用了一个函数打开文件,my_create,在这个函数中第三个参数传递了O_EXCL,但是并没有O_CREAT,下面继续看my_create函数,它在/mysys/my_create.c文件中定义

File my_create(const char *FileName, int CreateFlags, int access_flags,
           myf MyFlags)
{
  int fd, rc;
  DBUG_ENTER("my_create");
  DBUG_PRINT("my",("Name: ‘%s‘ CreateFlags: %d  AccessFlags: %d  MyFlags: %d",
           FileName, CreateFlags, access_flags, MyFlags));

#if !defined(NO_OPEN_3)
  fd = open((char *) FileName, access_flags | O_CREAT,
        CreateFlags ? CreateFlags : my_umask);
#elif defined(VMS)
  fd = open((char *) FileName, access_flags | O_CREAT, 0,
        "ctx=stm","ctx=bin");
#elif defined(__WIN__)
  fd= my_sopen((char *) FileName, access_flags | O_CREAT | O_BINARY,
           SH_DENYNO, MY_S_IREAD | MY_S_IWRITE);
#else
  fd = open(FileName, access_flags);
#endif

  if ((MyFlags & MY_SYNC_DIR) && (fd >=0) &&
      my_sync_dir_by_file(FileName, MyFlags))
  {
    my_close(fd, MyFlags);
    fd= -1;
  }

  rc= my_register_filename(fd, FileName, FILE_BY_CREATE,
                           EE_CANTCREATEFILE, MyFlags);
  /*
    my_register_filename() may fail on some platforms even if the call to
    *open() above succeeds. In this case, don‘t leave the stale file because
    callers assume the file to not exist if my_create() fails, so they don‘t
    do any cleanups.
  */
  if (unlikely(fd >= 0 && rc < 0))
  {
    int tmp= my_errno;
    my_delete(FileName, MyFlags);
    my_errno= tmp;
  }

  DBUG_RETURN(rc);
} /* my_create */

红色的字体部分代码是为了实现跨平台,其中默认是蓝色字体代码,可以明显的看到,这时将O_CREAT添加进来了,此时就造成了O_CREAT和O_EXCL同时使用了。

在POSIX关于open函数的文档中可以看到,当O_CREAT和O_EXCL同时使用时,如果文件存在就会失败。

http://linux.die.net/man/3/open

Unable to use slave's temporary directory /tmp - Can't create/write to file '/tmp/SQL_LOAD-' (Errcode: 17)

时间: 2024-10-10 03:20:54

Unable to use slave's temporary directory /tmp - Can't create/write to file '/tmp/SQL_LOAD-' (Errcode: 17)的相关文章

mysql报Can&#39;t create/write to file &#39;/tmp/ib0n3frL&#39; (Errcode: 13 - Permission denied)

初始化数据库报错 [[email protected] mysql-5.6.24]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data Installing MySQL system tables...2017-04-03 19:52:21 0 [Warning] TIMESTAMP with implicit DEFA

ERROR 1 (HY000): Can&#39;t create/write to file &#39;/tmp/#sql_830_0.MYI&#39; (Errcode: 13)

mysql操作时,出现报错. 执行describe 命令时, 临时文件目录没有创建或者无写入权限:于是: cd /var/lib/mysql/ #进入mysql数据目录 mkdir tmp #创建需要的临时目录 chown mysql.mysql /var/lib/mysql/tmp #给临时目录分配mysql权限用户及群组 ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_830_0.MYI' (Errcode: 13)

编译安装mysql ERROR: 1 Can&#39;t create/write to file &#39;/tmp/#sql_86b_0.MYI&#39;

之前安装一个5.1版本,试了一个5.5版本,useradd -s /sbin/nologin -M mysql   创建一个mysql用户mkdir -p /data/mysql chmod -R /data/mysql cd /usr/local/mysqlscripts/mysql_install_db --user=mysql --datadir=/data/mysql出现报错:ERROR: 1  Can't create/write to file '/tmp/#sql_86b_0.MY

ERROR 1 (HY000): Can&#39;t create/write to file &#39;/tmp/#sql_909_0.MYI&#39; (Errcode: 13)

mysql> desc tablename; ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_909_0.MYI' (Errcode: 13) 两种解决办法:方法一:1.chmod 777 /tmp[[email protected] /]# chmod 777 /tmpchmod: 更改"/tmp" 的权限: 只读文件系统 --遇到这种情况,tmp权限无法更改. 2./etc/init.d/mysqld start

ERROR 1 (HY000): Can&#39;t create/write to file &#39;/tmp/#sql_4188_1.MYI&#39; (Errcode: 28)

mysql Errcode 28 磁盘还可以但是inode表没有了 dd if=/dev/zero of=tmpforinde count=1024 bs=1024KB mke2fs -N 5000000 -b 1024 -I 128 tmpforinde #格式化成ext2分区(因为ext3有日志系统,会消耗空间),制定inode大小为 mount -o loop tmpforinde /var/tmp [email protected]:/var# df -h Filesystem Size

svn: Can&#39;t find a temporary directory 问题解决

今天做项目的时候svn突然提更新不了,但是能提交,我以为是IDE自带的svn出问题,但是使用了其他的svn客户端还是不能更新代码,很是诡异! 错误出现: svn: Can't find a temporary directory 解决办法:网上搜了搜说一般这种情况出现在服务器端,磁盘慢了的情况: 我的svn服务器为Centos 6.5,于是我查看了一下硬盘使用情况, [[email protected] /]# df -hT Filesystem                   Type  

ERROR: Unable to clean up existing run directory

Project Navigator - Launching PlanAhead gives: ERROR: Unable to clean up existing run directory Description When running any process that will Launch the PlanAhead GUI (e.g. floor planning, Pin planning, analyze timing) I get an error about not being

virtualbox 安装 extension pack 方法以及出现 &quot;The installer failed with exit code 1: VBoxExtPackHelperApp.exe: error: Failed to rename the temporary directory to the final one&quot;的解决办法

virtualbox 的版本:5.1.26    下载地址:https://www.virtualbox.org/wiki/Downloads extension pack 的版本:5.1.26    下载地址:https://www.virtualbox.org/wiki/Downloads extension pack 安装: 1. 运行virtualbox,“管理” → “全局设定”: 2. 在弹出的 “全局设定” 界面左侧点击选中 “扩展”,然后在右侧点击添加新包按钮导入extensio

FRM-41839: Disk I/O error on temporary record buffer file /tmp/...TMP

这个错误是在处理很大数据量的时候才产生的, 比如做Physical Inventory Adjustment, 由于EBS 需要庞大的数据, 系统会在 /tmp 目录下使用一个临时文件 *.TMP, 结束后这个临时文件就被删了. 如果数据量实在太大, 就可能报这个错了: FRM-41839: Disk I/O error on temporary record buffer file /tmp/...TMP 报这个错的原因可能是 /tmp 目录分配的空间太小, 磁盘空间不够了. 但是即使这个目录