我可以对 MySQL 数据库使用符号链接吗

我可以对 MySQL 数据库使用符号链接吗

我的机器上安装了 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 仍然会以这种方式运行,但最好遵循当前的文档和当前的经验(如果其他人分享他们的经验)。

相关内容