我的机器上安装了 MySQL,我需要添加一个非常大的表来最大化现有容量。
我之前曾将 MySQL 数据保存在外部驱动器上,但由于读/写问题,我更愿意将尽可能多的数据保存在笔记本电脑硬盘上,而不是外部硬盘上,因此需要符号链接而不是将所有数据移动到硬盘上。
我参考了MySQL 文档为此,看起来它应该可以工作,但我所做的一切都不允许我(首先)在这个新数据库上创建一个表(最终希望将批量导出 .sql 文件/表导入到这个新数据库中)。
得到:
mysql> create table test(`test` varchar(8) NOT NULL);
ERROR 1030 (HY000): Got error 168 - 'Unknown (generic) error from engine' from storage engine
错误日志没有显示太多,只是这个警告:
chris@chris-X1C6:/var/log/mysql$ cat error.log
2024-02-26T21:36:16.697730Z 19 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
我已经检查了 MySQL 8 中的符号链接是否已打开,我已经检查了mysql
所有适用目录的所有者,并且每个位置都有足够的空间,但我仍然收到此错误 168。我缺少什么?如果有必要的话,在 Ubuntu 22.04 上运行 MySQL 8.0。
一些相关细节:
chris@chris-X1C6:/var/log/mysql$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 4.1M 1.6G 1% /run
/dev/nvme0n1p6 173G 153G 12G 93% /
tmpfs 7.7G 31M 7.7G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
efivarfs 154K 52K 98K 35% /sys/firmware/efi/efivars
tmpfs 7.7G 0 7.7G 0% /run/qemu
/dev/nvme0n1p4 60G 769M 60G 2% /media/chris/Share
/dev/nvme0n1p1 256M 35M 222M 14% /boot/efi
/dev/sdc2 4.6T 36K 4.3T 1% /media/chris/F
/dev/sda1 932G 287G 646G 31% /media/chris/T7
/dev/sdb2 4.6T 4.3T 260G 95% /media/chris/E
tmpfs 1.6G 96K 1.6G 1% /run/user/1000
chris@chris-X1C6:/var/lib/mysql$ ll --ignore=binlog*
total 1790432
-rw-rw-rw- 1 mysql mysql 1709 Dec 5 2022 ca-key.pem
-rw-rw-rw- 1 mysql mysql 1112 Dec 5 2022 ca.pem
-rw-rw-rw- 1 mysql mysql 1705 Dec 5 2022 server-key.pem
-rw-rw-rw- 1 mysql mysql 1112 Dec 5 2022 server-cert.pem
-rw-rw-rw- 1 mysql mysql 1705 Dec 5 2022 client-key.pem
-rw-rw-rw- 1 mysql mysql 1112 Dec 5 2022 client-cert.pem
-rw-rw-rw- 1 mysql mysql 1705 Dec 5 2022 private_key.pem
-rw-rw-rw- 1 mysql mysql 452 Dec 5 2022 public_key.pem
drwxrwxrwx 2 mysql mysql 4096 Dec 5 2022 sys/
drwxrwxrwx 2 mysql mysql 4096 Dec 14 2022 fu/
drwxrwxrwx 2 mysql mysql 4096 Dec 21 2022 eq/
drwxrwxrwx 2 mysql mysql 4096 May 8 2023 performance_schema/
-rw-rw-rw- 1 mysql mysql 0 Jan 26 17:44 mysql.sock
-rw-rw-rw- 1 mysql mysql 0 Jan 26 17:44 mysql.pid
-rw-rw-rw- 1 mysql mysql 0 Jan 31 06:40 debian-5.7.flag
drwxrwxrwx 2 mysql mysql 4096 Jan 31 06:40 mysql/
-rw-rw-rw- 1 mysql mysql 6 Jan 31 06:40 mysql_upgrade_info
lrwxrwxrwx 1 root root 14 Feb 13 22:31 F -> /media/chris/F/
drwxr-xr-x 83 root root 4096 Feb 17 09:46 ../
-rw-rw-rw- 1 mysql mysql 8585216 Feb 20 17:00 '#ib_16384_1.dblwr'
lrwxrwxrwx 1 mysql mysql 23 Feb 20 19:27 op -> /media/chris/F/mysql/op/
-rw-r----- 1 mysql mysql 56 Feb 20 19:28 auto.cnf
-rw-r----- 1 mysql mysql 3272 Feb 21 11:22 ib_buffer_pool
drwxrwxrwx 2 mysql mysql 4096 Feb 22 14:31 '#innodb_temp'/
drwxrwxrwx 2 mysql mysql 4096 Feb 22 14:32 '#innodb_redo'/
-rw-r----- 1 mysql mysql 5 Feb 22 14:32 chris-X1C6.pid
-rw-r----- 1 mysql mysql 12582912 Feb 22 14:32 ibtmp1
-rw-rw-rw- 1 mysql mysql 855638016 Feb 22 15:31 undo_002
drwxrwxrwx 9 mysql mysql 4096 Feb 26 00:00 ./
-rw-rw-rw- 1 mysql mysql 838860800 Feb 26 13:37 undo_001
-rw-rw-rw- 1 mysql mysql 79691776 Feb 26 13:37 ibdata1
-rw-rw-rw- 1 mysql mysql 196608 Feb 26 13:37 '#ib_16384_0.dblwr'
-rw-rw-rw- 1 mysql mysql 37748736 Feb 26 13:37 mysql.ibd
chris@chris-X1C6:/var/lib/mysql$ ls -lad /media/chris/F/mysql/op /var/lib/mysql/op
drwxrwxrwx 2 mysql mysql 4096 Feb 20 18:34 /media/chris/F/mysql/op
lrwxrwxrwx 1 mysql mysql 23 Feb 20 19:27 /var/lib/mysql/op -> /media/chris/F/mysql/op
答案1
我已经使用 MySQL v5.6 中的 InnoDB 表完成了此操作。我创建了一个空表,关闭 mysqld,将文件移动到具有足够空间的文件系统,设置指向移动文件的符号链接,然后再次启动 mysqld。
我必须确保我移动文件的目录对于 mysqld 运行所在的用户是可读和可写的,并且直到该位置的路径中的目录对于 mysqld 用户是可读和可执行的。 (可能只需要可执行,我不记得了)
我记得的另一点是 mysqld 将使用保存(大文件)的文件系统执行 ALTER TABLE 操作(通常创建一个新文件,将行复制到新文件,然后交换新旧文件的文件名,然后删除旧文件) ) 表,但对表数据的其他操作可能不会。创建临时文件(也许还有临时表)的排序或分组将保存到 mysqld 标准临时区域中的临时文件,这可能不是您移动该表文件的大型文件系统。
我的上述经历可能发生在8-10年前,所以它们可能已经过时了。我认为现代版本的 MySQL 仍然会以这种方式运行,但最好遵循当前的文档和当前的经验(如果其他人分享他们的经验)。