【问题标题】:Error creating temp table创建临时表时出错
【发布时间】:2014-12-16 02:19:39
【问题描述】:

我正在尝试创建一个临时表

CREATE TEMPORARY TABLE `test_table` (
  `test` DATE NOT NULL
);

即使我尝试其他模式,我也会收到以下错误

Can't create table 'db.test_table' (errno: -1)

我尝试用谷歌搜索 -1 错误,但没有成功。

【问题讨论】:

  • 你有创建表的权限吗?尝试修改现有表。
  • 好的,我们可以排除“CREATE TEMPORARY TABLES privilege”问题。您是否使用“apparmor”或其他可能影响 MySQL 行为的安全软件?
  • 我想我明白了。你必须明确地说 ENGINE=MEMORY;
  • 嗯,奇怪。我认为这个查询应该在不指定 ENGINE 的情况下工作。因为如果没有指定引擎,MySQL 将使用默认引擎 (MyISAM)。不管怎样,很高兴你知道了..
  • 您不应仅限于临时表的 MEMORY 引擎。我猜你已经更改了 tmpdir 并且 selinux/apparmor 不允许 mysqld 在新位置创建文件。

标签: mysql temp-tables create-table derived-table


【解决方案1】:

让我们总结一下:

  1. 确保您有权“创建临时表”
  2. 您可能需要指定要使用的确切 ENGINE

    CREATE TEMPORARY TABLE `test_table` (
       `test` DATE NOT NULL
    ) ENGINE=MEMORY;
    
  3. 通过查看其配置,确保安全软件(如“apparmor”)不会影响 MySQL 的行为。尤其是“tmpdir”保护。

更改 apparmor 临时目录的步骤:

  1. 创建新文件夹并将所有权更改为 mysql

    mkdir /mnt/foo/tmp 
    sudo chown mysql:mysql /mnt/foo/tmp
    
  2. 编辑 /etc/mysql/my.cnf 让 MySQL 使用新的 tmpdir

    tmpdir = /mnt/foo/tmp
    
  3. 编辑 /etc/apparmor.d/local/usr.sbin.mysqld 以允许读取和写入文件夹

    /mnt/foo/tmp/ r,
    /mnt/foo/tmp/** rw,
    
  4. 重启服务

    sudo service apparmor reload
    sudo service mysql restart
    

【讨论】:

  • 我可以通过指定引擎创建一个非内存表:CREATE TEMPORARY TABLE test_table (test DATE NOT NULL) ENGINE=MyISAM
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多