mysql没有“独立的数据临时表空间权限”,create temporary tables是数据库级权限,与表空间配置无关;临时表默认存于全局临时表空间ibtmp1,用户无法指定存储位置或授予表空间相关权限。

MySQL 没有“独立的数据临时表空间权限”这个概念
直接说结论:CREATE TEMPORARY TABLES 是数据库级权限,和表空间(如 innodb_file_per_table、CREATE TABLESPACE)完全无关。用户能否建临时表,只取决于是否被授予 CREATE TEMPORARY TABLES ON db_name.*,跟用哪个表空间存临时表、是否启用独立表空间、甚至是否能访问 ibtmp1 都不挂钩。
临时表实际存哪?由 server 决定,用户无权指定
MySQL 的临时表(CREATE TEMPORARY TABLE)默认全部写入**全局临时表空间**(ibtmp1),不是系统表空间(ibdata1),也不是独立表空间(.ibd 文件)。这个行为不可被用户控制:
- 即使你启用了
innodb_file_per_table=ON,它只影响普通 InnoDB 表,对临时表无效 - 你无法在
CREATE TEMPORARY TABLE语句里加TABLESPACE子句(会报错ERROR 1064) - MySQL 8.0.13+ 虽支持
CREATE TABLESPACE ... TYPE = TEMPORARY,但那是给内部优化器用的,不开放给用户显式绑定
真正要配的只有权限 + 库绑定
用户要成功执行 CREATE TEMPORARY TABLE t AS SELECT ...,必须同时满足两个硬条件:
-
GRANT CREATE TEMPORARY TABLES ON app_db.* TO 'u'@'%'—— 权限必须精确到库,不能是*.*(5.7 不支持,8.0+ 语法允许但语义危险) -
GRANT SELECT ON app_db.real_table TO 'u'@'%'—— 临时表里的SELECT源表,得有对应读权限;如果跨库查other_db.t,还得额外给other_db的SELECT - 执行时当前 session 必须
USE app_db或显式带库前缀,否则CREATE TEMPORARY TABLE t AS SELECT ... FROM real_table会因解析上下文失败而报错
容易被当成“空间权限”的混淆点
有人看到 innodb_temp_data_file_path 或 tmpdir 就以为能授权,其实这些是 server 级配置:
-
tmpdir控制磁盘临时文件(如排序、JOIN 中间结果),和CREATE TEMPORARY TABLE无关 -
innodb_temp_data_file_path只决定ibtmp1放哪、多大,DBA 配,用户无感知也无权改 - 试图给用户授
CREATE TABLESPACE权限来“管临时表空间”,纯属方向错误——该权限只用于创建通用表空间(CREATE TABLESPACE ts ADD DATAFILE 'ts.ibd'),且普通用户根本不该有
真正的权限边界就两条:能不能建(CREATE TEMPORARY TABLES)、能不能捞数据(SELECT on source tables)。其余全是 server 层面的资源调度,不在用户权限模型里。











