今天在迁移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
本文出自 “浪淘沙” 博客,谢绝转载!