ibdata—- InnoDB 的共享表空间
当你启用了 innodb_file_per_table(默认开启状态),表被存储在他们自己的表空间里,但是共享表空间仍然在存储其它的 InnoDB 内部数据:
数据字典,也就是 InnoDB 表的元数据
变更缓冲区
双写缓冲区
撤销日志
防御增长方法:
其中的一些在 Percona 服务器上可以被配置来避免增长过大的。例如你可以通过 innodb_ibuf_max_size 设置最大变更缓冲区,或设置 innodb_doublewrite_file 来将双写缓冲区存储到一个分离的文件。
如果出现了怎么办?——凉拌
(1)备份数据库
mysqldump -q -uroot -ppassword --add-drop-table --all-databases >/home/backup/all.sql
(2)针对Ubuntu
vim /etc/mysql/my.cnf
找到 [mysqld] 区域
加上一句话关闭坑爹的 innodb_file_per_table,保存后检查方法
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.53 sec)
(3)
删除掉 ibdata1这个巨无霸还有自己创建的表(不要删除mysql表)
重启服务器,导入刚才备份的文件。
错误示范-事务没有关闭过
#!/usr/bin/python
# -*- coding:utf-8 -*-
#__author__='Kakarotto'
import MySQLdb
def md5sum_insert_data():
#connect database
conn = MySQLdb.connect(
host='localhost',
port=3306,
user='root',
passwd='toor',
db='hello',
charset="utf8"
)
cur = conn.cursor()
sqli = "insert into hello values(%s,%s,%s)"
sqlii="select max(id) from hello"
cur.execute(sqlii)
conn.commit()#隐形杀手
maxnumber=cur.fetchall()
for row in maxnumber:
countori=row[0]
count=countori+1 #get primarary key new value
print count
for line in lines:
count+=1
hebing= line.replace("\n", "")
print hebing
try:
name,md5=hebing.split()
except:
pass
try:
cur.execute(sqli, ('%s' % count, '%s' % name, '%s' % md5))
conn.commit()
except:
cur.execute(sqli, ('%s' % count, '%s' % name,'null' ))
conn.commit()
conn.close()
if __name__=="__main__":
md5sum_insert_data()
更多细节参考
MySql ibdata1文件太大如何缩小