今天在迁移zabbix数据库时碰到一个共享表空间无法释放的问题,由于mysql默认使用的是innodb存储引擎,当删除一个很大的数据时,由于强制中断操作造成共享表空间不能释放,同时需要删除的数据库也无法删除掉,这样,共享表空间里仍存有未被完全删除的数据库的信息。从而造成表空间无法释放的问题。

当我们想释放或更换共享表空间时正确的步骤如下:

重新配置共享表空间

1.查看当前存在的数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
| zhujiangtao        |
+--------------------+
4 rows in set (0.00 sec)

2.备份那些存储引擎是innodb的数据库,当然若有其他的数据库,也需要备份,只是本文是针对innodb存储引擎而言的。

[root@zhu2 var]# mysqldump zhujiangtao > /tmp/zhu.sql #根据需要可对mysqldump使用具体的参数

3.关闭mysql数据库

[root@zhu2 ~]# service mysqld stop
Shutting down MySQL..                                      [确定]

4.删除innodb存储引擎的共享表空间和日志文件以及使用innodb存储引擎的表的.frm文件

[root@zhu2 var]# ll /opt/mysql/var/
总计 45880
-rw-rw---- 1 mysql mysql 35651584 10-18 00:51 ibdata1
-rw-rw---- 1 mysql mysql  5242880 10-18 00:51 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 10-18 00:51 ib_logfile1
[root@zhu2 var]# rm -rf ibdata1 #删除表空间
[root@zhu2 var]# rm -rf ib_logfile* #删除日志文件
[root@zhu2 var]# rm -rf zhujaingtao/student.frm #删除innodb表的.frm
文件

5.重新配置共享表空间

innodb_data_file_path = ibdata1:100M:autoextend

6.重启mysql

[root@zhu2 ~]# service mysqld start
Starting MySQL.                                            [确定]
[root@zhu2 var]# ll
总计 21276
-rw-rw---- 1 mysql mysql 10485760 10-18 00:59 ibdata1
-rw-rw---- 1 mysql mysql  5242880 10-18 00:59 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 10-18 00:59 ib_logfile1
#新的表空间和日志文件

7.恢复删除的表

[root@zhu2 var]# mysql zhujiangtao < /tmp/zhu.sql
mysql> use zhujiangtao;
Database changed
mysql> show tables ;
+-----------------------+
| Tables_in_zhujiangtao |
+-----------------------+
| student               |
+-----------------------+
1 row in set (0.01 sec)
mysql> select * from student limit 5;
+------+--------+
| id   | name   |
+------+--------+
|    1 | zhang3 |
|    2 | li4    |
|    3 | wang5  |
|    1 | zhang3 |
|    2 | li4    |
+------+--------+
5 rows in set (0.00 sec)
#可见表的内容完全恢复,并且我们已经对表共享空间重新进行了配置

共享表空间的配置配置语法:

配置共享表空间有两个参数

innodb_data_home_dir=/opt/mysql/var/#为innodb共享表空间指定一个父目录,当没有对该项进行设置的时候,默认路径是mysql的数据目录
innodb_data_file_path=ibdata1:10M:autoextend#指定组成innodb共享表空间的文件,文件之间以分号间隔,文件的属性以冒号间隔,innodb表空间的各项组成文件至少10M

#若是这两项都没有设置。innodb存储引擎将在服务器的数据目录里创建一个初始长度是10M。名字是ibdata1的文件作为默认共享表空间,
innodb_data_home_dir =     #当该项为空,就会把下面的参数视为绝对路径,当不为空,则视为相对路径,当不存在时,默认为mysql数据目录
innodb_data_file_path =/opt/mysql/data/ibdata1:50M;/opt/mysql/data/ibdata2:50M
#################################
innodb_data_home_dir = /opt/mysql/data
innodb_data_file_path = ibdata1:50M;ibdata2:50M
#################################################
这两种配置效果一样

配置语法

path:size
path:size:autoextend
path:size:autoextend:max:maxsize
######################################
innodb_data_file_path = ibdata1:10M:autoextend #表空间大小为10M,可以自动扩展
innodb_data_file_path = ibdata1:10M:ibdata2:2G:autoextend #共享表空间由ibdata1和ibdata2指定,大小设置的单位可以是M和G;autoextend为自动扩展,当有多个文件时,只能对最后一个文件进行autoextend设置。
innodb_data_file_path = ibdata1:10M:autoextend:max:10G #ibdata1大小为10M,自动扩展,但是最大为10G