我的 /tmp 分区在执行非常大的 SQL 查询时总是空间不足。如何让 /tmp 分区更大?
谢谢汤姆
编辑:
以下是请求的命令的输出
blkid
/dev/sda1: UUID="e8604436-53ea-4a05-9459-6c498cf19a1a" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda5: UUID="21bd6739-89c8-4196-986d-bec9474a4b1a" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda6: UUID="1a80f7c6-d524-4974-82ee-c5bd734802b9" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda7: TYPE="swap"
/dev/sda8: UUID="edee40d5-9337-4705-b152-7bc2b9b35336" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda9: UUID="5c586547-8d78-4dd1-86c9-92f83b4d8fb5" SEC_TYPE="ext2" TYPE="ext3"
fdisk -l
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000504d7
Device Boot Start End Blocks Id System
/dev/sda1 18663 19201 4329517+ 83 Linux
/dev/sda2 35 18662 149629410 5 Extended
/dev/sda5 35 642 4883728+ 83 Linux
/dev/sda6 643 1007 2931831 83 Linux
/dev/sda7 1008 1337 2650693+ 82 Linux swap / Solaris
/dev/sda8 1338 1386 393561 83 Linux
/dev/sda9 1387 18662 138769438+ 83 Linux
Partition table entries are not in disk order
cat /etc/mtab
/dev/sda1 / ext3 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
procbususb /proc/bus/usb usbfs rw 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev,size=1000m 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/sda9 /home ext3 rw 0 0
/dev/sda5 /usr ext3 rw 0 0
/dev/sda6 /var ext3 rw 0 0
rpc_pipefs /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
//192.168.254.12/SHARE1 /mnt/archive cifs rw,mand 0 0
/dev/sda8 /tmp ext3 rw 0 0
pvs
-su: pvs: command not found
pvs
-su: pvs: command not found
lvs
-su: lvs: command not found
答案1
用普通文件替换 /tmp 可能会更容易。
dd if=/dev/zero of=/var/mytmp bs=1024 count=<desired size in K>
mkfs -t ext3 /var/mytmp
umount /tmp
mount -o loop /var/mytmp /tmp
然后,在 /etc/fstab 文件中创建匹配的挂载行。
答案2
为什么不只是告诉 MySQL 在其他地方完成它的工作? 可以TMPDIR
在 MySQL 的环境中设置,也可以tmpdir = /some/non/tmp/path
在 my.cnf 中设置。
答案3
具体如何操作取决于您驱动器当前的排列方式。如果您将以下命令的输出添加到您的问题中,这将有所帮助:
fdisk -l
cat /etc/mtab
pvs
vgs
lvs
(如果您不使用 LVM,则最后三个命令可能不存在)
或者,您可以尝试移动 SQL 服务器用于临时暂存空间的位置。您必须向我们提供有关数据库设置的更多详细信息(即您使用的是哪个数据库服务器?mySQL/Postgres/...?)以获取帮助。
如果您的数据库与 /tmp 分区位于同一驱动器上,那么您可能会发现将临时区域移动到另一个驱动器上将大大提高这种复杂查询的速度。
在 StackOverflow 上发布 SQL 查询(以及有关其查询的结构的信息)也可能很有价值,看看路过的 SQL 专家是否可以看到任何明显需要轻松优化的部分。
编辑(发布分区信息后)
由于您根本不使用 LVM,并且更改不会影响您的/
或/boot
,如果您在执行操作时可以承受大量的停机时间,我建议gparted
“live CD”。用它启动,告诉它:
- 缩小一点
sda9
/home
- 将其向上移动到磁盘上,使其与
/sda8
(您的/tmp
)之间留出间隙 - 生长
sda8
以填补其后的新空间
如果您可以承受失去一点空间,那么这会更快(因为没有移动完整操作/home
,只有调整大小操作和任何所需的数据移动):
- 缩小到你想要的
/home
新的程度/tmp
- 在空间中创建一个新的分区
/home
- 然后你可以将其安装为
/tmp
- 您实际上并没有失去空间
sda8
利用,因为您可以将其安装为其他东西,但使用起来可能不是那么方便。
另一个选择是缩小位于 之前的交换空间sda8
,然后将其移动并调整大小sda8
到额外的空间中。这个想法有多好取决于您拥有的 RAM 数量以及您在机器上运行的内容。由于您不移动或调整 的大小,因此此选项会更快。/home
它实际上也会更安全,因为您不会触碰/home
- gparted 只会对/tmp
交换空间起作用,因此如果调整大小操作出错并且受影响分区中的内容最终损坏,则没有什么重要的事情。
我曾多次弄乱过这样的分区,gparted
完全没有遇到任何问题,但不用说,在使用它之前,您应该完整备份所有重要文件和当前分区表。我听说过如果您让gparted
分区包含以下内容,就会出现问题/boot
,但我总是将其保留/boot
在磁盘开头的自己的分区中,因此自己从未冒过风险。
答案4
在这种情况下,最简单的方法可能是卸载 /tmp,使用 fdisk 删除 /dev/sda8,创建一个更大的新 sda8,在其上执行 mkfs 并再次安装。不过,这可能会花费您一段时间(应用程序)停机时间。
下次,在 LVM 上构建您的文件系统,这会让这一切变得容易无数倍。