数据文件过大 磁盘空间不足处理

plan1:移动已存在的数据文件至其他目录

  • 将数据 idb 文件移动至其他盘符,再通软连接连回之前位置
1
2
3
4
5
6
7
8
MYSQL> create table db1.t20220728(id int);
MYSQL> shutdown;
SHELL> mv /data/mysql_3314/mysqldata/db1/t20220728.ibd /data/mysql_3314/otherdir

SHELL> ln -s /data/mysql_3314/otherdir/t20220728.ibd /data/mysql_3314/mysqldata/db1/t20220728.ibd
SHELL> systemctl start mysqld_3314

MYSQL> insert into db1.t20220728 values(1);

plan2:创建新表时指定数据文件的位置

  • 开启独立表空间后,每个表的数据在磁盘上都是一个单独的文件(idb文件),创建表是,可在 create 语句中指定 idb 文件存储的路径,以达到环节磁盘进场和拆分 io 的目的。
  • 注意!!:注意如果有主从的情况下从库也要配置好相应的目录和权限,create 语句中的指定路径的参数也会被同步到从库上,如果路径不存在或权限存在问题,会导致主从中断

配置

  • 创建存储目录并配置权限
1
2
3
mkdir -p /home/new_data/
chown mysql.mysql -R /home/new_data/
chmod 750 -R /home/new_data/
  • 创建新表并通过 DATA DIRECTORY 指定数据文件位置
1
2
3
4
5
6
mysql> CREATE TABLE `test_tbl1` (
    ->   `ID` bigint(20) NOT NULL AUTO_INCREMENT,
    ->   `VERSION` bigint(20) DEFAULT '0' COMMENT '版本',
    ->   PRIMARY KEY (`ID`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DATA DIRECTORY='/home/new_data';
Query OK, 0 rows affected (0.01 sec)
  • 查看新 data 目录文件
1
2
3
4
$ tree /home/new_data/
/home/new_data/
└── test
    └── test_tbl1.ibd
  • 查看原 data 目录文件
    • 源目录下本该生成的 idb 文件变成了 isl 后缀的文件
    • 查看文件内容,为新的 data 文件的地址
1
2
3
4
5
6
7
$ ll -h
total 1.1G
-rw-r-----. 1 mysql mysql   67 Jul 19 09:38 db.opt
-rw-r-----. 1 mysql mysql 8.4K Jul 19 11:08 test_tbl1.frm
-rw-r-----. 1 mysql mysql   33 Jul 19 11:08 test_tbl1.isl
$ cat test_tbl1.isl
/home/new_data/test/test_tbl1.ibd